DEV Community

Merissa Stemler
Merissa Stemler

Posted on

For Monthly Cross-Chain Payouts, Reconcile Both Chains

For monthly cross-chain payouts, match each source-chain debit to a confirmed destination-chain credit before marking it complete. A submitted transaction or a balance change on one chain alone does not show that the recipient received the expected amount.

What counts as a completed transfer?

A transfer is complete for treasury purposes when the source action is recognized by the bridge mechanism, the destination action has succeeded, and the recipient’s available balance reflects the net amount due. Those are separate events, often recorded in separate transactions, so one transaction hash cannot prove the whole path.

Record the source transaction hash, destination transaction hash, and any bridge message ID as different identifiers. The message ID, when available, ties the cross-chain instruction together; the two hashes identify the transactions on their respective chains. Ethereum’s JSON-RPC documentation describes how a transaction receipt includes its status and generated logs, which can confirm what happened in that transaction.

A successful source receipt may show that tokens were locked, burned, or sent to a contract, depending on the mechanism. It does not prove that the destination transaction has executed. When a payment is still waiting for source-chain confirmation, how a relay bridge carries a transfer explains why a debit alone does not prove delivery; for reconciliation, keep the transfer open until you can verify the destination result.

Which records should your team match?

Match transfers on a set of fields, not on amount alone. At minimum, capture the sending and receiving chain, token contract or asset identifier, sender, recipient, source amount, destination amount, fee, both transaction hashes, message ID if present, and timestamps. A spreadsheet can work for a small batch, but use one row per transfer and retain the underlying receipts or exports.

Amounts need normalization before comparison. Chains store token quantities in base units, while treasury systems usually show decimal amounts; compare the displayed values only after applying the correct token decimals on each chain. Also distinguish the gross amount sent from the net amount received, since a fee, exchange, or rounding rule can make them differ.

For example, a business sends 12,000 units to fund a payout wallet and the recipient receives 11,988 after a 12-unit fee. Reconcile the source debit of 12,000 to the destination credit of 11,988 and the documented fee of 12; do not treat the 12-unit difference as a missing payment. If the expected fee is not visible in the records, leave the row unresolved until the fee rule or destination event explains it.

How do you handle pending, failed, or mismatched transfers?

Use explicit statuses so a batch report distinguishes “submitted,” “source confirmed,” “destination pending,” “complete,” and “exception.” A source transaction can succeed while a later destination step remains delayed or fails, and a wallet interface may show only one side of that sequence. Set the completion threshold in advance, including how many confirmations or what finality signal your policy requires on each chain.

On Ethereum, transaction documentation describes blocks progressing from inclusion toward finality; a receipt with success status is useful evidence of execution, while finality provides stronger assurance that the block will not be changed. Other chains use different confirmation and finality rules, so apply the relevant chain’s rule instead of copying an Ethereum wait time. The transfer mechanism’s own status can help locate a message, but verify the destination transaction and recipient balance independently.

Raise an exception when the destination transaction failed, the recipient differs from the approved address, the asset is unexpected, or the net amount falls outside the agreed fee and rounding tolerance. A delayed destination is not automatically a loss, and a failed destination step does not mean the funds are safe to resend; first determine whether the mechanism supports retry, refund, or recovery. Keep the original row open and record the resolution against its identifiers.

A repeatable close process

For recurring treasury transfers, use the same checks for every batch and separate reconciliation from approval to pay. The following sequence creates an auditable record without relying on a single explorer screen or dashboard:

  1. Export the approved payout file with recipient addresses, assets, intended amounts, and an internal payment reference.
  2. After submission, save the source transaction hash, chain, timestamp, and receipt status against each payment reference.
  3. Wait for the source chain’s required confirmation threshold, then record the bridge message ID or equivalent tracking reference.
  4. Check for the destination transaction and verify its status, recipient, asset, and net amount against the approved payout.
  5. Record fees separately, mark only verified credits complete, and send pending or mismatched rows to an exception queue for follow-up.

A relay bridge can add a useful mechanism for recurring transfers, but the accounting control is the match between the two chain records and the approved instruction. The practical decision rule is simple: book a payout as complete only when its destination credit, recipient, and net amount match the approved payment after documented fees.

Top comments (0)