From fe34881538a708e3241e3258fbcedc169497e2b8 Mon Sep 17 00:00:00 2001 From: Agustina Aldasoro Date: Mon, 11 May 2026 21:37:05 -0300 Subject: [PATCH 1/6] Create changeset to transfer back mint authority to state pda in solana --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- .../changeset/solana_v0_1_1/cs_token_pool.go | 115 ++++++++++++++++++ deployment/go.mod | 2 +- deployment/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 +- system-tests/lib/go.mod | 2 +- system-tests/lib/go.sum | 4 +- system-tests/tests/go.mod | 2 +- system-tests/tests/go.sum | 4 +- 13 files changed, 133 insertions(+), 18 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index b74b3474922..39dea201655 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -485,7 +485,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260428205619-2db1389501a1 // indirect github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260408145530-22e2d05695cd // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 // indirect github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 // indirect github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20251211140724-319861e514c4 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 5c74c74cfeb..8e426e93c2b 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1634,8 +1634,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74/go.mod h1:LDCeKlQ6Ne0DYjI2RiqY2ZIO449FzjSHGc04TLszh68= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc h1:mvobZx5JV5PhG/9IXPReV+8mAGnupl0HIWQZ43zxzd4= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:gzCVLUlNov/zFXSC7G6zcGkZU1IfNOHaakbAPDe5Woc= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc h1:War93neyFmv7pzuElZeZC3qc/OfGtLvEXvqL3qeBfM0= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 h1:H4elXlsDnREQpx8JESKxIuHzMCwGlJbL5+MpFCoLZZc= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 h1:WJ+KO7/UgwoQoVVj1Hl+4MuzTW4/3I+wYxqgABLQyC0= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72/go.mod h1:Ls0oszLvhzV3/D0ivG85sh8qmmcsVhKplmepQdFq98E= github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd h1:IMopuENFVS63AerRELdfWo6o60UNUidcldJOxJLmk24= diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go b/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go index 71cf954ff46..7652336f832 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go @@ -27,6 +27,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/cctp_token_pool" solLockReleaseTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/lockrelease_token_pool" solTestTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/test_token_pool" + solBurnMintTokenPool_V1_6_2 "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v1_6_2/burnmint_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" @@ -66,6 +67,9 @@ var _ cldf.ChangeSet[SyncDomainConfig] = SyncDomain // extend token pool lookup table var _ cldf.ChangeSet[ExtendTokenPoolLookupTableConfig] = ExtendTokenPoolLookupTable +// transfer mint authority back to pool signer PDA +var _ cldf.ChangeSet[TransferMintAuthorityToSignerPDAConfig] = TransferMintAuthorityToSignerPDA + // append mcms txns generated from solanainstructions func appendTxs(instructions []solana.Instruction, tokenPool solana.PublicKey, poolType cldf.ContractType, txns *[]mcmsTypes.Transaction) error { for _, ixn := range instructions { @@ -929,6 +933,117 @@ func parseMultisigAddress(text string) (string, error) { return m[1], nil } +type TransferMintAuthorityToSignerPDAConfig struct { + ChainSelector uint64 + TokenMint solana.PublicKey + PoolType *cldf.ContractType + Metadata string + CurrentMintAuthority solana.PublicKey // current mint authority account (e.g. multisig) + MCMS *proposalutils.TimelockConfig +} + +func (cfg TransferMintAuthorityToSignerPDAConfig) Validate(e cldf.Environment, chainState solanastateview.CCIPChainState) error { + if err := chainState.CommonValidation(e, cfg.ChainSelector, cfg.TokenMint); err != nil { + return err + } + if *cfg.PoolType != shared.BurnMintTokenPool { + return errors.New("transfer mint authority to signer PDA only for burn and mint pools") + } + if _, err := chainState.TokenToTokenProgram(cfg.TokenMint); err != nil { + return fmt.Errorf("token %s not found in existing state, deploy the token first", cfg.TokenMint.String()) + } + tokenPool := chainState.GetActiveTokenPool(*cfg.PoolType, cfg.Metadata) + if tokenPool.IsZero() { + return fmt.Errorf("token pool of type %s not found in existing state, deploy the token pool first for chain %d", *cfg.PoolType, cfg.ChainSelector) + } + return nil +} + +func TransferMintAuthorityToSignerPDA(e cldf.Environment, cfg TransferMintAuthorityToSignerPDAConfig) (cldf.ChangesetOutput, error) { + e.Logger.Infow("Transfer mint authority to signer PDA", "cfg", cfg) + + state, err := stateview.LoadOnchainState(e) + if err != nil { + return cldf.ChangesetOutput{}, err + } + solChainState := state.SolChains[cfg.ChainSelector] + if err := cfg.Validate(e, solChainState); err != nil { + return cldf.ChangesetOutput{}, err + } + chain := e.BlockChains.SolanaChains()[cfg.ChainSelector] + tokenProgram, _ := solChainState.TokenToTokenProgram(cfg.TokenMint) + tokenPool := solChainState.GetActiveTokenPool(*cfg.PoolType, cfg.Metadata) + + runSafely(func() { + solBurnMintTokenPool.SetProgramID(tokenPool) + }) + + tokenPoolSigner, err := solTokenUtil.TokenPoolSignerAddress(cfg.TokenMint, tokenPool) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to get token pool signer address: %w", err) + } + poolConfig, err := solTokenUtil.TokenPoolConfigAddress(cfg.TokenMint, tokenPool) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to calculate the pool config: %w", err) + } + programData, err := getSolProgramData(e, chain, tokenPool) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to get solana token pool program data: %w", err) + } + + useMcms := solanastateview.IsSolanaProgramOwnedByTimelock( + &e, + chain, + solChainState, + shared.BurnMintTokenPool, + cfg.TokenMint, + cfg.Metadata, + ) + + authority := chain.DeployerKey.PublicKey() + if useMcms { + timelockSigner, err := FetchTimelockSigner(e, cfg.ChainSelector) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to fetch timelock signer: %w", err) + } + authority = timelockSigner + } + + ix, err := solBurnMintTokenPool_V1_6_2.NewTransferMintAuthorityToPdaSignerInstruction( + poolConfig, + cfg.TokenMint, + tokenProgram, + tokenPoolSigner, + authority, + cfg.CurrentMintAuthority, + tokenPool, + programData.Address, + ).ValidateAndBuild() + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to build ix to transfer mint authority to signer PDA: %w", err) + } + + if !useMcms { + if err := chain.Confirm([]solana.Instruction{ix}); err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + return cldf.ChangesetOutput{}, nil + } + + var txns []mcmsTypes.Transaction + if err := appendTxs([]solana.Instruction{ix}, tokenPool, *cfg.PoolType, &txns); err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to generate mcms txn: %w", err) + } + proposal, err := BuildProposalsForTxns( + e, cfg.ChainSelector, "proposal to transfer mint authority to signer PDA", cfg.MCMS.MinDelay, txns) + if err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) + } + return cldf.ChangesetOutput{ + MCMSTimelockProposals: []mcms.TimelockProposal{*proposal}, + }, nil +} + func ModifyMintAuthority(e cldf.Environment, cfg NewMintTokenPoolConfig) (cldf.ChangesetOutput, error) { e.Logger.Infow("Use multisig as mint authority", "cfg", cfg) diff --git a/deployment/go.mod b/deployment/go.mod index afc658f1e31..80cf73322b9 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -40,7 +40,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260428205619-2db1389501a1 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc - github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc + github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 github.com/smartcontractkit/chainlink-common v0.11.2-0.20260511142328-0441b446ad75 github.com/smartcontractkit/chainlink-common/keystore v1.1.0 diff --git a/deployment/go.sum b/deployment/go.sum index 07a65d48e59..fff12a029ca 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1377,8 +1377,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74/go.mod h1:LDCeKlQ6Ne0DYjI2RiqY2ZIO449FzjSHGc04TLszh68= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc h1:mvobZx5JV5PhG/9IXPReV+8mAGnupl0HIWQZ43zxzd4= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:gzCVLUlNov/zFXSC7G6zcGkZU1IfNOHaakbAPDe5Woc= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc h1:War93neyFmv7pzuElZeZC3qc/OfGtLvEXvqL3qeBfM0= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 h1:H4elXlsDnREQpx8JESKxIuHzMCwGlJbL5+MpFCoLZZc= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 h1:WJ+KO7/UgwoQoVVj1Hl+4MuzTW4/3I+wYxqgABLQyC0= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72/go.mod h1:Ls0oszLvhzV3/D0ivG85sh8qmmcsVhKplmepQdFq98E= github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd h1:IMopuENFVS63AerRELdfWo6o60UNUidcldJOxJLmk24= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 1b543905393..cd37a2ba6d7 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -28,7 +28,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260428205619-2db1389501a1 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc - github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc + github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 github.com/smartcontractkit/chainlink-common v0.11.2-0.20260511142328-0441b446ad75 github.com/smartcontractkit/chainlink-common/keystore v1.1.0 github.com/smartcontractkit/chainlink-deployments-framework v0.101.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 29638f1eea7..7ff8016ac7b 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1362,8 +1362,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74/go.mod h1:LDCeKlQ6Ne0DYjI2RiqY2ZIO449FzjSHGc04TLszh68= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc h1:mvobZx5JV5PhG/9IXPReV+8mAGnupl0HIWQZ43zxzd4= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:gzCVLUlNov/zFXSC7G6zcGkZU1IfNOHaakbAPDe5Woc= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc h1:War93neyFmv7pzuElZeZC3qc/OfGtLvEXvqL3qeBfM0= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 h1:H4elXlsDnREQpx8JESKxIuHzMCwGlJbL5+MpFCoLZZc= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 h1:WJ+KO7/UgwoQoVVj1Hl+4MuzTW4/3I+wYxqgABLQyC0= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72/go.mod h1:Ls0oszLvhzV3/D0ivG85sh8qmmcsVhKplmepQdFq98E= github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd h1:IMopuENFVS63AerRELdfWo6o60UNUidcldJOxJLmk24= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index f4ddd1328ac..8ef35d19739 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -19,7 +19,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260428205619-2db1389501a1 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc - github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc + github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 github.com/smartcontractkit/chainlink-common v0.11.2-0.20260511142328-0441b446ad75 github.com/smartcontractkit/chainlink-deployments-framework v0.101.0 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260507171202-46e6a397da2d diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 655979ed7b4..5f9aaeafcae 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1630,8 +1630,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74/go.mod h1:LDCeKlQ6Ne0DYjI2RiqY2ZIO449FzjSHGc04TLszh68= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc h1:mvobZx5JV5PhG/9IXPReV+8mAGnupl0HIWQZ43zxzd4= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:gzCVLUlNov/zFXSC7G6zcGkZU1IfNOHaakbAPDe5Woc= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc h1:War93neyFmv7pzuElZeZC3qc/OfGtLvEXvqL3qeBfM0= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 h1:H4elXlsDnREQpx8JESKxIuHzMCwGlJbL5+MpFCoLZZc= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 h1:WJ+KO7/UgwoQoVVj1Hl+4MuzTW4/3I+wYxqgABLQyC0= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72/go.mod h1:Ls0oszLvhzV3/D0ivG85sh8qmmcsVhKplmepQdFq98E= github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd h1:IMopuENFVS63AerRELdfWo6o60UNUidcldJOxJLmk24= diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index f0b6d70131c..f20ae8d5055 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -451,7 +451,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260428205619-2db1389501a1 // indirect github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260408145530-22e2d05695cd // indirect github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74 // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 // indirect github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 // indirect github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20251211140724-319861e514c4 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 4534684a1cf..645cb0760a1 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1601,8 +1601,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74/go.mod h1:LDCeKlQ6Ne0DYjI2RiqY2ZIO449FzjSHGc04TLszh68= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc h1:mvobZx5JV5PhG/9IXPReV+8mAGnupl0HIWQZ43zxzd4= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:gzCVLUlNov/zFXSC7G6zcGkZU1IfNOHaakbAPDe5Woc= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc h1:War93neyFmv7pzuElZeZC3qc/OfGtLvEXvqL3qeBfM0= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 h1:H4elXlsDnREQpx8JESKxIuHzMCwGlJbL5+MpFCoLZZc= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 h1:WJ+KO7/UgwoQoVVj1Hl+4MuzTW4/3I+wYxqgABLQyC0= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72/go.mod h1:Ls0oszLvhzV3/D0ivG85sh8qmmcsVhKplmepQdFq98E= github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd h1:IMopuENFVS63AerRELdfWo6o60UNUidcldJOxJLmk24= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index f11a294089d..14857740744 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -151,7 +151,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260408145530-22e2d05695cd // indirect github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 // indirect github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 // indirect github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd // indirect github.com/smartcontractkit/chainlink-protos/chainlink-ccv/committee-verifier v0.0.0-20251211142334-5c3421fe2c8d // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 3cba9bde84f..04f226c3a38 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1816,8 +1816,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260506144252-c100eabfda74/go.mod h1:LDCeKlQ6Ne0DYjI2RiqY2ZIO449FzjSHGc04TLszh68= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc h1:mvobZx5JV5PhG/9IXPReV+8mAGnupl0HIWQZ43zxzd4= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:gzCVLUlNov/zFXSC7G6zcGkZU1IfNOHaakbAPDe5Woc= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc h1:War93neyFmv7pzuElZeZC3qc/OfGtLvEXvqL3qeBfM0= -github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7 h1:H4elXlsDnREQpx8JESKxIuHzMCwGlJbL5+MpFCoLZZc= +github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260511195239-0f6e1b177fc7/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72 h1:WJ+KO7/UgwoQoVVj1Hl+4MuzTW4/3I+wYxqgABLQyC0= github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260504204047-af9826978b72/go.mod h1:Ls0oszLvhzV3/D0ivG85sh8qmmcsVhKplmepQdFq98E= github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260428133800-3b1484e8b1fd h1:IMopuENFVS63AerRELdfWo6o60UNUidcldJOxJLmk24= From 8c1d1549a3c9188d8769acdb2714ae885eb31645 Mon Sep 17 00:00:00 2001 From: Agustina Aldasoro Date: Mon, 11 May 2026 21:52:20 -0300 Subject: [PATCH 2/6] Remove not necessary account --- .../changeset/solana_v0_1_1/cs_token_pool.go | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go b/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go index 7652336f832..6937631af14 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go @@ -934,12 +934,11 @@ func parseMultisigAddress(text string) (string, error) { } type TransferMintAuthorityToSignerPDAConfig struct { - ChainSelector uint64 - TokenMint solana.PublicKey - PoolType *cldf.ContractType - Metadata string - CurrentMintAuthority solana.PublicKey // current mint authority account (e.g. multisig) - MCMS *proposalutils.TimelockConfig + ChainSelector uint64 + TokenMint solana.PublicKey + PoolType *cldf.ContractType + Metadata string + MCMS *proposalutils.TimelockConfig } func (cfg TransferMintAuthorityToSignerPDAConfig) Validate(e cldf.Environment, chainState solanastateview.CCIPChainState) error { @@ -991,6 +990,15 @@ func TransferMintAuthorityToSignerPDA(e cldf.Environment, cfg TransferMintAuthor return cldf.ChangesetOutput{}, fmt.Errorf("failed to get solana token pool program data: %w", err) } + var mintAccount solToken.Mint + if err := chain.GetAccountDataBorshInto(context.Background(), cfg.TokenMint, &mintAccount); err != nil { + return cldf.ChangesetOutput{}, fmt.Errorf("failed to get token mint account data: %w", err) + } + if mintAccount.MintAuthority == nil { + return cldf.ChangesetOutput{}, fmt.Errorf("token %s has no mint authority set", cfg.TokenMint) + } + currentMintAuthority := *mintAccount.MintAuthority + useMcms := solanastateview.IsSolanaProgramOwnedByTimelock( &e, chain, @@ -1015,7 +1023,7 @@ func TransferMintAuthorityToSignerPDA(e cldf.Environment, cfg TransferMintAuthor tokenProgram, tokenPoolSigner, authority, - cfg.CurrentMintAuthority, + currentMintAuthority, tokenPool, programData.Address, ).ValidateAndBuild() From e962047898d95ae8d072a409dc9c94631d7e8290 Mon Sep 17 00:00:00 2001 From: Agustina Aldasoro Date: Mon, 11 May 2026 21:54:09 -0300 Subject: [PATCH 3/6] Add changeset --- .changeset/fierce-foxes-guess.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fierce-foxes-guess.md diff --git a/.changeset/fierce-foxes-guess.md b/.changeset/fierce-foxes-guess.md new file mode 100644 index 00000000000..94d1d5bd14f --- /dev/null +++ b/.changeset/fierce-foxes-guess.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +Add changeset to clean up solana token mint authority after migration From efee9a444a8a1a769c940b773d303cec9950fceb Mon Sep 17 00:00:00 2001 From: Agustina Aldasoro Date: Mon, 11 May 2026 21:55:18 -0300 Subject: [PATCH 4/6] Update .changeset/fierce-foxes-guess.md --- .changeset/fierce-foxes-guess.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/fierce-foxes-guess.md b/.changeset/fierce-foxes-guess.md index 94d1d5bd14f..5d3936cf1b8 100644 --- a/.changeset/fierce-foxes-guess.md +++ b/.changeset/fierce-foxes-guess.md @@ -2,4 +2,4 @@ "chainlink": patch --- -Add changeset to clean up solana token mint authority after migration +#added changeset to clean up solana token mint authority after migration From 3ad8f51d63c126953875f164e254aef4256f7f52 Mon Sep 17 00:00:00 2001 From: Agustina Aldasoro Date: Tue, 12 May 2026 00:56:15 -0300 Subject: [PATCH 5/6] Add feedback --- deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go b/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go index 6937631af14..6aeeeb2e1c5 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go @@ -945,6 +945,9 @@ func (cfg TransferMintAuthorityToSignerPDAConfig) Validate(e cldf.Environment, c if err := chainState.CommonValidation(e, cfg.ChainSelector, cfg.TokenMint); err != nil { return err } + if cfg.PoolType == nil { + return errors.New("pool type is required") + } if *cfg.PoolType != shared.BurnMintTokenPool { return errors.New("transfer mint authority to signer PDA only for burn and mint pools") } @@ -975,6 +978,7 @@ func TransferMintAuthorityToSignerPDA(e cldf.Environment, cfg TransferMintAuthor runSafely(func() { solBurnMintTokenPool.SetProgramID(tokenPool) + solBurnMintTokenPool_V1_6_2.SetProgramID(tokenPool) }) tokenPoolSigner, err := solTokenUtil.TokenPoolSignerAddress(cfg.TokenMint, tokenPool) @@ -1038,6 +1042,9 @@ func TransferMintAuthorityToSignerPDA(e cldf.Environment, cfg TransferMintAuthor return cldf.ChangesetOutput{}, nil } + if cfg.MCMS == nil { + return cldf.ChangesetOutput{}, errors.New("MCMS config is required when program is owned by timelock") + } var txns []mcmsTypes.Transaction if err := appendTxs([]solana.Instruction{ix}, tokenPool, *cfg.PoolType, &txns); err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to generate mcms txn: %w", err) From 4ad99ec4fcfc3dd5ee49d0f56296e41bd0eef251 Mon Sep 17 00:00:00 2001 From: Agustina Aldasoro Date: Tue, 12 May 2026 11:58:06 -0300 Subject: [PATCH 6/6] remove old bindings --- deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go | 1 - 1 file changed, 1 deletion(-) diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go b/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go index 6aeeeb2e1c5..566da5d3d5c 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_token_pool.go @@ -977,7 +977,6 @@ func TransferMintAuthorityToSignerPDA(e cldf.Environment, cfg TransferMintAuthor tokenPool := solChainState.GetActiveTokenPool(*cfg.PoolType, cfg.Metadata) runSafely(func() { - solBurnMintTokenPool.SetProgramID(tokenPool) solBurnMintTokenPool_V1_6_2.SetProgramID(tokenPool) })