Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
cfa6dbe
wip
Unheilbar Dec 11, 2025
de7e29d
wip sol cap working
Unheilbar Dec 15, 2025
d7b3142
wip run write report in remote don
Unheilbar Jan 8, 2026
57a8899
add v2_solana_write test
Unheilbar Jan 21, 2026
6ecee5d
prints cleanup
Unheilbar Jan 21, 2026
b3b415f
Merge branch 'develop' into PLEX-1920
Unheilbar Jan 21, 2026
f53ab78
bump solana
Unheilbar Jan 21, 2026
8b96f09
bump solana
Unheilbar Jan 23, 2026
4c294f2
bump solana
Unheilbar Jan 23, 2026
a66b7ca
bump deps
Unheilbar Jan 28, 2026
e1aecf1
rm logs
Unheilbar Jan 28, 2026
59cdc25
bump common replace chain selector to testnet
Unheilbar Jan 29, 2026
0365ba2
bump compute limit
Unheilbar Jan 29, 2026
a8fef08
bump dependencies
Unheilbar Jan 29, 2026
bddd52d
increase delta stage
Unheilbar Jan 30, 2026
877c2bc
Merge branch 'develop' into PLEX-1920
Unheilbar Feb 3, 2026
f467844
Merge branch 'develop' into PLEX-1920
Unheilbar Feb 3, 2026
49851db
bump common
Unheilbar Feb 3, 2026
b8432f0
fix lint
Unheilbar Feb 3, 2026
845edeb
bump solana
Unheilbar Feb 3, 2026
b7fea43
remove solana v1
Unheilbar Feb 3, 2026
85d15f5
Merge branch 'develop' into PLEX-1920
Unheilbar Feb 3, 2026
0a94fdc
Merge branch 'develop' into PLEX-1920
Unheilbar Feb 4, 2026
18d3784
Merge branch 'develop' into PLEX-1920
Unheilbar Feb 4, 2026
1386e12
fix core tests amd lints
Unheilbar Feb 4, 2026
5620ef1
asign topology to oslana cre suite
Unheilbar Feb 4, 2026
160957f
fix test
Unheilbar Feb 4, 2026
3d08bf1
add solana to private plugins
Unheilbar Feb 4, 2026
5807f15
add debug err
Unheilbar Feb 4, 2026
884dce6
update solana changeset to support v2 contracts
Unheilbar Feb 5, 2026
02875a6
add debug logs
Unheilbar Feb 5, 2026
b936903
update consensus ref
Unheilbar Feb 5, 2026
ee322c6
fix lint
Unheilbar Feb 5, 2026
31767da
Merge branch 'develop' into PLEX-1920
Unheilbar Feb 5, 2026
3702806
p
Unheilbar Feb 5, 2026
977d376
make modgraph
Unheilbar Feb 6, 2026
6373938
make modgraph
silaslenihan Feb 6, 2026
4462e3b
rm
Unheilbar Feb 6, 2026
c618543
remove debug logs
Unheilbar Feb 6, 2026
50fbc6d
rm topology name
Unheilbar Feb 6, 2026
54c8220
fix typo
Unheilbar Feb 9, 2026
87ca765
Merge branch 'develop' into PLEX-1920
Unheilbar Feb 10, 2026
d8ed2e7
bump dep
Unheilbar Feb 10, 2026
9a6aa8a
fix remote hasher test
Unheilbar Feb 10, 2026
f6287df
fix lint
Unheilbar Feb 10, 2026
cc854fc
Merge branch 'develop' into PLEX-1920
Unheilbar Feb 10, 2026
e814ebb
bump deps
Unheilbar Feb 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/cre-system-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ jobs:
# Add list of tests with certain topologies
PER_TEST_TOPOLOGIES_JSON=${PER_TEST_TOPOLOGIES_JSON:-'{
"Test_CRE_V1_SecureMint": [
"Test_CRE_V2_Solana_Suite": [
{"topology":"workflow","configs":"configs/workflow-don-solana.toml"}
],
"Test_CRE_V1_Tron": [
Expand Down
74 changes: 63 additions & 11 deletions core/capabilities/remote/executable/hasher.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import (
"crypto/sha256"
"errors"
"fmt"
"strings"

"google.golang.org/protobuf/types/known/anypb"

"github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
evmcappb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/v2/chain-capabilities/evm"
solcappb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/v2/chain-capabilities/solana"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
)

Expand Down Expand Up @@ -93,28 +95,78 @@ func (r *writeReportExcludeSignaturesHasher) Hash(msg *types.MessageBody) ([32]b
// Exclude SpendLimits from RequestMetadata to ensure identical requests
// with different SpendLimits produce the same hash
req.Metadata.SpendLimits = nil

var wrReq evmcappb.WriteReportRequest
if err = req.Payload.UnmarshalTo(&wrReq); err != nil {
return [32]byte{}, fmt.Errorf("failed to unmarshal Payload to WriteReportRequest: %w", err)
}
if wrReq.Report == nil {
return [32]byte{}, errors.New("WriteReportRequest.Report is nil")
family, familyErr := getWriteReportFamily(msg)
if familyErr != nil {
return [32]byte{}, familyErr
}

wrReq.Report.Sigs = nil // exclude signatures from hash
var payload *anypb.Any
switch family {
case writeReportFamilyEVM:
var wrReq evmcappb.WriteReportRequest
if err = req.Payload.UnmarshalTo(&wrReq); err != nil {
return [32]byte{}, fmt.Errorf("failed to unmarshal Payload to WriteReportRequest: %w", err)
}
if wrReq.Report == nil {
return [32]byte{}, errors.New("WriteReportRequest.Report is nil")
}

wrReq.Report.Sigs = nil // exclude signatures from hash
payload, err = anypb.New(&wrReq)
if err != nil {
return [32]byte{}, fmt.Errorf("failed to marshal WriteReportRequest back to anypb: %w", err)
}
case writeReportFamilySolana:
var wrReq solcappb.WriteReportRequest
if err = req.Payload.UnmarshalTo(&wrReq); err != nil {
return [32]byte{}, fmt.Errorf("failed to unmarshal Payload to WriteReportRequest: %w", err)
}
if wrReq.Report == nil {
return [32]byte{}, errors.New("WriteReportRequest.Report is nil")
}

wrReq.Report.Sigs = nil // exclude signatures from hash
payload, err = anypb.New(&wrReq)
if err != nil {
return [32]byte{}, fmt.Errorf("failed to marshal WriteReportRequest back to anypb: %w", err)
}
default:
return [32]byte{}, fmt.Errorf("unexpected report family: %s", family)

req.Payload, err = anypb.New(&wrReq)
if err != nil {
return [32]byte{}, fmt.Errorf("failed to marshal WriteReportRequest back to anypb: %w", err)
}

req.Payload = payload

reqBytes, err := pb.MarshalCapabilityRequest(req)
if err != nil {
return [32]byte{}, fmt.Errorf("failed to marshal capability request: %w", err)
}
return sha256.Sum256(reqBytes), nil
}

type writeReportFamily string

var (
writeReportFamilyEVM writeReportFamily = "evm"
writeReportFamilySolana writeReportFamily = "solana"
)

func getWriteReportFamily(msg *types.MessageBody) (writeReportFamily, error) {
ss := strings.Split(msg.CapabilityId, ":")
if len(ss) < 1 {
return "", errors.New("failed to parse family from capability id")
}
family := ss[0]
switch family {
case "evm":
return writeReportFamilyEVM, nil
case "solana":
return writeReportFamilySolana, nil
}

return "", errors.New("report family is unknown, available families: evm, solana")
}

func NewWriteReportExcludeSignaturesHasher() types.MessageHasher {
return &writeReportExcludeSignaturesHasher{}
}
33 changes: 21 additions & 12 deletions core/capabilities/remote/executable/hasher_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
evmcappb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/v2/chain-capabilities/evm"
solcappb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/v2/chain-capabilities/solana"
"github.com/smartcontractkit/chainlink-protos/cre/go/sdk"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
)
Expand Down Expand Up @@ -45,19 +46,25 @@ func TestWriteReportExcludeSignaturesHasher_Hash_NilPayload(t *testing.T) {

func TestWriteReportExcludeSignaturesHasher_Hash_NilReport(t *testing.T) {
nilReq := &evmcappb.WriteReportRequest{Report: nil}
nilReqSol := &solcappb.WriteReportRequest{Report: nil}
nilPb, err := anypb.New(nilReq)
require.NoError(t, err)

nilPbSol, err2 := anypb.New(nilReqSol)
capReq := capabilities.CapabilityRequest{Payload: nilPb}
capReqBytes, err := pb.MarshalCapabilityRequest(capReq)
require.NoError(t, err)

msgBody := &types.MessageBody{Payload: capReqBytes}

hasher := NewWriteReportExcludeSignaturesHasher()
_, err = hasher.Hash(msgBody)
require.Error(t, err)
require.Contains(t, err.Error(), "WriteReportRequest.Report is nil")
require.NoError(t, err2)
capReqBytes, err3 := pb.MarshalCapabilityRequest(capReq)
require.NoError(t, err3)
capReqSol := capabilities.CapabilityRequest{Payload: nilPbSol}
capReqBytesSol, err4 := pb.MarshalCapabilityRequest(capReqSol)
require.NoError(t, err4)

msgBodies := []*types.MessageBody{{Payload: capReqBytes, CapabilityId: "evm:123"}, {Payload: capReqBytesSol, CapabilityId: "solana:123"}}
for _, msgBody := range msgBodies {
hasher := NewWriteReportExcludeSignaturesHasher()
_, err = hasher.Hash(msgBody)
require.Error(t, err)
require.Contains(t, err.Error(), "WriteReportRequest.Report is nil")
}
}

func TestWriteReportExcludeSignaturesHasher_Hash_InvalidPayload(t *testing.T) {
Expand Down Expand Up @@ -149,7 +156,8 @@ func getRequest(t *testing.T, data []byte, sigs [][]byte) *types.MessageBody {
capReqBytes, err := pb.MarshalCapabilityRequest(capReq)
require.NoError(t, err)
return &types.MessageBody{
Payload: capReqBytes,
Payload: capReqBytes,
CapabilityId: "evm:123",
}
}

Expand Down Expand Up @@ -206,6 +214,7 @@ func getWriteReportRequestWithSpendLimits(t *testing.T, data []byte, sigs [][]by
capReqBytes, err := pb.MarshalCapabilityRequest(capReq)
require.NoError(t, err)
return &types.MessageBody{
Payload: capReqBytes,
Payload: capReqBytes,
CapabilityId: "evm:2321",
}
}
55 changes: 28 additions & 27 deletions core/scripts/ccip/manual-execution/go.mod
Original file line number Diff line number Diff line change
@@ -1,63 +1,64 @@
module manual-execution

go 1.24.5
go 1.25.5

require (
github.com/ethereum/go-ethereum v1.16.2
github.com/ethereum/go-ethereum v1.16.8
github.com/pkg/errors v0.9.1
github.com/smartcontractkit/chain-selectors v1.0.71
golang.org/x/crypto v0.41.0
github.com/smartcontractkit/chain-selectors v1.0.90
golang.org/x/crypto v0.47.0
)

require (
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/DataDog/zstd v1.5.6 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/bits-and-blooms/bitset v1.20.0 // indirect
github.com/consensys/gnark-crypto v0.18.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/crate-crypto/go-eth-kzg v1.3.0 // indirect
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect
github.com/bits-and-blooms/bitset v1.24.0 // indirect
github.com/cespare/cp v1.1.1 // indirect
github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect
github.com/consensys/gnark-crypto v0.19.2 // indirect
github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
github.com/ethereum/c-kzg-4844/v2 v2.1.0 // indirect
github.com/deepmap/oapi-codegen v1.8.2 // indirect
github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect
github.com/ethereum/go-verkle v0.2.2 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang/snappy v1.0.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/graph-gophers/graphql-go v1.5.0 // indirect
github.com/holiman/uint256 v1.3.2 // indirect
github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect
github.com/klauspost/compress v1.18.2 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
github.com/pion/transport/v2 v2.2.10 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/prometheus/client_golang v1.23.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/rs/cors v1.11.1 // indirect
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/stretchr/testify v1.11.1 // indirect
github.com/supranational/blst v0.3.14 // indirect
github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
github.com/tklauser/numcpus v0.10.0 // indirect
github.com/urfave/cli/v2 v2.27.6 // indirect
github.com/urfave/cli/v2 v2.27.7 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/time v0.12.0 // indirect
google.golang.org/protobuf v1.36.8 // indirect
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect
golang.org/x/net v0.49.0 // indirect
golang.org/x/sync v0.19.0 // indirect
golang.org/x/sys v0.40.0 // indirect
golang.org/x/time v0.14.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading
Loading