Skip to content

Commit 621d73b

Browse files
feat: solana blockchain support
Add ability to spin up solana blockchain.
1 parent c0699a9 commit 621d73b

File tree

4 files changed

+204
-17
lines changed

4 files changed

+204
-17
lines changed

framework/components/blockchain/blockchain.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@ import (
66

77
// Input is a blockchain network configuration params
88
type Input struct {
9-
Type string `toml:"type" validate:"required,oneof=anvil geth besu" envconfig:"net_type"`
10-
Image string `toml:"image"`
11-
PullImage bool `toml:"pull_image"`
12-
Port string `toml:"port"`
9+
Type string `toml:"type" validate:"required,oneof=anvil geth besu solana" envconfig:"net_type"`
10+
Image string `toml:"image"`
11+
PullImage bool `toml:"pull_image"`
12+
Port string `toml:"port"`
13+
// Not applicable to Solana, ws port for Solana is +1 of port
1314
WSPort string `toml:"port_ws"`
1415
ChainID string `toml:"chain_id"`
1516
DockerCmdParamsOverrides []string `toml:"docker_cmd_params"`
1617
Out *Output `toml:"out"`
18+
19+
// solana only fields
20+
// publickey to mint when solana-test-validator starts
21+
PublicKey string `toml:"public_key"`
22+
ContractsDir string `toml:"contracts_dir"`
1723
}
1824

1925
// Output is a blockchain network output, ChainID and one or more nodes that forms the network
@@ -49,6 +55,8 @@ func NewBlockchainNetwork(in *Input) (*Output, error) {
4955
out, err = newGeth(in)
5056
case "besu":
5157
out, err = newBesu(in)
58+
case "solana":
59+
out, err = newSolana(in)
5260
default:
5361
return nil, fmt.Errorf("blockchain type is not supported or empty, must be 'anvil' or 'geth'")
5462
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package blockchain
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"strconv"
8+
"time"
9+
10+
"github.com/docker/docker/api/types/container"
11+
"github.com/docker/docker/api/types/mount"
12+
"github.com/docker/go-connections/nat"
13+
"github.com/testcontainers/testcontainers-go"
14+
"github.com/testcontainers/testcontainers-go/wait"
15+
16+
"github.com/smartcontractkit/chainlink-testing-framework/framework"
17+
)
18+
19+
var configYmlRaw = `
20+
json_rpc_url: http://0.0.0.0:%s
21+
websocket_url: ws://0.0.0.0:%s
22+
keypair_path: /root/.config/solana/cli/id.json
23+
address_labels:
24+
"11111111111111111111111111111111": ""
25+
commitment: finalized
26+
`
27+
28+
var idJSONRaw = `
29+
[94,214,238,83,144,226,75,151,226,20,5,188,42,110,64,180,196,244,6,199,29,231,108,112,67,175,110,182,3,242,102,83,103,72,221,132,137,219,215,192,224,17,146,227,94,4,173,67,173,207,11,239,127,174,101,204,65,225,90,88,224,45,205,117]
30+
`
31+
32+
func defaultSolana(in *Input) {
33+
if in.Image == "" {
34+
in.Image = "solanalabs/solana:v1.18.26"
35+
}
36+
if in.Port == "" {
37+
in.Port = "8899"
38+
}
39+
}
40+
41+
func newSolana(in *Input) (*Output, error) {
42+
defaultSolana(in)
43+
ctx := context.Background()
44+
wsPortNumberStr, err := wsPort(in.Port)
45+
if err != nil {
46+
return nil, err
47+
}
48+
framework.L.Info().Msg("Creating solana container")
49+
bindPort := fmt.Sprintf("%s/tcp", in.Port)
50+
containerName := framework.DefaultTCName("blockchain-solana-node")
51+
wsBindPort := fmt.Sprintf("%s/tcp", wsPortNumberStr)
52+
53+
configYml, err := os.CreateTemp("", "config.yml")
54+
if err != nil {
55+
return nil, err
56+
}
57+
configYmlRaw = fmt.Sprintf(configYmlRaw, in.Port, wsPortNumberStr)
58+
_, err = configYml.WriteString(configYmlRaw)
59+
if err != nil {
60+
return nil, err
61+
}
62+
63+
idJSON, err := os.CreateTemp("", "id.json")
64+
if err != nil {
65+
return nil, err
66+
}
67+
_, err = idJSON.WriteString(idJSONRaw)
68+
if err != nil {
69+
return nil, err
70+
}
71+
72+
req := testcontainers.ContainerRequest{
73+
AlwaysPullImage: in.PullImage,
74+
Image: in.Image,
75+
Labels: framework.DefaultTCLabels(),
76+
Name: containerName,
77+
ExposedPorts: []string{bindPort, wsBindPort},
78+
Networks: []string{framework.DefaultNetworkName},
79+
NetworkAliases: map[string][]string{
80+
framework.DefaultNetworkName: {containerName},
81+
},
82+
WaitingFor: wait.ForLog("Processed Slot: 1").
83+
WithStartupTimeout(30 * time.Second).
84+
WithPollInterval(100 * time.Millisecond),
85+
Env: map[string]string{
86+
"SERVER_PORT": "1080", // what is this?
87+
},
88+
HostConfigModifier: func(h *container.HostConfig) {
89+
h.PortBindings = framework.MapTheSamePort(bindPort)
90+
h.PortBindings[nat.Port(wsBindPort)] = []nat.PortBinding{
91+
{
92+
HostIP: "0.0.0.0",
93+
HostPort: wsBindPort,
94+
},
95+
}
96+
h.Mounts = append(h.Mounts, mount.Mount{
97+
Type: mount.TypeBind,
98+
Source: in.ContractsDir,
99+
Target: "/programs",
100+
ReadOnly: false,
101+
})
102+
},
103+
LifecycleHooks: []testcontainers.ContainerLifecycleHooks{
104+
{
105+
PostStarts: []testcontainers.ContainerHook{
106+
func(ctx context.Context, container testcontainers.Container) error {
107+
err = container.CopyFileToContainer(ctx, configYml.Name(), "/root/.config/solana/cli/config.yml", 0644)
108+
if err != nil {
109+
return err
110+
}
111+
err = container.CopyFileToContainer(ctx, idJSON.Name(), "/root/.config/solana/cli/id.json", 0644)
112+
return err
113+
},
114+
},
115+
},
116+
},
117+
Entrypoint: []string{"sh", "-c", "mkdir -p /root/.config/solana/cli && solana-test-validator -r --mint=" + in.PublicKey},
118+
}
119+
120+
c, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
121+
ContainerRequest: req,
122+
Started: true,
123+
})
124+
if err != nil {
125+
return nil, err
126+
}
127+
host, err := framework.GetHost(c)
128+
if err != nil {
129+
return nil, err
130+
}
131+
mp, err := c.MappedPort(ctx, nat.Port(bindPort))
132+
if err != nil {
133+
return nil, err
134+
}
135+
wsmp, err := c.MappedPort(ctx, nat.Port(wsBindPort))
136+
if err != nil {
137+
return nil, err
138+
}
139+
140+
framework.L.Info().Msg("Started Solana container")
141+
142+
return &Output{
143+
UseCache: true,
144+
Family: "non-evm",
145+
ChainID: in.ChainID,
146+
ContainerName: containerName,
147+
Nodes: []*Node{
148+
{
149+
HostWSUrl: fmt.Sprintf("ws://%s:%s", host, wsmp.Port()),
150+
HostHTTPUrl: fmt.Sprintf("http://%s:%s", host, mp.Port()),
151+
DockerInternalWSUrl: fmt.Sprintf("ws://%s:%s", containerName, wsPortNumberStr),
152+
DockerInternalHTTPUrl: fmt.Sprintf("http://%s:%s", containerName, in.Port),
153+
},
154+
},
155+
}, nil
156+
}
157+
158+
func wsPort(rpcPort string) (string, error) {
159+
wsPortNumber, err := strconv.Atoi(rpcPort)
160+
if err != nil {
161+
return "", fmt.Errorf("failed to convert port to integer: %w", err)
162+
}
163+
wsPortNumber += 1 // Increment by 1
164+
wsPortNumberStr := strconv.Itoa(wsPortNumber)
165+
return wsPortNumberStr, nil
166+
}

framework/examples/myproject/go.mod

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ require (
2020
)
2121

2222
require (
23-
dario.cat/mergo v1.0.0 // indirect
23+
dario.cat/mergo v1.0.1 // indirect
2424
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 // indirect
2525
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect
2626
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect
2727
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
2828
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect
2929
github.com/Masterminds/goutils v1.1.1 // indirect
30-
github.com/Masterminds/semver/v3 v3.2.1 // indirect
30+
github.com/Masterminds/semver/v3 v3.3.0 // indirect
3131
github.com/Masterminds/sprig/v3 v3.2.3 // indirect
3232
github.com/Microsoft/go-winio v0.6.2 // indirect
3333
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
@@ -46,7 +46,7 @@ require (
4646
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
4747
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect
4848
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.4 // indirect
49-
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3 // indirect
49+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 // indirect
5050
github.com/aws/aws-sdk-go-v2/service/sso v1.24.5 // indirect
5151
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.4 // indirect
5252
github.com/aws/aws-sdk-go-v2/service/sts v1.33.0 // indirect
@@ -80,7 +80,7 @@ require (
8080
github.com/consensys/gnark-crypto v0.12.1 // indirect
8181
github.com/containerd/log v0.1.0 // indirect
8282
github.com/containerd/platforms v0.2.1 // indirect
83-
github.com/coreos/go-semver v0.3.0 // indirect
83+
github.com/coreos/go-semver v0.3.1 // indirect
8484
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
8585
github.com/cpuguy83/dockercfg v0.3.2 // indirect
8686
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
@@ -92,7 +92,7 @@ require (
9292
github.com/dennwc/varint v1.0.0 // indirect
9393
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
9494
github.com/distribution/reference v0.6.0 // indirect
95-
github.com/docker/docker v27.3.0+incompatible // indirect
95+
github.com/docker/docker v27.3.1+incompatible // indirect
9696
github.com/docker/go-connections v0.5.0 // indirect
9797
github.com/docker/go-units v0.5.0 // indirect
9898
github.com/dustin/go-humanize v1.0.1 // indirect
@@ -102,7 +102,7 @@ require (
102102
github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
103103
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect
104104
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect
105-
github.com/fatih/color v1.16.0 // indirect
105+
github.com/fatih/color v1.17.0 // indirect
106106
github.com/felixge/httpsnoop v1.0.4 // indirect
107107
github.com/fsnotify/fsnotify v1.7.0 // indirect
108108
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
@@ -218,7 +218,7 @@ require (
218218
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
219219
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
220220
github.com/prometheus/alertmanager v0.26.0 // indirect
221-
github.com/prometheus/client_golang v1.20.4 // indirect
221+
github.com/prometheus/client_golang v1.20.5 // indirect
222222
github.com/prometheus/client_model v0.6.1 // indirect
223223
github.com/prometheus/common v0.60.0 // indirect
224224
github.com/prometheus/common/sigv4 v0.1.0 // indirect
@@ -253,9 +253,9 @@ require (
253253
github.com/x448/float16 v0.8.4 // indirect
254254
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
255255
github.com/yusufpapurcu/wmi v1.2.3 // indirect
256-
go.etcd.io/etcd/api/v3 v3.5.7 // indirect
257-
go.etcd.io/etcd/client/pkg/v3 v3.5.7 // indirect
258-
go.etcd.io/etcd/client/v3 v3.5.7 // indirect
256+
go.etcd.io/etcd/api/v3 v3.5.14 // indirect
257+
go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect
258+
go.etcd.io/etcd/client/v3 v3.5.14 // indirect
259259
go.mongodb.org/mongo-driver v1.12.0 // indirect
260260
go.opentelemetry.io/collector/pdata v1.0.0-rcv0015 // indirect
261261
go.opentelemetry.io/collector/semconv v0.81.0 // indirect
@@ -274,16 +274,16 @@ require (
274274
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect
275275
golang.org/x/arch v0.11.0 // indirect
276276
golang.org/x/crypto v0.29.0 // indirect
277-
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
278-
golang.org/x/mod v0.18.0 // indirect
277+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
278+
golang.org/x/mod v0.21.0 // indirect
279279
golang.org/x/net v0.30.0 // indirect
280280
golang.org/x/oauth2 v0.24.0 // indirect
281281
golang.org/x/sync v0.9.0 // indirect
282282
golang.org/x/sys v0.27.0 // indirect
283283
golang.org/x/term v0.26.0 // indirect
284284
golang.org/x/text v0.20.0 // indirect
285285
golang.org/x/time v0.7.0 // indirect
286-
golang.org/x/tools v0.22.0 // indirect
286+
golang.org/x/tools v0.26.0 // indirect
287287
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
288288
google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect
289289
google.golang.org/grpc v1.68.0 // indirect

framework/examples/myproject/go.sum

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
3232
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
3333
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
3434
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
35+
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
3536
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
3637
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
3738
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
@@ -75,6 +76,7 @@ github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy86
7576
github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
7677
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
7778
github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
79+
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
7880
github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
7981
github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
8082
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
@@ -138,6 +140,7 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.4 h1:tHxQi/XHP
138140
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.4/go.mod h1:4GQbF1vJzG60poZqWatZlhP31y8PGCCVTvIGPdaaYJ0=
139141
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3 h1:W2M3kQSuN1+FXgV2wMv1JMWPxw/37wBN87QHYDuTV0Y=
140142
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.33.3/go.mod h1:WyLS5qwXHtjKAONYZq/4ewdd+hcVsa3LBu77Ow5uj3k=
143+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2/go.mod h1:QuCURO98Sqee2AXmqDNxKXYFm2OEDAVAPApMqO0Vqnc=
141144
github.com/aws/aws-sdk-go-v2/service/sso v1.24.5 h1:HJwZwRt2Z2Tdec+m+fPjvdmkq2s9Ra+VR0hjF7V2o40=
142145
github.com/aws/aws-sdk-go-v2/service/sso v1.24.5/go.mod h1:wrMCEwjFPms+V86TCQQeOxQF/If4vT44FGIOFiMC2ck=
143146
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.4 h1:zcx9LiGWZ6i6pjdcoE9oXAB6mUdeyC36Ia/QEiIvYdg=
@@ -239,6 +242,7 @@ github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpS
239242
github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
240243
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
241244
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
245+
github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
242246
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
243247
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
244248
github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA=
@@ -274,6 +278,7 @@ github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
274278
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
275279
github.com/docker/docker v27.3.0+incompatible h1:BNb1QY6o4JdKpqwi9IB+HUYcRRrVN4aGFUTvDmWYK1A=
276280
github.com/docker/docker v27.3.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
281+
github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
277282
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
278283
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
279284
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
@@ -307,6 +312,7 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL
307312
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
308313
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
309314
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
315+
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
310316
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
311317
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
312318
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
@@ -823,6 +829,7 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP
823829
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
824830
github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI=
825831
github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
832+
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
826833
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
827834
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
828835
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -979,10 +986,13 @@ github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFi
979986
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
980987
go.etcd.io/etcd/api/v3 v3.5.7 h1:sbcmosSVesNrWOJ58ZQFitHMdncusIifYcrBfwrlJSY=
981988
go.etcd.io/etcd/api/v3 v3.5.7/go.mod h1:9qew1gCdDDLu+VwmeG+iFpL+QlpHTo7iubavdVDgCAA=
989+
go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU=
982990
go.etcd.io/etcd/client/pkg/v3 v3.5.7 h1:y3kf5Gbp4e4q7egZdn5T7W9TSHUvkClN6u+Rq9mEOmg=
983991
go.etcd.io/etcd/client/pkg/v3 v3.5.7/go.mod h1:o0Abi1MK86iad3YrWhgUsbGx1pmTS+hrORWc2CamuhY=
992+
go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI=
984993
go.etcd.io/etcd/client/v3 v3.5.7 h1:u/OhpiuCgYY8awOHlhIhmGIGpxfBU/GZBUP3m/3/Iz4=
985994
go.etcd.io/etcd/client/v3 v3.5.7/go.mod h1:sOWmj9DZUMyAngS7QQwCyAXXAL6WhgTOPLNS/NabQgw=
995+
go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk=
986996
go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg=
987997
go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng=
988998
go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8=
@@ -1053,6 +1063,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
10531063
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
10541064
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
10551065
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
1066+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
10561067
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
10571068
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
10581069
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1076,6 +1087,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
10761087
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
10771088
golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
10781089
golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
1090+
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
10791091
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
10801092
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
10811093
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1287,6 +1299,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
12871299
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
12881300
golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
12891301
golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
1302+
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
12901303
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
12911304
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
12921305
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

0 commit comments

Comments
 (0)