Stable Reconcile

Stablecoin invoice reconciliation: worked examples

Stable Reconcile compares your declared invoices with recorded stablecoin transfers. It separates partial payments, pending transfers and wrong-network records, with exact decimal totals. Use it for a local exception review before updating your books.

Three fictional scenarios, calculated by the same engine as the tool. They illustrate behavior and failure cases, not customer outcomes or measured provider performance.

Split & partial payments

One invoice matches; another is short by 20.

Invoices
2
Matched
1
Transfer exceptions
1
Invoice exceptions
InvoiceNetwork / assetDueRecorded paidPendingDifferenceStatus
INV-01eip155:8453 / demo-usdc-contract125.50125.500Matched
INV-02eip155:8453 / demo-usdc-contract80600-20Underpaid

Run this scenario Input JSON Calculated report

Inspect every input
{
  "invoices": [
    {
      "id": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "125.50"
    },
    {
      "id": "INV-02",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "80"
    }
  ],
  "transfers": [
    {
      "id": "demo-log-1",
      "invoice": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "100",
      "state": "finalized"
    },
    {
      "id": "demo-log-2",
      "invoice": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "25.50",
      "state": "finalized"
    },
    {
      "id": "demo-log-3",
      "invoice": "INV-02",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "60",
      "state": "finalized"
    },
    {
      "id": "demo-log-4",
      "invoice": "INV-02",
      "network": "eip155:1",
      "asset": "demo-usdc-contract",
      "amount": "20",
      "state": "finalized"
    }
  ]
}

A transfer is still pending

See why a pending transfer does not settle the invoice.

Invoices
2
Matched
0
Transfer exceptions
1
Invoice exceptions
InvoiceNetwork / assetDueRecorded paidPendingDifferenceStatus
INV-01eip155:8453 / demo-usdc-contract125.5010025.5-25.5Underpaid
INV-02eip155:8453 / demo-usdc-contract80600-20Underpaid

Run this scenario Input JSON Calculated report

Inspect every input
{
  "invoices": [
    {
      "id": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "125.50"
    },
    {
      "id": "INV-02",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "80"
    }
  ],
  "transfers": [
    {
      "id": "demo-log-1",
      "invoice": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "100",
      "state": "finalized"
    },
    {
      "id": "demo-log-2",
      "invoice": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "25.50",
      "state": "pending"
    },
    {
      "id": "demo-log-3",
      "invoice": "INV-02",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "60",
      "state": "finalized"
    },
    {
      "id": "demo-log-4",
      "invoice": "INV-02",
      "network": "eip155:1",
      "asset": "demo-usdc-contract",
      "amount": "20",
      "state": "finalized"
    }
  ]
}

Customer paid twice

Review an overpayment while keeping the duplicate event IDs distinct.

Invoices
2
Matched
0
Transfer exceptions
1
Invoice exceptions
InvoiceNetwork / assetDueRecorded paidPendingDifferenceStatus
INV-01eip155:8453 / demo-usdc-contract125.50135.5010Overpaid
INV-02eip155:8453 / demo-usdc-contract80600-20Underpaid

Run this scenario Input JSON Calculated report

Inspect every input
{
  "invoices": [
    {
      "id": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "125.50"
    },
    {
      "id": "INV-02",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "80"
    }
  ],
  "transfers": [
    {
      "id": "demo-log-1",
      "invoice": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "100",
      "state": "finalized"
    },
    {
      "id": "demo-log-2",
      "invoice": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "25.50",
      "state": "finalized"
    },
    {
      "id": "demo-log-3",
      "invoice": "INV-02",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "60",
      "state": "finalized"
    },
    {
      "id": "demo-log-4",
      "invoice": "INV-02",
      "network": "eip155:1",
      "asset": "demo-usdc-contract",
      "amount": "20",
      "state": "finalized"
    },
    {
      "id": "demo-extra-payment",
      "invoice": "INV-01",
      "network": "eip155:8453",
      "asset": "demo-usdc-contract",
      "amount": "10",
      "state": "finalized"
    }
  ]
}

A mistake worth catching

Counting a pending transfer as paid hides settlement risk. Keep pending amounts separate and verify finality with your original source.

Use the method with your records

Match the declared invoice ID, network and asset exactly. Sum finalized amounts with fixed-point integers. Pending and reverted records never settle an invoice.

No wallet sync, automatic matching, FX, refund processing, tax accounting or independent finality checks.

Read the complete method, sources and input contract. Updated 2026-09-19; by the AGI Scorecard team.

Continue your review

Call LensDecode three common token-call shapes offline and compare the recipient, spender and amount with your own expectations.Incentive LabModel capped rewards for accepted work and see whether customer revenue covers operating costs before token support.