Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions chains/evm/deployment/fastcurse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ func TestFastCurse(t *testing.T) {
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chainsel.FamilyEVM, deploy.MCMSVersion, evmDeployer)
cs := deploy.DeployMCMS(dReg)
cs := deploy.DeployMCMS(dReg, nil)
evmChain1 := env.BlockChains.EVMChains()[chain1]
evmChain2 := env.BlockChains.EVMChains()[chain2]
output, err := cs.Apply(*env, deploy.MCMSDeploymentConfig{
Expand Down Expand Up @@ -459,7 +459,7 @@ func TestFastCurseGlobalCurseOnChain(t *testing.T) {
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chainsel.FamilyEVM, deploy.MCMSVersion, evmDeployer)
cs := deploy.DeployMCMS(dReg)
cs := deploy.DeployMCMS(dReg, nil)
mcmsChainInput := make(map[uint64]deploy.MCMSDeploymentConfigPerChain)
for _, sel := range []uint64{chain1, chain2, chain3} {
evmChain := env.BlockChains.EVMChains()[sel]
Expand Down
2 changes: 1 addition & 1 deletion chains/evm/deployment/v1_0_0/adapters/deployer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func TestDeployMCMS(t *testing.T) {
evmDeployer := &adapters.EVMDeployer{}
dReg := deployops.GetRegistry()
dReg.RegisterDeployer(chainsel.FamilyEVM, deployops.MCMSVersion, evmDeployer)
cs := deployops.DeployMCMS(dReg)
cs := deployops.DeployMCMS(dReg, nil)
output, err := cs.Apply(*env, deployops.MCMSDeploymentConfig{
AdapterVersion: semver.MustParse("1.0.0"),
Chains: map[uint64]deployops.MCMSDeploymentConfigPerChain{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func TestTransferOwnership(t *testing.T) {
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chainsel.FamilyEVM, deploy.MCMSVersion, evmDeployer)
deployMCMS := deploy.DeployMCMS(dReg)
deployMCMS := deploy.DeployMCMS(dReg, nil)
output, err := deployMCMS.Apply(*env, deploy.MCMSDeploymentConfig{
AdapterVersion: semver.MustParse("1.0.0"),
Chains: map[uint64]deploy.MCMSDeploymentConfigPerChain{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ func TestSiloedUSDCTokenPoolDeployChangeset(t *testing.T) {
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chain_selectors.FamilyEVM, deploy.MCMSVersion, evmDeployer)
cs := deploy.DeployMCMS(dReg)
cs := deploy.DeployMCMS(dReg, nil)
output, err := cs.Apply(*e, deploy.MCMSDeploymentConfig{
AdapterVersion: semver.MustParse("1.0.0"),
Chains: map[uint64]deploy.MCMSDeploymentConfigPerChain{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func TestUpdateLockReleasePoolAddressesChangeset(t *testing.T) {
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chain_selectors.FamilyEVM, deploy.MCMSVersion, evmDeployer)
cs := deploy.DeployMCMS(dReg)
cs := deploy.DeployMCMS(dReg, nil)
output, err := cs.Apply(*e, deploy.MCMSDeploymentConfig{
AdapterVersion: semver.MustParse("1.0.0"),
Chains: map[uint64]deploy.MCMSDeploymentConfigPerChain{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ func TestUSDCTokenPoolCCTPV2DeployChangeset(t *testing.T) {
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chain_selectors.FamilyEVM, deploy.MCMSVersion, evmDeployer)
cs := deploy.DeployMCMS(dReg)
cs := deploy.DeployMCMS(dReg, nil)
output, err := cs.Apply(*e, deploy.MCMSDeploymentConfig{
AdapterVersion: semver.MustParse("1.0.0"),
Chains: map[uint64]deploy.MCMSDeploymentConfigPerChain{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func TestUSDCTokenPoolDeployChangeset_NoExisting_MessageTransmitter_Proxy(t *tes
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chain_selectors.FamilyEVM, deploy.MCMSVersion, evmDeployer)
cs := deploy.DeployMCMS(dReg)
cs := deploy.DeployMCMS(dReg, nil)
output, err := cs.Apply(*e, deploy.MCMSDeploymentConfig{
AdapterVersion: semver.MustParse("1.0.0"),
Chains: map[uint64]deploy.MCMSDeploymentConfigPerChain{
Expand Down Expand Up @@ -312,7 +312,7 @@ func TestUSDCTokenPoolDeployChangeset_Existing_MessageTransmitter_Proxy(t *testi
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chain_selectors.FamilyEVM, deploy.MCMSVersion, evmDeployer)
cs := deploy.DeployMCMS(dReg)
cs := deploy.DeployMCMS(dReg, nil)
output, err := cs.Apply(*e, deploy.MCMSDeploymentConfig{
AdapterVersion: semver.MustParse("1.0.0"),
Chains: map[uint64]deploy.MCMSDeploymentConfigPerChain{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func TestDeployUSDCTokenPoolProxyChangeset(t *testing.T) {
evmDeployer := &adapters.EVMDeployer{}
dReg := deploy.GetRegistry()
dReg.RegisterDeployer(chain_selectors.FamilyEVM, deploy.MCMSVersion, evmDeployer)
cs := deploy.DeployMCMS(dReg)
cs := deploy.DeployMCMS(dReg, nil)
output, err := cs.Apply(*e, deploy.MCMSDeploymentConfig{
AdapterVersion: semver.MustParse("1.0.0"),
Chains: map[uint64]deploy.MCMSDeploymentConfigPerChain{
Expand Down
107 changes: 107 additions & 0 deletions chains/solana/deployment/utils/upgrade_authority.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package utils

import (
"context"
"encoding/binary"
"errors"
"fmt"

"github.com/gagliardetto/solana-go"
solRpc "github.com/gagliardetto/solana-go/rpc"
)

// UpgradeableLoaderState mirrors the Rust enum in the Solana SDK.
type UpgradeableLoaderState struct {
Type uint32
Program *Program
ProgramData *ProgramData
Uninitialized bool
}

// Program holds the address of the ProgramData account.
type Program struct {
ProgramData solana.PublicKey
}

// ProgramData holds the optional UpgradeAuthority.
type ProgramData struct {
Slot uint64
AuthorityOption uint32 // 0 = none, 1 = present
Authority solana.PublicKey
}

func decodeUpgradeableLoaderState(data []byte) (*UpgradeableLoaderState, error) {
if len(data) < 4 {
return nil, errors.New("data too short")
}
state := &UpgradeableLoaderState{}
state.Type = binary.LittleEndian.Uint32(data[:4])

switch state.Type {
case 2: // Program
if len(data) < 36 {
return nil, errors.New("program data too short")
}
state.Program = &Program{
ProgramData: solana.PublicKeyFromBytes(data[4:36]),
}
case 3: // ProgramData
slot := binary.LittleEndian.Uint64(data[4:12])
opt := data[12]
var auth *solana.PublicKey
if opt == 1 {
if len(data) < 45 {
return nil, errors.New("missing authority pubkey")
}
pk := solana.PublicKeyFromBytes(data[13:45])
auth = &pk
}
state.ProgramData = &ProgramData{
Slot: slot,
AuthorityOption: uint32(opt),
}
if state.ProgramData.AuthorityOption == 1 {
state.ProgramData.Authority = *auth
}
default:
// other variants (Uninitialized, Buffer) are not needed here
}
return state, nil
}

func getUpgradeableLoaderState(client *solRpc.Client, progPubkey solana.PublicKey) (*UpgradeableLoaderState, error) {
resp, err := client.GetAccountInfo(context.Background(), progPubkey)
if err != nil {
return nil, fmt.Errorf("failed to fetch program account: %w", err)
}
if resp.Value == nil {
return nil, errors.New("program account does not exist")
}

state, err := decodeUpgradeableLoaderState(resp.Value.Data.GetBinary())
if err != nil {
return nil, fmt.Errorf("decode error: %w", err)
}
return state, nil
}

func GetUpgradeAuthority(client *solRpc.Client, progDataPubkey solana.PublicKey) (solana.PublicKey, error) {
data, err := GetSolProgramData(client, progDataPubkey)
if err != nil {
return solana.PublicKey{}, fmt.Errorf("failed to get program data for %s: %w", progDataPubkey.String(), err)
}
state, err := getUpgradeableLoaderState(client, data.Address)
if err != nil {
return solana.PublicKey{}, fmt.Errorf("failed to get upgrade authority for program data %s: %w", progDataPubkey.String(), err)
}

if state.ProgramData == nil {
return solana.PublicKey{}, errors.New("unexpected state: no programdata")
}

if state.ProgramData.AuthorityOption == 0 {
// No authority – the program is immutable
return solana.PublicKey{}, nil
}
return state.ProgramData.Authority, nil
}
4 changes: 2 additions & 2 deletions chains/solana/deployment/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,15 @@ func GetSolProgramSize(chain cldf_solana.Chain, programID solana.PublicKey) (int
return programBytes, nil
}

func GetSolProgramData(chain cldf_solana.Chain, programID solana.PublicKey) (struct {
func GetSolProgramData(client *solrpc.Client, programID solana.PublicKey) (struct {
DataType uint32
Address solana.PublicKey
}, error) {
var programData struct {
DataType uint32
Address solana.PublicKey
}
data, err := chain.Client.GetAccountInfoWithOpts(context.Background(), programID, &solrpc.GetAccountInfoOpts{
data, err := client.GetAccountInfoWithOpts(context.Background(), programID, &solrpc.GetAccountInfoOpts{
Commitment: solrpc.CommitmentConfirmed,
})
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ var Initialize = operations.NewOperation(
"Initializes the FeeQuoter 1.6.0 contract",
func(b operations.Bundle, chain cldf_solana.Chain, input Params) (sequences.OnChainOutput, error) {
fee_quoter.SetProgramID(input.FeeQuoter)
programData, err := utils.GetSolProgramData(chain, input.FeeQuoter)
programData, err := utils.GetSolProgramData(chain.Client, input.FeeQuoter)
if err != nil {
return sequences.OnChainOutput{}, fmt.Errorf("failed to get program data: %w", err)
}
Expand Down
Loading
Loading