diff --git a/runtime/tests/runtime-signing.test.mjs b/runtime/tests/runtime-signing.test.mjs index c04ba61..148c31a 100644 --- a/runtime/tests/runtime-signing.test.mjs +++ b/runtime/tests/runtime-signing.test.mjs @@ -54,6 +54,8 @@ function unwrapReceiptResponse(payload) { return { receipt: payload?.receipt || payload, runtimeMetadata: payload?.runtime_metadata || null }; } + + async function stop(proc) { if (proc.exitCode !== null) return; proc.kill("SIGTERM"); @@ -170,3 +172,32 @@ test("/verify?ens=1 passes with mocked ENS TXT response", async () => { await stop(srv.proc); } }); + + +test("fabricated x402 defaults use v1.1.0", async () => { + const keys = makeKeys(); + const srv = await startServer({ + API_VERSION: "1.1.0", + RECEIPT_SIGNING_PRIVATE_KEY_PEM_B64: keys.privatePemB64, + RECEIPT_SIGNING_PUBLIC_KEY_B64: keys.publicRaw32B64, + RECEIPT_SIGNER_ID: "runtime.commandlayer.eth", + }); + + try { + const receiptResp = await fetch(`${srv.base}/describe/v1.1.0`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ input: { subject: "t", detail_level: "short" }, trace: { provider: "test" } }), + }); + assert.equal(receiptResp.status, 200); + const response = await receiptResp.json(); + const { receipt } = unwrapReceiptResponse(response); + assert.deepEqual(receipt.x402, { + verb: "describe", + version: "1.1.0", + entry: "x402://describeagent.eth/describe/v1.1.0", + }); + } finally { + await stop(srv.proc); + } +}); diff --git a/server.mjs b/server.mjs index f53e9a3..9c0496c 100644 --- a/server.mjs +++ b/server.mjs @@ -772,7 +772,7 @@ function makeAjv() { } function receiptSchemaUrlForVerb(verb) { - return `${SCHEMA_HOST}/schemas/v1.0.0/commons/${verb}/receipts/${verb}.receipt.schema.json`; + return `${SCHEMA_HOST}/schemas/v1.1.0/commons/${verb}/receipts/${verb}.receipt.schema.json`; } async function getValidatorForVerb(verb) { @@ -793,9 +793,9 @@ async function getValidatorForVerb(verb) { // Preload shared refs (best effort) try { const shared = [ - `${SCHEMA_HOST}/schemas/v1.0.0/_shared/receipt.base.schema.json`, - `${SCHEMA_HOST}/schemas/v1.0.0/_shared/x402.schema.json`, - `${SCHEMA_HOST}/schemas/v1.0.0/_shared/identity.schema.json`, + `${SCHEMA_HOST}/schemas/v1.1.0/_shared/receipt.base.schema.json`, + `${SCHEMA_HOST}/schemas/v1.1.0/_shared/x402.schema.json`, + `${SCHEMA_HOST}/schemas/v1.1.0/_shared/identity.schema.json`, ]; await Promise.all(shared.map((u) => fetchJsonWithTimeout(u, SCHEMA_FETCH_TIMEOUT_MS).catch(() => null))); } catch {