Skip to content

Add data feeds cache, proxy, and common contracts - #161

Draft
Fletch153 wants to merge 9 commits into
mainfrom
feature/DF-25429/data-feeds-contracts
Draft

Add data feeds cache, proxy, and common contracts#161
Fletch153 wants to merge 9 commits into
mainfrom
feature/DF-25429/data-feeds-contracts

Conversation

@Fletch153

Copy link
Copy Markdown
Collaborator

Summary

  • Adds the Data Feeds contracts (cache, proxy, common) under contracts/data-feeds/ as a self-contained nested cargo workspace.

Context

Byte-identical port of the reviewed contracts from data-feeds-stellar-integration (its PR #1), relocating them to live with the other Stellar contracts. The nested workspace keeps their soroban-sdk 26.1 / stellar-access 0.7.2 pins isolated from the root workspace's soroban-sdk 25.1 — no contract changes, and the root workspace build/CI is untouched (verified: cargo check --workspace does not descend into it).

Changes

  • contracts/data-feeds/: data-feeds-cache, data-feeds-proxy, data-feeds-common crates with their own workspace Cargo.toml, Cargo.lock, and rust-toolchain.toml.

Testing

  • cargo test --manifest-path contracts/data-feeds/Cargo.toml --workspace — 165 passed.
  • Cache exercised end-to-end as the CRE write receiver in the local suite (chainlink #23208) — run green, decoded round read back on-chain.

Notes

  • Committed wasm files under */test_fixtures/ are inputs for the upgrade tests.
  • Follow-up: a CI step for the nested workspace (cargo test + fmt --check under contracts/data-feeds/).

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown

Soroban Contract Test Coverage

92.57% line coverage — 18067 / 19517 lines hit

Metric Hit Total Coverage
Lines 18067 19517 92.57%
Functions 1196 1538 77.76%
Regions 33594 35986 93.35%

Per-Contract Breakdown

Contract Lines (Hit / Total) Line Cov Funcs (Hit / Total) Func Cov
other 18067 / 19517 92.6% 1196 / 1538 77.8%
Full file-level coverage report
Filename                                                 Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ccip-ramp-registry/src/lib.rs                                188                75    60.11%           8                 3    62.50%         104                41    60.58%           0                 0         -
ccip-ramp-registry/src/test.rs                               214                 0   100.00%           5                 0   100.00%         128                 0   100.00%           0                 0         -
ccip-ramp-registry/src/types.rs                               83                11    86.75%          17                 6    64.71%          83                11    86.75%           0                 0         -
ccvs/committee-verifier/src/lib.rs                           588                54    90.82%          26                 2    92.31%         382                10    97.38%           0                 0         -
ccvs/committee-verifier/src/test.rs                         1300                25    98.08%          48                 2    95.83%         587                13    97.79%           0                 0         -
ccvs/committee-verifier/src/types.rs                          17                 8    52.94%           6                 5    16.67%          14                 7    50.00%           0                 0         -
ccvs/versioned-verifier-resolver/src/lib.rs                  287                21    92.68%          14                 1    92.86%         162                 4    97.53%           0                 0         -
ccvs/versioned-verifier-resolver/src/test.rs                 680                 9    98.68%          20                 0   100.00%         359                 3    99.16%           0                 0         -
ccvs/versioned-verifier-resolver/src/types.rs                 89                 6    93.26%          16                 4    75.00%          83                 4    95.18%           0                 0         -
common/authorization/src/allowlist.rs                        167                51    69.46%          12                 4    66.67%         110                40    63.64%           0                 0         -
common/authorization/src/lib.rs                              426                27    93.66%          16                 0   100.00%         277                16    94.22%           0                 0         -
common/authorization/src/ownable.rs                          102                13    87.25%           9                 1    88.89%          62                 6    90.32%           0                 0         -
common/authorization/src/test.rs                            1195                 0   100.00%          57                 0   100.00%         462                 0   100.00%           0                 0         -
common/guard/src/initializable.rs                             30                 1    96.67%           4                 0   100.00%          22                 1    95.45%           0                 0         -
common/guard/src/lib.rs                                       32                 1    96.88%           4                 0   100.00%          22                 0   100.00%           0                 0         -
common/guard/src/test.rs                                     101                 0   100.00%           8                 0   100.00%          47                 0   100.00%           0                 0         -
common/helpers/src/curse_checkable.rs                        103                24    76.70%           6                 1    83.33%          56                12    78.57%           0                 0         -
common/helpers/src/map_updater.rs                             94                15    84.04%           7                 3    57.14%          39                 8    79.49%           0                 0         -
common/helpers/src/soroban_invoke.rs                         277                 7    97.47%          12                 0   100.00%         115                 1    99.13%           0                 0         -
common/interfaces/src/ccip_receiver.rs                         8                 8     0.00%           8                 8     0.00%           8                 8     0.00%           0                 0         -
common/interfaces/src/committee_verifier.rs                   13                13     0.00%          13                13     0.00%          13                13     0.00%           0                 0         -
common/interfaces/src/fee_quoter.rs                           17                17     0.00%          17                17     0.00%          17                17     0.00%           0                 0         -
common/interfaces/src/offramp.rs                              11                11     0.00%          11                11     0.00%          11                11     0.00%           0                 0         -
common/interfaces/src/onramp.rs                                9                 9     0.00%           9                 9     0.00%           9                 9     0.00%           0                 0         -
common/interfaces/src/ramp_registry.rs                         5                 5     0.00%           5                 5     0.00%           5                 5     0.00%           0                 0         -
common/interfaces/src/rmn_proxy.rs                             6                 6     0.00%           6                 6     0.00%           6                 6     0.00%           0                 0         -
common/interfaces/src/router.rs                                9                 9     0.00%           9                 9     0.00%           9                 9     0.00%           0                 0         -
common/interfaces/src/siloed_lock_release_pool.rs             21                21     0.00%          21                21     0.00%          21                21     0.00%           0                 0         -
common/interfaces/src/token_admin_registry.rs                  8                 8     0.00%           8                 8     0.00%           8                 8     0.00%           0                 0         -
common/interfaces/src/token_lock_box.rs                        6                 6     0.00%           6                 6     0.00%           6                 6     0.00%           0                 0         -
common/interfaces/src/token_pool.rs                           11                11     0.00%          11                11     0.00%          11                11     0.00%           0                 0         -
common/interfaces/src/versioned_verifier_resolver.rs          10                10     0.00%          10                10     0.00%          10                10     0.00%           0                 0         -
common/message/src/lib.rs                                    586                41    93.00%          28                 4    85.71%         298                 9    96.98%           0                 0         -
common/message/src/test.rs                                   641                 2    99.69%          28                 0   100.00%         323                 0   100.00%           0                 0         -
common/pool/src/decimals.rs                                  109                10    90.83%           6                 0   100.00%          76                 3    96.05%           0                 0         -
common/pool/src/finality_codec.rs                             52                 1    98.08%           3                 0   100.00%          41                 0   100.00%           0                 0         -
common/pool/src/lib.rs                                       460                31    93.26%          32                 1    96.88%         409                26    93.64%           0                 0         -
common/pool/src/rate_limit.rs                                180                 7    96.11%           9                 0   100.00%         145                 3    97.93%           0                 0         -
common/pool/src/types.rs                                      20                14    30.00%          16                14    12.50%          30                14    53.33%           0                 0         -
common/signature/src/config.rs                                44                12    72.73%           6                 2    66.67%          28                 5    82.14%           0                 0         -
common/signature/src/quorum.rs                                68                 1    98.53%           2                 0   100.00%          44                 1    97.73%           0                 0         -
common/signature/src/scheme.rs                                45                 0   100.00%           2                 0   100.00%          29                 0   100.00%           0                 0         -
cre/forwarder/src/error.rs                                     8                 3    62.50%           1                 0   100.00%           8                 3    62.50%           0                 0         -
cre/forwarder/src/lib.rs                                     462                24    94.81%          18                 0   100.00%         318                 7    97.80%           0                 0         -
cre/forwarder/src/test.rs                                   2886                14    99.51%         128                 2    98.44%        1204                 8    99.34%           0                 0         -
cre/forwarder/src/types.rs                                    62                 6    90.32%          10                 6    40.00%          36                 6    83.33%           0                 0         -
cre/test/read_fixture/src/lib.rs                             125               125     0.00%          33                33     0.00%         103               103     0.00%           0                 0         -
cre/test/receiver/src/lib.rs                                  53                53     0.00%           5                 5     0.00%          26                26     0.00%           0                 0         -
cre/test/rejecting_receiver/src/lib.rs                         3                 3     0.00%           1                 1     0.00%           8                 8     0.00%           0                 0         -
fee-quoter/src/lib.rs                                        771               164    78.73%          20                 3    85.00%         527               100    81.02%           0                 0         -
fee-quoter/src/test.rs                                       861                 0   100.00%          17                 0   100.00%         427                 0   100.00%           0                 0         -
fee-quoter/src/types.rs                                       13                13     0.00%          13                13     0.00%          13                13     0.00%           0                 0         -
mcms/src/abi_encoding.rs                                     216                 4    98.15%          10                 0   100.00%          98                 1    98.98%           0                 0         -
mcms/src/constants.rs                                         10                 0   100.00%           2                 0   100.00%           6                 0   100.00%           0                 0         -
mcms/src/crypto.rs                                           202                 3    98.51%           7                 0   100.00%         109                 2    98.17%           0                 0         -
mcms/src/error.rs                                              8                 4    50.00%           1                 0   100.00%           8                 4    50.00%           0                 0         -
mcms/src/lib.rs                                              713                50    92.99%          20                 0   100.00%         483                23    95.24%           0                 0         -
mcms/src/test.rs                                            2278                19    99.17%          59                 0   100.00%        1095                 2    99.82%           0                 0         -
mcms/src/types.rs                                             10                10     0.00%          10                10     0.00%          10                10     0.00%           0                 0         -
offramp/src/lib.rs                                           729               400    45.13%          23                 8    65.22%         473               224    52.64%           0                 0         -
offramp/src/test.rs                                          890                 0   100.00%          28                 0   100.00%         363                 0   100.00%           0                 0         -
offramp/src/types.rs                                          21                 9    57.14%           6                 5    16.67%          17                 7    58.82%           0                 0         -
onramp/src/lib.rs                                           1181               149    87.38%          27                 2    92.59%         739                61    91.75%           0                 0         -
onramp/src/test.rs                                          1591                 4    99.75%          37                 0   100.00%         708                 4    99.44%           0                 0         -
onramp/src/types.rs                                           23                 9    60.87%           6                 5    16.67%          19                 7    63.16%           0                 0         -
pools/burn-mint-pool/src/lib.rs                              390               107    72.56%          28                 9    67.86%         282                55    80.50%           0                 0         -
pools/burn-mint-pool/src/test.rs                            2671                24    99.10%          56                 5    91.07%        1744                55    96.85%           0                 0         -
pools/lock-release-pool/src/lib.rs                           404               100    75.25%          28                 8    71.43%         288                48    83.33%           0                 0         -
pools/lock-release-pool/src/test.rs                         2330                24    98.97%          55                 5    90.91%        1524                55    96.39%           0                 0         -
pools/siloed-lock-release-pool/src/lib.rs                    556               196    64.75%          38                17    55.26%         384               123    67.97%           0                 0         -
pools/siloed-lock-release-pool/src/test.rs                  1303                12    99.08%          38                 2    94.74%         695                18    97.41%           0                 0         -
pools/token-lock-box/src/lib.rs                              197                17    91.37%          13                 1    92.31%         113                 2    98.23%           0                 0         -
pools/token-lock-box/src/test.rs                             257                 0   100.00%           7                 0   100.00%          73                 0   100.00%           0                 0         -
registry/src/lib.rs                                            8                 0   100.00%           1                 0   100.00%           3                 0   100.00%           0                 0         -
registry/src/test.rs                                          27                 0   100.00%           1                 0   100.00%          11                 0   100.00%           0                 0         -
rmn_proxy/src/lib.rs                                          66                12    81.82%           5                 1    80.00%          34                 3    91.18%           0                 0         -
rmn_proxy/src/test.rs                                        279                 0   100.00%          11                 0   100.00%          91                 0   100.00%           0                 0         -
rmn_remote/src/lib.rs                                        302                26    91.39%          16                 1    93.75%         171                10    94.15%           0                 0         -
rmn_remote/src/test.rs                                       393                 0   100.00%          14                 0   100.00%         133                 0   100.00%           0                 0         -
router/src/lib.rs                                            593                87    85.33%          18                 1    94.44%         374                43    88.50%           0                 0         -
router/src/test.rs                                          1186                 0   100.00%          29                 0   100.00%         497                 0   100.00%           0                 0         -
router/src/test_panic_receiver.rs                              5                 0   100.00%           2                 0   100.00%           5                 0   100.00%           0                 0         -
router/src/types.rs                                            3                 3     0.00%           3                 3     0.00%           3                 3     0.00%           0                 0         -
timelock/src/error.rs                                          6                 2    66.67%           1                 0   100.00%           6                 2    66.67%           0                 0         -
timelock/src/lib.rs                                          649                46    92.91%          32                 2    93.75%         393                18    95.42%           0                 0         -
timelock/src/roles.rs                                        141                10    92.91%           6                 0   100.00%          76                 7    90.79%           0                 0         -
timelock/src/storage.rs                                      115                15    86.96%          12                 1    91.67%          68                 7    89.71%           0                 0         -
timelock/src/test.rs                                        1479                16    98.92%          37                 0   100.00%         531                 1    99.81%           0                 0         -
timelock/src/types.rs                                          3                 3     0.00%           3                 3     0.00%           3                 3     0.00%           0                 0         -
token-admin-registry/src/lib.rs                              368                23    93.75%          18                 1    94.44%         257                 4    98.44%           0                 0         -
token-admin-registry/src/test.rs                             825                 0   100.00%          21                 0   100.00%         287                 0   100.00%           0                 0         -
token-admin-registry/src/types.rs                              2                 2     0.00%           2                 2     0.00%           2                 2     0.00%           0                 0         -
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                                                      35986              2392    93.35%        1538               342    77.76%       19517              1450    92.57%           0                 0         -```

</details>

> Commit `943fa110` | [Full CI run](https://github.com/smartcontractkit/chainlink-stellar/actions/runs/30819815531)

<!-- Sticky Pull Request Commentcontract-coverage -->

@Fletch153

Fletch153 commented Jul 22, 2026

Copy link
Copy Markdown
Collaborator Author

The five failing Go CI checks (E2E, Go Unit Tests, Integration ×2, Coverage) are pre-existing on main with byte-identical failure signatures — not introduced here: deployment/adapters references CommitteeVerifierClient.GetAllSignatureConfigs, which is absent from the bindings at current main, so every Go job fails at build. All contract-side checks (test-contracts, formatting, generated code) pass.

Without discriminants Soroban encodes a unit enum as a symbol union;
with them it becomes an integer enum (U32 on the wire). The Go bindings
generator emits U32 for unit enums, so this one-line change makes the
generated find_round encoding correct with no generator changes.

Deliberately diverges from the byte-identical port by exactly this
declaration; behavior inside the contract is unchanged (26+165 tests
pass untouched).
@Fletch153
Fletch153 force-pushed the feature/DF-25429/data-feeds-contracts branch from fe0b147 to 76ac73e Compare July 23, 2026 13:11
@Fletch153

Copy link
Copy Markdown
Collaborator Author

Note for reviewers: 76ac73e adds explicit discriminants to Bound (AtOrBefore = 0, AtOrAfter = 1) — a deliberate two-line deviation from the byte-identical port. With discriminants, Soroban registers the enum as an integer enum (U32 on the wire) instead of a symbol union, which is the encoding the Go bindings generator (#162) emits for unit enums — so find_round calls from Go encode correctly with no generator special-casing. Behavior inside the contract is unchanged; all tests pass untouched.

Soroban's contracttype/contractevent/contractimpl macros run before
name resolution and record whatever type token is written, so an alias
name at an ABI position becomes a dangling UDT reference in the wasm
spec (aliases produce no definition entry), breaking every downstream
bindings generator. Literal BytesN<N> at those positions makes the
spec self-contained.

The aliases (DataId, WorkflowName, WorkflowOwner, WasmHash,
WorkflowCid, ReportId, WireDataId) remain defined and used everywhere
the macros cannot see: domain logic, storage, decode paths, and tests.

No behavior change; 200 tests pass. Verified via stellar contract
inspect that no alias name appears as a type in either wasm spec.
@Fletch153
Fletch153 force-pushed the feature/DF-25429/data-feeds-contracts branch from 019b250 to 14b9721 Compare July 23, 2026 18:16
description() returns an empty string both for an unconfigured feed
and for one legitimately configured with an empty description, so it
cannot answer whether a feed is registered. is_configured checks the
config store directly and avoids deserializing FeedConfig.
- Gate both getters on the feed config, so an unknown id reads as
  None instead of a derived value or an empty string
- Keep the pure byte-7 derivation as decimals_from_id for the
  FeedConfigSet event
- Collapse feed::is_configured into feed::configured, which had an
  identical body
- Map both getters to NoDataPresent in the round proxy, matching how
  it already treats an absent round
- Store frozen on FeedState, which the round reads already load
- Return FeedFrozen from latest_round, get_round, round_range,
  find_round, decimals and description; is_configured stays
  readable so a frozen feed is still distinguishable from an
  unknown one
- Keep on_report writing while frozen, and carry the flag across a
  report so an update cannot thaw a feed
- Rebuild the self-upgrade fixtures, since the new FeedState field
  changes its encoding
- Fold the is_frozen toggle and the is_configured exemption into
  the two round-trip tests that already set them up
- Merge the unknown-id and unreported-id cases into one batch
  atomicity test
- Add a live_feed helper for the repeated configure-and-seed pair
- Assert every frozen read the same way, since the return types
  rule out a shared closure
The mock cache always answers Some for decimals and description, so
the real-cache test was the only coverage of their absence branch.
Widening it to latest_round and get_round lets one test state the
whole contract instead of just the paths the mock cannot reach.
- feed::set_frozen returns bool; contract.rs owns the error
  decision, so no function in domain/feed.rs errors
- Map missing feed state to new NoFeedState (110) instead of
  FeedNotConfigured, which lied for configured-but-unreported
  feeds
- Drop the no-op event suppression so every successful call
  emits, matching every other emitter in both contracts
- Drop the redundant pre-pass existence check in set_feed_frozen
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant