From 50cfb19f4a1f9fa03d62e660f1171d9a27e41cdd Mon Sep 17 00:00:00 2001 From: anirudhwarrier <12178754+anirudhwarrier@users.noreply.github.com> Date: Fri, 21 Nov 2025 15:10:54 +0400 Subject: [PATCH] feat: add changeset ty type --- cmd/account/link_key/link_key.go | 7 ++- cmd/account/unlink_key/unlink_key.go | 7 ++- cmd/client/client_factory.go | 2 + cmd/client/tx.go | 15 ++++++ cmd/secrets/common/handler.go | 1 + cmd/secrets/create/create.go | 2 +- cmd/secrets/delete/delete.go | 2 +- cmd/secrets/execute/execute.go | 2 +- cmd/secrets/list/list.go | 2 +- cmd/secrets/update/update.go | 2 +- cmd/workflow/activate/activate.go | 7 ++- cmd/workflow/delete/delete.go | 7 ++- cmd/workflow/deploy/deploy.go | 2 +- cmd/workflow/deploy/register.go | 68 ++++++++++++++++++++++++++++ cmd/workflow/pause/pause.go | 7 ++- internal/settings/settings_load.go | 15 +++--- 16 files changed, 131 insertions(+), 17 deletions(-) diff --git a/cmd/account/link_key/link_key.go b/cmd/account/link_key/link_key.go index 7db21e6f..b2cc88f1 100644 --- a/cmd/account/link_key/link_key.go +++ b/cmd/account/link_key/link_key.go @@ -84,7 +84,7 @@ func New(runtimeContext *runtime.Context) *cobra.Command { return h.Execute(inputs) }, } - settings.AddRawTxFlag(cmd) + settings.AddTxnTypeFlags(cmd) settings.AddSkipConfirmation(cmd) cmd.Flags().StringP("owner-label", "l", "", "Label for the workflow owner") @@ -327,6 +327,11 @@ func (h *handler) linkOwner(resp initiateLinkingResponse) error { fmt.Println("") fmt.Printf(" %x\n", txOut.RawTx.Data) fmt.Println("") + + case client.Changeset: + // TODO: implement changeset handling + fmt.Println("Changeset output type is not yet implemented") + default: h.log.Warn().Msgf("Unsupported transaction type: %s", txOut.Type) } diff --git a/cmd/account/unlink_key/unlink_key.go b/cmd/account/unlink_key/unlink_key.go index b3f36fd4..35bd8557 100644 --- a/cmd/account/unlink_key/unlink_key.go +++ b/cmd/account/unlink_key/unlink_key.go @@ -83,7 +83,7 @@ func New(runtimeContext *runtime.Context) *cobra.Command { return h.Execute(in) }, } - settings.AddRawTxFlag(cmd) + settings.AddTxnTypeFlags(cmd) settings.AddSkipConfirmation(cmd) return cmd } @@ -285,6 +285,11 @@ func (h *handler) unlinkOwner(owner string, resp initiateUnlinkingResponse) erro fmt.Println("") fmt.Printf(" %s\n", resp.TransactionData) fmt.Println("") + + case client.Changeset: + // TODO: implement changeset handling + fmt.Println("Changeset output type is not yet implemented") + default: h.log.Warn().Msgf("Unsupported transaction type: %s", txOut.Type) } diff --git a/cmd/client/client_factory.go b/cmd/client/client_factory.go index 7b502130..82e75882 100644 --- a/cmd/client/client_factory.go +++ b/cmd/client/client_factory.go @@ -88,6 +88,8 @@ func (f *factoryImpl) GetTxType() TxType { return Raw } else if f.viper.GetBool(settings.Flags.Ledger.Name) { return Ledger + } else if f.viper.GetBool(settings.Flags.Changeset.Name) { + return Changeset } return Regular } diff --git a/cmd/client/tx.go b/cmd/client/tx.go index 8bf55f42..8aab2b3b 100644 --- a/cmd/client/tx.go +++ b/cmd/client/tx.go @@ -31,6 +31,7 @@ const ( Regular TxType = iota Raw Ledger + Changeset ) type TxClientConfig struct { @@ -223,6 +224,20 @@ func (c *TxClient) executeTransactionByTxType(txFn func(opts *bind.TransactOpts) Args: cmdCommon.ToStringSlice(args), }, }, nil + case Changeset: + tx, err := txFn(cmdCommon.SimTransactOpts()) + if err != nil { + return TxOutput{Type: Changeset}, err + } + return TxOutput{ + Type: Changeset, + RawTx: RawTx{ + To: tx.To().Hex(), + Data: []byte{}, + Function: funName, + Args: cmdCommon.ToStringSlice(args), + }, + }, nil //case Ledger: // txOpts, err := c.ledgerOpts(c.ledgerConfig) // if err != nil { diff --git a/cmd/secrets/common/handler.go b/cmd/secrets/common/handler.go index b15f715d..2b28996e 100644 --- a/cmd/secrets/common/handler.go +++ b/cmd/secrets/common/handler.go @@ -173,6 +173,7 @@ func (h *Handler) ValidateInputs(inputs UpsertSecretsInputs) error { } // TODO: use TxType interface +// TODO: implement changeset handling func (h *Handler) PackAllowlistRequestTxData(reqDigest [32]byte, duration time.Duration) (string, error) { contractABI, err := abi.JSON(strings.NewReader(workflow_registry_wrapper_v2.WorkflowRegistryMetaData.ABI)) if err != nil { diff --git a/cmd/secrets/create/create.go b/cmd/secrets/create/create.go index 1d0e9693..3f06cdef 100644 --- a/cmd/secrets/create/create.go +++ b/cmd/secrets/create/create.go @@ -58,6 +58,6 @@ func New(ctx *runtime.Context) *cobra.Command { }, } - settings.AddRawTxFlag(cmd) + settings.AddTxnTypeFlags(cmd) return cmd } diff --git a/cmd/secrets/delete/delete.go b/cmd/secrets/delete/delete.go index 3da226ad..c673d09d 100644 --- a/cmd/secrets/delete/delete.go +++ b/cmd/secrets/delete/delete.go @@ -88,7 +88,7 @@ func New(ctx *runtime.Context) *cobra.Command { }, } - settings.AddRawTxFlag(cmd) + settings.AddTxnTypeFlags(cmd) return cmd } diff --git a/cmd/secrets/execute/execute.go b/cmd/secrets/execute/execute.go index 8e8fe066..9ef16fa0 100644 --- a/cmd/secrets/execute/execute.go +++ b/cmd/secrets/execute/execute.go @@ -89,7 +89,7 @@ func New(ctx *runtime.Context) *cobra.Command { }, } - settings.AddRawTxFlag(cmd) + settings.AddTxnTypeFlags(cmd) return cmd } diff --git a/cmd/secrets/list/list.go b/cmd/secrets/list/list.go index 1c402d1a..7968ec0c 100644 --- a/cmd/secrets/list/list.go +++ b/cmd/secrets/list/list.go @@ -64,7 +64,7 @@ func New(ctx *runtime.Context) *cobra.Command { } cmd.Flags().StringVar(&namespace, "namespace", "main", "Namespace to list (default: main)") - settings.AddRawTxFlag(cmd) + settings.AddTxnTypeFlags(cmd) return cmd } diff --git a/cmd/secrets/update/update.go b/cmd/secrets/update/update.go index f9577e16..a0504f26 100644 --- a/cmd/secrets/update/update.go +++ b/cmd/secrets/update/update.go @@ -64,7 +64,7 @@ func New(ctx *runtime.Context) *cobra.Command { }, } - settings.AddRawTxFlag(cmd) + settings.AddTxnTypeFlags(cmd) return cmd } diff --git a/cmd/workflow/activate/activate.go b/cmd/workflow/activate/activate.go index 549f461c..853fd292 100644 --- a/cmd/workflow/activate/activate.go +++ b/cmd/workflow/activate/activate.go @@ -54,7 +54,7 @@ func New(runtimeContext *runtime.Context) *cobra.Command { }, } - settings.AddRawTxFlag(activateCmd) + settings.AddTxnTypeFlags(activateCmd) settings.AddSkipConfirmation(activateCmd) return activateCmd @@ -196,6 +196,11 @@ func (h *handler) Execute() error { fmt.Println("") fmt.Printf(" %x\n", txOut.RawTx.Data) fmt.Println("") + + case client.Changeset: + // TODO: implement changeset handling + fmt.Println("Changeset output type is not yet implemented") + default: h.log.Warn().Msgf("Unsupported transaction type: %s", txOut.Type) } diff --git a/cmd/workflow/delete/delete.go b/cmd/workflow/delete/delete.go index 015a28b4..b8ed7260 100644 --- a/cmd/workflow/delete/delete.go +++ b/cmd/workflow/delete/delete.go @@ -55,7 +55,7 @@ func New(runtimeContext *runtime.Context) *cobra.Command { }, } - settings.AddRawTxFlag(deleteCmd) + settings.AddTxnTypeFlags(deleteCmd) settings.AddSkipConfirmation(deleteCmd) return deleteCmd @@ -208,6 +208,11 @@ func (h *handler) Execute() error { fmt.Println("") fmt.Printf(" %x\n", txOut.RawTx.Data) fmt.Println("") + + case client.Changeset: + // TODO: implement changeset handling + fmt.Println("Changeset output type is not yet implemented") + default: h.log.Warn().Msgf("Unsupported transaction type: %s", txOut.Type) } diff --git a/cmd/workflow/deploy/deploy.go b/cmd/workflow/deploy/deploy.go index 91fe8deb..a1c7282b 100644 --- a/cmd/workflow/deploy/deploy.go +++ b/cmd/workflow/deploy/deploy.go @@ -94,7 +94,7 @@ func New(runtimeContext *runtime.Context) *cobra.Command { }, } - settings.AddRawTxFlag(deployCmd) + settings.AddTxnTypeFlags(deployCmd) settings.AddSkipConfirmation(deployCmd) deployCmd.Flags().StringP("output", "o", defaultOutputPath, "The output file for the compiled WASM binary encoded in base64") deployCmd.Flags().StringP("owner-label", "l", "", "Label for the workflow owner (used during auto-link if owner is not already linked)") diff --git a/cmd/workflow/deploy/register.go b/cmd/workflow/deploy/register.go index dd95f71a..98fb5a8b 100644 --- a/cmd/workflow/deploy/register.go +++ b/cmd/workflow/deploy/register.go @@ -3,12 +3,39 @@ package deploy import ( "encoding/hex" "fmt" + "os" + "path/filepath" "github.com/ethereum/go-ethereum/common" + "gopkg.in/yaml.v2" "github.com/smartcontractkit/cre-cli/cmd/client" ) +type ChangesetFile struct { + Changesets []Changeset `yaml:"changesets"` +} + +type Changeset struct { + WorkflowUpsert WorkflowUpsert `yaml:"workflow_upsert"` +} + +type WorkflowUpsert struct { + Payload Payload `yaml:"payload"` +} + +type Payload struct { + WorkflowID string `yaml:"workflowID"` + WorkflowName string `yaml:"workflowName"` + WorkflowTag string `yaml:"workflowTag"` + WorkflowStatus uint8 `yaml:"workflowStatus"` + DonFamily string `yaml:"donFamily"` + BinaryURL string `yaml:"binaryURL"` + ConfigURL string `yaml:"configURL"` + Attributes string `yaml:"attributes"` + KeepAlive bool `yaml:"keepAlive"` +} + func (h *handler) upsert() error { if !h.validated { return fmt.Errorf("handler inputs not validated") @@ -84,6 +111,47 @@ func (h *handler) handleUpsert(params client.RegisterWorkflowV2Parameters) error fmt.Println("") fmt.Printf(" %x\n", txOut.RawTx.Data) fmt.Println("") + + case client.Changeset: + csFile := ChangesetFile{ + Changesets: []Changeset{ + { + WorkflowUpsert: WorkflowUpsert{ + Payload: Payload{ + WorkflowID: hex.EncodeToString(params.WorkflowID[:]), + WorkflowName: params.WorkflowName, + WorkflowTag: params.Tag, + WorkflowStatus: params.Status, + DonFamily: params.DonFamily, + BinaryURL: params.BinaryURL, + ConfigURL: params.ConfigURL, + Attributes: string(params.Attributes), + KeepAlive: params.KeepAlive, + }, + }, + }, + }, + } + + yamlData, err := yaml.Marshal(&csFile) + if err != nil { + return fmt.Errorf("failed to marshal changeset to yaml: %w", err) + } + + fileName := fmt.Sprintf("UpsertWorkflow_%s_%s.yaml", workflowName, h.workflowArtifact.WorkflowID) + workingDir, err := os.Getwd() + if err != nil { + return fmt.Errorf("failed to get working directory: %w", err) + } + if err := os.WriteFile(fileName, yamlData, 0600); err != nil { + return fmt.Errorf("failed to write changeset yaml file: %w", err) + } + + fmt.Println("") + fmt.Println("Changeset YAML file generated!") + fmt.Printf("File: %s\n", filepath.Join(workingDir, fileName)) + fmt.Println("") + default: h.log.Warn().Msgf("Unsupported transaction type: %s", txOut.Type) } diff --git a/cmd/workflow/pause/pause.go b/cmd/workflow/pause/pause.go index d2e46dc4..7cd12cb7 100644 --- a/cmd/workflow/pause/pause.go +++ b/cmd/workflow/pause/pause.go @@ -54,7 +54,7 @@ func New(runtimeContext *runtime.Context) *cobra.Command { }, } - settings.AddRawTxFlag(pauseCmd) + settings.AddTxnTypeFlags(pauseCmd) settings.AddSkipConfirmation(pauseCmd) return pauseCmd } @@ -197,6 +197,11 @@ func (h *handler) Execute() error { fmt.Println("") fmt.Printf(" %x\n", txOut.RawTx.Data) fmt.Println("") + + case client.Changeset: + // TODO: implement changeset handling + fmt.Println("Changeset output type is not yet implemented") + default: h.log.Warn().Msgf("Unsupported transaction type: %s", txOut.Type) } diff --git a/internal/settings/settings_load.go b/internal/settings/settings_load.go index 30f6c365..fbdb6456 100644 --- a/internal/settings/settings_load.go +++ b/internal/settings/settings_load.go @@ -38,6 +38,7 @@ type flagNames struct { OverridePreviousRoot Flag Description Flag RawTxFlag Flag + Changeset Flag Ledger Flag LedgerDerivationPath Flag NonInteractive Flag @@ -52,20 +53,22 @@ var Flags = flagNames{ Target: Flag{"target", "T"}, OverridePreviousRoot: Flag{"override-previous-root", "O"}, RawTxFlag: Flag{"unsigned", ""}, + Changeset: Flag{"changeset", ""}, Ledger: Flag{"ledger", ""}, LedgerDerivationPath: Flag{"ledger-derivation-path", ""}, NonInteractive: Flag{"non-interactive", ""}, SkipConfirmation: Flag{"yes", "y"}, } -func AddTxnTypeFlags(cmd *cobra.Command) { - AddRawTxFlag(cmd) - cmd.Flags().Bool(Flags.Ledger.Name, false, "Sign the workflow with a Ledger device [EXPERIMENTAL]") - cmd.Flags().String(Flags.LedgerDerivationPath.Name, "m/44'/60'/0'/0/0", "Derivation path for the Ledger device") -} +//func AddTxnTypeFlags(cmd *cobra.Command) { +// AddTxnTypeFlags(cmd) +// cmd.Flags().Bool(Flags.Ledger.Name, false, "Sign the workflow with a Ledger device [EXPERIMENTAL]") +// cmd.Flags().String(Flags.LedgerDerivationPath.Name, "m/44'/60'/0'/0/0", "Derivation path for the Ledger device") +//} -func AddRawTxFlag(cmd *cobra.Command) { +func AddTxnTypeFlags(cmd *cobra.Command) { cmd.Flags().Bool(Flags.RawTxFlag.Name, false, "If set, the command will either return the raw transaction instead of sending it to the network or execute the second step of secrets operations using a previously generated raw transaction") + cmd.Flags().Bool(Flags.Changeset.Name, false, "If set, the command will output a changeset YAML for use with CLD instead of sending the transaction to the network") } func AddSkipConfirmation(cmd *cobra.Command) {