diff --git a/cmd/chainlink-ton/lock.nix b/cmd/chainlink-ton/lock.nix index 4c3a1bf56..6fc19aa4d 100644 --- a/cmd/chainlink-ton/lock.nix +++ b/cmd/chainlink-ton/lock.nix @@ -1,5 +1,5 @@ # Notice: `pkgs.lib.fakeHash` can be used as a placeholder, # but `lock-nix-tidy` will only replace actual hashes. {pkgs}: { - chainlink-ton = "sha256-L+DYd+iECMZQftw4cqrRfahrXarJdC1z+SxwdQ+/J8M="; + chainlink-ton = "sha256-mVAaO/QcPhHwJp5MvAmENYAcsScZ87mZNfTmQH0sD80="; } diff --git a/deployment/ccip/cs_test_helpers.go b/deployment/ccip/cs_test_helpers.go index ea0bdb286..c933423a1 100644 --- a/deployment/ccip/cs_test_helpers.go +++ b/deployment/ccip/cs_test_helpers.go @@ -24,7 +24,6 @@ import ( "github.com/xssnick/tonutils-go/tlb" "github.com/xssnick/tonutils-go/ton" "github.com/xssnick/tonutils-go/ton/wallet" - "github.com/xssnick/tonutils-go/tvm/cell" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -277,42 +276,8 @@ func AddLaneTONConfig(env *cldf.Environment, onRamp []byte, from, to uint64, fro } // TODO Consider move chainlink core AnyMsgSentEvent and CCIPSendReqConfig to CLDF? - -// TonSendRequest is a simplified CCIP send request structure. -// Deprecated: Use router.CCIPSend directly with SendCCIPMessage for new code. -type TonSendRequest struct { - QueryID uint64 - Receiver []byte - Data []byte - ExtraArgs *cell.Cell - FeeToken *address.Address - // TokenAmounts common.SnakeRef[ocr.Any2TVMTokenTransfer] -} - -// ToRouterCCIPSend converts TonSendRequest to router.CCIPSend. -func (r TonSendRequest) ToRouterCCIPSend(destChainSelector uint64) router.CCIPSend { - return router.CCIPSend{ - QueryID: r.QueryID, - DestChainSelector: destChainSelector, - Receiver: r.Receiver, - Data: r.Data, - TokenAmounts: nil, // TODO: add token amounts when token transfer enabled - FeeToken: r.FeeToken, - ExtraArgs: r.ExtraArgs, - } -} - -// SendTonRequest sends a CCIP request from a TON chain. -// Deprecated: Use SendCCIPMessage with router.CCIPSend for new code. -func SendTonRequest( - e cldf.Environment, - state state.CCIPChainState, - sourceChain, destChain uint64, - msg TonSendRequest) (uint64, any, error) { - return SendCCIPMessage(e, state, sourceChain, msg.ToRouterCCIPSend(destChain)) -} - // SendCCIPMessage sends a CCIP request from a TON chain using the standard router.CCIPSend message. +// TODO: add TokenAmounts support for TON token transfers func SendCCIPMessage( e cldf.Environment, state state.CCIPChainState, diff --git a/deployment/go.mod b/deployment/go.mod index 133967f64..890f01876 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -18,7 +18,7 @@ require ( github.com/smartcontractkit/chainlink-ton v0.0.0-20250904183752-4ea5c19ee886 github.com/smartcontractkit/mcms v0.30.2 github.com/xssnick/tonutils-go v1.14.1 - golang.org/x/sync v0.17.0 + golang.org/x/sync v0.19.0 ) require ( @@ -212,14 +212,14 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.43.0 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc // indirect - golang.org/x/net v0.46.0 // indirect - golang.org/x/sys v0.37.0 // indirect - golang.org/x/term v0.36.0 // indirect - golang.org/x/text v0.30.0 // indirect + golang.org/x/net v0.47.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 - golang.org/x/tools v0.37.0 // indirect + golang.org/x/tools v0.38.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect google.golang.org/grpc v1.75.1 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index e0e895cf2..e8d7701a6 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -827,8 +827,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc h1:TS73t7x3KarrNd5qAipmspBDS1rkMcgVG/fS1aRb4Rc= golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= @@ -843,8 +843,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.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +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= @@ -866,8 +866,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= -golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -876,8 +876,8 @@ 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.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.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= @@ -922,18 +922,18 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 h1:dHQOQddU4YHS5gY33/6klKjq7Gp3WwMyOXGNp5nzRj8= -golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053/go.mod h1:+nZKN+XVh4LCiA9DV3ywrzN4gumyCnKjau3NGb9SGoE= +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-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= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= -golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -944,8 +944,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -965,8 +965,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= -golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.md b/go.md index cf35c8bc9..b9ce25f60 100644 --- a/go.md +++ b/go.md @@ -20,6 +20,8 @@ flowchart LR click chainlink-common href "https://github.com/smartcontractkit/chainlink-common" chainlink-common/pkg/chipingress click chainlink-common/pkg/chipingress href "https://github.com/smartcontractkit/chainlink-common" + chainlink-framework/metrics --> chainlink-common + click chainlink-framework/metrics href "https://github.com/smartcontractkit/chainlink-framework" chainlink-protos/billing/go click chainlink-protos/billing/go href "https://github.com/smartcontractkit/chainlink-protos" chainlink-protos/cre/go @@ -31,6 +33,7 @@ flowchart LR chainlink-protos/workflows/go click chainlink-protos/workflows/go href "https://github.com/smartcontractkit/chainlink-protos" chainlink-ton --> chainlink-ccip + chainlink-ton --> chainlink-framework/metrics click chainlink-ton href "https://github.com/smartcontractkit/chainlink-ton" freeport click freeport href "https://github.com/smartcontractkit/freeport" @@ -178,6 +181,7 @@ flowchart LR chainlink-testing-framework/wasp click chainlink-testing-framework/wasp href "https://github.com/smartcontractkit/chainlink-testing-framework" chainlink-ton --> chainlink-ccip + chainlink-ton --> chainlink-framework/metrics click chainlink-ton href "https://github.com/smartcontractkit/chainlink-ton" chainlink-ton/deployment --> chainlink-ccip/deployment chainlink-ton/deployment --> chainlink-ton diff --git a/go.mod b/go.mod index 09086c2a5..1aa8d61b4 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.72 github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251024142759-093ed1b4017f github.com/smartcontractkit/chainlink-common v0.9.6-0.20251003171904-99a82a53b142 + github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251206233640-139a324649d9 github.com/smartcontractkit/libocr v0.0.0-20250905115425-2785a5cee79d github.com/spf13/cobra v1.10.1 github.com/stretchr/testify v1.11.1 @@ -22,7 +23,7 @@ require ( go.opentelemetry.io/otel/metric v1.37.0 go.uber.org/zap v1.27.0 golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc - golang.org/x/sync v0.16.0 + golang.org/x/sync v0.19.0 ) require ( @@ -127,12 +128,13 @@ require ( go.opentelemetry.io/otel/trace v1.37.0 // indirect go.opentelemetry.io/proto/otlp v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.40.0 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/net v0.42.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/term v0.33.0 // indirect - golang.org/x/text v0.28.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/telemetry v0.0.0-20251208220230-2638a1023523 // 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 google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect diff --git a/go.sum b/go.sum index 397dec12e..0c22c999b 100644 --- a/go.sum +++ b/go.sum @@ -316,6 +316,8 @@ github.com/smartcontractkit/chainlink-common v0.9.6-0.20251003171904-99a82a53b14 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-framework/metrics v0.0.0-20251206233640-139a324649d9 h1:TAVreQK5eP63a0zu5Qe34i4pYGGo5x8zgfJ1NVVo6K4= +github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251206233640-139a324649d9/go.mod h1:HG/aei0MgBOpsyRLexdKGtOUO8yjSJO3iUu0Uu8KBm4= 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/freeport v0.1.3-0.20250716200817-cb5dfd0e369e h1:Hv9Mww35LrufCdM9wtS9yVi/rEWGI1UnjHbcKKU0nVY= @@ -443,8 +445,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc h1:TS73t7x3KarrNd5qAipmspBDS1rkMcgVG/fS1aRb4Rc= golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= @@ -459,8 +461,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.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +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-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -478,8 +480,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -488,8 +490,8 @@ 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.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -520,16 +522,18 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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-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= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= -golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -540,8 +544,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -561,8 +565,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/integration-tests/deployment/ccip/cs_test.go b/integration-tests/deployment/ccip/cs_test.go index 0e35ba35e..84c240e51 100644 --- a/integration-tests/deployment/ccip/cs_test.go +++ b/integration-tests/deployment/ccip/cs_test.go @@ -185,10 +185,11 @@ func TestDeployCCIP(t *testing.T) { TxLoader: txloader.New(lggr, clientProvider), LogStore: inmemorystore.NewLogStore("test-chain", lggr), } - lp := logpoller.NewService(lggr, "test-chain", + lp, err := logpoller.NewService(lggr, "test-chain", clientProvider, opts, ) + require.NoError(t, err) addrCodec := codec.NewAddressCodec() accessor, err := chainaccessor.NewTONAccessor(lggr, ccipocr3.ChainSelector(chainSelector), tonChain.Client, lp, addrCodec) require.NoError(t, err) diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 743c54033..eacfad40c 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -341,7 +341,7 @@ require ( github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251127103031-b25db0b98e0b // indirect github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251022075638-49d961001d1b // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 // indirect - github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a // indirect + github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251206233640-139a324649d9 // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 // indirect github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251124151448-0448aefdaab9 // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 // indirect @@ -423,16 +423,16 @@ require ( golang.org/x/arch v0.11.0 // indirect golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc // indirect - golang.org/x/mod v0.29.0 // indirect + golang.org/x/mod v0.31.0 // indirect golang.org/x/net v0.47.0 // indirect golang.org/x/oauth2 v0.32.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/telemetry v0.0.0-20251208220230-2638a1023523 // 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 - golang.org/x/tools v0.38.0 // indirect + golang.org/x/tools v0.39.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.16.0 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 932613e64..6cdd47cab 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1156,8 +1156,8 @@ github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-202508181755 github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20250818175541-3389ac08a563/go.mod h1:jP5mrOLFEYZZkl7EiCHRRIMSSHCQsYypm1OZSus//iI= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942 h1:D7N2d46Nj7ZSzpdDRg6GtsgldNgZyOojjWrH/Y/Fl+w= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20251021173435-e86785845942/go.mod h1:+pRGfDej1r7cHMs1dYmuyPuOZzYB9Q+PKu0FvZOYlmw= -github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a h1:pr0VFI7AWlDVJBEkcvzXWd97V8w8QMNjRdfPVa/IQLk= -github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251020150604-8ab84f7bad1a/go.mod h1:jo+cUqNcHwN8IF7SInQNXDZ8qzBsyMpnLdYbDswviFc= +github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251206233640-139a324649d9 h1:TAVreQK5eP63a0zu5Qe34i4pYGGo5x8zgfJ1NVVo6K4= +github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251206233640-139a324649d9/go.mod h1:HG/aei0MgBOpsyRLexdKGtOUO8yjSJO3iUu0Uu8KBm4= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942 h1:T/eCDsUI8EJT4n5zSP4w1mz4RHH+ap8qieA17QYfBhk= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20251021173435-e86785845942/go.mod h1:2JTBNp3FlRdO/nHc4dsc9bfxxMClMO1Qt8sLJgtreBY= github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 h1:GCzrxDWn3b7jFfEA+WiYRi8CKoegsayiDoJBCjYkneE= @@ -1472,8 +1472,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= @@ -1525,8 +1525,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/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= 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= @@ -1587,10 +1587,10 @@ 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.18.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/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/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-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= @@ -1638,8 +1638,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/integration-tests/smoke/chainaccessor/accessor_test.go b/integration-tests/smoke/chainaccessor/accessor_test.go index 5012745f4..c75bb1311 100644 --- a/integration-tests/smoke/chainaccessor/accessor_test.go +++ b/integration-tests/smoke/chainaccessor/accessor_test.go @@ -351,12 +351,13 @@ func Test_TonAccessorCommitEventQueries(t *testing.T) { LogStore: inmemorystore.NewLogStore("test-chain", lggr), } - lp := logpoller.NewService( + lp, err := logpoller.NewService( lggr, "test-chain", clientProvider, opts, ) + require.NoError(t, err) // Run test with in-memory store (filterID = 1 for in-memory) testCommitReportsMixedHelper(t, lp, opts.LogStore, 1, merkleRootOnlyCell, priceOnlyCell, bothCell) @@ -370,12 +371,13 @@ func Test_TonAccessorCommitEventQueries(t *testing.T) { LogStore: inmemorystore.NewLogStore("test-chain", lggr), } - lp := logpoller.NewService( + lp, err := logpoller.NewService( lggr, "test-chain", clientProvider, opts, ) + require.NoError(t, err) // Run test with in-memory store (filterID = 1 for in-memory) testCommitReportsBasicHelper(t, lp, opts.LogStore, 1, merkleRootOnlyCell) @@ -399,12 +401,13 @@ func Test_TonAccessorCommitEventQueries(t *testing.T) { LogStore: postgresstore.NewLogStore("test-chain", orm, lggr), } - lp := logpoller.NewService( + lp, err := logpoller.NewService( lggr, "test-chain", clientProvider, opts, ) + require.NoError(t, err) // Register filter first (required for foreign key constraint) filter := lptypes.Filter{ @@ -438,12 +441,13 @@ func Test_TonAccessorCommitEventQueries(t *testing.T) { LogStore: postgresstore.NewLogStore("test-chain", orm, lggr), } - lp := logpoller.NewService( + lp, err := logpoller.NewService( lggr, "test-chain", clientProvider, opts, ) + require.NoError(t, err) // Register filter first (required for foreign key constraint) filter := lptypes.Filter{ @@ -704,12 +708,13 @@ func Test_TonAccessorExecutedMessages(t *testing.T) { LogStore: inmemorystore.NewLogStore("test-chain", lggr), } - lp := logpoller.NewService( + lp, err := logpoller.NewService( lggr, "test-chain", clientProvider, opts, ) + require.NoError(t, err) // Run common test logic with in-memory store (filterID = 1 for in-memory) testExecutedMessagesHelper(t, lp, opts.LogStore, 1) @@ -744,12 +749,13 @@ func Test_TonAccessorExecutedMessages_WithPostgresStore(t *testing.T) { LogStore: pgStore, } - lp := logpoller.NewService( + lp, err := logpoller.NewService( lggr, "test-chain", clientProvider, opts, ) + require.NoError(t, err) // Register filter first (required for foreign key constraint) filter := lptypes.Filter{ diff --git a/integration-tests/smoke/logpoller/log_poller_test.go b/integration-tests/smoke/logpoller/log_poller_test.go index a060948d9..21220b941 100644 --- a/integration-tests/smoke/logpoller/log_poller_test.go +++ b/integration-tests/smoke/logpoller/log_poller_test.go @@ -196,12 +196,13 @@ func Test_LogPoller(t *testing.T) { TxLoader: txloader.New(lggr, clientProvider), LogStore: inmemorystore.NewLogStore("test-chain", lggr), } - lp := logpoller.NewService( + lp, err := logpoller.NewService( lggr, "test-chain", clientProvider, opts, ) + require.NoError(t, err) // register filters filterA := models.Filter{ @@ -869,7 +870,8 @@ func Test_LogPoller(t *testing.T) { TxLoader: txloader.New(lggr, clientProvider), LogStore: inmemorystore.NewLogStore("test-chain", lggr), } - lp := logpoller.NewService(lggr, "test-chain", clientProvider, opts) + lp, err := logpoller.NewService(lggr, "test-chain", clientProvider, opts) + require.NoError(t, err) // 4. Register filter (without replay) filter := models.Filter{ diff --git a/pkg/logpoller/metrics.go b/pkg/logpoller/metrics.go new file mode 100644 index 000000000..68d930401 --- /dev/null +++ b/pkg/logpoller/metrics.go @@ -0,0 +1,249 @@ +package logpoller + +import ( + "context" + "fmt" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + + "github.com/smartcontractkit/chainlink-common/pkg/beholder" + "github.com/smartcontractkit/chainlink-common/pkg/metrics" + frameworkmetrics "github.com/smartcontractkit/chainlink-framework/metrics" +) + +// Prometheus metrics for TON LogPoller +var ( + promTonLpPollDuration = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "ton_logpoller_poll_duration_seconds", + Help: "Duration of the last log poller poll iteration", + }, []string{"chainID"}) + + promTonLpPollErrors = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "ton_logpoller_poll_errors_total", + Help: "Total number of poll iteration errors", + }, []string{"chainID"}) + + promTonLpBlocksBehind = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "ton_logpoller_blocks_behind", + Help: "Number of blocks behind chain head (latest_block - last_processed_block)", + }, []string{"chainID"}) + + promTonLpLastProcessedBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "ton_logpoller_last_processed_block", + Help: "Last processed masterchain block sequence number", + }, []string{"chainID"}) + + promTonLpBlocksProcessed = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "ton_logpoller_blocks_processed_total", + Help: "Total number of blocks processed", + }, []string{"chainID"}) + + promTonLpLogsInserted = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "ton_logpoller_logs_inserted_total", + Help: "Total number of logs inserted to database", + }, []string{"chainID"}) + + promTonLpLoaderErrors = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "ton_logpoller_loader_errors_total", + Help: "Total number of transaction loading errors", + }, []string{"chainID"}) + + promTonLpParseErrors = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "ton_logpoller_parse_errors_total", + Help: "Total number of log parsing errors", + }, []string{"chainID"}) + + // Query metrics for observed stores + promTonLpQueryDuration = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "ton_logpoller_query_duration_seconds", + Help: "Duration of last database query by operation", + }, []string{"chainID", "query", "type"}) + + promTonLpAddressesMonitored = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "ton_logpoller_addresses_monitored", + Help: "Number of addresses being monitored", + }, []string{"chainID"}) + + promTonLpQueryResultSize = promauto.NewGaugeVec(prometheus.GaugeOpts{ + Name: "ton_logpoller_query_result_size", + Help: "Number of rows returned by query", + }, []string{"chainID", "query"}) +) + +// logPollerMetrics provides instrumentation for the TON LogPoller +type logPollerMetrics struct { + metrics.Labeler + chainID string + + // core service metrics (OTel) + pollDuration metric.Float64Gauge + pollErrors metric.Int64Counter + blocksBehind metric.Int64Gauge + lastProcessedBlock metric.Int64Gauge + blocksProcessed metric.Int64Counter + logsInserted metric.Int64Counter + loaderErrors metric.Int64Counter + parseErrors metric.Int64Counter + + // query metrics for observed stores (OTel) + queryDuration metric.Float64Gauge + addressesMonitored metric.Int64Gauge + queryResultSize metric.Int64Gauge +} + +// newMetrics creates a new metrics instance for TON LogPoller +func newMetrics(chainID string) (*logPollerMetrics, error) { + m := beholder.GetMeter() + + pollDuration, err := m.Float64Gauge("ton_logpoller_poll_duration_seconds") + if err != nil { + return nil, fmt.Errorf("failed to register poll duration: %w", err) + } + + pollErrors, err := m.Int64Counter("ton_logpoller_poll_errors_total") + if err != nil { + return nil, fmt.Errorf("failed to register poll errors: %w", err) + } + + blocksBehind, err := m.Int64Gauge("ton_logpoller_blocks_behind") + if err != nil { + return nil, fmt.Errorf("failed to register blocks behind: %w", err) + } + + lastProcessedBlock, err := m.Int64Gauge("ton_logpoller_last_processed_block") + if err != nil { + return nil, fmt.Errorf("failed to register last processed block: %w", err) + } + + blocksProcessed, err := m.Int64Counter("ton_logpoller_blocks_processed_total") + if err != nil { + return nil, fmt.Errorf("failed to register blocks processed: %w", err) + } + + logsInserted, err := m.Int64Counter("ton_logpoller_logs_inserted_total") + if err != nil { + return nil, fmt.Errorf("failed to register logs inserted: %w", err) + } + + loaderErrors, err := m.Int64Counter("ton_logpoller_loader_errors_total") + if err != nil { + return nil, fmt.Errorf("failed to register loader errors: %w", err) + } + + parseErrors, err := m.Int64Counter("ton_logpoller_parse_errors_total") + if err != nil { + return nil, fmt.Errorf("failed to register parse errors: %w", err) + } + + queryDuration, err := m.Float64Gauge("ton_logpoller_query_duration_seconds") + if err != nil { + return nil, fmt.Errorf("failed to register query duration: %w", err) + } + + addressesMonitored, err := m.Int64Gauge("ton_logpoller_addresses_monitored") + if err != nil { + return nil, fmt.Errorf("failed to register addresses monitored: %w", err) + } + + queryResultSize, err := m.Int64Gauge("ton_logpoller_query_result_size") + if err != nil { + return nil, fmt.Errorf("failed to register query result size: %w", err) + } + + return &logPollerMetrics{ + chainID: chainID, + Labeler: metrics.NewLabeler().With("chainID", chainID), + + pollDuration: pollDuration, + pollErrors: pollErrors, + blocksBehind: blocksBehind, + lastProcessedBlock: lastProcessedBlock, + blocksProcessed: blocksProcessed, + logsInserted: logsInserted, + loaderErrors: loaderErrors, + parseErrors: parseErrors, + queryDuration: queryDuration, + addressesMonitored: addressesMonitored, + queryResultSize: queryResultSize, + }, nil +} + +// getOtelAttributes returns OTel attributes for this metrics instance +func (m *logPollerMetrics) getOtelAttributes() []attribute.KeyValue { + return beholder.OtelAttributes(m.Labels).AsStringAttributes() +} + +// SetPollDuration sets the duration of the last poll iteration +func (m *logPollerMetrics) SetPollDuration(ctx context.Context, duration time.Duration) { + seconds := duration.Seconds() + promTonLpPollDuration.WithLabelValues(m.chainID).Set(seconds) + m.pollDuration.Record(ctx, seconds, metric.WithAttributes(m.getOtelAttributes()...)) +} + +// IncrementPollErrors increments the poll error counter +func (m *logPollerMetrics) IncrementPollErrors(ctx context.Context) { + promTonLpPollErrors.WithLabelValues(m.chainID).Inc() + m.pollErrors.Add(ctx, 1, metric.WithAttributes(m.getOtelAttributes()...)) +} + +// SetBlocksBehind sets the number of blocks behind chain head +func (m *logPollerMetrics) SetBlocksBehind(ctx context.Context, latestBlock, lastProcessedBlock uint32) { + behind := int64(latestBlock) - int64(lastProcessedBlock) + promTonLpBlocksBehind.WithLabelValues(m.chainID).Set(float64(behind)) + m.blocksBehind.Record(ctx, behind, metric.WithAttributes(m.getOtelAttributes()...)) +} + +// SetLastProcessedBlock sets the last processed block sequence number +func (m *logPollerMetrics) SetLastProcessedBlock(ctx context.Context, seqNo uint32) { + promTonLpLastProcessedBlock.WithLabelValues(m.chainID).Set(float64(seqNo)) + m.lastProcessedBlock.Record(ctx, int64(seqNo), metric.WithAttributes(m.getOtelAttributes()...)) +} + +// AddBlocksProcessed increments the blocks processed counter +func (m *logPollerMetrics) AddBlocksProcessed(ctx context.Context, count int64) { + promTonLpBlocksProcessed.WithLabelValues(m.chainID).Add(float64(count)) + m.blocksProcessed.Add(ctx, count, metric.WithAttributes(m.getOtelAttributes()...)) +} + +// AddLogsInserted increments the logs inserted counter +func (m *logPollerMetrics) AddLogsInserted(ctx context.Context, count int64) { + promTonLpLogsInserted.WithLabelValues(m.chainID).Add(float64(count)) + m.logsInserted.Add(ctx, count, metric.WithAttributes(m.getOtelAttributes()...)) +} + +// IncrementLoaderErrors increments the loader error counter +func (m *logPollerMetrics) IncrementLoaderErrors(ctx context.Context) { + promTonLpLoaderErrors.WithLabelValues(m.chainID).Inc() + m.loaderErrors.Add(ctx, 1, metric.WithAttributes(m.getOtelAttributes()...)) +} + +// IncrementParseErrors increments the parse error counter +func (m *logPollerMetrics) IncrementParseErrors(ctx context.Context) { + promTonLpParseErrors.WithLabelValues(m.chainID).Inc() + m.parseErrors.Add(ctx, 1, metric.WithAttributes(m.getOtelAttributes()...)) +} + +// RecordQueryDuration records the duration of a database query +func (m *logPollerMetrics) RecordQueryDuration(ctx context.Context, queryName string, queryType frameworkmetrics.QueryType, duration time.Duration) { + seconds := duration.Seconds() + promTonLpQueryDuration.WithLabelValues(m.chainID, queryName, string(queryType)).Set(seconds) + attrs := append(m.getOtelAttributes(), attribute.String("query", queryName), attribute.String("type", string(queryType))) + m.queryDuration.Record(ctx, seconds, metric.WithAttributes(attrs...)) +} + +// SetAddressesMonitored sets the number of addresses being monitored +func (m *logPollerMetrics) SetAddressesMonitored(ctx context.Context, count int) { + promTonLpAddressesMonitored.WithLabelValues(m.chainID).Set(float64(count)) + m.addressesMonitored.Record(ctx, int64(count), metric.WithAttributes(m.getOtelAttributes()...)) +} + +// SetQueryResultSize sets the result size of a query +func (m *logPollerMetrics) SetQueryResultSize(ctx context.Context, queryName string, count int) { + promTonLpQueryResultSize.WithLabelValues(m.chainID, queryName).Set(float64(count)) + attrs := append(m.getOtelAttributes(), attribute.String("query", queryName)) + m.queryResultSize.Record(ctx, int64(count), metric.WithAttributes(attrs...)) +} diff --git a/pkg/logpoller/observed_filter_store.go b/pkg/logpoller/observed_filter_store.go new file mode 100644 index 000000000..e4fcffeed --- /dev/null +++ b/pkg/logpoller/observed_filter_store.go @@ -0,0 +1,87 @@ +package logpoller + +import ( + "context" + "time" + + "github.com/xssnick/tonutils-go/address" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + frameworkmetrics "github.com/smartcontractkit/chainlink-framework/metrics" + + "github.com/smartcontractkit/chainlink-ton/pkg/logpoller/models" +) + +var _ FilterStore = (*ObservedFilterStore)(nil) + +// ObservedFilterStore wraps a FilterStore with metrics instrumentation +type ObservedFilterStore struct { + FilterStore + metrics *logPollerMetrics + lggr logger.Logger +} + +// NewObservedFilterStore creates a new observed filter store wrapper +func NewObservedFilterStore(store FilterStore, metrics *logPollerMetrics, lggr logger.Logger) *ObservedFilterStore { + return &ObservedFilterStore{ + FilterStore: store, + metrics: metrics, + lggr: logger.Named(lggr, "ObservedFilterStore"), + } +} + +// RegisterFilter wraps the underlying RegisterFilter with metrics +func (o *ObservedFilterStore) RegisterFilter(ctx context.Context, flt models.Filter) (int64, error) { + start := time.Now() + id, err := o.FilterStore.RegisterFilter(ctx, flt) + + o.metrics.RecordQueryDuration(ctx, "RegisterFilter", frameworkmetrics.Create, time.Since(start)) + + return id, err +} + +// UnregisterFilter wraps the underlying UnregisterFilter with metrics +func (o *ObservedFilterStore) UnregisterFilter(ctx context.Context, name string) error { + start := time.Now() + err := o.FilterStore.UnregisterFilter(ctx, name) + + o.metrics.RecordQueryDuration(ctx, "UnregisterFilter", frameworkmetrics.Del, time.Since(start)) + + return err +} + +// HasFilter wraps the underlying HasFilter with metrics +func (o *ObservedFilterStore) HasFilter(ctx context.Context, name string) (bool, error) { + start := time.Now() + exists, err := o.FilterStore.HasFilter(ctx, name) + + o.metrics.RecordQueryDuration(ctx, "HasFilter", frameworkmetrics.Read, time.Since(start)) + + return exists, err +} + +// GetDistinctAddresses wraps the underlying GetDistinctAddresses with metrics +func (o *ObservedFilterStore) GetDistinctAddresses(ctx context.Context) ([]*address.Address, error) { + start := time.Now() + addresses, err := o.FilterStore.GetDistinctAddresses(ctx) + + o.metrics.RecordQueryDuration(ctx, "GetDistinctAddresses", frameworkmetrics.Read, time.Since(start)) + if err == nil { + o.metrics.SetAddressesMonitored(ctx, len(addresses)) + } + + return addresses, err +} + +// GetFiltersByAddress wraps the underlying GetFiltersByAddress with metrics +func (o *ObservedFilterStore) GetFiltersByAddress(ctx context.Context, addr *address.Address) ([]models.Filter, error) { + start := time.Now() + filters, err := o.FilterStore.GetFiltersByAddress(ctx, addr) + + o.metrics.RecordQueryDuration(ctx, "GetFiltersByAddress", frameworkmetrics.Read, time.Since(start)) + if err == nil { + o.metrics.SetQueryResultSize(ctx, "GetFiltersByAddress", len(filters)) + } + + return filters, err +} diff --git a/pkg/logpoller/observed_log_store.go b/pkg/logpoller/observed_log_store.go new file mode 100644 index 000000000..fda31b604 --- /dev/null +++ b/pkg/logpoller/observed_log_store.go @@ -0,0 +1,56 @@ +package logpoller + +import ( + "context" + "time" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + frameworkmetrics "github.com/smartcontractkit/chainlink-framework/metrics" + + "github.com/smartcontractkit/chainlink-ton/pkg/logpoller/models" + "github.com/smartcontractkit/chainlink-ton/pkg/logpoller/query" +) + +var _ LogStore = (*ObservedLogStore)(nil) + +// ObservedLogStore wraps a LogStore with metrics instrumentation +type ObservedLogStore struct { + LogStore + metrics *logPollerMetrics + lggr logger.Logger +} + +// NewObservedLogStore creates a new observed log store wrapper +func NewObservedLogStore(store LogStore, metrics *logPollerMetrics, lggr logger.Logger) *ObservedLogStore { + return &ObservedLogStore{ + LogStore: store, + metrics: metrics, + lggr: logger.Named(lggr, "ObservedLogStore"), + } +} + +// SaveLogs wraps the underlying SaveLogs with metrics +func (o *ObservedLogStore) SaveLogs(ctx context.Context, logs []models.Log, batchInsertSize, minBatchSize uint32) (int64, error) { + start := time.Now() + count, err := o.LogStore.SaveLogs(ctx, logs, batchInsertSize, minBatchSize) + + o.metrics.RecordQueryDuration(ctx, "SaveLogs", frameworkmetrics.Create, time.Since(start)) + if err == nil && count > 0 { + o.metrics.AddLogsInserted(ctx, count) + } + + return count, err +} + +// QueryLogs wraps the underlying QueryLogs with metrics +func (o *ObservedLogStore) QueryLogs(ctx context.Context, logQuery *query.LogQuery) ([]models.Log, bool, string, error) { + start := time.Now() + logs, hasMore, nextCursor, err := o.LogStore.QueryLogs(ctx, logQuery) + + o.metrics.RecordQueryDuration(ctx, "QueryLogs", frameworkmetrics.Read, time.Since(start)) + if err == nil { + o.metrics.SetQueryResultSize(ctx, "QueryLogs", len(logs)) + } + + return logs, hasMore, nextCursor, err +} diff --git a/pkg/logpoller/service.go b/pkg/logpoller/service.go index b1c2449b9..1fbe05baa 100644 --- a/pkg/logpoller/service.go +++ b/pkg/logpoller/service.go @@ -48,6 +48,8 @@ type service struct { filterStore FilterStore // Filter store for managing filters logStore LogStore // Log store for storing logs + metrics *logPollerMetrics // metrics for observability + // configuration for service operation pollPeriod time.Duration // How often to poll for new blocks lastProcessedBlock uint32 // Last processed masterchain sequence number @@ -72,14 +74,25 @@ type ServiceOptions struct { } // NewService creates a new TON log polling service instance -func NewService(lggr logger.Logger, chainID string, clientProvider func(context.Context) (ton.APIClientWrapped, error), opts *ServiceOptions) Service { +func NewService(lggr logger.Logger, chainID string, clientProvider func(context.Context) (ton.APIClientWrapped, error), opts *ServiceOptions) (Service, error) { + // init metrics + metrics, err := newMetrics(chainID) + if err != nil { + return nil, fmt.Errorf("failed to initialize metrics: %w", err) + } + + // wrap stores with observed versions for metrics instrumentation + observedFilterStore := NewObservedFilterStore(opts.FilterStore, metrics, lggr) + observedLogStore := NewObservedLogStore(opts.LogStore, metrics, lggr) + lp := &service{ lggr: logger.Sugared(lggr), chainID: chainID, clientProvider: clientProvider, - filterStore: opts.FilterStore, + filterStore: observedFilterStore, loader: opts.TxLoader, - logStore: opts.LogStore, + logStore: observedLogStore, + metrics: metrics, pollPeriod: opts.Config.PollPeriod.Duration(), startingLookback: opts.Config.LogPollerStartingLookback.Duration(), blockTime: opts.Config.BlockTime.Duration(), @@ -93,7 +106,7 @@ func NewService(lggr logger.Logger, chainID string, clientProvider func(context. Name: "TONLogPoller", Start: lp.start, }.NewServiceEngine(lggr) - return lp + return lp, nil } // NewServiceWith creates a new TON log polling service and registers the provided filters. @@ -107,7 +120,10 @@ func NewServiceWith( opts *ServiceOptions, filters []models.Filter, ) (Service, error) { - svc := NewService(lggr, chainID, clientProvider, opts) + svc, err := NewService(lggr, chainID, clientProvider, opts) + if err != nil { + return nil, fmt.Errorf("failed to create service: %w", err) + } for _, f := range filters { if _, err := svc.RegisterFilter(ctx, f); err != nil { @@ -122,9 +138,12 @@ func NewServiceWith( func (lp *service) start(_ context.Context) error { lp.lggr.Infof("starting TON logpoller") lp.eng.GoTick(services.NewTicker(lp.pollPeriod), func(ctx context.Context) { + start := time.Now() if err := lp.run(ctx); err != nil { lp.lggr.Errorw("iteration failed", "err", err) + lp.metrics.IncrementPollErrors(ctx) } + lp.metrics.SetPollDuration(ctx, time.Since(start)) }) return nil } @@ -157,6 +176,9 @@ func (lp *service) run(ctx context.Context) (err error) { return fmt.Errorf("failed to apply replay override: %w", err) } + // Record blocks behind before processing (shows catch-up work needed) + lp.metrics.SetBlocksBehind(ctx, blockRange.ToSeqNo(), blockRange.FromSeqNo()) + lp.lggr.Tracew("processing block range", "fromSeq", blockRange.FromSeqNo(), "toSeq", blockRange.ToSeqNo()) addresses, err := lp.filterStore.GetDistinctAddresses(ctx) @@ -178,6 +200,9 @@ func (lp *service) run(ctx context.Context) (err error) { } lp.lastProcessedBlock = blockRange.ToSeqNo() + lp.metrics.SetLastProcessedBlock(ctx, lp.lastProcessedBlock) + lp.metrics.AddBlocksProcessed(ctx, int64(blockRange.ToSeqNo()-blockRange.FromSeqNo())) + return nil } @@ -189,18 +214,19 @@ func (lp *service) processBlockRange(ctx context.Context, blockRange *models.Blo return fmt.Errorf("failed to build filter index: %w", err) } - txsCh, loaderErrsCh := lp.loadTxsForAddresses(ctx, blockRange, addresses) + txsCh, loadErrsCh := lp.loadTxsForAddresses(ctx, blockRange, addresses) logsCh, parseErrsCh := lp.parseTransactions(ctx, filterIndex, lp.chainID, txsCh) - // TODO: deal with error metrics here go func() { - for err := range loaderErrsCh { - lp.lggr.Errorw("loader error", "err", err) + for err := range loadErrsCh { + lp.metrics.IncrementLoaderErrors(ctx) + lp.lggr.Errorw("loading transactions error", "err", err) } }() go func() { for err := range parseErrsCh { - lp.lggr.Errorw("parse error", "err", err) + lp.metrics.IncrementParseErrors(ctx) + lp.lggr.Errorw("parsing transactions error", "err", err) } }() @@ -209,7 +235,7 @@ func (lp *service) processBlockRange(ctx context.Context, blockRange *models.Blo return fmt.Errorf("failed to save logs: %w", err) } - // Only log when we actually saved logs to reduce noise + // Note: logs inserted metric is recorded by ObservedLogStore.SaveLogs if totalSaved > 0 { lp.lggr.Debugf("processed range (%d, %d], saved %d logs from %d addresses", blockRange.FromSeqNo(), blockRange.ToSeqNo(), totalSaved, len(addresses)) } diff --git a/pkg/relay/chain.go b/pkg/relay/chain.go index e30538ac6..f81c77b6d 100644 --- a/pkg/relay/chain.go +++ b/pkg/relay/chain.go @@ -126,9 +126,9 @@ func newChain(cfg *config.TOMLConfig, loopKs loop.Keystore, lggr logger.Logger, } clientProvider := func(ctx context.Context) (ton.APIClientWrapped, error) { - signedClient, err := signedClientProvider.Get(ctx) - if err != nil { - return nil, err + signedClient, cerr := signedClientProvider.Get(ctx) + if cerr != nil { + return nil, cerr } return signedClient.Client, nil } @@ -142,7 +142,10 @@ func newChain(cfg *config.TOMLConfig, loopKs loop.Keystore, lggr logger.Logger, LogStore: lppgstore.NewLogStore(ch.ID(), orm, lggr), } - ch.lp = logpoller.NewService(lggr, ch.ID(), clientProvider, lgOpts) + ch.lp, err = logpoller.NewService(lggr, ch.ID(), clientProvider, lgOpts) + if err != nil { + return nil, fmt.Errorf("failed to create logpoller service: %w", err) + } // TODO: Setup accounts balance monitor diff --git a/pkg/txm/metrics.go b/pkg/txm/metrics.go index 482e113c6..5687710a9 100644 --- a/pkg/txm/metrics.go +++ b/pkg/txm/metrics.go @@ -41,7 +41,7 @@ var ( }, []string{"chainID", "exitCode"}) ) -type tonTxmMetrics struct { +type txmMetrics struct { metrics.Labeler chainID string @@ -57,7 +57,7 @@ type tonTxmMetrics struct { revertTxs metric.Int64Counter } -func newTonTxmMetrics(chainID string) (*tonTxmMetrics, error) { +func newMetrics(chainID string) (*txmMetrics, error) { m := beholder.GetMeter() var err error @@ -86,7 +86,7 @@ func newTonTxmMetrics(chainID string) (*tonTxmMetrics, error) { return nil, fmt.Errorf("failed to register ton revert txs: %w", err) } - return &tonTxmMetrics{ + return &txmMetrics{ chainID: chainID, Labeler: metrics.NewLabeler().With("chainID", chainID), @@ -99,32 +99,32 @@ func newTonTxmMetrics(chainID string) (*tonTxmMetrics, error) { }, nil } -func (m *tonTxmMetrics) GetOtelAttributes() []attribute.KeyValue { +func (m *txmMetrics) getOtelAttributes() []attribute.KeyValue { return beholder.OtelAttributes(m.Labels).AsStringAttributes() } -func (m *tonTxmMetrics) IncrementSuccessTxs(ctx context.Context) { +func (m *txmMetrics) IncrementSuccessTxs(ctx context.Context) { promTonTxmSuccessTxs.WithLabelValues(m.chainID).Add(1) - m.successTxs.Add(ctx, 1, metric.WithAttributes(m.GetOtelAttributes()...)) + m.successTxs.Add(ctx, 1, metric.WithAttributes(m.getOtelAttributes()...)) } -func (m *tonTxmMetrics) IncrementFinalizedTxs(ctx context.Context) { +func (m *txmMetrics) IncrementFinalizedTxs(ctx context.Context) { promTonTxmFinalizedTxs.WithLabelValues(m.chainID).Add(1) - m.finalizedTxs.Add(ctx, 1, metric.WithAttributes(m.GetOtelAttributes()...)) + m.finalizedTxs.Add(ctx, 1, metric.WithAttributes(m.getOtelAttributes()...)) } -func (m *tonTxmMetrics) SetPendingTxs(ctx context.Context, count int) { +func (m *txmMetrics) SetPendingTxs(ctx context.Context, count int) { promTonTxmPendingTxs.WithLabelValues(m.chainID).Set(float64(count)) - m.pendingTxs.Record(ctx, int64(count), metric.WithAttributes(m.GetOtelAttributes()...)) + m.pendingTxs.Record(ctx, int64(count), metric.WithAttributes(m.getOtelAttributes()...)) } -func (m *tonTxmMetrics) IncrementFailedToBroadcastTxs(ctx context.Context) { +func (m *txmMetrics) IncrementFailedToBroadcastTxs(ctx context.Context) { promTonTxmFailedToBroadcastTxs.WithLabelValues(m.chainID).Add(1) - m.failedToBroadcastTxs.Add(ctx, 1, metric.WithAttributes(m.GetOtelAttributes()...)) + m.failedToBroadcastTxs.Add(ctx, 1, metric.WithAttributes(m.getOtelAttributes()...)) } -func (m *tonTxmMetrics) IncrementRevertTxs(ctx context.Context, exitCode string) { +func (m *txmMetrics) IncrementRevertTxs(ctx context.Context, exitCode string) { promTonTxmRevertTxs.WithLabelValues(m.chainID, exitCode).Add(1) - attrs := append(m.GetOtelAttributes(), attribute.String("exitCode", exitCode)) + attrs := append(m.getOtelAttributes(), attribute.String("exitCode", exitCode)) m.revertTxs.Add(ctx, 1, metric.WithAttributes(attrs...)) } diff --git a/pkg/txm/txm.go b/pkg/txm/txm.go index d715a2a12..6ba4fe3f9 100644 --- a/pkg/txm/txm.go +++ b/pkg/txm/txm.go @@ -40,7 +40,7 @@ type Txm struct { keystore loop.Keystore config Config chainID string - metrics *tonTxmMetrics + metrics *txmMetrics clientProvider func(context.Context) (tracetracking.SignedAPIClient, error) broadcastChan chan *Tx @@ -68,7 +68,7 @@ func New( clientProvider func(context.Context) (tracetracking.SignedAPIClient, error), config Config, ) (*Txm, error) { - metrics, err := newTonTxmMetrics(chainID) + metrics, err := newMetrics(chainID) if err != nil { return nil, fmt.Errorf("failed to initialize metrics: %w", err) } diff --git a/scripts/.core_version b/scripts/.core_version index c1efbe17c..40bad6a53 100644 --- a/scripts/.core_version +++ b/scripts/.core_version @@ -1 +1 @@ -ca8e10040285f30f9354a27a38d5e8bccc63e6f3 +1a8945ea69b76f18f7c6111e9c4c26c400182e17 diff --git a/staging-monitor/go.mod b/staging-monitor/go.mod index b2bca50ad..9e92624af 100644 --- a/staging-monitor/go.mod +++ b/staging-monitor/go.mod @@ -157,6 +157,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250908144012-8184001834b5 // indirect github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.9-0.20251020164035-ab562b473fe2 // indirect + github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251206233640-139a324649d9 // indirect github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251021010742-3f8d3dba17d8 // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 // indirect github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b // indirect @@ -210,15 +211,15 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.43.0 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc // indirect - golang.org/x/net v0.46.0 // indirect - golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.37.0 // indirect - golang.org/x/term v0.36.0 // indirect - golang.org/x/text v0.30.0 // indirect + golang.org/x/net v0.47.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 - golang.org/x/tools v0.37.0 // indirect + golang.org/x/tools v0.38.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect google.golang.org/grpc v1.75.1 // indirect diff --git a/staging-monitor/go.sum b/staging-monitor/go.sum index 07fe54703..aa9b4bd53 100644 --- a/staging-monitor/go.sum +++ b/staging-monitor/go.sum @@ -642,6 +642,8 @@ github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.9-0.2025102016 github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.9-0.20251020164035-ab562b473fe2/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-deployments-framework v0.67.1-0.20251120111322-7760d1301f77 h1:EP9eHLDPjLQevF59U2jkkQDB3IB44dzbgv55/FVMNGs= github.com/smartcontractkit/chainlink-deployments-framework v0.67.1-0.20251120111322-7760d1301f77/go.mod h1:vE/dMQyTOnS+T4sXqcTbSR7THlHhT/xlHiOumReMYFk= +github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251206233640-139a324649d9 h1:TAVreQK5eP63a0zu5Qe34i4pYGGo5x8zgfJ1NVVo6K4= +github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20251206233640-139a324649d9/go.mod h1:HG/aei0MgBOpsyRLexdKGtOUO8yjSJO3iUu0Uu8KBm4= github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251021010742-3f8d3dba17d8 h1:hPeEwcvRVtwhyNXH45qbzqmscqlbygu94cROwbjyzNQ= github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20251021010742-3f8d3dba17d8/go.mod h1:jUC52kZzEnWF9tddHh85zolKybmLpbQ1oNA4FjOHt1Q= github.com/smartcontractkit/chainlink-protos/job-distributor v0.17.0 h1:xHPmFDhff7QpeFxKsZfk+24j4AlnQiFjjRh5O87Peu4= @@ -829,8 +831,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc h1:TS73t7x3KarrNd5qAipmspBDS1rkMcgVG/fS1aRb4Rc= golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= @@ -845,8 +847,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.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +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= @@ -868,8 +870,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= -golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -878,8 +880,8 @@ 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.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.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= @@ -924,18 +926,18 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 h1:dHQOQddU4YHS5gY33/6klKjq7Gp3WwMyOXGNp5nzRj8= -golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053/go.mod h1:+nZKN+XVh4LCiA9DV3ywrzN4gumyCnKjau3NGb9SGoE= +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-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= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= -golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -946,8 +948,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -967,8 +969,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= -golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=