diff --git a/chain_capabilities/common/gasmeter/gasmeter.go b/chain_capabilities/common/gasmeter/gasmeter.go index ce5953461..dc139bd36 100644 --- a/chain_capabilities/common/gasmeter/gasmeter.go +++ b/chain_capabilities/common/gasmeter/gasmeter.go @@ -73,7 +73,7 @@ func (m *Meter) Close() error { // txHash (or tx signature) is the capability event id: one record per // on-chain write, identical on every node of the DON that observes it. The // log line is a contract consumed by the billing reconciler (fields: -// executionID, eventID, resourceType, value, orgID, txHash) and must stay +// workflowID, executionID, eventID, resourceType, value, orgID, txHash) and must stay // stable. Fail-open: never affects the reply. func (m *Meter) Emit(ctx context.Context, metadata capabilities.RequestMetadata, txHash string, fee *big.Int) { if m == nil || fee == nil { @@ -90,6 +90,7 @@ func (m *Meter) Emit(ctx context.Context, metadata capabilities.RequestMetadata, OrgID: metadata.OrgID, }) m.lggr.Infow("Emitted capability usage meter record", + "workflowID", metadata.WorkflowID, "executionID", metadata.WorkflowExecutionID, "eventID", txHash, "resourceType", m.resourceType, diff --git a/chain_capabilities/common/gasmeter/gasmeter_fault_test.go b/chain_capabilities/common/gasmeter/gasmeter_fault_test.go new file mode 100644 index 000000000..d49c60698 --- /dev/null +++ b/chain_capabilities/common/gasmeter/gasmeter_fault_test.go @@ -0,0 +1,60 @@ +package gasmeter + +import ( + "fmt" + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/capabilities" + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/settings" +) + +// faultSettings builds a getter with PerOrg.BillingFault* overrides for org. +func faultSettings(t *testing.T, org string, kv map[string]string) settings.Getter { + t.Helper() + cfg := fmt.Sprintf("[org.%s.PerOrg]\n", org) + for k, v := range kv { + cfg += fmt.Sprintf("%s = %q\n", k, v) + } + g, err := settings.NewTOMLGetter([]byte(cfg)) + require.NoError(t, err) + return g +} + +// Fault injection is read from CRE settings by the shared ResourceManager, so +// it reaches the gas meter with no code here. +func TestEmit_FaultInjection(t *testing.T) { + metadata := capabilities.RequestMetadata{WorkflowID: "wf-1", WorkflowExecutionID: "exec-1", OrgID: "org-1"} + + t.Run("perturb applies delta to the emitted fee", func(t *testing.T) { + emitter := &recordingEmitter{} + cfg := enabledCfg(emitter) + cfg.Settings = faultSettings(t, "org-1", map[string]string{"BillingFaultPerturbRate": "1", "BillingFaultPerturbDelta": "7"}) + m := New(logger.Test(t), cfg, 1, 7) + m.Emit(t.Context(), metadata, "0xabc", big.NewInt(100)) + require.Len(t, emitter.records, 1) + require.Equal(t, "107", emitter.records[0].GetUtilizations()[0].GetValue(), "sign sample for 0xabc adds") + }) + + t.Run("drop emits nothing", func(t *testing.T) { + emitter := &recordingEmitter{} + cfg := enabledCfg(emitter) + cfg.Settings = faultSettings(t, "org-1", map[string]string{"BillingFaultDropRate": "1"}) + m := New(logger.Test(t), cfg, 1, 7) + m.Emit(t.Context(), metadata, "0xabc", big.NewInt(100)) + require.Empty(t, emitter.records) + }) + + t.Run("other org is untouched", func(t *testing.T) { + emitter := &recordingEmitter{} + cfg := enabledCfg(emitter) + cfg.Settings = faultSettings(t, "org-canary", map[string]string{"BillingFaultDropRate": "1"}) + m := New(logger.Test(t), cfg, 1, 7) + m.Emit(t.Context(), metadata, "0xabc", big.NewInt(100)) + require.Len(t, emitter.records, 1) + require.Equal(t, "100", emitter.records[0].GetUtilizations()[0].GetValue()) + }) +} diff --git a/chain_capabilities/common/gasmeter/gasmeter_test.go b/chain_capabilities/common/gasmeter/gasmeter_test.go index 832f5ea0f..51fd6c5a7 100644 --- a/chain_capabilities/common/gasmeter/gasmeter_test.go +++ b/chain_capabilities/common/gasmeter/gasmeter_test.go @@ -84,6 +84,7 @@ func TestEmit(t *testing.T) { logs := obs.FilterMessage("Emitted capability usage meter record").All() require.Len(t, logs, 1) fields := logs[0].ContextMap() + require.Equal(t, "wf-1", fields["workflowID"]) require.Equal(t, "exec-1", fields["executionID"]) require.Equal(t, "0xabc", fields["eventID"]) require.Equal(t, "cre:workflow:gas:421614", fields["resourceType"]) diff --git a/chain_capabilities/common/go.mod b/chain_capabilities/common/go.mod index a436136f2..caa222742 100644 --- a/chain_capabilities/common/go.mod +++ b/chain_capabilities/common/go.mod @@ -5,7 +5,7 @@ go 1.27.3 require ( github.com/jpillora/backoff v1.0.0 github.com/smartcontractkit/capabilities/libs v0.0.0-20260714133332-db2a5f11cd64 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20261006175240-29594528f464 + github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9 github.com/smartcontractkit/chainlink-protos/metering/go v0.0.0-20260710151514-27b5a126dabe github.com/smartcontractkit/libocr v0.0.0-20260810200708-618b5bf7f342 github.com/stretchr/testify v1.12.1 @@ -53,7 +53,7 @@ require ( github.com/shopspring/decimal v1.4.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.104 // indirect github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20261005132539-b7d63d5fd549 // indirect - github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260804191526-b7a850ae7648 // indirect + github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20261013212015-e622e8b83b6b // indirect github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b // indirect github.com/stretchr/objx v0.5.3 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect diff --git a/chain_capabilities/common/go.sum b/chain_capabilities/common/go.sum index 2d6a64241..fc399339f 100644 --- a/chain_capabilities/common/go.sum +++ b/chain_capabilities/common/go.sum @@ -94,12 +94,12 @@ github.com/smartcontractkit/capabilities/libs v0.0.0-20260714133332-db2a5f11cd64 github.com/smartcontractkit/capabilities/libs v0.0.0-20260714133332-db2a5f11cd64/go.mod h1:DZkOtlIRV6ecpCskdXMF+k2es3uJQqTT1m5TRB9etjQ= github.com/smartcontractkit/chain-selectors v1.0.104 h1:/n9pPGM5W/+r1eHoWZv4VwX9LNS1af4+ICyhM8zKRNM= github.com/smartcontractkit/chain-selectors v1.0.104/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20261006175240-29594528f464 h1:DVXwyIGekGqLaFAcSWa3K3S209gAY0WDFwliYdLp1dk= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20261006175240-29594528f464/go.mod h1:37Mu0pbAnGmHPgOZ8bQvgP4hzXw/Wu7smKX4cN46UOs= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9 h1:BA0Ln76BvIXN2CNb48xEToEmWOOYSooF97LaglpgGWo= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9/go.mod h1:GQPosLRkCllnWENEHTetu6W5/xuFC24QMqXm35mYmt4= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20261005132539-b7d63d5fd549 h1:J4vYRJxkBO8Yf//17wScKjYWmS45VZaFWx0zt+4ETEU= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20261005132539-b7d63d5fd549/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= -github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260804191526-b7a850ae7648 h1:WEUMkKQPAgcNMRgES6CBWrRUiII+HKEWQjulKQBSuMA= -github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260804191526-b7a850ae7648/go.mod h1:/i8hjTPFdVWHiY+QjeSiVS2Z3GB3WAZznGgXHstC02E= +github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20261013212015-e622e8b83b6b h1:tlxPkVQ6ZpJIElqUWc4lU5VH4BB6OzhckG/gHwpaaa0= +github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20261013212015-e622e8b83b6b/go.mod h1:/i8hjTPFdVWHiY+QjeSiVS2Z3GB3WAZznGgXHstC02E= github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b h1:QuI6SmQFK/zyUlVWEf0GMkiUYBPY4lssn26nKSd/bOM= github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b/go.mod h1:qSTSwX3cBP3FKQwQacdjArqv0g6QnukjV4XuzO6UyoY= github.com/smartcontractkit/chainlink-protos/metering/go v0.0.0-20260710151514-27b5a126dabe h1:MDnY5wQbWTpFdDnMRicEnoMfSP5nM/KncARr4skP1ug= diff --git a/chain_capabilities/evm/go.mod b/chain_capabilities/evm/go.mod index 5cad8d2b5..4245a9211 100644 --- a/chain_capabilities/evm/go.mod +++ b/chain_capabilities/evm/go.mod @@ -8,7 +8,7 @@ require ( github.com/smartcontractkit/capabilities/chain_capabilities/common v0.0.0-20261009182120-372f846f528c github.com/smartcontractkit/capabilities/libs v0.0.0-20261001142216-b1dea8dbb961 github.com/smartcontractkit/chain-selectors v1.0.112 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20261028220357-f9f63cb65fce + github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260512150409-b4068bf735e6 github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260521164805-26d78d5e1243 diff --git a/chain_capabilities/evm/go.sum b/chain_capabilities/evm/go.sum index 9cab2199c..10c9468bd 100644 --- a/chain_capabilities/evm/go.sum +++ b/chain_capabilities/evm/go.sum @@ -458,8 +458,8 @@ github.com/smartcontractkit/capabilities/libs v0.0.0-20261001142216-b1dea8dbb961 github.com/smartcontractkit/capabilities/libs v0.0.0-20261001142216-b1dea8dbb961/go.mod h1:h4kazMLsDM6CsKl2OnT9AtCHhhRsFptA/OTM7Hkj2GE= github.com/smartcontractkit/chain-selectors v1.0.112 h1:3VO+ttHsqGzPviMmb1AsIT5+rXVgz/Xx6wmvTpamrzE= github.com/smartcontractkit/chain-selectors v1.0.112/go.mod h1:qy7whtgG5g+7z0jt0nRyii9bLND9m15NZTzuQPkMZ5w= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20261028220357-f9f63cb65fce h1:/kuXyHV8VmNmw/BPRJdRNOOL5ZKLnPnR/PQObXBGpC0= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20261028220357-f9f63cb65fce/go.mod h1:GQPosLRkCllnWENEHTetu6W5/xuFC24QMqXm35mYmt4= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9 h1:BA0Ln76BvIXN2CNb48xEToEmWOOYSooF97LaglpgGWo= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9/go.mod h1:GQPosLRkCllnWENEHTetu6W5/xuFC24QMqXm35mYmt4= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260917115705-1d3a14a9b049 h1:nQ2bw8QQLT+AuCE6JUVIRT1RAo08wQHR9jWh+MgT2GA= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260917115705-1d3a14a9b049/go.mod h1:FO9igruzwHPXstyb9J9z83sJ19iLSNSIg+0H/n0wlJU= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20261005132539-b7d63d5fd549 h1:J4vYRJxkBO8Yf//17wScKjYWmS45VZaFWx0zt+4ETEU= diff --git a/chain_capabilities/solana/go.mod b/chain_capabilities/solana/go.mod index 348334562..f6a833057 100644 --- a/chain_capabilities/solana/go.mod +++ b/chain_capabilities/solana/go.mod @@ -9,9 +9,9 @@ require ( github.com/smartcontractkit/capabilities/chain_capabilities/common v0.0.0-20261009182120-372f846f528c github.com/smartcontractkit/capabilities/libs v0.0.0-20261001142216-b1dea8dbb961 github.com/smartcontractkit/chain-selectors v1.0.104 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20261006175240-29594528f464 + github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9 github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260521164805-26d78d5e1243 - github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260821155228-fa1d775e2138 + github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20261013212015-e622e8b83b6b github.com/smartcontractkit/chainlink-solana v1.3.1-0.20260917175559-f7d4a86019d4 github.com/smartcontractkit/chainlink-solana/contracts v0.0.0-20260803170030-90043607d911 github.com/smartcontractkit/libocr v0.0.0-20260810200708-618b5bf7f342 diff --git a/chain_capabilities/solana/go.sum b/chain_capabilities/solana/go.sum index 375473755..7f25a12b1 100644 --- a/chain_capabilities/solana/go.sum +++ b/chain_capabilities/solana/go.sum @@ -634,8 +634,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260310183131-8 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260310183131-8d0f0e383288/go.mod h1:jPHlo/IN2YAArI001JJixmm6ZHQwgnAVJXY8VBFiFTc= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260310183131-8d0f0e383288 h1:eEjTgIQn4RW0ZPRepUDYTdgGwaRCMawMwgXkHItUc9U= github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260310183131-8d0f0e383288/go.mod h1:67YbnoglYD61Pz/jTVCgav9wFq7S35OU8UyQSvPllRw= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20261006175240-29594528f464 h1:DVXwyIGekGqLaFAcSWa3K3S209gAY0WDFwliYdLp1dk= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20261006175240-29594528f464/go.mod h1:37Mu0pbAnGmHPgOZ8bQvgP4hzXw/Wu7smKX4cN46UOs= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9 h1:BA0Ln76BvIXN2CNb48xEToEmWOOYSooF97LaglpgGWo= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20261029170057-b615a8de42d9/go.mod h1:GQPosLRkCllnWENEHTetu6W5/xuFC24QMqXm35mYmt4= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20261005132539-b7d63d5fd549 h1:J4vYRJxkBO8Yf//17wScKjYWmS45VZaFWx0zt+4ETEU= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20261005132539-b7d63d5fd549/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20251215152504-b1e41f508340 h1:PsjEI+5jZIz9AS4eOsLS5VpSWJINf38clXV3wryPyMk= @@ -644,8 +644,8 @@ github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260521164805-26 github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260521164805-26d78d5e1243/go.mod h1:HG/aei0MgBOpsyRLexdKGtOUO8yjSJO3iUu0Uu8KBm4= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260521164805-26d78d5e1243 h1:71PGTkjdFZ0JrloEC2Fs8eHl1b1gmUuH+bq7q23usKk= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260521164805-26d78d5e1243/go.mod h1:7ketk4ischPQW/JQgmyHz6zdzLUJv1VC29SiSgosydQ= -github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260821155228-fa1d775e2138 h1:Vk0CZJakAUS/djfBhIJENH4WvM4xl6bY8dYD8cIY/sk= -github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260821155228-fa1d775e2138/go.mod h1:/i8hjTPFdVWHiY+QjeSiVS2Z3GB3WAZznGgXHstC02E= +github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20261013212015-e622e8b83b6b h1:tlxPkVQ6ZpJIElqUWc4lU5VH4BB6OzhckG/gHwpaaa0= +github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20261013212015-e622e8b83b6b/go.mod h1:/i8hjTPFdVWHiY+QjeSiVS2Z3GB3WAZznGgXHstC02E= github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b h1:QuI6SmQFK/zyUlVWEf0GMkiUYBPY4lssn26nKSd/bOM= github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b/go.mod h1:qSTSwX3cBP3FKQwQacdjArqv0g6QnukjV4XuzO6UyoY= github.com/smartcontractkit/chainlink-protos/metering/go v0.0.0-20260710151514-27b5a126dabe h1:MDnY5wQbWTpFdDnMRicEnoMfSP5nM/KncARr4skP1ug=