@eco-incorp/sauce/verify validates an EVM settlement payload against the pinned settle program (SETTLE_WIRE: compiler 2.3.0, 356 bytes) and decodes its runtime argument tail. It depends on viem only, so it runs in browsers and edge runtimes without loading the compiler.
This page covers sdk/dist/verify/vectors.d.ts.
Generated from the type declarations shipped in
@eco-incorp/sauce 0.99.4. Each entry shows the package authors’ JSDoc and declaration for this SDK version. For runtime compatibility and deployed addresses, see architecture and deployments.SETTLE_PROGRAM
Variable · sdk/dist/verify/vectors.d.ts
The compiled recipes/settle.sauce.ts program - 356 bytes, measured by compiling it with the
published Rust compiler (@eco-incorp/sauce-compiler) against the package’s own
artifacts/IERC20.json.
ONE constant covers the whole corpus because the program is INVARIANT: main takes
(tokens, minOut, recipient) as runtime entry arguments, so no caller value reaches the
compiler. That is the property the appended-args model rests on, and verify.compile.test.ts recompiles
this and compares - a LIVE pin, unlike the v1 corpus it replaces, whose compiler no longer exists.
SETTLE_VECTORS
Variable · sdk/dist/verify/vectors.d.ts
Golden wire-format vectors - the Go/Solidity/Python conformance corpus, and the definition of the
layout for anyone reimplementing the decoder.
Each args tail is proven by EXECUTION, not by construction: verify-execution.e2e.test.ts runs
settlePayload(v.args) on a real v12 runtime against real ERC20s and asserts the engine sweeps
exactly v.tokens to v.recipient under v.minOut. The bytes below are what the engine reads,
not what this package’s encoder happens to emit.
v3 carries Z = 0x0000000000000000000000000000000000ff00aa - the address the retired v1 corpus
used as its trap, because a minimal-length PUSH squeezed it into 3 bytes and a fixed 20-byte read
misframed everything after it. On THIS wire it is an ordinary 32-byte word: the layout is
fixed-width, so leading zero bytes cost nothing and mean nothing. The hazard moved, and
SETTLE_REJECTIONS is where it went.
SETTLE_REJECTIONS
Variable · sdk/dist/verify/vectors.d.ts
Payloads a conformant decoder MUST refuse - the successor to the v1 corpus’s v3 trap.
The engineAccepts rows are the trap proper, and they are the reason this corpus exists at all: the
engine RUNS them and produces exactly the behavior of the canonical payload beside them, so they
are distinct byte strings with identical meaning. A decoder that accepts any of them is not
injective, and encodeSettleProgram re-encode-and-compare stops agreeing with decode-and-compare.
upperBytes is the sharpest: the engine masks a call target to 160 bits, so twelve arbitrary
bytes ride along in a token word and sweep the very same token.
Each vector’s code is reachable under ANY check order, so a Go or Solidity reimplementation is not
required to match this decoder’s sequence to pass. tokensPointer is the one that has to be built
for that: its padding word is 0x02 so that the count read at the canonical offset agrees with the
tail length, leaving the non-canonical pointer as the only complaint. A length-first decoder and a
pointer-first decoder both report TOKENS_OFFSET. (The engine reads its array from offset 128, so
that word is not in its read path — engineAccepts is unaffected by its value.)
settlePayload
Function · sdk/dist/verify/vectors.d.ts
The full on-the-wire payload for a vector’s tail: program || args.
Exported from ./verify, so it takes a caller’s hex rather than only this file’s literals: an
unprefixed tail would otherwise lose its first byte to the slice and resurface as a puzzling
ARGS_TRUNCATED, and a 0X prefix - which the decoder itself tolerates - would produce garbage.
Requires the canonical 0x, consistent with encodeSettleProgram’s inputs.
ConformanceVector
Interface · sdk/dist/verify/vectors.d.ts
RejectionVector
Interface · sdk/dist/verify/vectors.d.ts
