XCMAudit
Fixed-scope reviews for Polkadot integrations · woods.d.tyler@gmail.com

The transfer succeeds. The numbers are wrong.

Fixed-scope audits for teams shipping cross-chain transfers on Polkadot. Every finding arrives with the failing test that proves it, or it is labelled a hypothesis and not billed.

Where integrations break

A transfer crosses three systems before it is signed. Each one has a failure mode that returns no error.

  1. Origin wallet or dApp

    Fee asset resolution. An explicit choice is replaced by the account default on Hydration, and the quote silently switches asset.

  2. Exchange routing and quotes

    Client lifecycle. Cloned APIs lease pooled connections that are never released; an auto-selected swap can leak more than twenty leases per call.

  3. Destination signed XCM

    Calldata construction. On chains without DryRunApi, the final message can carry a placeholder fee amount of one whole token.

What a finding looks like

Across four public Polkadot wallets and transfer apps, the same checks found amounts truncated through a JS number, a destination-ED check comparing two different assets, and an agent swap tool that submitted only the first transaction of a two-leg route.

Fee asset precedence

High · reproduced

Two SDK implementations query MultiTransactionPayment.AccountCurrencyMap on Hydration and return the account's asset even when the caller passed a feeAsset. The third implementation guards against this; the other two were missed when the first was fixed.

Impact: the fee is quoted in, and returned as, an asset the caller did not choose. Three SDKs, two different answers for identical options. The fix is two lines; the regression test passes on one implementation and fails on the other two.

Client lifecycle

High · reproduced

Sixteen call sites clone an API and never disconnect: seven sdk-core transfer helpers, three API-layer fee fallbacks, and six swap sites. Only disconnect() decrements the pool's reference count, so single-use clients are treated as permanently in use.

Impact: connection churn, wasted keep-alive pings, and corrupted refcounts under sustained traffic. An auto-selected swap probes nine exchanges and leaks at least one client per candidate in a single call.

Signed placeholders

Medium · call-path proof

When the origin has no DryRunApi, fee computation returns null and the final type-and-then call is built as if it were a throwaway estimation pass: one whole fee token, half of it bought as execution, and an AllCounted filter.

Impact: on the two chains that report no DryRunApi support and do expose transfer_assets_using_type_and_then (Peaq and Heima, checked against the live runtimes), a custom asset with a relay or external location reaches this path. The signed call then carries a one-token fee amount and an AllCounted filter, so the account needs that headroom before the call is submitted. Whether the leftover fee asset is refunded or deposited is not established. The code comment calls it a dummy call that is "later dryRunned"; on this path it is signed.

Questions

How is this different from the public bug bounty?

The bounty covers defects in the SDK itself. This audit covers how your integration uses it: your call paths, your assets, your failure handling. The report is yours, and nothing is disclosed publicly without your written agreement.

What do you need from me?

The repository and commit, the transfer paths and assets you care about, and whether you want the audit only or the audit with fixes. No credentials, no signing keys, no funds.

What if you find nothing?

The first verified finding is free. If the paid review finds nothing, the report still lists the paths checked, the checklist pass, and what could not be verified. Hypotheses are excluded from the finding count.

How long does it take?

48 hours for the review tier, five business days for the integration audit, and ten business days for audit and fixes, counted after the scope is confirmed. The integration audit and audit plus fixes include a walkthrough.

Is it confidential?

Yes. Findings are private to you, and public disclosure or a bounty submission is your decision. Analysis uses AI assistance and is reviewed by a human before delivery.

What is not promised?

No clean bill of health, no guarantee that the integration is bug-free afterwards, and no on-chain signing or custody. Every finding needs a failing test or a traced call path.

Scope and price

Integration audit

$350 fixed

  • Up to 5 findings
  • File, line, mechanism, user impact
  • Reproduction or call-path proof for each
  • 30-minute walkthrough
  • Delivered in 5 business days

48-hour review

$250 fixed

  • One integration path
  • 2 findings maximum
  • File, line, mechanism, user impact
  • Reproduction or call-path proof
  • Delivered in 48 hours

Audit and fixes

$750 fixed

  • 10 findings, or 5 plus fixes
  • Patches with regression tests for the top 3
  • Re-check against your test suite
  • Walkthrough and written summary
  • Delivered in 10 business days

The method is public. Read the teardown of a live wallet integration bug at swush#73, then decide whether your integration has the same shape. Extra finding $60 · patch with test $120 · monthly re-audit of changed paths $400. Payment in USDC or by invoice. No retainers before the first audit.

How the work is done

Read this before buying anything.

Analysis is performed with AI assistance and reviewed by a human before delivery. Every finding is traced through the real call path and, where possible, reproduced with a minimal test.

Every review starts with a live capability check of the chains in scope. The result for 45 chains is public: the capability matrix.

Findings that cannot be reproduced are labelled hypotheses and are not counted against the tier. There is no promise that an integration is bug-free afterwards, and no on-chain signing or custody of funds is involved.

The checklist behind the audit is built from 117 public bounty reports read as of 25 October 2026 against a production XCM SDK, with the report numbers cited throughout. It is not generic advice.

Start with one finding, free

Send the repository and the transfer path you care about. You get one verified finding before any payment.

Not ready for a review? The 10-section, 40-check pre-flight checklist is $49 on Gumroad.

Request the free finding