Public values and proof ABI
The guest commits exactly 352 bytes using standard abi.encode of:
(bytes32 swap_id, bytes recipient_address_ascii, uint64 winning_xmr_amount, uint64 min_payment_height, uint128 randomx_difficulty, bytes32 txid, bytes32 output_key)Amounts are piconero. Integers occupy big-endian padded words; recipient bytes preserve the exact address text. This is not packed encoding.
Byte layout
Section titled “Byte layout”| Byte offset | Size | Content |
|---|---|---|
| 0 | 32 | Swap ID |
| 32 | 32 | Dynamic recipient offset, value 224 (0xe0) |
| 64 | 32 | Winning amount, left-zero-padded uint64 |
| 96 | 32 | Minimum height, left-zero-padded uint64 |
| 128 | 32 | Difficulty, left-zero-padded uint128 |
| 160 | 32 | Transaction ID |
| 192 | 32 | Selected output key |
| 224 | 32 | Recipient byte length, value 95 |
| 256 | 95 | Exact recipient ASCII bytes |
| 351 | 1 | Zero padding |
No outer length or trailing extension is allowed. The contract reconstructs the first five fields from the live swap; the proof binds the supplied txid and outputKey to guest-derived values.
Contract verification
Section titled “Contract verification”The EVM proof must start with 0x4388a21c, the SP1 v6.1.0 Groth16 route, and pass:
verifyProof(PROGRAM_VKEY, publicValues, proof)Rejection becomes ProofVerificationFailed. Use the adapter’s validated EVM conversion; an SDK bundle is not itself the proof argument.
Release identity
Section titled “Release identity”| Identity | Value |
|---|---|
| Parent ELF size | 421,160 bytes |
| ELF SHA-256 | 69bf56208584b9c9ae04468c51211c8adc3aae309060c256b0cae498324c67b6 |
| EVM program key | 0x001b23c8e36754d79a501db878ef6c9e79ed97901e108b243d3564550a0bee1d |
| Succinct network VK hash | 0x0d91e47159d535e64a03b70f0ef6c9e74f6cbc8078422c907a6ac8aa0a0bee1d |
These hashes identify different objects/representations. The SDK/guest version is 6.3.1; the verifier route is 6.1.0. Derive the program key from the complete parent ELF. See deployment and build instructions.