Skip to content

feat(escrow): paginate per-party escrow indexes - #1766

Merged
mikewheeleer merged 2 commits into
Talenttrust:mainfrom
OkeA-dev:feat/party-escrow-index
Oct 25, 2026
Merged

mikewheeleer merged 2 commits into
Talenttrust:mainfrom
OkeA-dev:feat/party-escrow-index

Conversation

@OkeA-dev

@OkeA-dev OkeA-dev commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Implements issue #1708: index escrows by client/freelancer with bounded pages (max 50 per page) and expose paginated read/count APIs.

Closes #1708

Summary

  • On create_contract, append escrow id to DataKey::ClientEscrows / DataKey::FreelancerEscrows indexes.
  • Store indexes as pages of max 50 ids (DataKey::ClientPage(Address, u32) / DataKey::FreelancerPage(Address, u32)) plus count keys.
  • Add count_client_escrows / count_freelancer_escrows and get_client_escrows / get_freelancer_escrows (limit clamped to 50; limit == 0 → empty; start >= count → empty; creation order).
  • TTL bumped on index writes.
  • Indexes maintained from upgrade onward; escrows created before this upgrade are not backfilled.

Extra write cost of create_contract

  • Adds 2 persistent appends per create_contract: 1 client index page + count update, 1 freelancer index page + count update (each page write persists up to 50 ids; writes extend TTL). Compared to pre-upgrade, create_contract now does 4 extra persistent writes/TTL extensions in the steady state (page + count for client, page + count for freelancer).

WASM size

  • Before (origin/main c970981): 38,481 bytes
  • After (this PR): 42,629 bytes
  • Delta: +4,148 bytes (+10.8%) — under 128 KB

Full cargo test output

    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.36s
     Running unittests src/lib.rs (target/debug/deps/escrow-a002c7a24891b423)

running 16 tests
test test::initialize_only_once ... ok
test test::non_admin_cannot_void_rating ... ok
test test::full_happy_path ... ok
test test::cancel_unfunded_escrow_does_not_count_cancellation ... ok
test test::pause_blocks_mutations ... ok
test test::dispute_split_and_cancel ... ok
test test::ratings_issued_before_upgrade_return_rating_not_found ... ok
test test::dispute_outcomes_freelancer_client_and_exact_threshold ... ok
test test::rate_then_void_restores_reputation_and_prevents_rerating ... ok
test test::rejects_overfunding_and_double_release ... ok
test test::void_unrated_escrow_fails_with_rating_not_found ... ok
test test::rate_resolved_escrow_succeeds_once_and_cancelled_rejected ... ok
test test::void_one_of_three_ratings_preserves_others ... ok
test test::party_index_reads_clamp_and_bound_the_page ... ok
test test::party_index_pages_never_exceed_page_size ... ok
test test::party_indices_paginate_in_creation_order ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.49s

Tests

  • party_indices_paginate_in_creation_order: 120 escrows for one client across two freelancers → pages 50, 50, 20, counts correct per party, order preserved.
  • party_index_reads_clamp_and_bound_the_page: limit 0 → empty, limit 500 → clamped to 50, start >= count and start == u32::MAX → empty; cross-page read verified.
  • party_index_pages_never_exceed_page_size: asserts no single index page holds > 50 ids.

Docs

  • README.md updated: contract-interface table includes new functions, notes limit clamped to 50, and documents no-backfill.

Notes

  • No existing tests deleted or weakened; only README updated.
  • cargo clippy --all-targets -- -D warnings clean.

@OkeA-dev OkeA-dev changed the title feat(escrow): paginate per-party escrow indexes (issue #1708) feat(escrow): paginate per-party escrow indexes Oct 24, 2026
@mikewheeleer

Copy link
Copy Markdown
Contributor

hey @OkeA-dev 👋 this PR scans clean and CI is green, but it now has merge conflicts with main — please rebase on the latest main and push, and we'll merge it 🙌

# Conflicts:
#	README.md
#	contracts/escrow/src/lib.rs
#	contracts/escrow/src/test.rs
@mikewheeleer
mikewheeleer merged commit bc97442 into Talenttrust:main Oct 25, 2026
2 checks passed
@mikewheeleer

Copy link
Copy Markdown
Contributor

looks good — appreciate the work 🙏

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.

Index escrows by client and freelancer with paginated read APIs

2 participants