From 03d085b47738542579588cbbc89ce4f1639aa455 Mon Sep 17 00:00:00 2001 From: Graham Goh Date: Mon, 10 Feb 2025 18:07:43 +1100 Subject: [PATCH 01/34] feat(mcms/solana): update helpers to support solana (#16276) The MCMS proposal helpers currently only support EVM, this commit update it to support the solana chain. JIRA: https://smartcontract-it.atlassian.net/browse/DPA-1361 --- .../common/proposalutils/mcms_test_helpers.go | 98 ++++++++++++++----- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/deployment/common/proposalutils/mcms_test_helpers.go b/deployment/common/proposalutils/mcms_test_helpers.go index cbce29c2b68..e0d39127ee2 100644 --- a/deployment/common/proposalutils/mcms_test_helpers.go +++ b/deployment/common/proposalutils/mcms_test_helpers.go @@ -15,6 +15,7 @@ import ( mcmslib "github.com/smartcontractkit/mcms" "github.com/smartcontractkit/mcms/sdk" "github.com/smartcontractkit/mcms/sdk/evm" + "github.com/smartcontractkit/mcms/sdk/solana" "github.com/smartcontractkit/mcms/types" "github.com/stretchr/testify/require" @@ -94,15 +95,24 @@ func SignMCMSTimelockProposal(t *testing.T, env deployment.Environment, proposal converters := make(map[types.ChainSelector]sdk.TimelockConverter) inspectorsMap := make(map[types.ChainSelector]sdk.Inspector) for _, chain := range env.Chains { - chainselc, exists := chainsel.ChainBySelector(chain.Selector) + _, exists := chainsel.ChainBySelector(chain.Selector) require.True(t, exists) - chainSel := types.ChainSelector(chainselc.Selector) + chainSel := types.ChainSelector(chain.Selector) converters[chainSel] = &evm.TimelockConverter{} inspectorsMap[chainSel] = evm.NewInspector(chain.Client) } + for _, chain := range env.SolChains { + _, exists := chainsel.SolanaChainBySelector(chain.Selector) + require.True(t, exists) + chainSel := types.ChainSelector(chain.Selector) + converters[chainSel] = &solana.TimelockConverter{} + inspectorsMap[chainSel] = solana.NewInspector(chain.Client) + } + p, _, err := proposal.Convert(env.GetContext(), converters) require.NoError(t, err) + p.UseSimulatedBackend(true) signable, err := mcmslib.NewSignable(&p, inspectorsMap) @@ -134,7 +144,16 @@ func SignMCMSProposal(t *testing.T, env deployment.Environment, proposal *mcmsli inspectorsMap[chainSel] = evm.NewInspector(chain.Client) } + for _, chain := range env.SolChains { + _, exists := chainsel.SolanaChainBySelector(chain.Selector) + require.True(t, exists) + chainSel := types.ChainSelector(chain.Selector) + converters[chainSel] = &solana.TimelockConverter{} + inspectorsMap[chainSel] = solana.NewInspector(chain.Client) + } + proposal.UseSimulatedBackend(true) + signable, err := mcmslib.NewSignable(proposal, inspectorsMap) require.NoError(t, err) @@ -156,33 +175,52 @@ func SignMCMSProposal(t *testing.T, env deployment.Environment, proposal *mcmsli func ExecuteMCMSProposalV2(t *testing.T, env deployment.Environment, proposal *mcmslib.Proposal, sel uint64) { t.Log("Executing proposal on chain", sel) + executorsMap := map[types.ChainSelector]sdk.Executor{} encoders, err := proposal.GetEncoders() require.NoError(t, err) - selector := types.ChainSelector(sel) - encoder := encoders[selector].(*evm.Encoder) - evmExecutor := evm.NewExecutor(encoder, env.Chains[sel].Client, env.Chains[sel].DeployerKey) - executorsMap := map[types.ChainSelector]sdk.Executor{ - selector: evmExecutor, + family, err := chainsel.GetSelectorFamily(sel) + 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") } + executable, err := mcmslib.NewExecutable(proposal, executorsMap) require.NoError(t, err) - chain := env.Chains[sel] - root, err := executable.SetRoot(env.GetContext(), selector) + root, err := executable.SetRoot(env.GetContext(), chainSel) require.NoError(t, deployment.MaybeDataErr(err)) - evmTransaction := root.RawTransaction.(*gethtypes.Transaction) - _, err = chain.Confirm(evmTransaction) - 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] + evmTransaction := root.RawTransaction.(*gethtypes.Transaction) + _, err = chain.Confirm(evmTransaction) + require.NoError(t, err) + } for i := range proposal.Operations { result, err := executable.Execute(env.GetContext(), i) require.NoError(t, err) - evmTransaction = result.RawTransaction.(*gethtypes.Transaction) - _, err = chain.Confirm(evmTransaction) - require.NoError(t, err) + if family == chainsel.FamilyEVM { + chain := env.Chains[sel] + evmTransaction := result.RawTransaction.(*gethtypes.Transaction) + _, err = chain.Confirm(evmTransaction) + require.NoError(t, err) + } } } @@ -192,12 +230,21 @@ func ExecuteMCMSTimelockProposalV2(t *testing.T, env deployment.Environment, tim t.Log("Executing timelock proposal on chain", sel) tExecutors := map[types.ChainSelector]sdk.TimelockExecutor{} - chain := env.Chains[sel] + family, err := chainsel.GetSelectorFamily(sel) + require.NoError(t, err) - chainSel := types.ChainSelector(sel) - tExecutors[chainSel] = evm.NewTimelockExecutor( - env.Chains[sel].Client, - env.Chains[sel].DeployerKey) + 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") + } timelockExecutable, err := mcmslib.NewTimelockExecutable(timelockProposal, tExecutors) require.NoError(t, err) @@ -209,9 +256,14 @@ func ExecuteMCMSTimelockProposalV2(t *testing.T, env deployment.Environment, tim for i := range timelockProposal.Operations { tx, err = timelockExecutable.Execute(env.GetContext(), i, opts...) require.NoError(t, err) - evmTransaction := tx.RawTransaction.(*gethtypes.Transaction) - _, err = chain.Confirm(evmTransaction) - 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] + evmTransaction := tx.RawTransaction.(*gethtypes.Transaction) + _, err = chain.Confirm(evmTransaction) + require.NoError(t, err) + } } } From 4e28f54d02332e99576f30b86f77a17a8ad730e2 Mon Sep 17 00:00:00 2001 From: Makram Date: Mon, 10 Feb 2025 12:09:04 +0200 Subject: [PATCH 02/34] [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 03/34] [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 04/34] 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 05/34] 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 06/34] 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 07/34] 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 08/34] 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 09/34] 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 10/34] 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 11/34] 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 69e6510b29ecc5b89a36a58955d470062987e1fd Mon Sep 17 00:00:00 2001 From: asoliman Date: Mon, 10 Feb 2025 15:26:25 +0400 Subject: [PATCH 12/34] WIP add token pools for link token in crib deployment --- deployment/environment/crib/ccip_deployer.go | 72 ++++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 180d607d978..703c68ac55f 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" "math/big" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" @@ -28,6 +29,8 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/relay" ) +const LINKTokenSymbol = "LINK" + // DeployHomeChainContracts deploys the home chain contracts so that the chainlink nodes can use the CR address in Capabilities.ExternalRegistry // 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) { @@ -103,7 +106,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...") - *e, err = setupChains(e, homeChainSel) + *e, err = setupChains(lggr, e, homeChainSel) if err != nil { return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up chain: %w", err) } @@ -158,7 +161,7 @@ func DeployCCIPChains(ctx context.Context, lggr logger.Logger, envConfig devenv. // Setup because we only need to deploy the contracts and distribute job specs fmt.Println("setting up chains...") - *e, err = setupChains(e, homeChainSel) + *e, err = setupChains(lggr, e, homeChainSel) if err != nil { return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up chain: %w", err) } @@ -256,7 +259,7 @@ func FundCCIPTransmitters(ctx context.Context, lggr logger.Logger, envConfig dev }, nil } -func setupChains(e *deployment.Environment, homeChainSel uint64) (deployment.Environment, error) { +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) @@ -265,6 +268,7 @@ func setupChains(e *deployment.Environment, homeChainSel uint64) (deployment.Env } prereqCfgs := make([]changeset.DeployPrerequisiteConfigPerChain, 0) contractParams := make(map[uint64]changeset.ChainContractParams) + for _, chain := range chainSelectors { prereqCfgs = append(prereqCfgs, changeset.DeployPrerequisiteConfigPerChain{ ChainSelector: chain, @@ -283,7 +287,7 @@ func setupChains(e *deployment.Environment, homeChainSel uint64) (deployment.Env OffRampParams: changeset.DefaultOffRampParams(), } } - return commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ + env, err := commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ { Changeset: commonchangeset.WrapChangeSet(changeset.UpdateChainConfigChangeset), Config: changeset.UpdateChainConfigConfig{ @@ -319,6 +323,37 @@ func setupChains(e *deployment.Environment, homeChainSel uint64) (deployment.Env 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 *e, fmt.Errorf("failed to load onchain state: %w", err) + } + chainSelectors := e.AllChainSelectors() + poolInput := make(map[uint64]changeset.DeployTokenPoolInput) + for _, chain := range chainSelectors { + poolInput[chain] = changeset.DeployTokenPoolInput{ + Type: changeset.BurnMintTokenPool, + LocalTokenDecimals: 18, + AllowList: []common.Address{}, + TokenAddress: state.Chains[chain].LinkToken.Address(), + } + } + return commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ + { + Changeset: commonchangeset.WrapChangeSet(changeset.DeployTokenPoolContractsChangeset), + Config: changeset.DeployTokenPoolContractsConfig{ + TokenSymbol: LINKTokenSymbol, + NewPools: poolInput, + }, + }, + }) } func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (deployment.Environment, error) { @@ -327,6 +362,7 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de 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{ @@ -342,6 +378,8 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de 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{ @@ -357,10 +395,36 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de 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: LINKTokenSymbol, + PoolUpdates: poolUpdates, + }, + }, { Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), Config: changeset.UpdateOnRampDestsConfig{ 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 13/34] 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 14/34] [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 0c7ec22ce6b2bc07ae106fb2995f2fccf1f34bd8 Mon Sep 17 00:00:00 2001 From: asoliman Date: Tue, 11 Feb 2025 11:33:06 +0400 Subject: [PATCH 15/34] WIP making link work --- deployment/environment/crib/ccip_deployer.go | 26 ++ integration-tests/load/ccip/ccip_test.go | 242 +++++++++++++++++- .../load/ccip/destination_gun.go | 8 +- integration-tests/testconfig/ccip/ccip.toml | 1 + 4 files changed, 267 insertions(+), 10 deletions(-) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 703c68ac55f..af657567cfb 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -337,6 +337,7 @@ func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { } 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, @@ -344,6 +345,13 @@ func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { AllowList: []common.Address{}, TokenAddress: state.Chains[chain].LinkToken.Address(), } + pools[chain] = map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + LINKTokenSymbol: { + Type: changeset.BurnMintTokenPool, + Version: deployment.Version1_5_1, + ExternalAdmin: e.Chains[chain].DeployerKey.From, + }, + } } return commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ { @@ -353,6 +361,24 @@ func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { 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, + }, + }, }) } diff --git a/integration-tests/load/ccip/ccip_test.go b/integration-tests/load/ccip/ccip_test.go index 0a5800e90a8..f8e7a5db422 100644 --- a/integration-tests/load/ccip/ccip_test.go +++ b/integration-tests/load/ccip/ccip_test.go @@ -2,6 +2,8 @@ package ccip import ( "context" + "github.com/ethereum/go-ethereum/common" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "math/big" "sync" "testing" @@ -10,7 +12,6 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -50,6 +51,7 @@ func TestCCIPLoad_RPS(t *testing.T) { // 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() // Ensure cancel is called at the end of the test // get user defined configurations config, err := tc.GetConfig([]string{"Load"}, tc.CCIP) @@ -84,6 +86,10 @@ func TestCCIPLoad_RPS(t *testing.T) { go mm.Start(ctx) defer mm.Stop() + //defer func() { + // cancel() // Ensure all goroutines get canceled + // mm.Stop() // Ensure metrics manager stops logging + //}() // gunMap holds a destinationGun for every enabled destination chain gunMap := make(map[uint64]*DestinationGun) p := wasp.NewProfile() @@ -98,19 +104,30 @@ func TestCCIPLoad_RPS(t *testing.T) { messageKeys := make(map[uint64]*bind.TransactOpts) srcTokens := make(map[uint64]*burn_mint_erc677.BurnMintERC677) other := env.AllChainSelectorsExcluding([]uint64{cs}) - for _, sel := range other { - messageKeys[sel] = transmitKeys[sel][ind] - srcToken, _ := setupTokens( + //var wg sync.WaitGroup + for _, src := range other { + messageKeys[src] = transmitKeys[src][ind] + //srcToken, _ := setupTokens2( + // t, + // state, + // *env, + // src, + // cs, + // deployment.E18Mult(10_000), + // deployment.E18Mult(10_000), + // messageKeys[src], + //) + //srcTokens[src] = srcToken + prepareAccountToSendLink( t, state, *env, - sel, + src, cs, deployment.E18Mult(10_000), deployment.E18Mult(10_000), - messageKeys[sel], + messageKeys[src], ) - srcTokens[sel] = srcToken } gunMap[cs], err = NewDestinationGun( @@ -216,6 +233,7 @@ func TestCCIPLoad_RPS(t *testing.T) { testTimer := time.NewTimer(timeout) go func() { <-testTimer.C + mm.Stop() cancel() }() } @@ -224,8 +242,173 @@ func TestCCIPLoad_RPS(t *testing.T) { lggr.Infow("closed event subscribers") } +//func prepareDestChainLink( +// t *testing.T, +// state ccipchangeset.CCIPOnChainState, +// e deployment.Environment, +// src, dest uint64, +// transferTokenMintAmount, +// feeTokenMintAmount *big.Int, +// srcAccount *bind.TransactOpts) { +// dstLink, err := burn_mint_erc677.NewBurnMintERC677(state.Chains[dest].LinkToken.Address(), e.Chains[dest].Client) +// require.NoError(t, err) +// dstDeployer := e.Chains[dest].DeployerKey +// +//} + +func prepareAccountToSendLink( + t *testing.T, + state ccipchangeset.CCIPOnChainState, + e deployment.Environment, + src, dest uint64, + transferTokenMintAmount, + feeTokenMintAmount *big.Int, + srcAccount *bind.TransactOpts) { + + lggr := logger.Test(t) + + lggr.Infow("Setting up tokens", "src", src, "dest", dest) + srcLink, err := burn_mint_erc677.NewBurnMintERC677(state.Chains[src].LinkToken.Address(), e.Chains[src].Client) + require.NoError(t, err) + dstLink, err := burn_mint_erc677.NewBurnMintERC677(state.Chains[dest].LinkToken.Address(), e.Chains[dest].Client) + require.NoError(t, err) + srcDeployer := e.Chains[src].DeployerKey + dstDeployer := e.Chains[dest].DeployerKey + + 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, + new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), + ) + _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) + require.NoError(t, err) + + //-------------------------------------------------------------------------------------------- + // Mint a destination token + tx, err = dstLink.Mint( + dstDeployer, + dstDeployer.From, + new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), + ) + _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) + require.NoError(t, 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) + require.NoError(t, err) + + tx, err = dstLink.Approve(dstDeployer, state.Chains[dest].Router.Address(), math.MaxBig256) + _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) + require.NoError(t, err) +} + // setupTokens deploys transferable tokens on the source and dest, mints tokens for the source and dest, and // approves the router to spend the tokens +func setupTokens2( + t *testing.T, + state ccipchangeset.CCIPOnChainState, + e deployment.Environment, + src, dest uint64, + transferTokenMintAmount, + feeTokenMintAmount *big.Int, + srcAccount *bind.TransactOpts, +) (srcLink *burn_mint_erc677.BurnMintERC677, + dstLink *burn_mint_erc677.BurnMintERC677) { + lggr := logger.Test(t) + + lggr.Infow("Setting up tokens", "src", src, "dest", dest) + srcLink, err := burn_mint_erc677.NewBurnMintERC677(state.Chains[src].LinkToken.Address(), e.Chains[src].Client) + require.NoError(t, err) + dstLink, err = burn_mint_erc677.NewBurnMintERC677(state.Chains[dest].LinkToken.Address(), e.Chains[dest].Client) + require.NoError(t, err) + srcDeployer := e.Chains[src].DeployerKey + dstDeployer := e.Chains[dest].DeployerKey + + 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) + + tx, err = dstLink.GrantMintAndBurnRoles(dstDeployer, dstDeployer.From) + _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) + require.NoError(t, err) + + srcLinkPool := state.Chains[src].BurnMintTokenPools["LINK"][deployment.Version1_5_1] + dstLinkPool := state.Chains[dest].BurnMintTokenPools["LINK"][deployment.Version1_5_1] + + err = attachTokenToTheRegistry(e.Chains[src], state.Chains[src], srcDeployer, srcLink.Address(), srcLinkPool.Address()) + require.NoError(t, err) + err = attachTokenToTheRegistry(e.Chains[dest], state.Chains[dest], dstDeployer, dstLink.Address(), dstLinkPool.Address()) + require.NoError(t, err) + + tx, err = srcLink.GrantMintAndBurnRoles(srcDeployer, srcLinkPool.Address()) + _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) + require.NoError(t, err) + + tx, err = dstLink.GrantMintAndBurnRoles(dstDeployer, dstLinkPool.Address()) + _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) + require.NoError(t, err) + + lggr.Infow("Minting transfer amounts") + //-------------------------------------------------------------------------------------------- + tx, err = srcLink.Mint( + srcAccount, + srcAccount.From, + new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), + ) + _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) + require.NoError(t, err) + tx, err = srcLink.Mint( + srcAccount, + srcLinkPool.Address(), + new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), + ) + _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) + require.NoError(t, err) + //-------------------------------------------------------------------------------------------- + // Mint a destination token + tx, err = dstLink.Mint( + dstDeployer, + dstDeployer.From, + new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), + ) + _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) + require.NoError(t, err) + tx, err = dstLink.Mint( + dstDeployer, + dstLinkPool.Address(), + new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), + ) + _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) + require.NoError(t, 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) + require.NoError(t, err) + + tx, err = dstLink.Approve(dstDeployer, state.Chains[dest].Router.Address(), math.MaxBig256) + _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) + require.NoError(t, err) + + return srcLink, dstLink +} + func setupTokens( t *testing.T, state ccipchangeset.CCIPOnChainState, @@ -312,3 +495,48 @@ func E18Mult(amount uint64) *big.Int { func UBigInt(i uint64) *big.Int { return new(big.Int).SetUint64(i) } + +func attachTokenToTheRegistry( + chain deployment.Chain, + state ccipchangeset.CCIPChainState, + owner *bind.TransactOpts, + token common.Address, + tokenPool common.Address, +) error { + pool, err := state.TokenAdminRegistry.GetPool(nil, token) + if err != nil { + return err + } + // Pool is already registered, don't reattach it, because it would cause revert + if pool != (common.Address{}) { + return nil + } + + tx, err := state.RegistryModule.RegisterAdminViaOwner(owner, token) + if err != nil { + return err + } + _, err = chain.Confirm(tx) + if err != nil { + return err + } + + tx, err = state.TokenAdminRegistry.AcceptAdminRole(owner, token) + if err != nil { + return err + } + _, err = chain.Confirm(tx) + if err != nil { + return err + } + + tx, err = state.TokenAdminRegistry.SetPool(owner, token, tokenPool) + if err != nil { + return err + } + _, err = chain.Confirm(tx) + if err != nil { + return err + } + return nil +} diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index 6515faf944c..2dec65b9f42 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -146,7 +146,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 = fee + acc.Value = big.NewInt(0).Mul(big.NewInt(7), fee) defer func() { acc.Value = nil }() } m.l.Debugw("sending message ", @@ -256,7 +256,8 @@ func (m *DestinationGun) GetMessage(src uint64) (router.ClientEVM2AnyMessage, er Receiver: rcv, TokenAmounts: []router.ClientEVMTokenAmount{ { - Token: m.transferableTokens[src].Address(), + //Token: m.transferableTokens[src].Address(), + Token: m.state.Chains[src].LinkToken.Address(), Amount: big.NewInt(1), }, }, @@ -269,7 +270,8 @@ func (m *DestinationGun) GetMessage(src uint64) (router.ClientEVM2AnyMessage, er Data: common.Hex2Bytes("message with token"), TokenAmounts: []router.ClientEVMTokenAmount{ { - Token: m.transferableTokens[src].Address(), + //Token: m.transferableTokens[src].Address(), + Token: m.state.Chains[src].LinkToken.Address(), Amount: big.NewInt(1), }, }, diff --git a/integration-tests/testconfig/ccip/ccip.toml b/integration-tests/testconfig/ccip/ccip.toml index 5032297da32..bf5e64127d4 100644 --- a/integration-tests/testconfig/ccip/ccip.toml +++ b/integration-tests/testconfig/ccip/ccip.toml @@ -243,6 +243,7 @@ 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] # each destination chain will receive 1 incoming request per RequestFrequency for the duration of LoadDuration RequestFrequency = "10s" 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 16/34] 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 17/34] 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 18/34] 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 1757bb2ed3b2b96b84772ffe4093831f7846e98f Mon Sep 17 00:00:00 2001 From: asoliman Date: Tue, 11 Feb 2025 18:40:42 +0400 Subject: [PATCH 19/34] cleaning up and parallelizing router approval per sender --- integration-tests/load/ccip/ccip_test.go | 334 ++---------------- .../load/ccip/destination_gun.go | 26 +- 2 files changed, 36 insertions(+), 324 deletions(-) diff --git a/integration-tests/load/ccip/ccip_test.go b/integration-tests/load/ccip/ccip_test.go index f8e7a5db422..b15d4b46714 100644 --- a/integration-tests/load/ccip/ccip_test.go +++ b/integration-tests/load/ccip/ccip_test.go @@ -2,19 +2,14 @@ package ccip import ( "context" - "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" - "math/big" "sync" "testing" "time" "github.com/ethereum/go-ethereum/common/math" - "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" - "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/smartcontractkit/chainlink/deployment" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -51,7 +46,7 @@ func TestCCIPLoad_RPS(t *testing.T) { // 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() // Ensure cancel is called at the end of the test + defer cancel() // get user defined configurations config, err := tc.GetConfig([]string{"Load"}, tc.CCIP) @@ -86,10 +81,6 @@ func TestCCIPLoad_RPS(t *testing.T) { go mm.Start(ctx) defer mm.Stop() - //defer func() { - // cancel() // Ensure all goroutines get canceled - // mm.Stop() // Ensure metrics manager stops logging - //}() // gunMap holds a destinationGun for every enabled destination chain gunMap := make(map[uint64]*DestinationGun) p := wasp.NewProfile() @@ -102,33 +93,25 @@ func TestCCIPLoad_RPS(t *testing.T) { startBlocks[cs] = &block messageKeys := make(map[uint64]*bind.TransactOpts) - srcTokens := make(map[uint64]*burn_mint_erc677.BurnMintERC677) other := env.AllChainSelectorsExcluding([]uint64{cs}) - //var wg sync.WaitGroup + var mu sync.Mutex + wg.Add(len(other)) for _, src := range other { - messageKeys[src] = transmitKeys[src][ind] - //srcToken, _ := setupTokens2( - // t, - // state, - // *env, - // src, - // cs, - // deployment.E18Mult(10_000), - // deployment.E18Mult(10_000), - // messageKeys[src], - //) - //srcTokens[src] = srcToken - prepareAccountToSendLink( - t, - state, - *env, - src, - cs, - deployment.E18Mult(10_000), - deployment.E18Mult(10_000), - messageKeys[src], - ) + go func(src uint64) { + defer wg.Done() + mu.Lock() + messageKeys[src] = transmitKeys[src][ind] + mu.Unlock() + prepareAccountToSendLink( + t, + state, + *env, + src, + messageKeys[src], + ) + }(src) } + wg.Wait() gunMap[cs], err = NewDestinationGun( env.Logger, @@ -140,7 +123,6 @@ func TestCCIPLoad_RPS(t *testing.T) { messageKeys, ind, mm.InputChan, - srcTokens, ) if err != nil { lggr.Errorw("Failed to initialize DestinationGun for", "chainSelector", cs, "error", err) @@ -242,157 +224,27 @@ func TestCCIPLoad_RPS(t *testing.T) { lggr.Infow("closed event subscribers") } -//func prepareDestChainLink( -// t *testing.T, -// state ccipchangeset.CCIPOnChainState, -// e deployment.Environment, -// src, dest uint64, -// transferTokenMintAmount, -// feeTokenMintAmount *big.Int, -// srcAccount *bind.TransactOpts) { -// dstLink, err := burn_mint_erc677.NewBurnMintERC677(state.Chains[dest].LinkToken.Address(), e.Chains[dest].Client) -// require.NoError(t, err) -// dstDeployer := e.Chains[dest].DeployerKey -// -//} - func prepareAccountToSendLink( t *testing.T, state ccipchangeset.CCIPOnChainState, e deployment.Environment, - src, dest uint64, - transferTokenMintAmount, - feeTokenMintAmount *big.Int, + src uint64, srcAccount *bind.TransactOpts) { - lggr := logger.Test(t) - - lggr.Infow("Setting up tokens", "src", src, "dest", dest) - srcLink, err := burn_mint_erc677.NewBurnMintERC677(state.Chains[src].LinkToken.Address(), e.Chains[src].Client) - require.NoError(t, err) - dstLink, err := burn_mint_erc677.NewBurnMintERC677(state.Chains[dest].LinkToken.Address(), e.Chains[dest].Client) - require.NoError(t, err) + lggr.Infow("Setting up link token", "src", src) + srcLink := state.Chains[src].LinkToken srcDeployer := e.Chains[src].DeployerKey - dstDeployer := e.Chains[dest].DeployerKey - - 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, + tx, err := srcLink.Mint( + srcDeployer, srcAccount.From, - new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), - ) - _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - require.NoError(t, err) - - //-------------------------------------------------------------------------------------------- - // Mint a destination token - tx, err = dstLink.Mint( - dstDeployer, - dstDeployer.From, - new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), + deployment.E18Mult(20_000), ) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, 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) - require.NoError(t, err) - - tx, err = dstLink.Approve(dstDeployer, state.Chains[dest].Router.Address(), math.MaxBig256) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, err) -} - -// setupTokens deploys transferable tokens on the source and dest, mints tokens for the source and dest, and -// approves the router to spend the tokens -func setupTokens2( - t *testing.T, - state ccipchangeset.CCIPOnChainState, - e deployment.Environment, - src, dest uint64, - transferTokenMintAmount, - feeTokenMintAmount *big.Int, - srcAccount *bind.TransactOpts, -) (srcLink *burn_mint_erc677.BurnMintERC677, - dstLink *burn_mint_erc677.BurnMintERC677) { - lggr := logger.Test(t) - - lggr.Infow("Setting up tokens", "src", src, "dest", dest) - srcLink, err := burn_mint_erc677.NewBurnMintERC677(state.Chains[src].LinkToken.Address(), e.Chains[src].Client) - require.NoError(t, err) - dstLink, err = burn_mint_erc677.NewBurnMintERC677(state.Chains[dest].LinkToken.Address(), e.Chains[dest].Client) - require.NoError(t, err) - srcDeployer := e.Chains[src].DeployerKey - dstDeployer := e.Chains[dest].DeployerKey - - 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) - - tx, err = dstLink.GrantMintAndBurnRoles(dstDeployer, dstDeployer.From) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, err) - - srcLinkPool := state.Chains[src].BurnMintTokenPools["LINK"][deployment.Version1_5_1] - dstLinkPool := state.Chains[dest].BurnMintTokenPools["LINK"][deployment.Version1_5_1] - - err = attachTokenToTheRegistry(e.Chains[src], state.Chains[src], srcDeployer, srcLink.Address(), srcLinkPool.Address()) - require.NoError(t, err) - err = attachTokenToTheRegistry(e.Chains[dest], state.Chains[dest], dstDeployer, dstLink.Address(), dstLinkPool.Address()) - require.NoError(t, err) - - tx, err = srcLink.GrantMintAndBurnRoles(srcDeployer, srcLinkPool.Address()) _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) require.NoError(t, err) - tx, err = dstLink.GrantMintAndBurnRoles(dstDeployer, dstLinkPool.Address()) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, err) - - lggr.Infow("Minting transfer amounts") - //-------------------------------------------------------------------------------------------- - tx, err = srcLink.Mint( - srcAccount, - srcAccount.From, - new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), - ) - _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - require.NoError(t, err) - tx, err = srcLink.Mint( - srcAccount, - srcLinkPool.Address(), - new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), - ) - _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - require.NoError(t, err) - //-------------------------------------------------------------------------------------------- - // Mint a destination token - tx, err = dstLink.Mint( - dstDeployer, - dstDeployer.From, - new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), - ) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, err) - tx, err = dstLink.Mint( - dstDeployer, - dstLinkPool.Address(), - new(big.Int).Add(transferTokenMintAmount, feeTokenMintAmount), - ) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, err) //-------------------------------------------------------------------------------------------- lggr.Infow("Approving routers") @@ -401,142 +253,4 @@ func setupTokens2( tx, err = srcLink.Approve(srcAccount, state.Chains[src].Router.Address(), math.MaxBig256) _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) require.NoError(t, err) - - tx, err = dstLink.Approve(dstDeployer, state.Chains[dest].Router.Address(), math.MaxBig256) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, err) - - return srcLink, dstLink -} - -func setupTokens( - t *testing.T, - state ccipchangeset.CCIPOnChainState, - e deployment.Environment, - src, dest uint64, - transferTokenMintAmount, - feeTokenMintAmount *big.Int, - srcAccount *bind.TransactOpts, -) ( - srcToken *burn_mint_erc677.BurnMintERC677, - dstToken *burn_mint_erc677.BurnMintERC677, -) { - lggr := logger.Test(t) - - // Deploy the token to test transferring - srcToken, _, dstToken, _, err := testhelpers.DeployTransferableToken( - lggr, - e.Chains, - src, - dest, - srcAccount, - e.Chains[dest].DeployerKey, - state, - e.ExistingAddresses, - "MY_TOKEN", - ) - require.NoError(t, err) - - linkToken := state.Chains[src].LinkToken - - //-------------------------------------------------------------------------------------------- - tx, err := srcToken.Mint( - srcAccount, - srcAccount.From, - transferTokenMintAmount, - ) - _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - require.NoError(t, err) - //-------------------------------------------------------------------------------------------- - // Mint a destination token - tx, err = dstToken.Mint( - e.Chains[dest].DeployerKey, - e.Chains[dest].DeployerKey.From, - transferTokenMintAmount, - ) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, err) - //-------------------------------------------------------------------------------------------- - - // 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 = srcToken.Approve(e.Chains[src].DeployerKey, state.Chains[src].Router.Address(), math.MaxBig256) - //_, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - //require.NoError(t, err) - tx, err = srcToken.Approve(srcAccount, state.Chains[src].Router.Address(), math.MaxBig256) - _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - require.NoError(t, err) - - tx, err = dstToken.Approve(e.Chains[dest].DeployerKey, state.Chains[dest].Router.Address(), math.MaxBig256) - _, err = deployment.ConfirmIfNoError(e.Chains[dest], tx, err) - require.NoError(t, err) - - // Grant mint and burn roles to the deployer key for the newly deployed linkToken - // Since those roles are not granted automatically - tx, err = linkToken.GrantMintAndBurnRoles(e.Chains[src].DeployerKey, srcAccount.From) - _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - require.NoError(t, err) - - tx, err = linkToken.Mint( - srcAccount, - srcAccount.From, - feeTokenMintAmount, - ) - _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - require.NoError(t, err) - - return srcToken, dstToken -} - -func E18Mult(amount uint64) *big.Int { - return new(big.Int).Mul(UBigInt(amount), UBigInt(1e18)) -} - -func UBigInt(i uint64) *big.Int { - return new(big.Int).SetUint64(i) -} - -func attachTokenToTheRegistry( - chain deployment.Chain, - state ccipchangeset.CCIPChainState, - owner *bind.TransactOpts, - token common.Address, - tokenPool common.Address, -) error { - pool, err := state.TokenAdminRegistry.GetPool(nil, token) - if err != nil { - return err - } - // Pool is already registered, don't reattach it, because it would cause revert - if pool != (common.Address{}) { - return nil - } - - tx, err := state.RegistryModule.RegisterAdminViaOwner(owner, token) - if err != nil { - return err - } - _, err = chain.Confirm(tx) - if err != nil { - return err - } - - tx, err = state.TokenAdminRegistry.AcceptAdminRole(owner, token) - if err != nil { - return err - } - _, err = chain.Confirm(tx) - if err != nil { - return err - } - - tx, err = state.TokenAdminRegistry.SetPool(owner, token, tokenPool) - if err != nil { - return err - } - _, err = chain.Confirm(tx) - if err != nil { - return err - } - return nil } diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index 2dec65b9f42..29654e6c215 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -55,7 +55,6 @@ func NewDestinationGun( messageKeys map[uint64]*bind.TransactOpts, chainOffset int, metricPipe chan messageData, - transferableTokens map[uint64]*burn_mint_erc677.BurnMintERC677, ) (*DestinationGun, error) { seqNums := make(map[testhelpers.SourceDestPair]SeqNumRange) for _, cs := range env.AllChainSelectorsExcluding([]uint64{chainSelector}) { @@ -68,18 +67,17 @@ func NewDestinationGun( } } dg := DestinationGun{ - l: l, - env: env, - state: state, - seqNums: seqNums, - roundNum: &atomic.Int32{}, - chainSelector: chainSelector, - receiver: receiver, - testConfig: overrides, - messageKeys: messageKeys, - chainOffset: chainOffset, - metricPipe: metricPipe, - transferableTokens: transferableTokens, + l: l, + env: env, + state: state, + seqNums: seqNums, + roundNum: &atomic.Int32{}, + chainSelector: chainSelector, + receiver: receiver, + testConfig: overrides, + messageKeys: messageKeys, + chainOffset: chainOffset, + metricPipe: metricPipe, } err := dg.Validate() @@ -146,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(7), fee) + acc.Value = big.NewInt(0).Mul(big.NewInt(9), fee) defer func() { acc.Value = nil }() } m.l.Debugw("sending message ", From a75bb0043373ca09eba3b7573c09626b45b5dc27 Mon Sep 17 00:00:00 2001 From: 0xAustinWang Date: Tue, 11 Feb 2025 22:43:00 +0800 Subject: [PATCH 20/34] use enum names in merics --- integration-tests/load/ccip/metrics.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/integration-tests/load/ccip/metrics.go b/integration-tests/load/ccip/metrics.go index f6e34e0042d..85a32f46a5b 100644 --- a/integration-tests/load/ccip/metrics.go +++ b/integration-tests/load/ccip/metrics.go @@ -71,11 +71,11 @@ func (mm *MetricManager) Start(ctx context.Context) { for srcDstSeqNum, metricState := range mm.state { commitDuration, execDuration := uint64(0), uint64(0) timestamps := metricState.timestamps - if timestamps[1] != 0 && timestamps[0] != 0 { - commitDuration = timestamps[1] - timestamps[0] + if timestamps[committed] != 0 && timestamps[transmitted] != 0 { + commitDuration = timestamps[committed] - timestamps[transmitted] } - if timestamps[2] != 0 && timestamps[1] != 0 { - execDuration = timestamps[2] - timestamps[1] + if timestamps[executed] != 0 && timestamps[committed] != 0 { + execDuration = timestamps[executed] - timestamps[committed] } lokiLabels, err := setLokiLabels(srcDstSeqNum.src, srcDstSeqNum.dst, metricState.round) @@ -101,7 +101,7 @@ func (mm *MetricManager) Start(ctx context.Context) { state := mm.state[data.srcDstSeqNum] state.timestamps[data.eventType] = data.timestamp - if data.eventType == 0 && data.round != -1 { + if data.eventType == transmitted && data.round != -1 { state.round = data.round } mm.state[data.srcDstSeqNum] = state @@ -109,14 +109,14 @@ func (mm *MetricManager) Start(ctx context.Context) { 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[0] != 0 && state.timestamps[1] != 0 && state.timestamps[2] != 0 { + 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[2] - state.timestamps[1], - CommitDuration: state.timestamps[1] - state.timestamps[0], + ExecDuration: state.timestamps[executed] - state.timestamps[committed], + CommitDuration: state.timestamps[committed] - state.timestamps[executed], SequenceNumber: data.seqNum, }) From a9264ab9275052dd6a53b9d832753ea34b326a95 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 11 Feb 2025 09:57:56 -0500 Subject: [PATCH 21/34] 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 22/34] [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 23/34] 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 24/34] 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 25/34] 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 26/34] 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 27/34] 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 28/34] 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 29/34] 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 30/34] 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 31/34] 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 76d1ece78483d06f32b5ac2883ea3f4cec6f6bea Mon Sep 17 00:00:00 2001 From: 0xAustinWang Date: Wed, 12 Feb 2025 13:32:54 +0800 Subject: [PATCH 32/34] use sync map to coordinate map changes --- deployment/environment/devenv/chain.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/deployment/environment/devenv/chain.go b/deployment/environment/devenv/chain.go index f83813cf47e..22ed24cc6f8 100644 --- a/deployment/environment/devenv/chain.go +++ b/deployment/environment/devenv/chain.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "math/big" + "sync" "time" "golang.org/x/sync/errgroup" @@ -96,6 +97,7 @@ 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 { chainCfg := chainCfg @@ -122,7 +124,7 @@ func NewChains(logger logger.Logger, configs []ChainConfig) (map[uint64]deployme if err != nil { return fmt.Errorf("failed to get chain info for chain %s: %w", chainCfg.ChainName, err) } - chains[selector] = deployment.Chain{ + syncMap.Store(selector, deployment.Chain{ Selector: selector, Client: ec, DeployerKey: chainCfg.DeployerKey, @@ -150,10 +152,15 @@ func NewChains(logger logger.Logger, configs []ChainConfig) (map[uint64]deployme } return blockNumber, nil }, - } + }) return nil }) } err := g.Wait() + + syncMap.Range(func(sel, value interface{}) bool { + chains[sel.(uint64)] = value.(deployment.Chain) + return true + }) return chains, err } From 581be936531137289d5bc5744b245cd03903ebe1 Mon Sep 17 00:00:00 2001 From: 0xAustinWang Date: Wed, 12 Feb 2025 17:06:37 +0800 Subject: [PATCH 33/34] merge issues --- deployment/environment/crib/ccip_deployer.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index d2d339b0245..9d01d7fc066 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -416,7 +416,8 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de feeQuoterDestsUpdatesByChain[src][dst] = changeset.DefaultFeeQuoterDestChainConfig(true) updateOffRampSources[src][dst] = changeset.OffRampSourceUpdate{ - IsEnabled: true, + IsEnabled: true, + IsRMNVerificationDisabled: true, } updateRouterChanges[src].OffRampUpdates[dst] = true @@ -472,8 +473,7 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de { Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOffRampSourcesChangeset), Config: changeset.UpdateOffRampSourcesConfig{ - UpdatesByChain: updateOffRampSources, - IsRMNVerificationDisabled: true, + UpdatesByChain: updateOffRampSources, }, }, { From f4c6967a8e9530b36fd0b4b866b6627222a6d8e0 Mon Sep 17 00:00:00 2001 From: 0xAustinWang Date: Wed, 12 Feb 2025 17:49:42 +0800 Subject: [PATCH 34/34] golint, goimports --- deployment/environment/crib/ccip_deployer.go | 3 ++- integration-tests/load/ccip/ccip_test.go | 14 +++++++---- .../load/ccip/destination_gun.go | 24 +++++++++---------- integration-tests/load/ccip/metrics.go | 3 ++- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 9d01d7fc066..5a97b7c2a76 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -4,9 +4,10 @@ import ( "context" "errors" "fmt" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" "math/big" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink-ccip/chainconfig" diff --git a/integration-tests/load/ccip/ccip_test.go b/integration-tests/load/ccip/ccip_test.go index b15d4b46714..9ce3fc890a7 100644 --- a/integration-tests/load/ccip/ccip_test.go +++ b/integration-tests/load/ccip/ccip_test.go @@ -9,9 +9,10 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/smartcontractkit/chainlink/deployment" "github.com/stretchr/testify/require" + "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" @@ -102,13 +103,14 @@ func TestCCIPLoad_RPS(t *testing.T) { mu.Lock() messageKeys[src] = transmitKeys[src][ind] mu.Unlock() - prepareAccountToSendLink( + err := prepareAccountToSendLink( t, state, *env, src, messageKeys[src], ) + require.NoError(t, err) }(src) } wg.Wait() @@ -229,7 +231,7 @@ func prepareAccountToSendLink( state ccipchangeset.CCIPOnChainState, e deployment.Environment, src uint64, - srcAccount *bind.TransactOpts) { + srcAccount *bind.TransactOpts) error { lggr := logger.Test(t) lggr.Infow("Setting up link token", "src", src) srcLink := state.Chains[src].LinkToken @@ -243,7 +245,9 @@ func prepareAccountToSendLink( deployment.E18Mult(20_000), ) _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) - require.NoError(t, err) + if err != nil { + return err + } //-------------------------------------------------------------------------------------------- @@ -252,5 +256,5 @@ func prepareAccountToSendLink( // 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) - require.NoError(t, err) + return err } diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index 29654e6c215..2a3a3becb0c 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "math" "math/big" "math/rand" @@ -31,18 +30,17 @@ 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 - messageKeys map[uint64]*bind.TransactOpts - chainOffset int - metricPipe chan messageData - transferableTokens map[uint64]*burn_mint_erc677.BurnMintERC677 + 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 + messageKeys map[uint64]*bind.TransactOpts + chainOffset int + metricPipe chan messageData } func NewDestinationGun( diff --git a/integration-tests/load/ccip/metrics.go b/integration-tests/load/ccip/metrics.go index 85a32f46a5b..b913594e92c 100644 --- a/integration-tests/load/ccip/metrics.go +++ b/integration-tests/load/ccip/metrics.go @@ -2,9 +2,10 @@ package ccip import ( "context" + "strconv" + chainselectors "github.com/smartcontractkit/chain-selectors" "github.com/stretchr/testify/require" - "strconv" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-testing-framework/wasp"