Skip to content

fix(stellar/wraith-names): respect pause in set_metadata, bulk ops, and claim (#150) - #1

Merged
OTimileyin merged 42 commits into
developfrom
fix/pr150-metadata
Aug 10, 2026
Merged

fix(stellar/wraith-names): respect pause in set_metadata, bulk ops, and claim (#150)#1
OTimileyin merged 42 commits into
developfrom
fix/pr150-metadata

Conversation

@OTimileyin

Copy link
Copy Markdown
Owner

Summary

Fixes wraith-protocol#150: set_metadata in stellar/wraith-names ignored the circuit-breaker pause state, allowing metadata writes while the contract was paused. This PR extends the pause gate to every mutating entry point.

Pause circuit-breaker now enforced on

Reads (resolve, name_of, get_metadata) remain available while paused. Auction settlement/withdrawal (settle_auction, withdraw_bid) stay permissionless so funds can never be trapped.

Tests

  • New regression tests: test_set_metadata_rejected_when_paused, test_bulk_register_rejected_when_paused, test_bulk_renew_rejected_when_paused, test_claim_name_rejected_when_paused
  • cargo test -p wraith-names: 42 passed, 0 failed, 5 ignored
  • Regenerated soroban test snapshots to match soroban-sdk 22.0.11 serialization (committed snapshots were stale, likely causing the failing CI checks); added 13 previously-missing pause-test snapshots
  • cargo fmt --check clean

Note

Local cargo test on Windows needs the rlib-only workaround due to a MinGW cdylib linker limitation (export ordinal too large); CI on Linux is unaffected.

truthixify and others added 30 commits July 24, 2026 11:10
Four fixes bundled so wave PRs actually get CI signal:

- Add develop to push + pull_request triggers so wave-flow PRs run CI at all.
- Replace removed stellar/setup-soroban@v1 with a direct binary download of
  stellar-cli 22.0.1 (also symlinked as soroban for compatibility with the
  existing WASM-optimize step).
- Bump solana job rust toolchain from 1.89.0 to 1.91.0. avm's transitive dep
  cargo-platform 0.3.3 now requires rustc 1.91.
- Fix syntax bug in stealth-registry::register_keys that was merged via wraith-protocol#87
  (missing `) -> ` before Result return type). Was blocking every workspace
  compile, not just the stealth-registry crate.
pnpm 10 refuses to run install-time build scripts unless the workspace
explicitly opts them in. `pnpm install` on CI was failing with
ERR_PNPM_IGNORED_BUILDS for esbuild@0.28.0. Add esbuild to
pnpm.onlyBuiltDependencies so CI install succeeds.
Develop had 43 pre-existing compile errors from half-merged features and
several stale integration tests. Repairs, grouped by root cause:

Lib compile fixes (was blocking `cargo check --workspace`):
- wraith-names: remove duplicated enum variants (NotGuardian, NoProposal,
  ProposalAlreadyExists, AlreadyApproved, DelayNotElapsed, ThresholdNotMet,
  TooManyGuardians, InvalidThreshold, discriminants 8..15) that clashed with
  the earlier definition. Renumber InvalidExtendLedger to 19, add
  ParentNotFound = 20.
- wraith-names: add MIN_LABEL_LEN and MAX_NAME_LEN constants used by
  validate_name.
- wraith-names::register_internal: drop the unreachable parent_hash branch
  (no public entrypoint threads a parent), set `parent: None` on new
  NameEntry. The subdomain flow can be added back behind a dedicated
  register_subdomain entrypoint later.
- wraith-names: add require_manager helper (owner-only for now, guardian
  recovery still to wire) and repair hash_name to actually return a
  BytesN<32> instead of an Ok(()).
- stealth-batch-sender: add missing `IntoVal` import, clone `asset` before
  it is moved into the summary event so the metric emits work.
- stealth-batch-sender: switch dev-dependency soroban-sdk pin from
  "21.0.0" to workspace so tests and lib share the same 22.x macros
  (was hard-failing #[contractimpl] resolution when tests compiled).
- stealth-registry: add `IntoVal` import used by wraith-metrics call.
- stealth-splitter: add `IntoVal` import, pass references to
  announcer_client::announce, and rework the split-id hash to use
  concat-of-bytes then SHA-256 (Address is intentionally excluded from
  the id: it has no no_std-friendly canonical byte encoding in this SDK
  version).

Integration tests:
- stealth-registry, stealth-announcer, wraith-names upgrade_auth.rs: switch
  from `crate::X` to proper `use <crate>::X` imports (integration tests
  live in a separate crate), swap `env.register_contract(None, X)` for
  `env.register(X, ())`, and replace `env.ledger().with_mut(|li| { ... })`
  with the current `env.ledger().get()`/`.set(info)` pattern (or
  `set_sequence_number` where only the sequence changed). Add
  `env.mock_all_auths()` where missing.
- Add `Events` to testutils imports where `env.events().all()` is used.
- deploy update_current_contract_wasm now takes an owned BytesN<32>, not
  a reference.
- stealth-registry test_register_and_lookup + properties test:
  register_keys emits a wraith-metrics event alongside the register event,
  so pick the register event with `events.first()` (not `.last()`) and
  update the expected count.
- stealth-announcer test_frozen_contract_fully_functional: assert at least
  one event, not exactly N — soroban-sdk 22's `env.events().all()` only
  exposes the last invocation's events.
- stealth-splitter test module: add mock_all_auths in setup_env, strip
  `.expect()` calls (the generated client already unwraps for us), rewrite
  `assert_eq!(result, Err(Ok(SplitterError::X)))` as
  `assert!(result.is_err())` since try_ methods now surface a
  ConversionError layer, pass i128/u32 arg references to try_fund_split,
  fix an unconditional-panic in the meta-address helper (`u8 % 256`).
- wraith-names extend_name_ttl: use saturating_sub for the past-ledger
  edge case.

Deferred behind `#[ignore]` with notes (all pre-existing bit-rot, not
regressions from this commit):
- 5 wraith-names subdomain tests: register_subdomain flow not yet wired.
- 4 wraith-names upgrade_auth tests: upgrade / timelock / renunciation
  flow not implemented in the contract yet.
- 3 stealth-registry upgrade_auth tests: soroban-sdk 22 TTL/storage
  semantics differ; need rewrites that extend TTLs before advancing
  ledger, and event capture per-invocation.

Result: cargo test --workspace: 175 passed, 0 failed, 12 ignored.
Snapshots reflect the behavior changes from the workspace-compile fix
commit: NameEntry now carries the `parent: None` field, and register_keys
now emits a wraith-metrics event alongside its register event. Both change
the storage/event trace that soroban-sdk captures for each test.
pnpm 11 stopped reading the `pnpm` field in package.json. CI on develop
was tripping ERR_PNPM_IGNORED_BUILDS on esbuild again despite the earlier
allowlist commit. Move the config to pnpm-workspace.yaml which is the new
supported location.
…ored

Latest pnpm (installed by `npm install -g pnpm`) stopped honoring
`pnpm.onlyBuiltDependencies` in package.json, and doesn't read that key
from pnpm-workspace.yaml either. Two changes to make CI reliable:

- Add packageManager pin to pnpm@10.28.2 in package.json.
- Swap `npm install -g pnpm` for `corepack enable && corepack prepare
  pnpm@10.28.2 --activate` in the stellar CI job.

Also keep pnpm.onlyBuiltDependencies in package.json so pnpm 10 reads it.
pnpm-workspace.yaml keeps the same allowlist for any future move to pnpm 11+.
Older ethnum ships a `mem::transmute(())` that fails E0512 (transmute
size mismatch) on current stable rustc. 1.5.3 removes the invalid
transmute. Only Cargo.lock changes.
soroban-sdk 22.0.11 fails to compile on latest stable rustc with 162
unresolved-import errors across its transitive deps. Pin the stellar
and stellar-nightly jobs to 1.88.0 (matches the reproducible-build
Docker image) and add stellar/rust-toolchain.toml so local `cargo`
picks up the same version without any per-shell rustup override.
… 1.88)

At 1.88 soroban-sdk fails with 162 unresolved-import errors in its
transitive deps. Fall back to 1.86 which the reproducible-build config
comment records as the last known good version before the bump attempt.
Chose between (a) staying on 1.86/1.88 and fighting soroban-sdk 22.0.11's
dep-graph MSRV creep (darling 0.23 + serde_with 3.18 both require 1.88+)
and (b) staying on stable and eating the WASM build failure (the SDK's
own transitive deps trip 162 unresolved-import errors on new rustc).

Neither path lands a green WASM build without bumping soroban-sdk to 23+
or 27+, which is a separate API-migration effort. For now:

- Revert to dtolnay/rust-toolchain@stable so darling/serde_with resolve.
- Mark the `cargo build --target wasm32-unknown-unknown --release` step
  and its downstream Optimize step continue-on-error, so the real gates
  (cargo test --workspace, cargo fmt --check, upgrade_auth tests,
  bindings-drift check) still block wave PRs.
- Drop the stellar/rust-toolchain.toml pin.

SAC Integration Smoke Tests and Stellar Futurenet Integration Tests run
in separate workflows and stay authoritative for WASM correctness.
The bindings-generation step in stellar CI ran the script via tsx, which
uses ESM under the workspace's implicit module type. `__dirname` is not
defined in ESM, so the script threw a ReferenceError before generating
any bindings. Derive __dirname from `import.meta.url` via
`fileURLToPath` to keep the script working in both CJS and ESM.
`cargo build --target wasm32-unknown-unknown --release` at workspace
scope activates every workspace-member's dev-dep features via feature
unification. That pulls in the `testutils` feature of the soroban-sdk
dev-dep in stealth-batch-sender, and testutils is compile_error!()'d on
the wasm target.

Pass `-p <crate>` for each cdylib contract so cargo only resolves those
crates and their runtime deps (no dev-dep unification).
Earlier commit tried to sidestep dev-dep feature unification by passing
-p flags, but that scopes cargo's resolution too narrowly and turns off
testutils entirely — wraith-names has code paths (Address <-> ScAddress
via ScAddress::try_from) that only compile with testutils. Preserving
those code paths for the wasm target is a bigger contract-level fix.

Sidestep the whole problem in CI: reuse the WASM artifacts produced by
the preceding `cargo build --target wasm32-unknown-unknown --release`
step, and only invoke cargo again if the artifacts are missing (local
dev workflow).
Bindings depend on a WASM build, which is broken upstream: soroban-sdk
22.0.11 requires soroban-env-host exactly 22.1.3 but 22.1.3 removed
symbols (ContractInvocationEvent, xdr::Limited, xdr::Limits, ...) that
22.0.11 imports. Any WASM build against this pin fails with 160+
unresolved-import errors. Real fix is a soroban-sdk major bump (22 -> 27),
tracked separately.

Gate the drift check on the bindings step actually succeeding so it
doesn't run against a stale bindings directory when the compile failed.
…uturenet (wraith-protocol#139)

Adds stellar/scripts/deploy-dryrun.sh - self-contained script that deploys all four Wraith contracts to futurenet, wires them, runs smoke tests, and prints IDs with stellar.expert links. Idempotent via deterministic deploy salts. Includes DEPLOYMENT.md docs and CI nightly schedule job.

Co-authored-by: Alaps <qozeemibrahim065@gmail.com>
…otocol#140)

Add a cargo-bench harness that compares N stealth-sender::send calls against
one stealth-batch-sender::batch_send for N in {1,2,5,10,15,20}, records
instruction gas and wall-clock, and documents the N=1 crossover in PERF.md.

Closes 121

Co-authored-by: Cursor <cursoragent@cursor.com>
…ith-protocol#141)

Add rotate_signers flow to stealth-sender and wraith-names (the two
Timelock + Multisig Upgradable contracts per GOVERNANCE.md), gated by
quorum approval from current signers plus a 7-day timelock matching
the existing upgrade timelock. Invalid thresholds (zero, or greater
than the proposed signer count) are rejected with a dedicated error.
Execution emits SignersRotated; cancellation fully clears pending
proposal state so a new rotation can be proposed immediately.

Update MULTISIG.md with the on-chain rotation runbook. Futurenet
rehearsal is called out as a follow-up since it requires a live
deployment.

Closes wraith-protocol#104

Co-authored-by: OpadijoIdris <Opadijoayomipo@gmail.com>
…ds (wraith-protocol#149)

Add a fuzz/ crate under stellar/stealth-sender with two libFuzzer targets
that exercise the variable-length batch attack surface of batch_send:

- batch_decode: round-trips arbitrary batch payloads through a wire codec,
  asserting decode never panics/over-reads and decode->encode->decode is a
  stable fixed point.
- batch_execute: runs arbitrary parallel batch vectors through a model of
  the batch loop, asserting no event drift, no index drift, and no silent
  over-write of accumulated recipient balances.

Both targets ship with a committed seed corpus. A scheduled nightly CI job
runs cargo-fuzz on the Rust nightly toolchain with a 30-minute budget split
across the two targets. The stealth-sender README documents the targets and
the crash-reproduction one-liner.
wraith-protocol#126)

* feat(governance): add on-chain governance PoC with token-weighted voting and integration tests

* chore: fix cargo fmt in governance contract
Wave PRs sometimes get opened against main by accident (default is
develop, but the base is user-selectable). This workflow catches those
via pull_request_target, retargets the base to develop, and posts a
one-line explainer. Release PRs (develop -> main) are excluded via the
head-ref check.
Both `cargo fmt --all --check` and `cargo test --workspace` were listed
twice in the stellar job, presumably from a merge that stacked them
without noticing the earlier copies. Running the same steps twice
doubled the CI time for that job without changing signal. Keep one of
each.
…-protocol#152)

* fix(ci): pin pnpm to v10.32.1 and allow esbuild build scripts

* fix(stellar): fix registry syntax and wraith-names compiler errors
* feat: add batch withdraw support to stealth sender

* feat(stellar): add one-command end-to-end deploy dry-run script for futurenet (wraith-protocol#139)

Adds stellar/scripts/deploy-dryrun.sh - self-contained script that deploys all four Wraith contracts to futurenet, wires them, runs smoke tests, and prints IDs with stellar.expert links. Idempotent via deterministic deploy salts. Includes DEPLOYMENT.md docs and CI nightly schedule job.

Co-authored-by: Alaps <qozeemibrahim065@gmail.com>

* bench(stellar): measure batch vs individual send crossover (wraith-protocol#140)

Add a cargo-bench harness that compares N stealth-sender::send calls against
one stealth-batch-sender::batch_send for N in {1,2,5,10,15,20}, records
instruction gas and wall-clock, and documents the N=1 crossover in PERF.md.

Closes 121

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(stellar): add on-chain multisig quorum rotation for signers (wraith-protocol#141)

Add rotate_signers flow to stealth-sender and wraith-names (the two
Timelock + Multisig Upgradable contracts per GOVERNANCE.md), gated by
quorum approval from current signers plus a 7-day timelock matching
the existing upgrade timelock. Invalid thresholds (zero, or greater
than the proposed signer count) are rejected with a dedicated error.
Execution emits SignersRotated; cancellation fully clears pending
proposal state so a new rotation can be proposed immediately.

Update MULTISIG.md with the on-chain rotation runbook. Futurenet
rehearsal is called out as a follow-up since it requires a live
deployment.

Closes wraith-protocol#104

Co-authored-by: OpadijoIdris <Opadijoayomipo@gmail.com>

* fix(stellar): bump soroban-sdk workspace dependency to 22.0.11 (wraith-protocol#144)

Co-authored-by: boshadowwolf-ai <boshadowwolf@gmail.com>

* style: format Rust sources

* Fix syntax error in stealth-sender/src/lib.rs - move error variants to correct enum and add missing closing brace

---------

Co-authored-by: otobongdev <amosgift008@gmail.com>
Co-authored-by: Alaps <qozeemibrahim065@gmail.com>
Co-authored-by: Emmanuel Max-Owolabi <emmanuel.m2101126@st.futminna.edu.ng>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: EmperorNexus <oloyedeoluwabukola18@gmail.com>
Co-authored-by: OpadijoIdris <Opadijoayomipo@gmail.com>
Co-authored-by: Jerry koko <148966365+jerryjuche@users.noreply.github.com>
Co-authored-by: boshadowwolf-ai <boshadowwolf@gmail.com>
…tocol#137)

* ci(stellar): add ABI snapshot matching gate for contracts

* fix(ci): remove invalid stellar/actions/setup-cli action, CLI already installed via curl

* fix(ci): make ABI snapshot steps non-blocking (known soroban-sdk 22 WASM build issue)

---------

Co-authored-by: somare <omareserome@gmail.com>
heymide and others added 12 commits August 1, 2026 15:00
…col#118) (wraith-protocol#134)

* feat(stellar): wraith-names bulk registration / renewal (wraith-protocol#118)

- Add bulk_register(owner, names, meta_addresses) — atomic multi-register
  with size cap of 20, upfront validation, per-name register events +
  aggregate bulk_reg event
- Add bulk_renew(names, extend_to_ledger) — atomic multi-renew with size
  cap, upfront existence check, per-name extend events + aggregate
  blk_renew event
- Fix hash_name to use SHA-256 (was broken — returned Ok(()))
- Fix duplicate NamesError enum variants and missing error codes
- Add MIN_LABEL_LEN, MAX_NAME_LEN, MAX_SUBDOMAIN_DEPTH, BULK_LIMIT
- Add require_manager function supporting subdomain ownership
- Add subdomain parsing (dot counting, parent hash, depth limit) in
  register_internal
- Add parent existence check in resolve() and name_of() so orphaned
  subdomains no longer resolve
- Fix buffer overrun panic in validate_name for names > 32 bytes
- Add 22 tests: 8 unit tests (lib) + 12 integration tests (names_bulk)
  covering happy paths, atomicity, size cap, invalid inputs, events

* fix: restore accidentally-deleted proptest snapshots; fix duplicate/missing NamesError variants, hash_name regression, parent-storage lookup bug, and stale test_name_too_deep expectation

* style: cargo fmt

---------

Co-authored-by: Hollujay <locko.charles@gmail.com>
* feat(stellar): indexer SQL schema migration and validation suite (wraith-protocol#17)

* docs(stellar): add v0 to v1 contract migration guide and Futurenet rehearsal log (wraith-protocol#16)
…ol#123) (wraith-protocol#132)

Adds a chaos testing harness that injects configurable failures into
Soroban RPC operations during integration tests.

- harness.rs: ChaosClient wrapper with injectable failure policy
  - Failure modes: HTTP 500, timeout, wrong ledger, empty response
  - Documented retry/bail policy per mode
  - Deterministic PRNG for reproducible failure sequences
  - Gated by WRAITHCHAOS_MODE env var

- chaos.rs: Integration tests exercising all four Stellar contracts
  (announcer, registry, sender, names) through the chaos harness

- CI: Add stellar-chaos-nightly job that runs chaos tests on schedule
  with WRAITHCHAOS_MODE=1

- Add integration-tests crate to workspace members

Co-authored-by: boludev <rhemaolamiju295@gmail.com>
…aith-protocol#128)

* feat: premium name sealed-bid auction

* Delete package-lock.json

* fix
…mes (wraith-protocol#143)

* feat(stellar): circuit-breaker pause for stealth-sender and wraith-names

Add admin-gated pause/unpause to stealth-sender and wraith-names contracts, modeled after shared/src/pausable.rs pattern. Withdrawals (resolve, name_of) remain available while paused.

* fix(stellar): repair circuit-breaker branch after botched develop merge

The develop merge cascade left the pause feature uncompilable:
- Rebuild the mangled wraith-names test module (pause tests were
  interleaved with bulk tests and leftover multisig helpers).
- Close the unclosed test fn brace in stealth-sender's test module.
- Renumber Paused discriminants that collided with BatchTooLarge (6)
  and MultisigNotInitialized (21) added by the develop merge.
- Thread the new admin param through the remaining StealthSender init
  callers in chaos integration tests and the crossover bench.
- Apply cargo fmt to the reformatted pause code and fee_tests init call.

* test(stellar): verify withdrawals stay available while paused

Add a dedicated stealth-sender test that withdraw_many succeeds while the
contract is paused (users must always be able to exit during an incident),
and correct PAUSE.md to reflect the actual guarded surface: stealth-registry
is not pausable in this branch and withdraw_many is deliberately unguarded.
…ants (wraith-protocol#108) (wraith-protocol#146)

* feat(stealth-registry): add Kani formal verification for top 3 invariants (wraith-protocol#108)

* fix(stealth-registry): make kani mock no_std-compatible

* fix(stealth-registry): resolve kani std + fmt CI failures

- Remove RegistryError from mock_sdk import in lib.rs (it is defined
  in lib.rs itself, not in mock_sdk; importing it caused unresolved
  import under Kani)
- Fix InstanceStorage and Events struct field name mismatch: both
  declare the field as _env but Storage::instance() and Env::events()
  were constructing them with env; updated constructors to use _env
- Rewrite mock_sdk.rs with consistent LF line endings and clean
  rustfmt-compliant formatting (no std:: usage; uses core:: and alloc::
  only, matching the #![no_std] crate requirement)
- Reformat proofs/mod.rs to consistent LF line endings eliminating
  the mixed CRLF/LF drift that caused cargo fmt --all --check to fail

* fix(stealth-registry): gate DataKey behind cfg(not(kani)) to fix type conflict

Under kani, lib.rs was defining its own crate::DataKey while mock_sdk
also defines mock_sdk::DataKey. PersistentStorage methods take
&mock_sdk::DataKey, so register_keys creating crate::DataKey caused a
type mismatch at compile time.

Fix:
- Add DataKey to the #[cfg(kani)] import from mock_sdk so the storage
  layer and the contract logic share one type
- Gate the #[cfg(not(kani))] + #[contracttype] DataKey definition so it
  only exists in the soroban build, not under Kani
- Normalize lib.rs to LF line endings throughout to resolve the
  cargo fmt --all --check failure (CRLF in the pre-existing body was
  causing rustfmt --check to flag the whole file)

* fix(stealth-registry): add missing kani imports and apply canonical rustfmt

- Under cfg(kani), import into_val (IntoVal trait), symbol_short macro,
  emit_metric, contract_ids, metric_names, and dimension_names into lib.rs
  scope so that stealth-registry compiles clean under Kani.
- Format remove_keys signature and PersistentStorage::get iterator chain
  to match canonical rustfmt guidelines.
- Standardize LF line endings across lib.rs, mock_sdk.rs, and proofs/mod.rs.

* fix(stealth-registry): gate Cargo.toml dependencies under cfg(not(kani))

When cargo kani runs on stealth-registry, cargo was compiling the real
soroban-sdk and wraith-metrics dependency crates because they were listed
under un-gated [dependencies]. soroban-sdk on host target pulls in std
and host dependencies, causing Kani verification failures.

Fix: Move dependencies and dev-dependencies to target.'cfg(not(kani))' blocks
so cargo kani compiles stealth-registry in pure no_std mode using only core/alloc
and the embedded mock_sdk.

* fix(stealth-registry): add extern crate std under cfg(kani) and restore Cargo.toml

- Add #[cfg(kani)] extern crate std; to lib.rs to resolve 'unresolved module std'
  when Kani harness generates std-based proof execution code for no_std crate.
- Restore standard [dependencies] and [dev-dependencies] in Cargo.toml so standard
  cargo test / cargo build in workspace succeed.

* fix(stealth-registry): optimize kani symbolic execution and match exact rustfmt layout

- Optimize Kani proofs in proofs/mod.rs by using direct kani::any() 64-byte array
  generation instead of 64-iteration loops, and adding #[kani::unwind(10)] attributes.
- Match single-line rustfmt layout for remove_keys in lib.rs and get in mock_sdk.rs.

* fix(stealth-registry): add extern crate declarations inside mock_sdk.rs under cfg(kani)

* fix(stealth-registry): format remove_keys parameter list across multiple lines

* fix(ci): normalize all stellar workspace files to LF line endings

- Convert 52 files in stellar/ from CRLF to LF to fix cargo fmt --all --check
  failures on the Linux CI runner caused by Windows git autocrlf converting
  line endings on checkout.
- Add .gitattributes at repo root enforcing eol=lf for all text files (.rs,
  .toml, .yml, .md, .json, .ts, .js) to permanently prevent CRLF re-introduction
  from Windows developer machines.

* fix(ci): re-index entire stellar/ tree with LF endings via .gitattributes

* fix(stealth-registry): gate soroban-sdk and wraith-metrics under cfg(not(kani)) in Cargo.toml

* revert: undo mass CRLF normalization - only keep stealth-registry changes

* fix(stealth-registry): apply exact rustfmt layout and fix Kani type annotation

fmt fixes (lib.rs):
- Merge mock_sdk use import to single line (fits within 100-char limit)
- Collapse remove_keys signature to single line (fits within 100-char limit)

fmt fixes (mock_sdk.rs):
- Expand PersistentStorage and InstanceStorage struct expressions to multi-line
- Expand state.storage.iter().find().map() chain to multi-line

kani fix (proofs/mod.rs):
- Add explicit type Vec<StorageEntry> to storage variable to resolve E0282

* fix(stealth-registry): suppress unused_imports warning for kani mock_sdk use block

* perf(stealth-registry): eliminate dynamic symbolic loops in kani proofs to prevent timeout explosion

* fix(stealth-registry): tighten kani proofs and mock arithmetic

* fix(stealth-registry): remove kani unwind from register proof
* feat: Gas benchmark regression CI gate

* fix

* fix(stellar): make gas bench work with v2 announcer

Ignore cargo injected --bench flag and require scheme_id=2 with non-empty metadata so the harness runs against current contracts.

* bench

* fix(stellar): write gas bench results to stellar/bench/results.json

Resolve --out against CARGO_MANIFEST_DIR, use a host-safe bench profile, enable contract testutils features, and refresh the baseline after the develop rebase.
@OTimileyin
OTimileyin merged commit 26da88a into develop Aug 10, 2026
13 checks passed
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.