Skip to content

feat: merkle batch payment external signer support#12

Merged
mickvandijke merged 3 commits intomainfrom
feat-merkle-external-signer
Apr 3, 2026
Merged

feat: merkle batch payment external signer support#12
mickvandijke merged 3 commits intomainfrom
feat-merkle-external-signer

Conversation

@Nic-dorman
Copy link
Copy Markdown
Contributor

Summary

Extends the external signer support (PR #10) to cover merkle batch payments — the gas-efficient path for uploads with 64+ chunks.

The problem: pay_for_merkle_batch requires a Wallet on the Rust side. Desktop apps using WalletConnect can't call wallet.pay_for_merkle_tree() directly.

The solution: Same prepare/finalize pattern as the wave-batch PR:

  1. client.prepare_merkle_batch_external(addresses, data_type, data_size) — builds tree, collects candidate pools → returns PreparedMerkleBatch with depth, pool_commitments, timestamp
  2. Frontend calls pay_for_merkle_tree(depth, pool_commitments, timestamp) via WalletConnect → gets back winner_pool_hash
  3. finalize_merkle_batch(prepared, winner_pool_hash) — finds winner pool, generates per-chunk proofs

Changes

  • PreparedMerkleBatch: New struct with public payment params + private tree/pool data
  • prepare_merkle_batch_external(): Phase 1 — no wallet needed
  • finalize_merkle_batch(): Phase 2 — no wallet needed
  • ExternalPaymentInfo enum: WaveBatch(PaymentIntent) | Merkle(PreparedMerkleBatch)file_prepare_upload auto-selects based on chunk count
  • finalize_upload_merkle(): Handles merkle variant
  • Refactored pay_for_merkle_single_batch: Now uses prepare + finalize internally

No breaking changes

Existing wallet-based flows (file_upload_with_mode, pay_for_merkle_batch) work identically — pay_for_merkle_single_batch was refactored to use the new functions internally.

Tests

  • 3 new unit tests for finalize_merkle_batch (valid winner, invalid winner, proof deserialization)
  • All 108 tests pass (105 existing + 3 new)
  • Clippy clean, fmt clean

Test plan

  • cargo check --all passes
  • cargo clippy -p ant-core -- -D warnings clean
  • cargo fmt --all -- --check clean
  • cargo test -p ant-core --lib — 108 tests pass
  • E2E: prepare_merkle_batch_external → external payment → finalize_merkle_batch on devnet

Usage from ant-gui

let prepared = client.file_prepare_upload(&path).await?;

match prepared.payment_info {
    ExternalPaymentInfo::WaveBatch(intent) => {
        // Frontend calls payForQuotes() with intent.payments
    }
    ExternalPaymentInfo::Merkle(ref merkle) => {
        // Frontend calls pay_for_merkle_tree(depth, pool_commitments, timestamp)
        // Returns winner_pool_hash
    }
}

🤖 Generated with Claude Code

@mickvandijke mickvandijke force-pushed the feat-merkle-external-signer branch from 732ec17 to facfca7 Compare April 3, 2026 12:08
The `make_dummy_candidate_nodes` helper used a removed `quoting_metrics`
field and the wrong crate prefix `ant_evm`. Updated to use the current
`price` field and correct `evmlib` imports.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@mickvandijke mickvandijke merged commit 1d9348d into main Apr 3, 2026
11 of 12 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.

2 participants