Skip to content

Commit e52fe33

Browse files
feat(chain): add ton support (#110)
Migrating [this PR](#105) raised by Huang to the new chain redesign.
1 parent 5a5c8c1 commit e52fe33

File tree

8 files changed

+150
-27
lines changed

8 files changed

+150
-27
lines changed

.changeset/thin-impalas-sing.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"chainlink-deployments-framework": minor
3+
---
4+
5+
feat: add ton chain

chain/blockchain.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ import (
99
"github.com/smartcontractkit/chainlink-deployments-framework/chain/evm"
1010
"github.com/smartcontractkit/chainlink-deployments-framework/chain/solana"
1111
"github.com/smartcontractkit/chainlink-deployments-framework/chain/sui"
12+
"github.com/smartcontractkit/chainlink-deployments-framework/chain/ton"
1213
)
1314

1415
var _ BlockChain = evm.Chain{}
1516
var _ BlockChain = solana.Chain{}
1617
var _ BlockChain = aptos.Chain{}
1718
var _ BlockChain = sui.Chain{}
19+
var _ BlockChain = ton.Chain{}
1820

1921
// BlockChains represents a collection of chains.
2022
// It provides querying capabilities for different types of chains.
@@ -107,6 +109,20 @@ func (b BlockChains) SuiChains() (map[uint64]sui.Chain, error) {
107109
return suiChains, nil
108110
}
109111

112+
// TonChains returns a map of all Ton chains with their selectors.
113+
func (b BlockChains) TonChains() (map[uint64]ton.Chain, error) {
114+
var tonChains = make(map[uint64]ton.Chain)
115+
for selector, chain := range b.chains {
116+
c, ok := chain.(ton.Chain)
117+
if !ok {
118+
continue
119+
}
120+
tonChains[selector] = c
121+
}
122+
123+
return tonChains, nil
124+
}
125+
110126
// ChainSelectorsOption defines a function type for configuring ChainSelectors
111127
type ChainSelectorsOption func(*chainSelectorsOptions)
112128

@@ -180,6 +196,10 @@ func (b BlockChains) ListChainSelectors(options ...ChainSelectorsOption) []uint6
180196
if opts.family != chain_selectors.FamilySui {
181197
continue
182198
}
199+
case ton.Chain:
200+
if opts.family != chain_selectors.FamilyTon {
201+
continue
202+
}
183203
default:
184204
continue
185205
}

chain/blockchain_test.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import (
1212
"github.com/smartcontractkit/chainlink-deployments-framework/chain/evm"
1313
"github.com/smartcontractkit/chainlink-deployments-framework/chain/solana"
1414
"github.com/smartcontractkit/chainlink-deployments-framework/chain/sui"
15+
"github.com/smartcontractkit/chainlink-deployments-framework/chain/ton"
1516
)
1617

1718
var evmChain1 = evm.Chain{Selector: 1}
1819
var evmChain2 = evm.Chain{Selector: 2}
1920
var solanaChain1 = solana.Chain{Selector: 3}
2021
var aptosChain1 = aptos.Chain{Selector: 4}
2122
var suiChain1 = sui.Chain{Selector: 5}
23+
var tonChain1 = ton.Chain{Selector: 6}
2224

2325
func TestNewBlockChains(t *testing.T) {
2426
t.Parallel()
@@ -103,6 +105,20 @@ func TestBlockChainsSuiChains(t *testing.T) {
103105
assert.True(t, exists, "expected Sui chain with selector 5")
104106
}
105107

108+
func TestBlockChainsTonChains(t *testing.T) {
109+
t.Parallel()
110+
111+
chains := buildBlockChains()
112+
113+
tonChains, err := chains.TonChains()
114+
require.NoError(t, err)
115+
116+
assert.Len(t, tonChains, 1, "expected 1 Ton chain")
117+
118+
_, exists := tonChains[tonChain1.Selector]
119+
assert.True(t, exists, "expected Ton chain with selector 6")
120+
}
121+
106122
func TestBlockChainsListChainSelectors(t *testing.T) {
107123
t.Parallel()
108124

@@ -120,7 +136,7 @@ func TestBlockChainsListChainSelectors(t *testing.T) {
120136
expectedIDs: []uint64{
121137
evmChain1.ChainSelector(), evmChain2.ChainSelector(),
122138
solanaChain1.ChainSelector(), aptosChain1.ChainSelector(),
123-
suiChain1.ChainSelector(),
139+
suiChain1.ChainSelector(), tonChain1.ChainSelector(),
124140
},
125141
description: "expected all chain selectors",
126142
},
@@ -148,12 +164,18 @@ func TestBlockChainsListChainSelectors(t *testing.T) {
148164
expectedIDs: []uint64{suiChain1.Selector},
149165
description: "expected Sui chain selectors",
150166
},
167+
{
168+
name: "with family filter - Ton",
169+
options: []chain.ChainSelectorsOption{chain.WithFamily(chain_selectors.FamilyTon)},
170+
expectedIDs: []uint64{tonChain1.Selector},
171+
description: "expected Ton chain selectors",
172+
},
151173
{
152174
name: "with exclusion",
153175
options: []chain.ChainSelectorsOption{chain.WithChainSelectorsExclusion(
154176
[]uint64{evmChain1.Selector, aptosChain1.Selector}),
155177
},
156-
expectedIDs: []uint64{evmChain2.Selector, solanaChain1.Selector, suiChain1.Selector},
178+
expectedIDs: []uint64{evmChain2.Selector, solanaChain1.Selector, suiChain1.Selector, tonChain1.Selector},
157179
description: "expected chain selectors excluding 1 and 4",
158180
},
159181
{
@@ -185,6 +207,7 @@ func buildBlockChains() chain.BlockChains {
185207
evmChain2.ChainSelector(): evmChain2,
186208
aptosChain1.ChainSelector(): aptosChain1,
187209
suiChain1.ChainSelector(): suiChain1,
210+
tonChain1.ChainSelector(): tonChain1,
188211
})
189212

190213
return chains

chain/ton/ton_chain.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package ton
2+
3+
import (
4+
"github.com/xssnick/tonutils-go/address"
5+
"github.com/xssnick/tonutils-go/ton"
6+
"github.com/xssnick/tonutils-go/ton/wallet"
7+
8+
"github.com/smartcontractkit/chainlink-deployments-framework/chain/internal/common"
9+
)
10+
11+
// Chain represents a TON chain.
12+
type Chain struct {
13+
Selector uint64 // Canonical chain identifier
14+
Client *ton.APIClient // RPC client via Lite Server
15+
Wallet *wallet.Wallet // Wallet abstraction (signing, sending)
16+
WalletAddress *address.Address // Address of deployer wallet
17+
URL string // Liteserver URL
18+
DeployerSeed string // Optional: mnemonic or raw seed
19+
}
20+
21+
// ChainSelector returns the chain selector of the chain
22+
func (c Chain) ChainSelector() uint64 {
23+
return c.Selector
24+
}
25+
26+
// String returns chain name and selector "<name> (<selector>)"
27+
func (c Chain) String() string {
28+
return common.ChainMetadata{Selector: c.Selector}.String()
29+
}
30+
31+
// Name returns the name of the chain
32+
func (c Chain) Name() string {
33+
return common.ChainMetadata{Selector: c.Selector}.Name()
34+
}

chain/ton/ton_chain_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package ton_test
2+
3+
import (
4+
"testing"
5+
6+
chain_selectors "github.com/smartcontractkit/chain-selectors"
7+
"github.com/stretchr/testify/assert"
8+
9+
"github.com/smartcontractkit/chainlink-deployments-framework/chain/ton"
10+
)
11+
12+
func TestChain_ChainInfot(t *testing.T) {
13+
t.Parallel()
14+
15+
tests := []struct {
16+
name string
17+
selector uint64
18+
wantName string
19+
wantString string
20+
}{
21+
{
22+
name: "returns correct info",
23+
selector: chain_selectors.TON_MAINNET.Selector,
24+
wantString: "ton-mainnet (16448340667252469081)",
25+
wantName: chain_selectors.TON_MAINNET.Name,
26+
},
27+
}
28+
29+
for _, tt := range tests {
30+
t.Run(tt.name, func(t *testing.T) {
31+
t.Parallel()
32+
33+
provider := ton.Chain{
34+
Selector: tt.selector,
35+
}
36+
assert.Equal(t, tt.selector, provider.ChainSelector())
37+
assert.Equal(t, tt.wantString, provider.String())
38+
assert.Equal(t, tt.wantName, provider.Name())
39+
})
40+
}
41+
}

deployment/environment.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717

1818
"github.com/smartcontractkit/chainlink-deployments-framework/chain"
1919
"github.com/smartcontractkit/chainlink-deployments-framework/chain/evm"
20-
"github.com/smartcontractkit/chainlink-deployments-framework/chain/sui"
2120
"github.com/smartcontractkit/chainlink-deployments-framework/datastore"
2221
"github.com/smartcontractkit/chainlink-deployments-framework/operations"
2322
)
@@ -265,12 +264,7 @@ func (e Environment) AllChainSelectorsAptos() []uint64 {
265264
// AllChainSelectorsAllFamilies is being deprecated.
266265
// Use e.BlockChains.ListChainSelectors instead.
267266
func (e Environment) AllChainSelectorsAllFamilies() []uint64 {
268-
suiChains, err := e.BlockChains.SuiChains()
269-
if err != nil {
270-
// ignoring error here to avoid breaking change while we transition to BlockChains.ListChainSelectors
271-
suiChains = map[uint64]sui.Chain{}
272-
}
273-
selectors := make([]uint64, 0, len(e.Chains)+len(e.SolChains)+len(e.AptosChains)+len(suiChains))
267+
selectors := make([]uint64, 0, len(e.Chains)+len(e.SolChains)+len(e.AptosChains))
274268
for sel := range e.Chains {
275269
selectors = append(selectors, sel)
276270
}
@@ -280,9 +274,6 @@ func (e Environment) AllChainSelectorsAllFamilies() []uint64 {
280274
for sel := range e.AptosChains {
281275
selectors = append(selectors, sel)
282276
}
283-
for sel := range suiChains {
284-
selectors = append(selectors, sel)
285-
}
286277
sort.Slice(selectors, func(i, j int) bool {
287278
return selectors[i] < selectors[j]
288279
})

go.mod

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ require (
1616
github.com/smartcontractkit/chainlink-protos/job-distributor v0.10.0
1717
github.com/smartcontractkit/mcms v0.16.1
1818
github.com/stretchr/testify v1.10.0
19+
github.com/xssnick/tonutils-go v1.13.0
1920
github.com/zksync-sdk/zksync2-go v1.0.0
2021
go.uber.org/zap v1.27.0
2122
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0
@@ -71,9 +72,11 @@ require (
7172
github.com/modern-go/reflect2 v1.0.2 // indirect
7273
github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 // indirect
7374
github.com/mr-tron/base58 v1.2.0 // indirect
75+
github.com/oasisprotocol/curve25519-voi v0.0.0-20220328075252-7dd334e3daae // indirect
7476
github.com/pkg/errors v0.9.1 // indirect
7577
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
7678
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
79+
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3 // indirect
7780
github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 // indirect
7881
github.com/spf13/cast v1.7.1 // indirect
7982
github.com/stephenlacy/go-ethereum-hdwallet v0.0.0-20230913225845-a4fa94429863 // indirect
@@ -86,12 +89,12 @@ require (
8689
go.mongodb.org/mongo-driver v1.12.2 // indirect
8790
go.uber.org/multierr v1.11.0 // indirect
8891
go.uber.org/ratelimit v0.2.0 // indirect
89-
golang.org/x/crypto v0.37.0 // indirect
92+
golang.org/x/crypto v0.38.0 // indirect
9093
golang.org/x/net v0.39.0 // indirect
91-
golang.org/x/sync v0.13.0 // indirect
92-
golang.org/x/sys v0.32.0 // indirect
93-
golang.org/x/term v0.31.0 // indirect
94-
golang.org/x/text v0.24.0 // indirect
94+
golang.org/x/sync v0.14.0 // indirect
95+
golang.org/x/sys v0.33.0 // indirect
96+
golang.org/x/term v0.32.0 // indirect
97+
golang.org/x/text v0.25.0 // indirect
9598
golang.org/x/time v0.9.0 // indirect
9699
golang.org/x/tools v0.32.0 // indirect
97100
google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f // indirect

go.sum

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW
263263
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
264264
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
265265
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
266+
github.com/oasisprotocol/curve25519-voi v0.0.0-20220328075252-7dd334e3daae h1:7smdlrfdcZic4VfsGKD2ulWL804a4GVphr4s7WZxGiY=
267+
github.com/oasisprotocol/curve25519-voi v0.0.0-20220328075252-7dd334e3daae/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s=
266268
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
267269
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
268270
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -314,6 +316,8 @@ github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT
314316
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
315317
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
316318
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
319+
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3 h1:aQKxg3+2p+IFXXg97McgDGT5zcMrQoi0EICZs8Pgchs=
320+
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3/go.mod h1:9/etS5gpQq9BJsJMWg1wpLbfuSnkm8dPF6FdW2JXVhA=
317321
github.com/smartcontractkit/chain-selectors v1.0.57 h1:KApvb/Kpn15YalY7khFQaHH3mb7teX7JF/gwvq3ti7M=
318322
github.com/smartcontractkit/chain-selectors v1.0.57/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
319323
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250425163923-16aa375957b7 h1:j6Vo/NX2ABsPdGxETC5pfQLcz/h6iLJu/Yx+8AhPa34=
@@ -362,6 +366,8 @@ github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3k
362366
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
363367
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
364368
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
369+
github.com/xssnick/tonutils-go v1.13.0 h1:LV2JzB+CuuWaLQiYNolK+YI3NRQOpS0W+T+N+ctF6VQ=
370+
github.com/xssnick/tonutils-go v1.13.0/go.mod h1:EDe/9D/HZpAenbR+WPMQHICOF0BZWAe01TU5+Vpg08k=
365371
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
366372
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
367373
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
@@ -407,8 +413,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
407413
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
408414
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
409415
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
410-
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
411-
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
416+
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
417+
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
412418
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
413419
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
414420
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -431,8 +437,8 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
431437
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
432438
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
433439
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
434-
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
435-
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
440+
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
441+
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
436442
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
437443
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
438444
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -453,21 +459,21 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
453459
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
454460
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
455461
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
456-
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
457-
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
462+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
463+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
458464
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
459465
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
460-
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
461-
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
466+
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
467+
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
462468
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
463469
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
464470
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
465471
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
466472
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
467473
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
468474
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
469-
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
470-
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
475+
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
476+
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
471477
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
472478
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
473479
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

0 commit comments

Comments
 (0)