From bfc16a8af9123d1f70f3bc93217a658783d17e4d Mon Sep 17 00:00:00 2001 From: Pablo Date: Fri, 8 May 2026 09:58:48 -0600 Subject: [PATCH] chore: port solana generate view --- legacy/pkg/family/solana/state.go | 44 +++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/legacy/pkg/family/solana/state.go b/legacy/pkg/family/solana/state.go index 6542490..f0a4fcf 100644 --- a/legacy/pkg/family/solana/state.go +++ b/legacy/pkg/family/solana/state.go @@ -1,6 +1,7 @@ package solana import ( + "context" "errors" "fmt" @@ -13,6 +14,7 @@ import ( mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" cldchangesetscommon "github.com/smartcontractkit/cld-changesets/pkg/common" + "github.com/smartcontractkit/cld-changesets/pkg/contract/mcms/view/v1_0" ) type PDASeed [32]byte @@ -34,6 +36,48 @@ type MCMSWithTimelockPrograms struct { BypasserAccessControllerAccount solana.PublicKey } +// Validate checks that all fields are non-nil, ensuring it's ready +// for use generating views or interactions. +func (s *MCMSWithTimelockPrograms) Validate() error { + if s.McmProgram.IsZero() { + return errors.New("mcm program not found") + } + if s.TimelockProgram.IsZero() { + return errors.New("timelock program not found") + } + if s.AccessControllerProgram.IsZero() { + return errors.New("access controller program not found") + } + if s.ProposerAccessControllerAccount.IsZero() { + return errors.New("proposer access controller account not found") + } + if s.ExecutorAccessControllerAccount.IsZero() { + return errors.New("executor access controller account not found") + } + if s.CancellerAccessControllerAccount.IsZero() { + return errors.New("canceller access controller account not found") + } + if s.BypasserAccessControllerAccount.IsZero() { + return errors.New("bypasser access controller account not found") + } + + return nil +} + +func (s *MCMSWithTimelockPrograms) GenerateView( + ctx context.Context, chain cldf_solana.Chain, +) (v1_0.MCMSWithTimelockViewSolana, error) { + if err := s.Validate(); err != nil { + return v1_0.MCMSWithTimelockViewSolana{}, fmt.Errorf("unable to validate state: %w", err) + } + + inspector := mcmssolanasdk.NewInspector(chain.Client) + timelockInspector := mcmssolanasdk.NewTimelockInspector(chain.Client) + + return v1_0.GenerateMCMSWithTimelockViewSolana(ctx, inspector, timelockInspector, s.McmProgram, + s.ProposerMcmSeed, s.CancellerMcmSeed, s.BypasserMcmSeed, s.TimelockProgram, s.TimelockSeed) +} + func (s *MCMSWithTimelockPrograms) GetStateFromType(programType cldf.ContractType) (solana.PublicKey, PDASeed, error) { switch programType { case mcmscontracts.ManyChainMultisigProgram: