Skip to content

Commit 59c7a6f

Browse files
authored
Merge branch 'main' into cre-1323
2 parents 45a0c93 + 9720931 commit 59c7a6f

File tree

84 files changed

+16262
-545
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+16262
-545
lines changed

.mockery.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ packages:
2222
ContractReader:
2323
EVMService:
2424
TONService:
25+
SolanaService:
2526
github.com/smartcontractkit/chainlink-common/pkg/types/core:
2627
interfaces:
2728
CapabilitiesRegistry:

go.mod

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ require (
3030
github.com/kylelemons/godebug v1.1.0
3131
github.com/lib/pq v1.10.9
3232
github.com/marcboeker/go-duckdb v1.8.5
33+
github.com/mr-tron/base58 v1.2.0
3334
github.com/pelletier/go-toml v1.9.5
3435
github.com/pelletier/go-toml/v2 v2.2.4
3536
github.com/prometheus/client_golang v1.22.0
@@ -39,7 +40,7 @@ require (
3940
github.com/smartcontractkit/chain-selectors v1.0.67
4041
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10
4142
github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4
42-
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251021010742-3f8d3dba17d8
43+
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9
4344
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b
4445
github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0
4546
github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20251020004840-4638e4262066
@@ -65,11 +66,11 @@ require (
6566
go.opentelemetry.io/otel/sdk/metric v1.38.0
6667
go.opentelemetry.io/otel/trace v1.38.0
6768
go.uber.org/zap v1.27.0
68-
golang.org/x/crypto v0.41.0
69+
golang.org/x/crypto v0.45.0
6970
golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc
70-
golang.org/x/sync v0.16.0
71+
golang.org/x/sync v0.18.0
7172
golang.org/x/time v0.12.0
72-
golang.org/x/tools v0.35.0
73+
golang.org/x/tools v0.38.0
7374
gonum.org/v1/gonum v0.16.0
7475
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5
7576
google.golang.org/grpc v1.75.0
@@ -125,7 +126,6 @@ require (
125126
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
126127
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
127128
github.com/modern-go/reflect2 v1.0.2 // indirect
128-
github.com/mr-tron/base58 v1.2.0 // indirect
129129
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
130130
github.com/oklog/run v1.2.0 // indirect
131131
github.com/pierrec/lz4/v4 v4.1.22 // indirect
@@ -145,11 +145,12 @@ require (
145145
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect
146146
go.opentelemetry.io/proto/otlp v1.6.0 // indirect
147147
go.uber.org/multierr v1.11.0 // indirect
148-
golang.org/x/mod v0.26.0 // indirect
149-
golang.org/x/net v0.43.0 // indirect
150-
golang.org/x/sys v0.35.0 // indirect
151-
golang.org/x/term v0.34.0 // indirect
152-
golang.org/x/text v0.28.0 // indirect
148+
golang.org/x/mod v0.29.0 // indirect
149+
golang.org/x/net v0.47.0 // indirect
150+
golang.org/x/sys v0.38.0 // indirect
151+
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect
152+
golang.org/x/term v0.37.0 // indirect
153+
golang.org/x/text v0.31.0 // indirect
153154
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
154155
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
155156
gopkg.in/yaml.v2 v2.4.0 // indirect

go.sum

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,8 @@ github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9
330330
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY=
331331
github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 h1:GCzrxDWn3b7jFfEA+WiYRi8CKoegsayiDoJBCjYkneE=
332332
github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4/go.mod h1:HHGeDUpAsPa0pmOx7wrByCitjQ0mbUxf0R9v+g67uCA=
333-
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251021010742-3f8d3dba17d8 h1:hPeEwcvRVtwhyNXH45qbzqmscqlbygu94cROwbjyzNQ=
334-
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251021010742-3f8d3dba17d8/go.mod h1:jUC52kZzEnWF9tddHh85zolKybmLpbQ1oNA4FjOHt1Q=
333+
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 h1:QRWXJusIj/IRY5Pl3JclNvDre0cZPd/5NbILwc4RV2M=
334+
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9/go.mod h1:jUC52kZzEnWF9tddHh85zolKybmLpbQ1oNA4FjOHt1Q=
335335
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b h1:QuI6SmQFK/zyUlVWEf0GMkiUYBPY4lssn26nKSd/bOM=
336336
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b/go.mod h1:qSTSwX3cBP3FKQwQacdjArqv0g6QnukjV4XuzO6UyoY=
337337
github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0 h1:B7itmjy+CMJ26elVw/cAJqqhBQ3Xa/mBYWK0/rQ5MuI=
@@ -450,8 +450,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y
450450
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
451451
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
452452
golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
453-
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
454-
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
453+
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
454+
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
455455
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
456456
golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc h1:TS73t7x3KarrNd5qAipmspBDS1rkMcgVG/fS1aRb4Rc=
457457
golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
@@ -465,8 +465,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
465465
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
466466
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
467467
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
468-
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
469-
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
468+
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
469+
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
470470
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
471471
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
472472
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -483,8 +483,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
483483
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
484484
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
485485
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
486-
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
487-
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
486+
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
487+
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
488488
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
489489
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
490490
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -494,8 +494,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
494494
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
495495
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
496496
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
497-
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
498-
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
497+
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
498+
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
499499
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
500500
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
501501
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -525,16 +525,18 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
525525
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
526526
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
527527
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
528-
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
529-
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
528+
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
529+
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
530+
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU=
531+
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE=
530532
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
531533
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
532534
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
533535
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
534536
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
535537
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
536-
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
537-
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
538+
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
539+
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
538540
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
539541
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
540542
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -545,8 +547,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
545547
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
546548
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
547549
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
548-
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
549-
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
550+
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
551+
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
550552
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
551553
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
552554
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -566,8 +568,8 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK
566568
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
567569
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
568570
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
569-
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
570-
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
571+
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
572+
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
571573
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
572574
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
573575
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

keystore/cli/cli.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func NewDeleteCmd() *cobra.Command {
177177
}
178178
reader := bufio.NewReader(cmd.InOrStdin())
179179
line, _ := reader.ReadString('\n')
180-
if strings.TrimSpace(line) != "yes\n" {
180+
if strings.TrimSpace(line) != "yes" {
181181
return errors.New("delete aborted by user")
182182
}
183183
}

keystore/cli/cli_test.go

Lines changed: 55 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
)
1616

1717
func TestCLI(t *testing.T) {
18-
cmd := cli.NewRootCmd()
1918
tempDir := t.TempDir()
2019
defer os.RemoveAll(tempDir)
2120
keystoreFile := filepath.Join(tempDir, "keystore.json")
@@ -26,70 +25,58 @@ func TestCLI(t *testing.T) {
2625
os.Setenv("KEYSTORE_PASSWORD", "testpassword")
2726

2827
// No error just listing help.
29-
buf := new(bytes.Buffer)
30-
cmd.SetOutput(buf)
31-
cmd.SetErr(buf)
32-
cmd.SetArgs([]string{})
33-
require.NoError(t, cmd.ExecuteContext(t.Context()))
28+
_, err = runCommand(t, nil, "")
29+
require.NoError(t, err)
3430

3531
// Create a key.
36-
buf.Reset()
37-
cmd.SetArgs([]string{"create", "-d", `{"Keys": [{"KeyName": "testkey", "KeyType": "X25519"}]}`})
38-
require.NoError(t, cmd.ExecuteContext(t.Context()))
32+
_, err = runCommand(t, nil, "create", "-d", `{"Keys": [{"KeyName": "testkey", "KeyType": "X25519"}]}`)
33+
require.NoError(t, err)
3934

4035
// List keys.
41-
buf.Reset()
42-
cmd.SetArgs([]string{"get", "-d", `{"KeyNames": ["testkey"]}`})
43-
require.NoError(t, cmd.ExecuteContext(t.Context()))
36+
out, err := runCommand(t, nil, "get", "-d", `{"KeyNames": ["testkey"]}`)
37+
require.NoError(t, err)
4438
resp := ks.GetKeysResponse{}
45-
err = json.Unmarshal(buf.Bytes(), &resp)
39+
err = json.Unmarshal(out.Bytes(), &resp)
4640
require.NoError(t, err)
4741
require.Len(t, resp.Keys, 1)
4842
require.Equal(t, "testkey", resp.Keys[0].KeyInfo.Name)
4943
require.Equal(t, ks.X25519, resp.Keys[0].KeyInfo.KeyType)
5044

5145
// Create a second key we export.
52-
buf.Reset()
53-
cmd.SetArgs([]string{"create", "-d", `{"Keys": [{"KeyName": "testkey2", "KeyType": "ECDSA_S256"}]}`})
54-
require.NoError(t, cmd.ExecuteContext(t.Context()))
46+
_, err = runCommand(t, nil, "create", "-d", `{"Keys": [{"KeyName": "testkey2", "KeyType": "ECDSA_S256"}]}`)
47+
require.NoError(t, err)
5548

5649
// Export the second key.
57-
buf.Reset()
58-
cmd.SetArgs([]string{"export", "-d", `{"Keys": [{"KeyName": "testkey2", "Enc": {"Password": "testpassword2", "ScryptParams": {"N": 1024, "P": 1, "R": 8}}}]}`})
59-
require.NoError(t, cmd.ExecuteContext(t.Context()))
50+
out, err = runCommand(t, nil, "export", "-d", `{"Keys": [{"KeyName": "testkey2", "Enc": {"Password": "testpassword2", "ScryptParams": {"N": 1024, "P": 1, "R": 8}}}]}`)
51+
require.NoError(t, err)
6052
exportResp := ks.ExportKeysResponse{}
61-
err = json.Unmarshal(buf.Bytes(), &exportResp)
53+
err = json.Unmarshal(out.Bytes(), &exportResp)
6254
require.NoError(t, err)
6355
exportedKey2Data := base64.StdEncoding.EncodeToString(exportResp.Keys[0].Data)
6456

6557
// Delete the second key.
66-
buf.Reset()
67-
// Force deletion without confirmation.
68-
cmd.SetArgs([]string{"delete", "-d", `{"KeyNames": ["testkey2"]}`, "--yes"})
69-
require.NoError(t, cmd.ExecuteContext(t.Context()))
58+
_, err = runCommand(t, nil, "delete", "-d", `{"KeyNames": ["testkey2"]}`, "--yes")
59+
require.NoError(t, err)
7060

7161
// List key should only see first.
72-
buf.Reset()
73-
cmd.SetArgs([]string{"list"})
74-
require.NoError(t, cmd.ExecuteContext(t.Context()))
62+
out, err = runCommand(t, nil, "list")
63+
require.NoError(t, err)
7564
resp = ks.GetKeysResponse{}
76-
err = json.Unmarshal(buf.Bytes(), &resp)
65+
err = json.Unmarshal(out.Bytes(), &resp)
7766
require.NoError(t, err)
7867
require.Len(t, resp.Keys, 1)
7968
require.Equal(t, "testkey", resp.Keys[0].KeyInfo.Name)
8069
require.Equal(t, ks.X25519, resp.Keys[0].KeyInfo.KeyType)
8170

8271
// Import the exported key.
83-
buf.Reset()
84-
cmd.SetArgs([]string{"import", "-d", `{"Keys": [{"KeyName": "testkey2", "Data": "` + exportedKey2Data + `", "Password": "testpassword2"}]}`})
85-
require.NoError(t, cmd.ExecuteContext(t.Context()))
72+
_, err = runCommand(t, nil, "import", "-d", `{"Keys": [{"KeyName": "testkey2", "Data": "`+exportedKey2Data+`", "Password": "testpassword2"}]}`)
73+
require.NoError(t, err)
8674

8775
// List keys.
88-
buf.Reset()
89-
cmd.SetArgs([]string{"list"})
90-
require.NoError(t, cmd.ExecuteContext(t.Context()))
76+
out, err = runCommand(t, nil, "list")
77+
require.NoError(t, err)
9178
resp = ks.GetKeysResponse{}
92-
err = json.Unmarshal(buf.Bytes(), &resp)
79+
err = json.Unmarshal(out.Bytes(), &resp)
9380
require.NoError(t, err)
9481
require.Len(t, resp.Keys, 2)
9582
require.Equal(t, "testkey", resp.Keys[0].KeyInfo.Name)
@@ -98,20 +85,46 @@ func TestCLI(t *testing.T) {
9885
require.Equal(t, ks.ECDSA_S256, resp.Keys[1].KeyInfo.KeyType)
9986

10087
// Set metadata on testkey.
101-
buf.Reset()
10288
metadata := base64.StdEncoding.EncodeToString([]byte("my-custom-metadata"))
103-
cmd.SetArgs([]string{"set-metadata", "-d", `{"Updates": [{"KeyName": "testkey", "Metadata": "` + metadata + `"}]}`})
104-
require.NoError(t, cmd.ExecuteContext(t.Context()))
89+
_, err = runCommand(t, nil, "set-metadata", "-d", `{"Updates": [{"KeyName": "testkey", "Metadata": "`+metadata+`"}]}`)
90+
require.NoError(t, err)
10591

10692
// Verify metadata was set.
107-
buf.Reset()
108-
cmd.SetArgs([]string{"get", "-d", `{"KeyNames": ["testkey"]}`})
109-
require.NoError(t, cmd.ExecuteContext(t.Context()))
93+
out, err = runCommand(t, nil, "get", "-d", `{"KeyNames": ["testkey"]}`)
94+
require.NoError(t, err)
11095
resp = ks.GetKeysResponse{}
111-
err = json.Unmarshal(buf.Bytes(), &resp)
96+
err = json.Unmarshal(out.Bytes(), &resp)
11297
require.NoError(t, err)
11398
require.Len(t, resp.Keys, 1)
11499
require.Equal(t, "testkey", resp.Keys[0].KeyInfo.Name)
115100
// Metadata is []byte, Go's JSON unmarshaler automatically decodes base64 strings
116101
require.Equal(t, "my-custom-metadata", string(resp.Keys[0].KeyInfo.Metadata))
102+
103+
// Delete the keys with confirmation.
104+
out, err = runCommand(t, bytes.NewBufferString("yes\n"), "delete", "-d", `{"KeyNames": ["testkey", "testkey2"]}`)
105+
require.NoError(t, err)
106+
t.Log("out", out.String())
107+
108+
// List keys should be empty.
109+
out, err = runCommand(t, nil, "list")
110+
require.NoError(t, err)
111+
resp = ks.GetKeysResponse{}
112+
err = json.Unmarshal(out.Bytes(), &resp)
113+
require.NoError(t, err)
114+
require.Empty(t, resp.Keys)
115+
}
116+
117+
func runCommand(t *testing.T, in *bytes.Buffer, args ...string) (bytes.Buffer, error) {
118+
// Cobra commands are stateful which can cause subtle bugs if not reset.
119+
// For simplicity just create a fresh object.
120+
cmd := cli.NewRootCmd()
121+
buf := new(bytes.Buffer)
122+
cmd.SetOutput(buf)
123+
cmd.SetArgs(args)
124+
cmd.SetIn(in)
125+
err := cmd.ExecuteContext(t.Context())
126+
if err != nil {
127+
return bytes.Buffer{}, err
128+
}
129+
return *buf, nil
117130
}

keystore/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ require (
8585
github.com/shopspring/decimal v1.4.0 // indirect
8686
github.com/smartcontractkit/chain-selectors v1.0.67 // indirect
8787
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect
88-
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251021010742-3f8d3dba17d8 // indirect
88+
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 // indirect
8989
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b // indirect
9090
github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e // indirect
9191
github.com/spf13/pflag v1.0.6 // indirect

0 commit comments

Comments
 (0)