Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
caf1fad
feat(deployment): add chainlink-stellar dependency and stellar change…
Fletch153 Jul 22, 2026
0c2c0b0
feat(data-feeds/stellar): package scaffold — config, validation, deps…
Fletch153 Jul 2, 2026
a66f115
fix(data-feeds/stellar): left-justify data IDs to match Solana suite …
Fletch153 Jul 2, 2026
638f808
test(data-feeds/stellar): pin left-justified data-ID layout with disc…
Fletch153 Jul 2, 2026
ba73611
feat(data-feeds/stellar): CLDF operations for cache and proxy
Fletch153 Jul 2, 2026
50629ad
feat(data-feeds/stellar): DeployCache and DeployProxy changesets
Fletch153 Jul 2, 2026
933d1d7
fix(data-feeds/stellar): Apply-side chain guard, stat wasm path, asse…
Fletch153 Jul 2, 2026
9960296
feat(data-feeds/stellar): feed config, removal, and feed-admin change…
Fletch153 Jul 2, 2026
f55d114
feat(data-feeds/stellar): ownership, upgrade, recover-tokens, set-pro…
Fletch153 Jul 2, 2026
35010be
chore(deployment): mark go-stellar-sdk as direct dependency
Fletch153 Jul 2, 2026
c53ed55
feat(data-feeds/stellar): datastore-backed cache and proxy client loa…
Fletch153 Jul 2, 2026
b36dbb4
test(data-feeds/stellar): e2e on local CTF devnet covering every cach…
Fletch153 Jul 3, 2026
a5d56f0
docs(data-feeds/stellar): package README
Fletch153 Jul 3, 2026
240b292
refactor(data-feeds/stellar): quality pass - review minors
Fletch153 Jul 3, 2026
f6c94c9
fix(data-feeds/stellar): restore precondition check order, assert rou…
Fletch153 Jul 3, 2026
7eeff5f
fix(data-feeds/stellar): final-review fixes — lint, docs, validation
Fletch153 Jul 3, 2026
4562c66
test(data-feeds/stellar): pin report byte layout, owner-path cases
Fletch153 Jul 3, 2026
cb4f129
fix(data-feeds/stellar): construct Bound as symbol union in e2e find_…
Fletch153 Jul 3, 2026
7940a5e
docs(data-feeds/stellar): reword e2e coverage comment
Fletch153 Jul 3, 2026
71cd76c
Tidy deployment module for chainlink-stellar pins
Fletch153 Jul 22, 2026
a57fdd3
Re-pin chainlink-stellar to a5c7938 and adapt to final bindings
Fletch153 Jul 24, 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
113 changes: 113 additions & 0 deletions deployment/data-feeds/changeset/stellar/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
### Stellar Data Feeds Changesets

CLDF `ChangeSetV2` suite for the Soroban `DataFeedsCache` and `DataFeedsProxy`
contracts. Style follows the Solana suite (`ChangeSetV2` + operations);
functional coverage mirrors the EVM Data Feeds suite (deploy / configure /
admin / remove / ownership / proxy — `jd_*`, `migrate_feeds`, `import_address`
are EVM/JD-specific and deliberately have no Stellar equivalent here).

#### Package layout

```
data-feeds/changeset/stellar/
├── deploy_cache.go, deploy_proxy.go # instantiate contracts, record AddressRefs
├── configure_cache.go # SetFeedConfigs — descriptions + permissions
├── remove_feeds.go, feed_admin.go # remove feed configs, grant/revoke feed-admin
├── ownership.go # transfer / accept / renounce (cache + proxy)
├── upgrade_cache.go, recover_tokens.go, set_proxy_cache.go
├── deps.go, state.go # shared resolve-ref/build-deps + client loaders
├── validation.go, config.go # input validation, encoding helpers
├── operation/operation.go # one CLDF operation per on-chain call
└── testdata/ # e2e WASM fixtures — see testdata/README.md
```

Each changeset's `Apply` resolves a `datastore.AddressRef` (chain selector +
`ContractType` + version + qualifier) to a `stellarApplyDeps` bundle — the
contract ID plus the `stellardeps.StellarDeps` (Deploy + Invoker) needed to
call it — then executes one or more `operation.*` calls from
`operation/operation.go` through `env.OperationsBundle`. Operations are thin:
each wraps exactly one generated-binding call
(`chainlink-stellar/bindings/contracts/data_feeds_{cache,proxy}`) or one
`stellardeps.Deploy` call. `deps.go`'s `verifyContractRef` /
`resolveContractDeps` hold the chain-exists + version-parse + ref-exists +
build-deps skeleton shared by every changeset in this package.

#### Permissions model — no standalone "set forwarder"

There is no `SetForwarder`-style changeset here. A feed's writer allowlist is
part of its `FeedConfig` and is set via `SetFeedConfigs`
(`configure_cache.go`): each `FeedPermission` carries an `AllowedSender` —
the CRE forwarder contract address — plus `AllowedWorkflowOwner` and
`AllowedWorkflowName`, checked on-chain by `on_report`. This mirrors EVM's
`WorkflowMetadata{AllowedSender, AllowedWorkflowOwner, AllowedWorkflowName}`
gate. To point feeds at a new forwarder, re-run `SetFeedConfigs` with updated
`Permissions` — there's no separate on-chain "forwarder" slot to update.

#### Cross-contract version coupling

`DeployProxy` and `SetProxyCache` both resolve their cache `AddressRef` using
the *proxy's own* `req.Version`, not a separate cache-version field. This
suite's convention is that cross-contract datastore lookups share the acting
changeset's `Version` — so a cache recorded under a different version needs a
matching-version record before a proxy at that version can find it. An
optional `CacheVersion` field on these requests (to let the two diverge) is a
recorded follow-up, not implemented here.

#### Regenerating testdata WASM + bindings

The e2e test (`e2e_test.go`) deploys real WASM to a local devnet; the fixtures
in `testdata/` and the generated Go bindings in
`chainlink-stellar/bindings/contracts/data_feeds_{cache,proxy}` are a
**matched pair** — a contract ABI change requires regenerating both together,
or the e2e test will fail to compile or decode. See `testdata/README.md` for
checksums and the exact regeneration steps; in short:

```sh
# 1. rebuild WASM from the contract source repo
cd <data-feeds-stellar-integration>/contracts/data-feeds
stellar contract build # stellar CLI 27.0.0
cp target/wasm32v1-none/release/data_feeds_{cache,proxy}.wasm \
<chainlink>/deployment/data-feeds/changeset/stellar/testdata/
# (older stellar CLIs output to target/wasm32-unknown-unknown/release/ instead)

# 2. regenerate bindings from the new WASM, in chainlink-stellar
./scripts/gen_bindings.sh
```

#### Running the e2e test

`TestStellarDataFeedsE2E` boots a local CTF Soroban devnet, deploys both
contracts, and asserts 35 exported function calls succeed plus 2
(`recover_tokens` on each contract) fail with the documented `InvalidAction`
host error (self-transfer re-entry — see the test's `recover_tokens`
comments). It needs Docker and does not run in CI (`skipInCI` skips when
`CI=true`).

```sh
go test ./data-feeds/changeset/stellar/ -run TestStellarDataFeedsE2E -v -timeout 25m
```

The default path boots `stellar/quickstart:future` via CLDF's
`NewCTFChainProvider`, hardcoded by the CTF framework to `linux/amd64` — on a
native arm64 host without amd64 emulation this fails (`exec format error`).
Override with `STELLAR_E2E_RPC_URL` / `STELLAR_E2E_FRIENDBOT_URL` to attach to
a quickstart container started natively instead:

```sh
docker run -d -p 8000:8000 stellar/quickstart:latest \
--local --enable-soroban-rpc --protocol-version 26
STELLAR_E2E_RPC_URL=http://127.0.0.1:8000/rpc \
STELLAR_E2E_FRIENDBOT_URL=http://127.0.0.1:8000/friendbot \
go test ./data-feeds/changeset/stellar/ -run TestStellarDataFeedsE2E -v -timeout 25m
```

See the doc comment on `newE2EChain` for why protocol 26 (not quickstart's
default 25) is required.

#### Out of scope

- **Durable-pipeline registration** in `chainlink-deployments` — follow-up
work, coordinate with PLEX-2923.
- **MCMS** (multi-chain multisig) integration — PLEX-owned.
- **Forwarder / timelock deployment** — PLEX-owned; this package only wires
an already-deployed forwarder's address into `FeedPermission.AllowedSender`.
Loading
Loading