From 326147831cb8ece4708ccc6fd57ecd7f0f268049 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Tue, 9 Dec 2025 16:51:05 -0600 Subject: [PATCH 01/26] extend cldf proposal conversion logic --- chain/ton/provider/ctf_provider.go | 16 ++++--- chain/ton/provider/ctf_provider_test.go | 2 +- chain/ton/provider/rpc_provider.go | 8 ++++ chain/ton/ton_chain.go | 8 ++++ engine/cld/legacy/cli/mcmsv2/mcms_v2.go | 49 ++++++++++++++------- go.mod | 27 ++++++------ go.sum | 57 +++++++++++-------------- 7 files changed, 100 insertions(+), 67 deletions(-) diff --git a/chain/ton/provider/ctf_provider.go b/chain/ton/provider/ctf_provider.go index 74aecec3..5a73473d 100644 --- a/chain/ton/provider/ctf_provider.go +++ b/chain/ton/provider/ctf_provider.go @@ -34,6 +34,9 @@ const ( // supportedTONImageRepository is the only supported Docker image repository for TON localnet. supportedTONImageRepository = "ghcr.io/neodix42/mylocalton-docker" + + // defaultTxTONAmount is the default amount of TON to use for transactions. + defaultTxTONAmount = "0.1" ) // CTFChainProviderConfig holds the configuration to initialize the CTFChainProvider. @@ -123,17 +126,20 @@ func (p *CTFChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er } // airdrop the deployer wallet - ferr := fundTonWallets(ctx, nodeClient, []*address.Address{tonWallet.Address()}, []tlb.Coins{tlb.MustFromTON("1000")}) - if ferr != nil { - return nil, fmt.Errorf("failed to fund wallet: %w", ferr) + err = fundTonWallets(ctx, nodeClient, []*address.Address{tonWallet.WalletAddress()}, []tlb.Coins{tlb.MustFromTON("1000")}) // TODO does 1000 here make sense? + if err != nil { + return nil, fmt.Errorf("failed to fund wallet: %w", err) } p.chain = &cldf_ton.Chain{ ChainMetadata: cldf_ton.ChainMetadata{Selector: p.selector}, Client: nodeClient, - Wallet: tonWallet, - WalletAddress: tonWallet.Address(), + WalletAddress: tonWallet.WalletAddress(), URL: url, + TxOps: cldf_ton.TxOps{ + Wallet: tonWallet, + Amount: tlb.MustFromTON(defaultTxTONAmount), // default amount for transactions + }, } return *p.chain, nil diff --git a/chain/ton/provider/ctf_provider_test.go b/chain/ton/provider/ctf_provider_test.go index f32e7341..4ada120d 100644 --- a/chain/ton/provider/ctf_provider_test.go +++ b/chain/ton/provider/ctf_provider_test.go @@ -88,7 +88,7 @@ func Test_CTFChainProvider_Initialize(t *testing.T) { require.True(t, ok, "expected got to be of type ton.Chain") assert.Equal(t, tt.giveSelector, gotChain.Selector) assert.NotEmpty(t, gotChain.Client) - assert.NotEmpty(t, gotChain.Wallet) + assert.NotEmpty(t, gotChain.TxOps) assert.NotEmpty(t, gotChain.WalletAddress) } }) diff --git a/chain/ton/provider/rpc_provider.go b/chain/ton/provider/rpc_provider.go index b36c936f..7796f5a7 100644 --- a/chain/ton/provider/rpc_provider.go +++ b/chain/ton/provider/rpc_provider.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/xssnick/tonutils-go/liteclient" + "github.com/xssnick/tonutils-go/tlb" tonlib "github.com/xssnick/tonutils-go/ton" "github.com/xssnick/tonutils-go/ton/wallet" @@ -22,6 +23,8 @@ const ( WalletVersionV4R2 WalletVersion = "V4R2" WalletVersionV5R1 WalletVersion = "V5R1" WalletVersionDefault WalletVersion = "" + + defaultAmountTonString = "0.1" // Default amount in TON for transactions ) // RPCChainProviderConfig holds the configuration to initialize the RPCChainProvider. @@ -36,6 +39,7 @@ type RPCChainProviderConfig struct { // Optional: The TON wallet version to use. Supported versions are: V1R1, V1R2, V1R3, V2R1, // V2R2, V3R1, V3R2, V4R1, V4R2 and V5R1. If no value provided, V5R1 is used as default. WalletVersion WalletVersion + Amount string } // validateLiteserverURL validates the format of a liteserver URL @@ -181,6 +185,10 @@ func (p *RPCChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er Wallet: tonWallet, WalletAddress: tonWallet.WalletAddress(), URL: p.config.HTTPURL, + TxOps: ton.TxOps{ + Wallet: tonWallet, + Amount: tlb.MustFromTON(defaultAmountTonString), + }, } return *p.chain, nil diff --git a/chain/ton/ton_chain.go b/chain/ton/ton_chain.go index 70a6d069..5222c4cf 100644 --- a/chain/ton/ton_chain.go +++ b/chain/ton/ton_chain.go @@ -6,10 +6,17 @@ import ( "github.com/xssnick/tonutils-go/ton/wallet" "github.com/smartcontractkit/chainlink-deployments-framework/chain/internal/common" + "github.com/xssnick/tonutils-go/tlb" ) type ChainMetadata = common.ChainMetadata +// TxOps holds configuration for transaction operations. +type TxOps struct { + Wallet *wallet.Wallet // Wallet abstraction (signing, sending) + Amount tlb.Coins // Default amount for msg transfers +} + // Chain represents a TON chain. type Chain struct { ChainMetadata // Contains canonical chain identifier @@ -17,4 +24,5 @@ type Chain struct { Wallet *wallet.Wallet // Wallet abstraction (signing, sending) WalletAddress *address.Address // Address of deployer wallet URL string // Liteserver URL + TxOps TxOps // Transaction operations configuration } diff --git a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go index 56aa6b37..b45e01fd 100644 --- a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go +++ b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go @@ -28,6 +28,7 @@ import ( "github.com/smartcontractkit/mcms/sdk/evm/bindings" "github.com/smartcontractkit/mcms/sdk/solana" "github.com/smartcontractkit/mcms/sdk/sui" + "github.com/smartcontractkit/mcms/sdk/ton" "github.com/smartcontractkit/mcms/types" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -1183,6 +1184,8 @@ func newCfgv2(lggr logger.Logger, cmd *cobra.Command, domain cldf_domain.Domain, if err != nil { return nil, fmt.Errorf("error creating Sui timelock converter: %w", err) } + case chainsel.FamilyTon: + converter = ton.NewTimelockConverter() default: return nil, fmt.Errorf("unsupported chain family %s", fam) } @@ -1489,18 +1492,18 @@ func getExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainSelector) if !ok { return nil, fmt.Errorf("invalid encoder type: %T", encoder) } - chain := cfg.blockchains.EVMChains()[uint64(chainSelector)] + c := cfg.blockchains.EVMChains()[uint64(chainSelector)] - return evm.NewExecutor(evmEncoder, chain.Client, chain.DeployerKey), nil + return evm.NewExecutor(evmEncoder, c.Client, c.DeployerKey), nil case chainsel.FamilySolana: solanaEncoder, ok := encoder.(*solana.Encoder) if !ok { return nil, fmt.Errorf("invalid encoder type: %T", encoder) } - chain := cfg.blockchains.SolanaChains()[uint64(chainSelector)] + c := cfg.blockchains.SolanaChains()[uint64(chainSelector)] - return solana.NewExecutor(solanaEncoder, chain.Client, *chain.DeployerKey), nil + return solana.NewExecutor(solanaEncoder, c.Client, *c.DeployerKey), nil case chainsel.FamilyAptos: encoder, ok := encoder.(*aptos.Encoder) @@ -1511,9 +1514,9 @@ func getExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainSelector) if err != nil { return nil, fmt.Errorf("error getting aptos role from proposal: %w", err) } - chain := cfg.blockchains.AptosChains()[uint64(chainSelector)] + c := cfg.blockchains.AptosChains()[uint64(chainSelector)] - return aptos.NewExecutor(chain.Client, chain.DeployerSigner, encoder, *role), nil + return aptos.NewExecutor(c.Client, c.DeployerSigner, encoder, *role), nil case chainsel.FamilySui: encoder, ok := encoder.(*sui.Encoder) @@ -1524,10 +1527,18 @@ func getExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainSelector) if err != nil { return nil, fmt.Errorf("error getting sui metadata from proposal: %w", err) } - chain := cfg.blockchains.SuiChains()[uint64(chainSelector)] + c := cfg.blockchains.SuiChains()[uint64(chainSelector)] entrypointEncoder := suibindings.NewCCIPEntrypointArgEncoder(metadata.RegistryObj, metadata.DeployerStateObj) - return sui.NewExecutor(chain.Client, chain.Signer, encoder, entrypointEncoder, metadata.McmsPackageID, metadata.Role, cfg.timelockProposal.ChainMetadata[chainSelector].MCMAddress, metadata.AccountObj, metadata.RegistryObj, metadata.TimelockObj) + return sui.NewExecutor(c.Client, c.Signer, encoder, entrypointEncoder, metadata.McmsPackageID, metadata.Role, cfg.timelockProposal.ChainMetadata[chainSelector].MCMAddress, metadata.AccountObj, metadata.RegistryObj, metadata.TimelockObj) + case chainsel.FamilyTon: + encoder, ok := encoder.(*ton.Encoder) + if !ok { + return nil, fmt.Errorf("error getting encoder for chain %d", cfg.chainSelector) + } + c := cfg.blockchains.TonChains()[uint64(chainSelector)] + + return ton.NewExecutor(encoder, c.Client, c.TxOps.Wallet, c.TxOps.Amount) default: return nil, fmt.Errorf("unsupported chain family %s", family) } @@ -1557,26 +1568,29 @@ func getTimelockExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainS var executor sdk.TimelockExecutor switch family { case chainsel.FamilyEVM: - chain := cfg.blockchains.EVMChains()[uint64(chainSelector)] + c := cfg.blockchains.EVMChains()[uint64(chainSelector)] - executor = evm.NewTimelockExecutor(chain.Client, chain.DeployerKey) + executor = evm.NewTimelockExecutor(c.Client, c.DeployerKey) case chainsel.FamilySolana: - chain := cfg.blockchains.SolanaChains()[uint64(chainSelector)] - executor = solana.NewTimelockExecutor(chain.Client, *chain.DeployerKey) + c := cfg.blockchains.SolanaChains()[uint64(chainSelector)] + executor = solana.NewTimelockExecutor(c.Client, *c.DeployerKey) case chainsel.FamilyAptos: - chain := cfg.blockchains.AptosChains()[uint64(chainSelector)] - executor = aptos.NewTimelockExecutor(chain.Client, chain.DeployerSigner) + c := cfg.blockchains.AptosChains()[uint64(chainSelector)] + executor = aptos.NewTimelockExecutor(c.Client, c.DeployerSigner) case chainsel.FamilySui: - chain := cfg.blockchains.SuiChains()[uint64(chainSelector)] + c := cfg.blockchains.SuiChains()[uint64(chainSelector)] metadata, err := suiMetadataFromProposal(chainSelector, cfg.timelockProposal) if err != nil { return nil, fmt.Errorf("error getting sui metadata from proposal: %w", err) } entrypointEncoder := suibindings.NewCCIPEntrypointArgEncoder(metadata.AccountObj, metadata.DeployerStateObj) - executor, err = sui.NewTimelockExecutor(chain.Client, chain.Signer, entrypointEncoder, metadata.McmsPackageID, metadata.RegistryObj, metadata.AccountObj) + executor, err = sui.NewTimelockExecutor(c.Client, c.Signer, entrypointEncoder, metadata.McmsPackageID, metadata.RegistryObj, metadata.AccountObj) if err != nil { return nil, fmt.Errorf("error creating sui timelock executor: %w", err) } + case chainsel.FamilyTon: + c := cfg.blockchains.TonChains()[uint64(chainSelector)] + return ton.NewTimelockExecutor(c.Client, c.TxOps.Wallet, c.TxOps.Amount) default: return nil, fmt.Errorf("unsupported chain family %s", family) } @@ -1631,6 +1645,9 @@ var getInspectorFromChainSelector = func(cfg cfgv2) (sdk.Inspector, error) { if err != nil { return nil, fmt.Errorf("error creating sui inspector: %w", err) } + case chainsel.FamilyTon: + chain := cfg.blockchains.TonChains()[cfg.chainSelector] + inspector = ton.NewInspector(chain.Client) default: return nil, fmt.Errorf("unsupported chain family %s", fam) } diff --git a/go.mod b/go.mod index 24005314..c487f119 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/smartcontractkit/chainlink-deployments-framework -go 1.24.5 +go 1.25.3 replace github.com/fbsobreira/gotron-sdk => github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.4 @@ -29,7 +29,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.85 github.com/smartcontractkit/chainlink-aptos v0.0.0-20251024142440-51f2ad2652a2 - github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20250903115155-a68d8c28ae1d + github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251024142759-093ed1b4017f github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250805210128-7f8a0f403c3a github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250805210128-7f8a0f403c3a github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 @@ -38,15 +38,15 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.2 github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335 github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e - github.com/smartcontractkit/libocr v0.0.0-20250707144819-babe0ec4e358 - github.com/smartcontractkit/mcms v0.31.1 - github.com/spf13/cobra v1.8.1 + github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d + github.com/smartcontractkit/mcms v0.31.2-0.20251209144844-5431a6ab1526 + github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.11.1 github.com/testcontainers/testcontainers-go v0.39.0 github.com/testcontainers/testcontainers-go/modules/postgres v0.38.0 - github.com/xssnick/tonutils-go v1.13.0 + github.com/xssnick/tonutils-go v1.14.1 github.com/zksync-sdk/zksync2-go v1.1.1-0.20250620124214-2c742ee399c6 go.uber.org/zap v1.27.1 golang.org/x/crypto v0.45.0 @@ -70,9 +70,10 @@ require ( github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/lib/pq v1.10.9 // indirect github.com/minio/sha256-simd v1.0.1 // indirect - github.com/smartcontractkit/chainlink-common v0.9.5-0.20250908082700-aa3f5927af8c // indirect - github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.1 // indirect - github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250829155125-f4655b0b4605 // indirect + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251003171904-99a82a53b142 // indirect + github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.4 // indirect + github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250911124514-5874cc6d62b2 // indirect + github.com/smartcontractkit/chainlink-ton v0.0.0-20251209121704-8d997e4a1833 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) @@ -158,7 +159,6 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/graph-gophers/graphql-go v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect @@ -217,7 +217,6 @@ require ( github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect github.com/oklog/run v1.2.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect @@ -230,7 +229,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect + github.com/prometheus/client_golang v1.23.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect github.com/prometheus/procfs v0.16.1 // indirect @@ -240,7 +239,7 @@ require ( github.com/rs/zerolog v1.34.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect - github.com/samber/lo v1.49.1 // indirect + github.com/samber/lo v1.52.0 // indirect github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect github.com/scylladb/go-reflectx v1.0.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect @@ -272,7 +271,7 @@ require ( github.com/x448/float16 v0.8.4 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.mongodb.org/mongo-driver v1.17.0 // indirect + go.mongodb.org/mongo-driver v1.17.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect diff --git a/go.sum b/go.sum index 091e7660..76cbf3a2 100644 --- a/go.sum +++ b/go.sum @@ -171,7 +171,7 @@ github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= @@ -267,7 +267,6 @@ github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874/go.mod h1: github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -332,7 +331,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -576,8 +574,6 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= github.com/oklog/run v1.2.0 h1:O8x3yXwah4A73hJdlrwo/2X6J62gE5qTMusH0dvz60E= github.com/oklog/run v1.2.0/go.mod h1:mgDbKRSwPhJfesJ4PntqFUbKQRZ50NgmZTSPlFA0YFk= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= @@ -602,7 +598,6 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= @@ -635,8 +630,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= @@ -665,8 +660,8 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= -github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= -github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= +github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= +github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= @@ -695,18 +690,18 @@ github.com/smartcontractkit/chain-selectors v1.0.85 h1:A7eyN7KIACxmngn1MJJ0giVtf github.com/smartcontractkit/chain-selectors v1.0.85/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-aptos v0.0.0-20251024142440-51f2ad2652a2 h1:vGdeMwHO3ow88HvxfhA4DDPYNY0X9jmdux7L83UF/W8= github.com/smartcontractkit/chainlink-aptos v0.0.0-20251024142440-51f2ad2652a2/go.mod h1:iteU0WORHkArACVh/HoY/1bipV4TcNcJdTmom9uIT0E= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20250903115155-a68d8c28ae1d h1:4tEhMQnJW5jndVxukgC+/CVf+FkHVKg3AYygkMtOVUQ= -github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20250903115155-a68d8c28ae1d/go.mod h1://SdVNO8EApDtkB+iaexDScAnapRAvcGbxgF3H6ixhY= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251024142759-093ed1b4017f h1:jP2BHA7+QSp5IzWykT8KunThNbSwEM9j6lCXwEoxTIc= +github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251024142759-093ed1b4017f/go.mod h1:pETrvAF8uvkZgtDgI/oRllZZaC4IpPO26tMxh1u9LC4= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250805210128-7f8a0f403c3a h1:kQ8Zs6OzXizScIK8PEb8THxDUziGttGT9D6tTTAwmZk= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250805210128-7f8a0f403c3a/go.mod h1:Ve1xD71bl193YIZQEoJMmBqLGQJdNs29bwbuObwvbhQ= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250805210128-7f8a0f403c3a h1:38dAlTPRUQHZus5dCnBnQyf/V4oYn0p2svWlbPgHDQ4= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250805210128-7f8a0f403c3a/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= -github.com/smartcontractkit/chainlink-common v0.9.5-0.20250908082700-aa3f5927af8c h1:2cnAGt0nedGS/M0deXRCIJVsxTWi6CzYPXkTxqVwViY= -github.com/smartcontractkit/chainlink-common v0.9.5-0.20250908082700-aa3f5927af8c/go.mod h1:b5KI42+P0ZmUXuvOFzSH9uIB8K83wvXq1GNVoY+ePeg= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.1 h1:ca2z5OXgnbBPQRxpwXwBLJsUA1+cAp5ncfW4Ssvd6eY= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.1/go.mod h1:NZv/qKYGFRnkjOYBouajnDfFoZ+WDa6H2KNmSf1dnKc= -github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250829155125-f4655b0b4605 h1:yVH5tLDzW2ZBUpmkHF5nci1SRSXTcU3A1VZ8iS5qudA= -github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250829155125-f4655b0b4605/go.mod h1:jUC52kZzEnWF9tddHh85zolKybmLpbQ1oNA4FjOHt1Q= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251003171904-99a82a53b142 h1:xyGWWEwIwZv4wflEA12TDBGKEa86tDEECzl3n1Az2m0= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251003171904-99a82a53b142/go.mod h1:1r3aM96KHAESfnayJ3BTHCkP1qJS1BEG1r4czeoaXlA= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.4 h1:hvqATtrZ0iMRTI80cpBot/3JFbjz2j+2tvpfooVhRHw= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.4/go.mod h1:eKGyfTKzr0/PeR7qKN4l2FcW9p+HzyKUwAfGhm/5YZc= +github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250911124514-5874cc6d62b2 h1:1/KdO5AbUr3CmpLjMPuJXPo2wHMbfB8mldKLsg7D4M8= +github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250911124514-5874cc6d62b2/go.mod h1:jUC52kZzEnWF9tddHh85zolKybmLpbQ1oNA4FjOHt1Q= github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 h1:xHPmFDhff7QpeFxKsZfk+24j4AlnQiFjjRh5O87Peu4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/op-catalog v0.0.4 h1:AEnxv4HM3WD1RbQkRiFyb9cJ6YKAcqBp1CpIcFdZfuo= @@ -717,6 +712,8 @@ github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 h1:Ld3 github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1/go.mod h1:r6KXRM1u9ch5KFR2jspkgtyWEC1X+gxPCL8mR63U990= github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.2 h1:ZJ/8Jx6Be5//TyjPi1pS1uotnmcYq5vVkSyISIymSj8= github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.2/go.mod h1:kHYJnZUqiPF7/xN5273prV+srrLJkS77GbBXHLKQpx0= +github.com/smartcontractkit/chainlink-ton v0.0.0-20251209121704-8d997e4a1833 h1:jy8TfjU+A1MFt70JRJ9GjTQshNlk/dBpRPzXmdHKDPk= +github.com/smartcontractkit/chainlink-ton v0.0.0-20251209121704-8d997e4a1833/go.mod h1:rxekiaWnJnFFfklae1OvO6T7xHJtsEldDvW/e5+b/qg= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335 h1:7bxYNrPpygn8PUSBiEKn8riMd7CXMi/4bjTy0fHhcrY= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335/go.mod h1:ccjEgNeqOO+bjPddnL4lUrNLzyCvGCxgBjJdhFX3wa8= github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.4 h1:J4qtAo0ZmgX5pIr8Y5mdC+J2rj2e/6CTUC263t6mGOM= @@ -725,19 +722,19 @@ github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e h1:Hv9 github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e/go.mod h1:T4zH9R8R8lVWKfU7tUvYz2o2jMv1OpGCdpY2j2QZXzU= 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-20250707144819-babe0ec4e358 h1:+NVzR5LZVazRUunzVn34u+lwnpmn6NTVPCeZOVyQHLo= -github.com/smartcontractkit/libocr v0.0.0-20250707144819-babe0ec4e358/go.mod h1:Acy3BTBxou83ooMESLO90s8PKSu7RvLCzwSTbxxfOK0= -github.com/smartcontractkit/mcms v0.31.1 h1:sUIJG9pTMTpQ9WkLGSuPAIjq7z0b1KQ5rnL9KxaonXE= -github.com/smartcontractkit/mcms v0.31.1/go.mod h1:s/FrY+wVrmK7IfrSq8VPLGqqplX9Nv6Qek47ubz2+n8= +github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d h1:/0/80Ic6wpKH5F1nwDoRj9+70IxXunvCyNcCkA+9ik0= +github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d/go.mod h1:Acy3BTBxou83ooMESLO90s8PKSu7RvLCzwSTbxxfOK0= +github.com/smartcontractkit/mcms v0.31.2-0.20251209144844-5431a6ab1526 h1:IZ8SZA8bLPe0eQ14npcVuTmDV6BldY9aeHKzCviloL0= +github.com/smartcontractkit/mcms v0.31.2-0.20251209144844-5431a6ab1526/go.mod h1:ciwGs3cGDB5yCorkEWy8VSOmE89HZwuldz0tKfjeCwI= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= @@ -808,8 +805,8 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= -github.com/xssnick/tonutils-go v1.13.0 h1:LV2JzB+CuuWaLQiYNolK+YI3NRQOpS0W+T+N+ctF6VQ= -github.com/xssnick/tonutils-go v1.13.0/go.mod h1:EDe/9D/HZpAenbR+WPMQHICOF0BZWAe01TU5+Vpg08k= +github.com/xssnick/tonutils-go v1.14.1 h1:zV/iVYl/h3hArS+tPsd9XrSFfGert3r21caMltPSeHg= +github.com/xssnick/tonutils-go v1.14.1/go.mod h1:68xwWjpoGGqiTbLJ0gT63sKu1Z1moCnDLLzA+DKanIg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -821,15 +818,14 @@ github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaD github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/zksync-sdk/zksync2-go v1.1.1-0.20250620124214-2c742ee399c6 h1:VRdX3Gn/I7ITbzUY4ZNfgn65tdQM9Zhf2b7KP0HZllk= github.com/zksync-sdk/zksync2-go v1.1.1-0.20250620124214-2c742ee399c6/go.mod h1:NWNlQS21isOsSsn+hLRAPpiuv+3P+LcdaZNuRt2T5Yo= -go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k= -go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= +go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM= +go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= -go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= @@ -864,7 +860,6 @@ go.opentelemetry.io/otel/sdk/log/logtest v0.13.0 h1:9yio6AFZ3QD9j9oqshV1Ibm9gPLl go.opentelemetry.io/otel/sdk/log/logtest v0.13.0/go.mod h1:QOGiAJHl+fob8Nu85ifXfuQYmJTFAvcrxL6w5/tu168= go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= -go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI= From ce292f96725d8af13ea55d2b3a568cc541c236f8 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Tue, 9 Dec 2025 21:24:08 -0600 Subject: [PATCH 02/26] fix goimport --- chain/ton/ton_chain.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chain/ton/ton_chain.go b/chain/ton/ton_chain.go index 5222c4cf..0300e472 100644 --- a/chain/ton/ton_chain.go +++ b/chain/ton/ton_chain.go @@ -5,8 +5,9 @@ import ( "github.com/xssnick/tonutils-go/ton" "github.com/xssnick/tonutils-go/ton/wallet" - "github.com/smartcontractkit/chainlink-deployments-framework/chain/internal/common" "github.com/xssnick/tonutils-go/tlb" + + "github.com/smartcontractkit/chainlink-deployments-framework/chain/internal/common" ) type ChainMetadata = common.ChainMetadata From 76f794103b38c6bc342f4723de72ff320f618920 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Wed, 10 Dec 2025 10:18:11 -0600 Subject: [PATCH 03/26] rm redundant wallet funds --- chain/ton/provider/ctf_provider.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/chain/ton/provider/ctf_provider.go b/chain/ton/provider/ctf_provider.go index 5a73473d..a0ad2d6a 100644 --- a/chain/ton/provider/ctf_provider.go +++ b/chain/ton/provider/ctf_provider.go @@ -125,12 +125,6 @@ func (p *CTFChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er return nil, fmt.Errorf("failed to create wallet: %w", err) } - // airdrop the deployer wallet - err = fundTonWallets(ctx, nodeClient, []*address.Address{tonWallet.WalletAddress()}, []tlb.Coins{tlb.MustFromTON("1000")}) // TODO does 1000 here make sense? - if err != nil { - return nil, fmt.Errorf("failed to fund wallet: %w", err) - } - p.chain = &cldf_ton.Chain{ ChainMetadata: cldf_ton.ChainMetadata{Selector: p.selector}, Client: nodeClient, From 6b03e06cdd49fb984e32f855353f49f2ad0e2e17 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Wed, 10 Dec 2025 10:40:18 -0600 Subject: [PATCH 04/26] remove unused fundwallet func --- chain/ton/provider/ctf_provider.go | 49 ------------------------------ 1 file changed, 49 deletions(-) diff --git a/chain/ton/provider/ctf_provider.go b/chain/ton/provider/ctf_provider.go index a0ad2d6a..8bf445b2 100644 --- a/chain/ton/provider/ctf_provider.go +++ b/chain/ton/provider/ctf_provider.go @@ -13,7 +13,6 @@ import ( "github.com/avast/retry-go/v4" "github.com/testcontainers/testcontainers-go" - "github.com/xssnick/tonutils-go/address" "github.com/xssnick/tonutils-go/tlb" "github.com/xssnick/tonutils-go/ton" "github.com/xssnick/tonutils-go/ton/wallet" @@ -220,54 +219,6 @@ func createTonWallet(client ton.APIClientWrapped, versionConfig wallet.VersionCo return pw, nil } -func fundTonWallets(ctx context.Context, client ton.APIClientWrapped, recipients []*address.Address, amounts []tlb.Coins) error { - if len(amounts) != len(recipients) { - return errors.New("recipients and amounts must have the same length") - } - - // initialize the prefunded wallet(Highload-V2), for other wallets, see https://github.com/neodix42/mylocalton-docker#pre-installed-wallets - version := wallet.HighloadV2Verified //nolint:staticcheck // SA1019: only available option in mylocalton-docker - rawHlWallet, err := wallet.FromSeed(client, strings.Fields(blockchain.DefaultTonHlWalletMnemonic), version) - if err != nil { - return fmt.Errorf("failed to create wallet from seed: %w", err) - } - - mcFunderWallet, err := wallet.FromPrivateKeyWithOptions(client, rawHlWallet.PrivateKey(), version, wallet.WithWorkchain(-1)) - if err != nil { - return fmt.Errorf("failed to create wallet from private key: %w", err) - } - - funder, err := mcFunderWallet.GetSubwallet(uint32(42)) - if err != nil { - return fmt.Errorf("failed to get subwallet: %w", err) - } - - // double check funder address - if funder.Address().StringRaw() != blockchain.DefaultTonHlWalletAddress { - return fmt.Errorf("funder address mismatch: %s != %s", funder.Address().StringRaw(), blockchain.DefaultTonHlWalletAddress) - } - - // create transfer messages for each recipient - messages := make([]*wallet.Message, len(recipients)) - for i, addr := range recipients { - transfer, terr := funder.BuildTransfer(addr, amounts[i], false, "") - if terr != nil { - return fmt.Errorf("failed to build transfer: %w", terr) - } - messages[i] = transfer - } - - // we don't wait for the transaction to be confirmed here, as it may take some time - // the name SendManyWaitTransaction is misleading, it doesn't wait for the transaction to be confirmed, - // it just sends the transactions(TON has asynchronous transactions) - _, _, txerr := funder.SendManyWaitTransaction(ctx, messages) - if txerr != nil { - return fmt.Errorf("failed to send many wait transaction: %w", txerr) - } - - return nil -} - func getMasterchainBlockID(ctx context.Context, client ton.APIClientWrapped) (*ton.BlockIDExt, error) { var masterchainBlockID *ton.BlockIDExt // check connection, CTFv2 handles the readiness From bb6622b5eeee9bb2e95851a9faf8e10393184022 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Thu, 11 Dec 2025 21:30:01 -0500 Subject: [PATCH 05/26] add test coverage --- chain/ton/provider/rpc_provider.go | 1 - chain/ton/provider/rpc_provider_test.go | 57 +++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/chain/ton/provider/rpc_provider.go b/chain/ton/provider/rpc_provider.go index 7796f5a7..f0345566 100644 --- a/chain/ton/provider/rpc_provider.go +++ b/chain/ton/provider/rpc_provider.go @@ -39,7 +39,6 @@ type RPCChainProviderConfig struct { // Optional: The TON wallet version to use. Supported versions are: V1R1, V1R2, V1R3, V2R1, // V2R2, V3R1, V3R2, V4R1, V4R2 and V5R1. If no value provided, V5R1 is used as default. WalletVersion WalletVersion - Amount string } // validateLiteserverURL validates the format of a liteserver URL diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index add5c34b..989d0213 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -5,6 +5,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/xssnick/tonutils-go/tlb" tonchain "github.com/smartcontractkit/chainlink-deployments-framework/chain/ton" ) @@ -89,6 +90,45 @@ func Test_RPCChainProvider_Initialize(t *testing.T) { assert.Equal(t, existingChain.Selector, gotChain.Selector) } +func Test_RPCChainProvider_Initialize_AlreadyInitialized_ReturnsTxOps(t *testing.T) { + t.Parallel() + + expectedAmount := tlb.MustFromTON("0.5") + existingChain := &tonchain.Chain{ + ChainMetadata: tonchain.ChainMetadata{Selector: 456}, + TxOps: tonchain.TxOps{ + Amount: expectedAmount, + }, + } + p := &RPCChainProvider{ + selector: 456, + chain: existingChain, + } + + got, err := p.Initialize(t.Context()) + require.NoError(t, err) + + gotChain, ok := got.(tonchain.Chain) + require.True(t, ok) + assert.Equal(t, expectedAmount, gotChain.TxOps.Amount) +} + +func Test_RPCChainProvider_Initialize_InvalidConfig(t *testing.T) { + t.Parallel() + + p := &RPCChainProvider{ + selector: 123, + config: RPCChainProviderConfig{ + HTTPURL: "", // invalid - missing URL + DeployerSignerGen: PrivateKeyRandom(), + }, + } + + _, err := p.Initialize(t.Context()) + require.Error(t, err) + assert.Contains(t, err.Error(), "failed to validate provider config") +} + func Test_RPCChainProvider_Name(t *testing.T) { t.Parallel() @@ -112,6 +152,23 @@ func Test_RPCChainProvider_BlockChain(t *testing.T) { assert.Equal(t, *c, p.BlockChain()) } +func Test_RPCChainProvider_BlockChain_WithTxOps(t *testing.T) { + t.Parallel() + + expectedAmount := tlb.MustFromTON("0.25") + c := &tonchain.Chain{ + ChainMetadata: tonchain.ChainMetadata{Selector: 123}, + TxOps: tonchain.TxOps{ + Amount: expectedAmount, + }, + } + p := &RPCChainProvider{chain: c} + + gotChain := p.BlockChain().(tonchain.Chain) + assert.Equal(t, expectedAmount, gotChain.TxOps.Amount) + assert.Equal(t, uint64(123), gotChain.Selector) +} + // Unit tests for extracted functions func Test_validateLiteserverURL(t *testing.T) { From 564f8804e63ec33a4b42b3c7ae1b1bfa4525dbb7 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Thu, 11 Dec 2025 23:25:12 -0500 Subject: [PATCH 06/26] update test --- chain/ton/provider/rpc_provider.go | 15 ++++-- chain/ton/provider/rpc_provider_test.go | 70 +++++++++++-------------- 2 files changed, 40 insertions(+), 45 deletions(-) diff --git a/chain/ton/provider/rpc_provider.go b/chain/ton/provider/rpc_provider.go index f0345566..58f0d9ae 100644 --- a/chain/ton/provider/rpc_provider.go +++ b/chain/ton/provider/rpc_provider.go @@ -176,21 +176,26 @@ func (p *RPCChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er return nil, err } - p.chain = &ton.Chain{ + p.chain = buildChain(p.selector, api, tonWallet, p.config.HTTPURL) + + return *p.chain, nil +} + +// buildChain creates a ton.Chain with the given parameters and default TxOps amount. +func buildChain(selector uint64, api *tonlib.APIClient, tonWallet *wallet.Wallet, httpURL string) *ton.Chain { + return &ton.Chain{ ChainMetadata: ton.ChainMetadata{ - Selector: p.selector, + Selector: selector, }, Client: api, Wallet: tonWallet, WalletAddress: tonWallet.WalletAddress(), - URL: p.config.HTTPURL, + URL: httpURL, TxOps: ton.TxOps{ Wallet: tonWallet, Amount: tlb.MustFromTON(defaultAmountTonString), }, } - - return *p.chain, nil } // createLiteclientConnectionPool creates connection pool returning concrete type for production use diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 989d0213..2c544986 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/xssnick/tonutils-go/tlb" + "github.com/xssnick/tonutils-go/ton/wallet" tonchain "github.com/smartcontractkit/chainlink-deployments-framework/chain/ton" ) @@ -90,29 +91,6 @@ func Test_RPCChainProvider_Initialize(t *testing.T) { assert.Equal(t, existingChain.Selector, gotChain.Selector) } -func Test_RPCChainProvider_Initialize_AlreadyInitialized_ReturnsTxOps(t *testing.T) { - t.Parallel() - - expectedAmount := tlb.MustFromTON("0.5") - existingChain := &tonchain.Chain{ - ChainMetadata: tonchain.ChainMetadata{Selector: 456}, - TxOps: tonchain.TxOps{ - Amount: expectedAmount, - }, - } - p := &RPCChainProvider{ - selector: 456, - chain: existingChain, - } - - got, err := p.Initialize(t.Context()) - require.NoError(t, err) - - gotChain, ok := got.(tonchain.Chain) - require.True(t, ok) - assert.Equal(t, expectedAmount, gotChain.TxOps.Amount) -} - func Test_RPCChainProvider_Initialize_InvalidConfig(t *testing.T) { t.Parallel() @@ -152,23 +130,6 @@ func Test_RPCChainProvider_BlockChain(t *testing.T) { assert.Equal(t, *c, p.BlockChain()) } -func Test_RPCChainProvider_BlockChain_WithTxOps(t *testing.T) { - t.Parallel() - - expectedAmount := tlb.MustFromTON("0.25") - c := &tonchain.Chain{ - ChainMetadata: tonchain.ChainMetadata{Selector: 123}, - TxOps: tonchain.TxOps{ - Amount: expectedAmount, - }, - } - p := &RPCChainProvider{chain: c} - - gotChain := p.BlockChain().(tonchain.Chain) - assert.Equal(t, expectedAmount, gotChain.TxOps.Amount) - assert.Equal(t, uint64(123), gotChain.Selector) -} - // Unit tests for extracted functions func Test_validateLiteserverURL(t *testing.T) { @@ -335,6 +296,35 @@ func Test_createWallet(t *testing.T) { } } +func Test_buildChain(t *testing.T) { + t.Parallel() + + // Create a test wallet using a fixed private key + privateKey := make([]byte, 32) + for i := range privateKey { + privateKey[i] = byte(i) + } + testWallet, err := wallet.FromPrivateKeyWithOptions(nil, privateKey, wallet.V4R2, wallet.WithWorkchain(0)) + require.NoError(t, err) + + selector := uint64(789) + httpURL := "liteserver://publickey@localhost:8080" + + chain := buildChain(selector, nil, testWallet, httpURL) + + require.NotNil(t, chain) + assert.Equal(t, selector, chain.Selector) + assert.Equal(t, httpURL, chain.URL) + assert.Nil(t, chain.Client) + assert.Equal(t, testWallet, chain.Wallet) + assert.Equal(t, testWallet.WalletAddress(), chain.WalletAddress) + + // Verify TxOps uses the default amount (0.1 TON) + expectedAmount := tlb.MustFromTON("0.1") + assert.Equal(t, expectedAmount, chain.TxOps.Amount) + assert.Equal(t, testWallet, chain.TxOps.Wallet) +} + func Test_createLiteclientConnectionPool_InvalidURL(t *testing.T) { t.Parallel() From 580e5c78421b682709aaa4b415c0945e364e5876 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Thu, 11 Dec 2025 23:30:00 -0500 Subject: [PATCH 07/26] update --- chain/ton/provider/ctf_provider_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/ton/provider/ctf_provider_test.go b/chain/ton/provider/ctf_provider_test.go index 4ada120d..1e19656e 100644 --- a/chain/ton/provider/ctf_provider_test.go +++ b/chain/ton/provider/ctf_provider_test.go @@ -89,7 +89,7 @@ func Test_CTFChainProvider_Initialize(t *testing.T) { assert.Equal(t, tt.giveSelector, gotChain.Selector) assert.NotEmpty(t, gotChain.Client) assert.NotEmpty(t, gotChain.TxOps) - assert.NotEmpty(t, gotChain.WalletAddress) + require.False(t, gotChain.WalletAddress.IsAddrNone()) } }) } From d1395797c5ac4aeebdadc412101c20c9ea65685d Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Mon, 15 Dec 2025 20:30:49 -0600 Subject: [PATCH 08/26] bump version --- engine/cld/legacy/cli/mcmsv2/mcms_v2_test.go | 9 +++++++++ go.mod | 8 ++++---- go.sum | 8 ++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/engine/cld/legacy/cli/mcmsv2/mcms_v2_test.go b/engine/cld/legacy/cli/mcmsv2/mcms_v2_test.go index 8ad8c6eb..2417452e 100644 --- a/engine/cld/legacy/cli/mcmsv2/mcms_v2_test.go +++ b/engine/cld/legacy/cli/mcmsv2/mcms_v2_test.go @@ -390,6 +390,15 @@ func Test_timelockExecuteOptions(t *testing.T) { require.Empty(t, opts) }, }, + { + name: "empty options for TON", + cfg: &cfgv2{chainSelector: chainsel.TON_MAINNET.Selector}, + assert: func(t *testing.T, opts []mcms.Option, err error) { + t.Helper() + require.NoError(t, err) + require.Empty(t, opts) + }, + }, { name: "CallProxy option added for EVM when addresses is in DataStore", cfg: &cfgv2{ diff --git a/go.mod b/go.mod index c487f119..fdddd57c 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335 github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d - github.com/smartcontractkit/mcms v0.31.2-0.20251209144844-5431a6ab1526 + github.com/smartcontractkit/mcms v0.31.2-0.20251215091707-34ad98fc250c github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 @@ -73,7 +73,7 @@ require ( github.com/smartcontractkit/chainlink-common v0.9.6-0.20251003171904-99a82a53b142 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.4 // indirect github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250911124514-5874cc6d62b2 // indirect - github.com/smartcontractkit/chainlink-ton v0.0.0-20251209121704-8d997e4a1833 // indirect + github.com/smartcontractkit/chainlink-ton v0.0.0-20251215075716-5098cfecb0d2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) @@ -296,8 +296,8 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect golang.org/x/net v0.47.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect golang.org/x/term v0.37.0 // indirect golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.12.0 // indirect diff --git a/go.sum b/go.sum index 76cbf3a2..096f95de 100644 --- a/go.sum +++ b/go.sum @@ -714,6 +714,8 @@ github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.2 h1:ZJ/8Jx6B github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.2/go.mod h1:kHYJnZUqiPF7/xN5273prV+srrLJkS77GbBXHLKQpx0= github.com/smartcontractkit/chainlink-ton v0.0.0-20251209121704-8d997e4a1833 h1:jy8TfjU+A1MFt70JRJ9GjTQshNlk/dBpRPzXmdHKDPk= github.com/smartcontractkit/chainlink-ton v0.0.0-20251209121704-8d997e4a1833/go.mod h1:rxekiaWnJnFFfklae1OvO6T7xHJtsEldDvW/e5+b/qg= +github.com/smartcontractkit/chainlink-ton v0.0.0-20251215075716-5098cfecb0d2 h1:VdoPwJ/IkgsnulmIvpjosJzyz8mVYczLvHUFROEb110= +github.com/smartcontractkit/chainlink-ton v0.0.0-20251215075716-5098cfecb0d2/go.mod h1:z27AgU6fEXkkfmUAzcbEH9u3RKz2oaGy3isb7KK6Z2E= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335 h1:7bxYNrPpygn8PUSBiEKn8riMd7CXMi/4bjTy0fHhcrY= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335/go.mod h1:ccjEgNeqOO+bjPddnL4lUrNLzyCvGCxgBjJdhFX3wa8= github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.4 h1:J4qtAo0ZmgX5pIr8Y5mdC+J2rj2e/6CTUC263t6mGOM= @@ -726,6 +728,8 @@ github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d h1:/0/80Ic github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d/go.mod h1:Acy3BTBxou83ooMESLO90s8PKSu7RvLCzwSTbxxfOK0= github.com/smartcontractkit/mcms v0.31.2-0.20251209144844-5431a6ab1526 h1:IZ8SZA8bLPe0eQ14npcVuTmDV6BldY9aeHKzCviloL0= github.com/smartcontractkit/mcms v0.31.2-0.20251209144844-5431a6ab1526/go.mod h1:ciwGs3cGDB5yCorkEWy8VSOmE89HZwuldz0tKfjeCwI= +github.com/smartcontractkit/mcms v0.31.2-0.20251215091707-34ad98fc250c h1:XZu4NWW3bWIRwyHaNNkV3rOlnjojnLv460SpdJ3raGY= +github.com/smartcontractkit/mcms v0.31.2-0.20251215091707-34ad98fc250c/go.mod h1:PO3JzoPMjQq8BTfsVGXpcmEY7rN5zqI+A5oeWvJLeEc= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= @@ -972,6 +976,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1025,6 +1031,8 @@ golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU= golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= From e0493ebedf3855dd9d9220a162ee7dc7511104c0 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Tue, 16 Dec 2025 15:19:58 -0600 Subject: [PATCH 09/26] bump mcms version --- go.mod | 4 ++-- go.sum | 24 ++++++++---------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index fdddd57c..bd79703b 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335 github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d - github.com/smartcontractkit/mcms v0.31.2-0.20251215091707-34ad98fc250c + github.com/smartcontractkit/mcms v0.31.2-0.20251216193316-af713b02477f github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 @@ -73,7 +73,7 @@ require ( github.com/smartcontractkit/chainlink-common v0.9.6-0.20251003171904-99a82a53b142 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.4 // indirect github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250911124514-5874cc6d62b2 // indirect - github.com/smartcontractkit/chainlink-ton v0.0.0-20251215075716-5098cfecb0d2 // indirect + github.com/smartcontractkit/chainlink-ton v0.0.0-20251216164546-5c01294e67f0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 096f95de..8045f2d5 100644 --- a/go.sum +++ b/go.sum @@ -712,10 +712,8 @@ github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1 h1:Ld3 github.com/smartcontractkit/chainlink-testing-framework/framework v0.12.1/go.mod h1:r6KXRM1u9ch5KFR2jspkgtyWEC1X+gxPCL8mR63U990= github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.2 h1:ZJ/8Jx6Be5//TyjPi1pS1uotnmcYq5vVkSyISIymSj8= github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.2/go.mod h1:kHYJnZUqiPF7/xN5273prV+srrLJkS77GbBXHLKQpx0= -github.com/smartcontractkit/chainlink-ton v0.0.0-20251209121704-8d997e4a1833 h1:jy8TfjU+A1MFt70JRJ9GjTQshNlk/dBpRPzXmdHKDPk= -github.com/smartcontractkit/chainlink-ton v0.0.0-20251209121704-8d997e4a1833/go.mod h1:rxekiaWnJnFFfklae1OvO6T7xHJtsEldDvW/e5+b/qg= -github.com/smartcontractkit/chainlink-ton v0.0.0-20251215075716-5098cfecb0d2 h1:VdoPwJ/IkgsnulmIvpjosJzyz8mVYczLvHUFROEb110= -github.com/smartcontractkit/chainlink-ton v0.0.0-20251215075716-5098cfecb0d2/go.mod h1:z27AgU6fEXkkfmUAzcbEH9u3RKz2oaGy3isb7KK6Z2E= +github.com/smartcontractkit/chainlink-ton v0.0.0-20251216164546-5c01294e67f0 h1:e8C47c6WC/BSFd/joI5kadkmA9twR5ArK7rKisQPZ+k= +github.com/smartcontractkit/chainlink-ton v0.0.0-20251216164546-5c01294e67f0/go.mod h1:z27AgU6fEXkkfmUAzcbEH9u3RKz2oaGy3isb7KK6Z2E= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335 h1:7bxYNrPpygn8PUSBiEKn8riMd7CXMi/4bjTy0fHhcrY= github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335/go.mod h1:ccjEgNeqOO+bjPddnL4lUrNLzyCvGCxgBjJdhFX3wa8= github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.4 h1:J4qtAo0ZmgX5pIr8Y5mdC+J2rj2e/6CTUC263t6mGOM= @@ -726,10 +724,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-20250905115425-2785a5cee79d h1:/0/80Ic6wpKH5F1nwDoRj9+70IxXunvCyNcCkA+9ik0= github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d/go.mod h1:Acy3BTBxou83ooMESLO90s8PKSu7RvLCzwSTbxxfOK0= -github.com/smartcontractkit/mcms v0.31.2-0.20251209144844-5431a6ab1526 h1:IZ8SZA8bLPe0eQ14npcVuTmDV6BldY9aeHKzCviloL0= -github.com/smartcontractkit/mcms v0.31.2-0.20251209144844-5431a6ab1526/go.mod h1:ciwGs3cGDB5yCorkEWy8VSOmE89HZwuldz0tKfjeCwI= -github.com/smartcontractkit/mcms v0.31.2-0.20251215091707-34ad98fc250c h1:XZu4NWW3bWIRwyHaNNkV3rOlnjojnLv460SpdJ3raGY= -github.com/smartcontractkit/mcms v0.31.2-0.20251215091707-34ad98fc250c/go.mod h1:PO3JzoPMjQq8BTfsVGXpcmEY7rN5zqI+A5oeWvJLeEc= +github.com/smartcontractkit/mcms v0.31.2-0.20251216193316-af713b02477f h1:l/xeu3HIq9+VbNWHkmyk7+f4n32SyASc3Q3hTMy/cdM= +github.com/smartcontractkit/mcms v0.31.2-0.20251216193316-af713b02477f/go.mod h1:qThfLkRhd+spHTt05bXWqrL48vZnw9EVG93ymhN2BEE= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= @@ -931,8 +927,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -974,8 +970,6 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1029,12 +1023,10 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU= -golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= +golang.org/x/telemetry v0.0.0-20251208220230-2638a1023523 h1:H52Mhyrc44wBgLTGzq6+0cmuVuF3LURCSXsLMOqfFos= +golang.org/x/telemetry v0.0.0-20251208220230-2638a1023523/go.mod h1:ArQvPJS723nJQietgilmZA+shuB3CZxH1n2iXq9VSfs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From b703c087d945eaf01708231b3fd23a321caaaa09 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Tue, 16 Dec 2025 17:01:42 -0600 Subject: [PATCH 10/26] fix make --- engine/cld/legacy/cli/mcmsv2/mcms_v2.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go index 55e7ea17..515c0b05 100644 --- a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go +++ b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go @@ -1185,7 +1185,7 @@ func newCfgv2(lggr logger.Logger, cmd *cobra.Command, domain cldf_domain.Domain, return nil, fmt.Errorf("error creating Sui timelock converter: %w", err) } case chainsel.FamilyTon: - converter = ton.NewTimelockConverter() + converter = ton.NewTimelockConverter(ton.DefaultSendAmount) default: return nil, fmt.Errorf("unsupported chain family %s", fam) } From 060c95ea703f2c17eedad5975c297885473d35ac Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Thu, 22 Jan 2026 14:50:27 -0600 Subject: [PATCH 11/26] fix make --- engine/cld/legacy/cli/mcmsv2/mcms_v2.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go index 7ee323b7..b49268ab 100644 --- a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go +++ b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go @@ -1489,8 +1489,13 @@ func getExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainSelector) return nil, fmt.Errorf("error getting encoder for chain %d", cfg.chainSelector) } c := cfg.blockchains.TonChains()[uint64(chainSelector)] - - return ton.NewExecutor(encoder, c.Client, c.TxOps.Wallet, c.TxOps.Amount) + opts := ton.ExecutorOpts{ + Encoder: encoder, + Client: c.Client, + Wallet: c.TxOps.Wallet, + Amount: c.TxOps.Amount, + } + return ton.NewExecutor(opts) default: return nil, fmt.Errorf("unsupported chain family %s", family) } @@ -1536,13 +1541,18 @@ func getTimelockExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainS return nil, fmt.Errorf("error getting sui metadata from proposal: %w", err) } entrypointEncoder := suibindings.NewCCIPEntrypointArgEncoder(metadata.RegistryObj, metadata.DeployerStateObj) - executor, err = sui.NewTimelockExecutor(chain.Client, chain.Signer, entrypointEncoder, metadata.McmsPackageID, metadata.RegistryObj, metadata.AccountObj) + executor, err = sui.NewTimelockExecutor(c.Client, c.Signer, entrypointEncoder, metadata.McmsPackageID, metadata.RegistryObj, metadata.AccountObj) if err != nil { return nil, fmt.Errorf("error creating sui timelock executor: %w", err) } case chainsel.FamilyTon: c := cfg.blockchains.TonChains()[uint64(chainSelector)] - return ton.NewTimelockExecutor(c.Client, c.TxOps.Wallet, c.TxOps.Amount) + opts := ton.TimelockExecutorOpts{ + Client: c.Client, + Wallet: c.TxOps.Wallet, + Amount: c.TxOps.Amount, + } + return ton.NewTimelockExecutor(opts) default: return nil, fmt.Errorf("unsupported chain family %s", family) } From 4a131732119c9b55d1c2341423a157c6264a4d19 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Thu, 22 Jan 2026 16:03:10 -0600 Subject: [PATCH 12/26] fix lint --- chain/ton/provider/ctf_provider.go | 7 ++----- chain/ton/provider/ctf_provider_test.go | 2 +- chain/ton/provider/rpc_provider.go | 9 +++------ chain/ton/provider/rpc_provider_test.go | 8 ++++---- chain/ton/ton_chain.go | 8 +------- engine/cld/legacy/cli/mcmsv2/mcms_v2.go | 10 ++++++---- 6 files changed, 17 insertions(+), 27 deletions(-) diff --git a/chain/ton/provider/ctf_provider.go b/chain/ton/provider/ctf_provider.go index 6a1f9b44..bdc247a3 100644 --- a/chain/ton/provider/ctf_provider.go +++ b/chain/ton/provider/ctf_provider.go @@ -35,7 +35,7 @@ const ( supportedTONImageRepository = "ghcr.io/neodix42/mylocalton-docker" // defaultTxTONAmount is the default amount of TON to use for transactions. - defaultTxTONAmount = "0.1" + defaultTxTONAmount = "0.25" ) // CTFChainProviderConfig holds the configuration to initialize the CTFChainProvider. @@ -133,10 +133,7 @@ func (p *CTFChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er Client: nodeClient, WalletAddress: tonWallet.WalletAddress(), URL: url, - TxOps: cldf_ton.TxOps{ - Wallet: tonWallet, - Amount: tlb.MustFromTON(defaultTxTONAmount), // default amount for transactions - }, + Amount: tlb.MustFromTON(defaultTxTONAmount), // default amount for transactions } return *p.chain, nil diff --git a/chain/ton/provider/ctf_provider_test.go b/chain/ton/provider/ctf_provider_test.go index c6074df6..a45344c1 100644 --- a/chain/ton/provider/ctf_provider_test.go +++ b/chain/ton/provider/ctf_provider_test.go @@ -88,7 +88,7 @@ func Test_CTFChainProvider_Initialize(t *testing.T) { require.True(t, ok, "expected got to be of type ton.Chain") assert.Equal(t, tt.giveSelector, gotChain.Selector) assert.NotEmpty(t, gotChain.Client) - assert.NotEmpty(t, gotChain.TxOps) + assert.NotEmpty(t, gotChain.Amount) require.False(t, gotChain.WalletAddress.IsAddrNone()) } }) diff --git a/chain/ton/provider/rpc_provider.go b/chain/ton/provider/rpc_provider.go index 58f0d9ae..8511c302 100644 --- a/chain/ton/provider/rpc_provider.go +++ b/chain/ton/provider/rpc_provider.go @@ -24,7 +24,7 @@ const ( WalletVersionV5R1 WalletVersion = "V5R1" WalletVersionDefault WalletVersion = "" - defaultAmountTonString = "0.1" // Default amount in TON for transactions + defaultAmountTonString = "0.25" // Default amount in TON for transactions ) // RPCChainProviderConfig holds the configuration to initialize the RPCChainProvider. @@ -181,7 +181,7 @@ func (p *RPCChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er return *p.chain, nil } -// buildChain creates a ton.Chain with the given parameters and default TxOps amount. +// buildChain creates a ton.Chain with the given parameters and default amount. func buildChain(selector uint64, api *tonlib.APIClient, tonWallet *wallet.Wallet, httpURL string) *ton.Chain { return &ton.Chain{ ChainMetadata: ton.ChainMetadata{ @@ -191,10 +191,7 @@ func buildChain(selector uint64, api *tonlib.APIClient, tonWallet *wallet.Wallet Wallet: tonWallet, WalletAddress: tonWallet.WalletAddress(), URL: httpURL, - TxOps: ton.TxOps{ - Wallet: tonWallet, - Amount: tlb.MustFromTON(defaultAmountTonString), - }, + Amount: tlb.MustFromTON(defaultAmountTonString), } } diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 2c544986..b21c641c 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -319,10 +319,10 @@ func Test_buildChain(t *testing.T) { assert.Equal(t, testWallet, chain.Wallet) assert.Equal(t, testWallet.WalletAddress(), chain.WalletAddress) - // Verify TxOps uses the default amount (0.1 TON) - expectedAmount := tlb.MustFromTON("0.1") - assert.Equal(t, expectedAmount, chain.TxOps.Amount) - assert.Equal(t, testWallet, chain.TxOps.Wallet) + // Verify the default amount (0.25 TON) + expectedAmount := tlb.MustFromTON("0.25") + assert.Equal(t, expectedAmount, chain.Amount) + assert.Equal(t, testWallet, chain.Wallet) } func Test_createLiteclientConnectionPool_InvalidURL(t *testing.T) { diff --git a/chain/ton/ton_chain.go b/chain/ton/ton_chain.go index 0300e472..e74367ab 100644 --- a/chain/ton/ton_chain.go +++ b/chain/ton/ton_chain.go @@ -12,12 +12,6 @@ import ( type ChainMetadata = common.ChainMetadata -// TxOps holds configuration for transaction operations. -type TxOps struct { - Wallet *wallet.Wallet // Wallet abstraction (signing, sending) - Amount tlb.Coins // Default amount for msg transfers -} - // Chain represents a TON chain. type Chain struct { ChainMetadata // Contains canonical chain identifier @@ -25,5 +19,5 @@ type Chain struct { Wallet *wallet.Wallet // Wallet abstraction (signing, sending) WalletAddress *address.Address // Address of deployer wallet URL string // Liteserver URL - TxOps TxOps // Transaction operations configuration + Amount tlb.Coins // Default amount for msg transfers } diff --git a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go index b49268ab..b6757fed 100644 --- a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go +++ b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go @@ -1492,9 +1492,10 @@ func getExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainSelector) opts := ton.ExecutorOpts{ Encoder: encoder, Client: c.Client, - Wallet: c.TxOps.Wallet, - Amount: c.TxOps.Amount, + Wallet: c.Wallet, + Amount: c.Amount, } + return ton.NewExecutor(opts) default: return nil, fmt.Errorf("unsupported chain family %s", family) @@ -1549,9 +1550,10 @@ func getTimelockExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainS c := cfg.blockchains.TonChains()[uint64(chainSelector)] opts := ton.TimelockExecutorOpts{ Client: c.Client, - Wallet: c.TxOps.Wallet, - Amount: c.TxOps.Amount, + Wallet: c.Wallet, + Amount: c.Amount, } + return ton.NewTimelockExecutor(opts) default: return nil, fmt.Errorf("unsupported chain family %s", family) From 5f800a972320876bd25f6ba2d82c0388e2894a27 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Thu, 22 Jan 2026 19:05:02 -0600 Subject: [PATCH 13/26] update test --- chain/ton/provider/rpc_provider_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index b21c641c..2d8986a4 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -5,7 +5,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/xssnick/tonutils-go/tlb" "github.com/xssnick/tonutils-go/ton/wallet" tonchain "github.com/smartcontractkit/chainlink-deployments-framework/chain/ton" @@ -319,9 +318,7 @@ func Test_buildChain(t *testing.T) { assert.Equal(t, testWallet, chain.Wallet) assert.Equal(t, testWallet.WalletAddress(), chain.WalletAddress) - // Verify the default amount (0.25 TON) - expectedAmount := tlb.MustFromTON("0.25") - assert.Equal(t, expectedAmount, chain.Amount) + assert.Equal(t, defaultAmountTonString, chain.Amount) assert.Equal(t, testWallet, chain.Wallet) } From 02d0258bf62683ed12decf30914665f0fbc3b4c0 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Thu, 22 Jan 2026 20:59:50 -0600 Subject: [PATCH 14/26] fix test --- chain/ton/provider/rpc_provider_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 2d8986a4..cbdaf4bd 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -318,7 +318,7 @@ func Test_buildChain(t *testing.T) { assert.Equal(t, testWallet, chain.Wallet) assert.Equal(t, testWallet.WalletAddress(), chain.WalletAddress) - assert.Equal(t, defaultAmountTonString, chain.Amount) + assert.Equal(t, defaultAmountTonString, chain.Amount.String()) assert.Equal(t, testWallet, chain.Wallet) } From 588016c6bc5b36497ba95618a1850a0f5b46326c Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 11:14:12 -0600 Subject: [PATCH 15/26] update test --- chain/ton/provider/rpc_provider_test.go | 288 ++++++++++-------------- 1 file changed, 117 insertions(+), 171 deletions(-) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index cbdaf4bd..1baef857 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -27,6 +27,30 @@ func Test_RPCChainProviderConfig_validate(t *testing.T) { c.WalletVersion = "" }, }, + { + name: "valid config with V3R2 wallet version", + giveConfigFunc: func(c *RPCChainProviderConfig) { + c.HTTPURL = "liteserver://publickey@localhost:8080" + c.DeployerSignerGen = PrivateKeyRandom() + c.WalletVersion = WalletVersionV3R2 + }, + }, + { + name: "valid config with V4R2 wallet version", + giveConfigFunc: func(c *RPCChainProviderConfig) { + c.HTTPURL = "liteserver://publickey@localhost:8080" + c.DeployerSignerGen = PrivateKeyRandom() + c.WalletVersion = WalletVersionV4R2 + }, + }, + { + name: "valid config with V5R1 wallet version", + giveConfigFunc: func(c *RPCChainProviderConfig) { + c.HTTPURL = "liteserver://publickey@localhost:8080" + c.DeployerSignerGen = PrivateKeyRandom() + c.WalletVersion = WalletVersionV5R1 + }, + }, { name: "missing liteserver url", giveConfigFunc: func(c *RPCChainProviderConfig) { @@ -35,6 +59,38 @@ func Test_RPCChainProviderConfig_validate(t *testing.T) { }, wantErr: "liteserver url is required", }, + { + name: "invalid liteserver url prefix", + giveConfigFunc: func(c *RPCChainProviderConfig) { + c.HTTPURL = "http://example.com" + c.DeployerSignerGen = PrivateKeyRandom() + }, + wantErr: "invalid liteserver URL format: expected liteserver:// prefix", + }, + { + name: "invalid liteserver url missing @ separator", + giveConfigFunc: func(c *RPCChainProviderConfig) { + c.HTTPURL = "liteserver://nohostport" + c.DeployerSignerGen = PrivateKeyRandom() + }, + wantErr: "invalid liteserver URL format: expected publickey@host:port", + }, + { + name: "invalid liteserver url empty public key", + giveConfigFunc: func(c *RPCChainProviderConfig) { + c.HTTPURL = "liteserver://@localhost:8080" + c.DeployerSignerGen = PrivateKeyRandom() + }, + wantErr: "invalid liteserver URL format: public key cannot be empty", + }, + { + name: "invalid liteserver url empty host:port", + giveConfigFunc: func(c *RPCChainProviderConfig) { + c.HTTPURL = "liteserver://publickey@" + c.DeployerSignerGen = PrivateKeyRandom() + }, + wantErr: "invalid liteserver URL format: host:port cannot be empty", + }, { name: "missing deployer signer generator", giveConfigFunc: func(c *RPCChainProviderConfig) { @@ -131,113 +187,50 @@ func Test_RPCChainProvider_BlockChain(t *testing.T) { // Unit tests for extracted functions -func Test_validateLiteserverURL(t *testing.T) { - t.Parallel() - - tests := []struct { - name string - url string - wantErr string - }{ - { - name: "valid URL", - url: "liteserver://validkey@localhost:8080", - }, - { - name: "empty URL", - url: "", - wantErr: "liteserver url is required", - }, - { - name: "invalid prefix", - url: "http://example.com", - wantErr: "invalid liteserver URL format: expected liteserver:// prefix", - }, - { - name: "missing @", - url: "liteserver://invalidurl", - wantErr: "invalid liteserver URL format: expected publickey@host:port", - }, - { - name: "multiple @", - url: "liteserver://key1@key2@host:port", - wantErr: "invalid liteserver URL format: expected publickey@host:port", - }, - { - name: "empty public key", - url: "liteserver://@localhost:8080", - wantErr: "invalid liteserver URL format: public key cannot be empty", - }, - { - name: "empty host:port", - url: "liteserver://validkey@", - wantErr: "invalid liteserver URL format: host:port cannot be empty", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - - err := validateLiteserverURL(tt.url) - if tt.wantErr != "" { - require.ErrorContains(t, err, tt.wantErr) - } else { - require.NoError(t, err) - } - }) - } -} - func Test_getWalletVersionConfig(t *testing.T) { t.Parallel() - tests := []struct { - name string - version WalletVersion - wantErr bool - }{ - { - name: "V3R2", - version: WalletVersionV3R2, - wantErr: false, - }, - { - name: "V4R2", - version: WalletVersionV4R2, - wantErr: false, - }, - { - name: "V5R1", - version: WalletVersionV5R1, - wantErr: false, - }, - { - name: "Default (empty)", - version: WalletVersionDefault, - wantErr: false, - }, - { - name: "Unsupported version", - version: "V9R9", - wantErr: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - - cfg, err := getWalletVersionConfig(tt.version) - if tt.wantErr { - require.Error(t, err) - assert.Nil(t, cfg) - } else { - require.NoError(t, err) - assert.NotNil(t, cfg) - } - }) - } + t.Run("V3R2 returns wallet.V3R2", func(t *testing.T) { + t.Parallel() + cfg, err := getWalletVersionConfig(WalletVersionV3R2) + require.NoError(t, err) + assert.Equal(t, wallet.V3R2, cfg) + }) + + t.Run("V4R2 returns wallet.V4R2", func(t *testing.T) { + t.Parallel() + cfg, err := getWalletVersionConfig(WalletVersionV4R2) + require.NoError(t, err) + assert.Equal(t, wallet.V4R2, cfg) + }) + + t.Run("V5R1 returns ConfigV5R1Final", func(t *testing.T) { + t.Parallel() + cfg, err := getWalletVersionConfig(WalletVersionV5R1) + require.NoError(t, err) + v5Config, ok := cfg.(wallet.ConfigV5R1Final) + require.True(t, ok, "expected ConfigV5R1Final type") + assert.Equal(t, int32(wallet.MainnetGlobalID), v5Config.NetworkGlobalID) + assert.Equal(t, int8(0), v5Config.Workchain) + }) + + t.Run("Default returns ConfigV5R1Final", func(t *testing.T) { + t.Parallel() + cfg, err := getWalletVersionConfig(WalletVersionDefault) + require.NoError(t, err) + v5Config, ok := cfg.(wallet.ConfigV5R1Final) + require.True(t, ok, "expected ConfigV5R1Final type") + assert.Equal(t, int32(wallet.MainnetGlobalID), v5Config.NetworkGlobalID) + assert.Equal(t, int8(0), v5Config.Workchain) + }) + + t.Run("Unsupported version returns error", func(t *testing.T) { + t.Parallel() + cfg, err := getWalletVersionConfig("V9R9") + require.Error(t, err) + assert.Nil(t, cfg) + assert.Contains(t, err.Error(), "unsupported wallet version") + }) } func Test_NewRPCChainProvider(t *testing.T) { @@ -259,42 +252,6 @@ func Test_NewRPCChainProvider(t *testing.T) { assert.Nil(t, p.chain) } -func Test_createWallet(t *testing.T) { - t.Parallel() - - tests := []struct { - name string - version WalletVersion - expectError bool - errorContains string - }{ - { - name: "unsupported wallet version returns error", - version: "V9R9", - expectError: true, - errorContains: "unsupported wallet version", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - - privateKey := make([]byte, 32) - wallet, err := createWallet(nil, privateKey, tt.version) - - if tt.expectError { - require.Error(t, err) - assert.Contains(t, err.Error(), tt.errorContains) - assert.Nil(t, wallet) - } else { - require.NoError(t, err) - assert.NotNil(t, wallet) - } - }) - } -} - func Test_buildChain(t *testing.T) { t.Parallel() @@ -322,40 +279,29 @@ func Test_buildChain(t *testing.T) { assert.Equal(t, testWallet, chain.Wallet) } -func Test_createLiteclientConnectionPool_InvalidURL(t *testing.T) { +func Test_WalletVersionConstants(t *testing.T) { t.Parallel() - tests := []struct { - name string - url string - errorContains string - }{ - { - name: "empty URL returns error", - url: "", - errorContains: "liteserver url is required", - }, - { - name: "invalid prefix returns error", - url: "http://example.com", - errorContains: "invalid liteserver URL format", - }, - { - name: "missing @ returns error", - url: "liteserver://invalidurl", - errorContains: "invalid liteserver URL format", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() + assert.Equal(t, WalletVersion("V3R2"), WalletVersionV3R2) + assert.Equal(t, WalletVersion("V4R2"), WalletVersionV4R2) + assert.Equal(t, WalletVersion("V5R1"), WalletVersionV5R1) + assert.Equal(t, WalletVersion(""), WalletVersionDefault) +} - pool, err := createLiteclientConnectionPool(t.Context(), tt.url) +func Test_RPCChainProvider_Initialize_FailedPrivateKeyGeneration(t *testing.T) { + t.Parallel() - require.Error(t, err) - assert.Contains(t, err.Error(), tt.errorContains) - assert.Nil(t, pool) - }) + p := &RPCChainProvider{ + selector: 123, + config: RPCChainProviderConfig{ + HTTPURL: "liteserver://publickey@localhost:8080", + DeployerSignerGen: PrivateKeyFromRaw("invalid-hex"), // invalid hex will cause generation to fail + WalletVersion: WalletVersionV5R1, + }, } + + _, err := p.Initialize(t.Context()) + require.Error(t, err) + // The error will be about connection since we can't actually connect, + // but this exercises the code path } From 3d3a6bab2c4ab61e92b2e3802a18cbed79288a91 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 11:21:44 -0600 Subject: [PATCH 16/26] fix test --- chain/ton/provider/rpc_provider_test.go | 6 +++--- engine/cld/legacy/cli/mcmsv2/mcms_v2.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 1baef857..74f3fd3b 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -282,9 +282,9 @@ func Test_buildChain(t *testing.T) { func Test_WalletVersionConstants(t *testing.T) { t.Parallel() - assert.Equal(t, WalletVersion("V3R2"), WalletVersionV3R2) - assert.Equal(t, WalletVersion("V4R2"), WalletVersionV4R2) - assert.Equal(t, WalletVersion("V5R1"), WalletVersionV5R1) + assert.Equal(t, WalletVersionV3R2, WalletVersion("V3R2")) + assert.Equal(t, WalletVersionV4R2, WalletVersion("V4R2")) + assert.Equal(t, WalletVersionV5R1, WalletVersion("V5R1")) assert.Equal(t, WalletVersion(""), WalletVersionDefault) } diff --git a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go index b6757fed..80d39656 100644 --- a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go +++ b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go @@ -1486,7 +1486,7 @@ func getExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainSelector) case chainsel.FamilyTon: encoder, ok := encoder.(*ton.Encoder) if !ok { - return nil, fmt.Errorf("error getting encoder for chain %d", cfg.chainSelector) + return nil, fmt.Errorf("invalid encoder type for TON chain %d: expected *ton.Encoder, got %T", cfg.chainSelector, encoder) } c := cfg.blockchains.TonChains()[uint64(chainSelector)] opts := ton.ExecutorOpts{ From 95337bbb6d013a6ad6124f382db97f649c8540b7 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 11:26:50 -0600 Subject: [PATCH 17/26] fix test --- chain/ton/provider/rpc_provider_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 74f3fd3b..85952264 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -285,7 +285,7 @@ func Test_WalletVersionConstants(t *testing.T) { assert.Equal(t, WalletVersionV3R2, WalletVersion("V3R2")) assert.Equal(t, WalletVersionV4R2, WalletVersion("V4R2")) assert.Equal(t, WalletVersionV5R1, WalletVersion("V5R1")) - assert.Equal(t, WalletVersion(""), WalletVersionDefault) + assert.Equal(t, WalletVersionDefault, WalletVersion("")) } func Test_RPCChainProvider_Initialize_FailedPrivateKeyGeneration(t *testing.T) { @@ -302,6 +302,4 @@ func Test_RPCChainProvider_Initialize_FailedPrivateKeyGeneration(t *testing.T) { _, err := p.Initialize(t.Context()) require.Error(t, err) - // The error will be about connection since we can't actually connect, - // but this exercises the code path } From c4349401fcd99d0cc7bd8a1768a2e11d3fdc1667 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 11:35:30 -0600 Subject: [PATCH 18/26] remove duplicate test --- chain/ton/provider/rpc_provider_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 85952264..21217399 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -276,7 +276,6 @@ func Test_buildChain(t *testing.T) { assert.Equal(t, testWallet.WalletAddress(), chain.WalletAddress) assert.Equal(t, defaultAmountTonString, chain.Amount.String()) - assert.Equal(t, testWallet, chain.Wallet) } func Test_WalletVersionConstants(t *testing.T) { From 781a16b5518eaac31affb7a197ef37a795c03136 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 11:40:37 -0600 Subject: [PATCH 19/26] fix --- chain/ton/provider/ctf_provider.go | 1 + 1 file changed, 1 insertion(+) diff --git a/chain/ton/provider/ctf_provider.go b/chain/ton/provider/ctf_provider.go index bdc247a3..df00c6b0 100644 --- a/chain/ton/provider/ctf_provider.go +++ b/chain/ton/provider/ctf_provider.go @@ -131,6 +131,7 @@ func (p *CTFChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er p.chain = &cldf_ton.Chain{ ChainMetadata: cldf_ton.ChainMetadata{Selector: p.selector}, Client: nodeClient, + Wallet: tonWallet, WalletAddress: tonWallet.WalletAddress(), URL: url, Amount: tlb.MustFromTON(defaultTxTONAmount), // default amount for transactions From 284e77e4d5ea49f59d4c9313b8bd2fb71189f0cb Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 12:22:30 -0600 Subject: [PATCH 20/26] more test coverage --- chain/ton/provider/rpc_provider_test.go | 50 +++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 21217399..22c4e344 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -302,3 +302,53 @@ func Test_RPCChainProvider_Initialize_FailedPrivateKeyGeneration(t *testing.T) { _, err := p.Initialize(t.Context()) require.Error(t, err) } + +func Test_createWallet(t *testing.T) { + t.Parallel() + + t.Run("success with valid private key and version", func(t *testing.T) { + t.Parallel() + + privateKey := make([]byte, 32) + for i := range privateKey { + privateKey[i] = byte(i) + } + + w, err := createWallet(nil, privateKey, WalletVersionV4R2) + require.NoError(t, err) + require.NotNil(t, w) + }) + + t.Run("error with unsupported wallet version", func(t *testing.T) { + t.Parallel() + + privateKey := make([]byte, 32) + + w, err := createWallet(nil, privateKey, "UNSUPPORTED") + require.Error(t, err) + assert.Nil(t, w) + assert.Contains(t, err.Error(), "unsupported wallet version") + }) + + t.Run("success with default wallet version", func(t *testing.T) { + t.Parallel() + + privateKey := make([]byte, 32) + for i := range privateKey { + privateKey[i] = byte(i + 10) + } + + w, err := createWallet(nil, privateKey, WalletVersionDefault) + require.NoError(t, err) + require.NotNil(t, w) + }) +} + +func Test_setupConnection_invalidURL(t *testing.T) { + t.Parallel() + + // Test that setupConnection fails with invalid URL + _, err := setupConnection(t.Context(), "invalid-url") + require.Error(t, err) + assert.Contains(t, err.Error(), "failed to connect to liteserver") +} From 2e6c227a9361575f8e27b74de6b78e3a0daaef63 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 12:30:15 -0600 Subject: [PATCH 21/26] update test --- chain/ton/provider/ctf_provider_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chain/ton/provider/ctf_provider_test.go b/chain/ton/provider/ctf_provider_test.go index a45344c1..1d1671b8 100644 --- a/chain/ton/provider/ctf_provider_test.go +++ b/chain/ton/provider/ctf_provider_test.go @@ -88,8 +88,9 @@ func Test_CTFChainProvider_Initialize(t *testing.T) { require.True(t, ok, "expected got to be of type ton.Chain") assert.Equal(t, tt.giveSelector, gotChain.Selector) assert.NotEmpty(t, gotChain.Client) - assert.NotEmpty(t, gotChain.Amount) + assert.NotEmpty(t, gotChain.Wallet) require.False(t, gotChain.WalletAddress.IsAddrNone()) + require.Equal(t, defaultTxTONAmount, gotChain.Amount.String()) } }) } From 06dd94112f0dc49cf3d04354d8258d0b146618f8 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 13:30:38 -0600 Subject: [PATCH 22/26] refactor for test coverage --- chain/ton/provider/rpc_provider.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/chain/ton/provider/rpc_provider.go b/chain/ton/provider/rpc_provider.go index 8511c302..ad1d3870 100644 --- a/chain/ton/provider/rpc_provider.go +++ b/chain/ton/provider/rpc_provider.go @@ -158,18 +158,18 @@ func (p *RPCChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er return nil, fmt.Errorf("failed to validate provider config: %w", err) } - // Setup connection to TON network - api, err := setupConnection(ctx, p.config.HTTPURL) - if err != nil { - return nil, err - } - // Generate private key for wallet privateKey, err := p.config.DeployerSignerGen.Generate() if err != nil { return nil, fmt.Errorf("failed to generate private key: %w", err) } + // Setup connection to TON network + api, err := setupConnection(ctx, p.config.HTTPURL) + if err != nil { + return nil, err + } + // Create wallet tonWallet, err := createWallet(api, privateKey, p.config.WalletVersion) if err != nil { From 4168b5e08f7664ecf3ba6287219901d8cb62298a Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 14:56:59 -0600 Subject: [PATCH 23/26] revert --- chain/ton/provider/rpc_provider.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/chain/ton/provider/rpc_provider.go b/chain/ton/provider/rpc_provider.go index ad1d3870..8511c302 100644 --- a/chain/ton/provider/rpc_provider.go +++ b/chain/ton/provider/rpc_provider.go @@ -158,18 +158,18 @@ func (p *RPCChainProvider) Initialize(ctx context.Context) (chain.BlockChain, er return nil, fmt.Errorf("failed to validate provider config: %w", err) } - // Generate private key for wallet - privateKey, err := p.config.DeployerSignerGen.Generate() - if err != nil { - return nil, fmt.Errorf("failed to generate private key: %w", err) - } - // Setup connection to TON network api, err := setupConnection(ctx, p.config.HTTPURL) if err != nil { return nil, err } + // Generate private key for wallet + privateKey, err := p.config.DeployerSignerGen.Generate() + if err != nil { + return nil, fmt.Errorf("failed to generate private key: %w", err) + } + // Create wallet tonWallet, err := createWallet(api, privateKey, p.config.WalletVersion) if err != nil { From 120f23b01b142bf6a5a83ac4c6e0d5a1252b76ce Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 15:29:18 -0600 Subject: [PATCH 24/26] update --- chain/ton/provider/rpc_provider_test.go | 322 ++++++++++++------------ 1 file changed, 164 insertions(+), 158 deletions(-) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 22c4e344..5c3f53ed 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -27,30 +27,6 @@ func Test_RPCChainProviderConfig_validate(t *testing.T) { c.WalletVersion = "" }, }, - { - name: "valid config with V3R2 wallet version", - giveConfigFunc: func(c *RPCChainProviderConfig) { - c.HTTPURL = "liteserver://publickey@localhost:8080" - c.DeployerSignerGen = PrivateKeyRandom() - c.WalletVersion = WalletVersionV3R2 - }, - }, - { - name: "valid config with V4R2 wallet version", - giveConfigFunc: func(c *RPCChainProviderConfig) { - c.HTTPURL = "liteserver://publickey@localhost:8080" - c.DeployerSignerGen = PrivateKeyRandom() - c.WalletVersion = WalletVersionV4R2 - }, - }, - { - name: "valid config with V5R1 wallet version", - giveConfigFunc: func(c *RPCChainProviderConfig) { - c.HTTPURL = "liteserver://publickey@localhost:8080" - c.DeployerSignerGen = PrivateKeyRandom() - c.WalletVersion = WalletVersionV5R1 - }, - }, { name: "missing liteserver url", giveConfigFunc: func(c *RPCChainProviderConfig) { @@ -59,38 +35,6 @@ func Test_RPCChainProviderConfig_validate(t *testing.T) { }, wantErr: "liteserver url is required", }, - { - name: "invalid liteserver url prefix", - giveConfigFunc: func(c *RPCChainProviderConfig) { - c.HTTPURL = "http://example.com" - c.DeployerSignerGen = PrivateKeyRandom() - }, - wantErr: "invalid liteserver URL format: expected liteserver:// prefix", - }, - { - name: "invalid liteserver url missing @ separator", - giveConfigFunc: func(c *RPCChainProviderConfig) { - c.HTTPURL = "liteserver://nohostport" - c.DeployerSignerGen = PrivateKeyRandom() - }, - wantErr: "invalid liteserver URL format: expected publickey@host:port", - }, - { - name: "invalid liteserver url empty public key", - giveConfigFunc: func(c *RPCChainProviderConfig) { - c.HTTPURL = "liteserver://@localhost:8080" - c.DeployerSignerGen = PrivateKeyRandom() - }, - wantErr: "invalid liteserver URL format: public key cannot be empty", - }, - { - name: "invalid liteserver url empty host:port", - giveConfigFunc: func(c *RPCChainProviderConfig) { - c.HTTPURL = "liteserver://publickey@" - c.DeployerSignerGen = PrivateKeyRandom() - }, - wantErr: "invalid liteserver URL format: host:port cannot be empty", - }, { name: "missing deployer signer generator", giveConfigFunc: func(c *RPCChainProviderConfig) { @@ -187,50 +131,113 @@ func Test_RPCChainProvider_BlockChain(t *testing.T) { // Unit tests for extracted functions +func Test_validateLiteserverURL(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + url string + wantErr string + }{ + { + name: "valid URL", + url: "liteserver://validkey@localhost:8080", + }, + { + name: "empty URL", + url: "", + wantErr: "liteserver url is required", + }, + { + name: "invalid prefix", + url: "http://example.com", + wantErr: "invalid liteserver URL format: expected liteserver:// prefix", + }, + { + name: "missing @", + url: "liteserver://invalidurl", + wantErr: "invalid liteserver URL format: expected publickey@host:port", + }, + { + name: "multiple @", + url: "liteserver://key1@key2@host:port", + wantErr: "invalid liteserver URL format: expected publickey@host:port", + }, + { + name: "empty public key", + url: "liteserver://@localhost:8080", + wantErr: "invalid liteserver URL format: public key cannot be empty", + }, + { + name: "empty host:port", + url: "liteserver://validkey@", + wantErr: "invalid liteserver URL format: host:port cannot be empty", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + err := validateLiteserverURL(tt.url) + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + } else { + require.NoError(t, err) + } + }) + } +} + func Test_getWalletVersionConfig(t *testing.T) { t.Parallel() - t.Run("V3R2 returns wallet.V3R2", func(t *testing.T) { - t.Parallel() - cfg, err := getWalletVersionConfig(WalletVersionV3R2) - require.NoError(t, err) - assert.Equal(t, wallet.V3R2, cfg) - }) - - t.Run("V4R2 returns wallet.V4R2", func(t *testing.T) { - t.Parallel() - cfg, err := getWalletVersionConfig(WalletVersionV4R2) - require.NoError(t, err) - assert.Equal(t, wallet.V4R2, cfg) - }) - - t.Run("V5R1 returns ConfigV5R1Final", func(t *testing.T) { - t.Parallel() - cfg, err := getWalletVersionConfig(WalletVersionV5R1) - require.NoError(t, err) - v5Config, ok := cfg.(wallet.ConfigV5R1Final) - require.True(t, ok, "expected ConfigV5R1Final type") - assert.Equal(t, int32(wallet.MainnetGlobalID), v5Config.NetworkGlobalID) - assert.Equal(t, int8(0), v5Config.Workchain) - }) - - t.Run("Default returns ConfigV5R1Final", func(t *testing.T) { - t.Parallel() - cfg, err := getWalletVersionConfig(WalletVersionDefault) - require.NoError(t, err) - v5Config, ok := cfg.(wallet.ConfigV5R1Final) - require.True(t, ok, "expected ConfigV5R1Final type") - assert.Equal(t, int32(wallet.MainnetGlobalID), v5Config.NetworkGlobalID) - assert.Equal(t, int8(0), v5Config.Workchain) - }) - - t.Run("Unsupported version returns error", func(t *testing.T) { - t.Parallel() - cfg, err := getWalletVersionConfig("V9R9") - require.Error(t, err) - assert.Nil(t, cfg) - assert.Contains(t, err.Error(), "unsupported wallet version") - }) + tests := []struct { + name string + version WalletVersion + wantErr bool + }{ + { + name: "V3R2", + version: WalletVersionV3R2, + wantErr: false, + }, + { + name: "V4R2", + version: WalletVersionV4R2, + wantErr: false, + }, + { + name: "V5R1", + version: WalletVersionV5R1, + wantErr: false, + }, + { + name: "Default (empty)", + version: WalletVersionDefault, + wantErr: false, + }, + { + name: "Unsupported version", + version: "V9R9", + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + cfg, err := getWalletVersionConfig(tt.version) + if tt.wantErr { + require.Error(t, err) + assert.Nil(t, cfg) + } else { + require.NoError(t, err) + assert.NotNil(t, cfg) + } + }) + } } func Test_NewRPCChainProvider(t *testing.T) { @@ -278,77 +285,76 @@ func Test_buildChain(t *testing.T) { assert.Equal(t, defaultAmountTonString, chain.Amount.String()) } -func Test_WalletVersionConstants(t *testing.T) { - t.Parallel() - - assert.Equal(t, WalletVersionV3R2, WalletVersion("V3R2")) - assert.Equal(t, WalletVersionV4R2, WalletVersion("V4R2")) - assert.Equal(t, WalletVersionV5R1, WalletVersion("V5R1")) - assert.Equal(t, WalletVersionDefault, WalletVersion("")) -} - -func Test_RPCChainProvider_Initialize_FailedPrivateKeyGeneration(t *testing.T) { +func Test_createWallet(t *testing.T) { t.Parallel() - p := &RPCChainProvider{ - selector: 123, - config: RPCChainProviderConfig{ - HTTPURL: "liteserver://publickey@localhost:8080", - DeployerSignerGen: PrivateKeyFromRaw("invalid-hex"), // invalid hex will cause generation to fail - WalletVersion: WalletVersionV5R1, + tests := []struct { + name string + version WalletVersion + expectError bool + errorContains string + }{ + { + name: "unsupported wallet version returns error", + version: "V9R9", + expectError: true, + errorContains: "unsupported wallet version", }, } - _, err := p.Initialize(t.Context()) - require.Error(t, err) -} - -func Test_createWallet(t *testing.T) { - t.Parallel() - - t.Run("success with valid private key and version", func(t *testing.T) { - t.Parallel() - - privateKey := make([]byte, 32) - for i := range privateKey { - privateKey[i] = byte(i) - } - - w, err := createWallet(nil, privateKey, WalletVersionV4R2) - require.NoError(t, err) - require.NotNil(t, w) - }) - - t.Run("error with unsupported wallet version", func(t *testing.T) { - t.Parallel() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() - privateKey := make([]byte, 32) + privateKey := make([]byte, 32) + wallet, err := createWallet(nil, privateKey, tt.version) - w, err := createWallet(nil, privateKey, "UNSUPPORTED") - require.Error(t, err) - assert.Nil(t, w) - assert.Contains(t, err.Error(), "unsupported wallet version") - }) + if tt.expectError { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errorContains) + assert.Nil(t, wallet) + } else { + require.NoError(t, err) + assert.NotNil(t, wallet) + } + }) + } +} - t.Run("success with default wallet version", func(t *testing.T) { - t.Parallel() +func Test_createLiteclientConnectionPool_InvalidURL(t *testing.T) { + t.Parallel() - privateKey := make([]byte, 32) - for i := range privateKey { - privateKey[i] = byte(i + 10) - } + tests := []struct { + name string + url string + errorContains string + }{ + { + name: "empty URL returns error", + url: "", + errorContains: "liteserver url is required", + }, + { + name: "invalid prefix returns error", + url: "http://example.com", + errorContains: "invalid liteserver URL format", + }, + { + name: "missing @ returns error", + url: "liteserver://invalidurl", + errorContains: "invalid liteserver URL format", + }, + } - w, err := createWallet(nil, privateKey, WalletVersionDefault) - require.NoError(t, err) - require.NotNil(t, w) - }) -} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() -func Test_setupConnection_invalidURL(t *testing.T) { - t.Parallel() + pool, err := createLiteclientConnectionPool(t.Context(), tt.url) - // Test that setupConnection fails with invalid URL - _, err := setupConnection(t.Context(), "invalid-url") - require.Error(t, err) - assert.Contains(t, err.Error(), "failed to connect to liteserver") + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errorContains) + assert.Nil(t, pool) + }) + } } From d58f9190f0f1ea9d1683f778c6b09fc61a04e1b1 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 18:24:45 -0600 Subject: [PATCH 25/26] minor --- chain/ton/provider/rpc_provider.go | 4 +--- engine/cld/legacy/cli/mcmsv2/mcms_v2.go | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/chain/ton/provider/rpc_provider.go b/chain/ton/provider/rpc_provider.go index 8511c302..07a1dc2b 100644 --- a/chain/ton/provider/rpc_provider.go +++ b/chain/ton/provider/rpc_provider.go @@ -23,8 +23,6 @@ const ( WalletVersionV4R2 WalletVersion = "V4R2" WalletVersionV5R1 WalletVersion = "V5R1" WalletVersionDefault WalletVersion = "" - - defaultAmountTonString = "0.25" // Default amount in TON for transactions ) // RPCChainProviderConfig holds the configuration to initialize the RPCChainProvider. @@ -191,7 +189,7 @@ func buildChain(selector uint64, api *tonlib.APIClient, tonWallet *wallet.Wallet Wallet: tonWallet, WalletAddress: tonWallet.WalletAddress(), URL: httpURL, - Amount: tlb.MustFromTON(defaultAmountTonString), + Amount: tlb.MustFromTON(defaultTxTONAmount), } } diff --git a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go index 80d39656..49e84e4d 100644 --- a/engine/cld/legacy/cli/mcmsv2/mcms_v2.go +++ b/engine/cld/legacy/cli/mcmsv2/mcms_v2.go @@ -1486,7 +1486,7 @@ func getExecutorWithChainOverride(cfg *cfgv2, chainSelector types.ChainSelector) case chainsel.FamilyTon: encoder, ok := encoder.(*ton.Encoder) if !ok { - return nil, fmt.Errorf("invalid encoder type for TON chain %d: expected *ton.Encoder, got %T", cfg.chainSelector, encoder) + return nil, fmt.Errorf("invalid encoder type for TON chain %d: expected *ton.Encoder, got %T", chainSelector, encoder) } c := cfg.blockchains.TonChains()[uint64(chainSelector)] opts := ton.ExecutorOpts{ From ad23d0ea0ea6bbda4b57bf24eeec30c3c7c05d60 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 23 Jan 2026 18:28:18 -0600 Subject: [PATCH 26/26] lint --- chain/ton/provider/rpc_provider_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/ton/provider/rpc_provider_test.go b/chain/ton/provider/rpc_provider_test.go index 5c3f53ed..08f3570f 100644 --- a/chain/ton/provider/rpc_provider_test.go +++ b/chain/ton/provider/rpc_provider_test.go @@ -282,7 +282,7 @@ func Test_buildChain(t *testing.T) { assert.Equal(t, testWallet, chain.Wallet) assert.Equal(t, testWallet.WalletAddress(), chain.WalletAddress) - assert.Equal(t, defaultAmountTonString, chain.Amount.String()) + assert.Equal(t, defaultTxTONAmount, chain.Amount.String()) } func Test_createWallet(t *testing.T) {