{
  "reference_kind": "historical_recorded_exchanges_plus_labeled_current_illustrations_not_runtime_schema",
  "captured_on": "2026-10-01",
  "endpoint": "https://dev.testril.ai/mcp",
  "note": "Current 0.14.0 illustrations are shown in the site scenes. Historical recorded exchanges remain below as an archival record, not integration guidance. Payments use USDC; addresses are shortened and signed payloads omitted.",
  "current_money_contract": {
    "version": "0.14.0",
    "ordinary_money": {
      "atoms": "integer string of USDC atoms",
      "usd": "server-formatted display string"
    },
    "exceptions": {
      "x402_accepts_amount": "bare atom string",
      "nft_accounting": "bare atom strings",
      "batch_minimum_deposit": "10000 atoms ($0.01) at accepts[].extra.minDeposit as a bare atom string"
    },
    "payment_policy": "Payment settles the exact quoted amount; spending caps belong in the agent wallet or signer.",
    "payment_transport": "PaymentRequired is in structuredContent/content[0], quote {quote_id, amount, lines} in content[1]; repeat the identical call with _meta[\"x402/payment\"] and retain _meta[\"x402/payment-response\"].",
    "idempotency": "The same spent payment or payment-identifier is not charged twice; a different request using that identifier is payment_identifier_conflict.",
    "recovery": "For payment_recovery_pending, retry the original paid call and do not sign a replacement."
  },
  "normalization": "Capture helper set_args renamed arguments; unsupported materialize blocks field omitted; signed payload redactions explicitly marked. Historical examples 1–36 retain their recorded pre-0.9.0 tools, arguments, and money values. Examples 37–46 are labeled 0.14.0 illustrations.",
  "scenes": [
    {
      "id": "discovery",
      "label": "Discovery & health",
      "title": "Meet the data runtime",
      "description": "Establish the connection, discover the tools, check health, and inspect prices.",
      "examples": [
        38
      ],
      "exchanges": [
        {
          "id": "capture-38-1",
          "example": 38,
          "title": "Discover the 0.14.0 public surface",
          "method": "tools/list",
          "category": "Discovery",
          "request": {
            "jsonrpc": "2.0",
            "id": 2,
            "method": "tools/list",
            "params": {}
          },
          "request_kind": "MCP message",
          "response": {
            "jsonrpc": "2.0",
            "id": 2,
            "result": {
              "tools": [
                {
                  "name": "ask"
                },
                {
                  "name": "bind"
                },
                {
                  "name": "claim_rewards"
                },
                {
                  "name": "health_check"
                },
                {
                  "name": "inspect"
                },
                {
                  "name": "materialize"
                },
                {
                  "name": "provenance"
                },
                {
                  "name": "read"
                },
                {
                  "name": "stop"
                }
              ]
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "response"
        }
      ]
    },
    {
      "id": "binding",
      "label": "Binding & coverage",
      "title": "Give a function its scope",
      "description": "Bind a token and wallet, then inspect what a bound function already knows.",
      "examples": [
        39
      ],
      "exchanges": [
        {
          "id": "capture-39-1",
          "example": 39,
          "title": "Bind current token-balance scope",
          "method": "bind",
          "category": "Binding",
          "request": {
            "tool": "bind",
            "arguments": {
              "function_slug": "erc20.token_balance",
              "chain_id": 1,
              "params": {
                "reads": {
                  "tokens": [
                    "<TOKEN_ADDRESS>"
                  ],
                  "owners": [
                    "<WALLET_ADDRESS>"
                  ]
                }
              }
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "success",
            "bound_function_id": "sha256:<id>",
            "function_slug": "erc20.token_balance",
            "chain_id": 1,
            "created": true
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "success"
        }
      ]
    },
    {
      "id": "materialization",
      "label": "Materialization",
      "title": "Bring a block window into view",
      "description": "Quote 90 blocks of USDC transfer data on Arbitrum One, pay, execute, and inspect the job.",
      "examples": [
        40,
        41
      ],
      "exchanges": [
        {
          "id": "capture-40-1",
          "example": 40,
          "title": "Unpaid materialize returns PaymentRequired and the quote",
          "method": "materialize",
          "category": "Materialization",
          "request": {
            "tool": "materialize",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "from_block": 100,
              "to_block": 110
            }
          },
          "request_kind": "Tool call",
          "response": {
            "isError": true,
            "structuredContent": {
              "x402Version": 2,
              "error": "payment_required",
              "resource": {
                "url": "mcp://tool/materialize",
                "mimeType": "application/json"
              },
              "accepts": [
                {
                  "scheme": "batch-settlement",
                  "network": "<OFFERED_NETWORK>",
                  "asset": "<OFFERED_USDC_ADDRESS>",
                  "payTo": "<OFFERED_RECEIVER>",
                  "amount": "1200",
                  "maxTimeoutSeconds": 3600,
                  "extra": {
                    "minDeposit": "10000"
                  }
                }
              ]
            },
            "content": [
              {
                "type": "text",
                "text": "<PaymentRequired JSON>"
              },
              {
                "type": "text",
                "text": "{\"quote_id\":\"quote:<id>\",\"amount\":{\"atoms\":\"1200\",\"usd\":\"$0.0012\"},\"lines\":[{\"label\":\"materialize_blocks\",\"units\":10,\"unit_price\":{\"atoms\":\"120\",\"usd\":\"$0.00012\"},\"amount\":{\"atoms\":\"1200\",\"usd\":\"$0.0012\"}}]}"
              }
            ]
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "response"
        },
        {
          "id": "capture-41-1",
          "example": 41,
          "title": "Repeat the identical materialize call with payment",
          "method": "materialize",
          "category": "Execution",
          "request": {
            "tool": "materialize",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "from_block": 100,
              "to_block": 110
            },
            "_meta": {
              "x402/payment": {
                "x402Version": 2,
                "accepted": "<COPIED_ACCEPTS_ROW>",
                "payload": "<SIGNED_PAYMENT_FIELDS>"
              }
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "success",
            "result": "materializing",
            "job": {
              "job_id": "job:<id>",
              "quote_id": "quote:<id>",
              "blocks_total": 10,
              "state": "queued"
            },
            "_meta": {
              "x402/payment-response": {
                "success": true,
                "network": "<SELECTED_NETWORK>",
                "payer": "<PAYER_ADDRESS>"
              }
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "success"
        }
      ]
    },
    {
      "id": "query",
      "label": "Query",
      "title": "Receive the values",
      "description": "A read has its own quote. After settlement, the answer arrives as typed values.",
      "examples": [
        42
      ],
      "exchanges": [
        {
          "id": "capture-42-1",
          "example": 42,
          "title": "A paid read repeats the identical read arguments",
          "method": "read",
          "category": "Query",
          "request": {
            "tool": "read",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "from_block": 100,
              "to_block": 110
            },
            "_meta": {
              "x402/payment": {
                "x402Version": 2,
                "accepted": "<COPIED_ACCEPTS_ROW>",
                "payload": "<SIGNED_PAYMENT_FIELDS>"
              }
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "success",
            "bound_function_id": "sha256:<id>",
            "from_block": 100,
            "to_block": 110,
            "values": [],
            "_meta": {
              "x402/payment-response": {
                "success": true,
                "network": "<SELECTED_NETWORK>",
                "payer": "<PAYER_ADDRESS>"
              }
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "success"
        }
      ]
    },
    {
      "id": "provenance",
      "label": "Provenance",
      "title": "Follow a value back to its source",
      "description": "Inspect the source block hashes behind an Ethereum token balance.",
      "examples": [
        43
      ],
      "exchanges": [
        {
          "id": "capture-43-1",
          "example": 43,
          "title": "Provenance uses the same identity and window",
          "method": "provenance",
          "category": "Provenance",
          "request": {
            "tool": "provenance",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "from_block": 100,
              "to_block": 110
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "success",
            "bound_function_id": "sha256:<id>",
            "chain_id": 42161,
            "from_block": 100,
            "to_block": 110,
            "block_count": 0,
            "blocks": [],
            "digest": "sha256:<digest>",
            "computation": {
              "kind": "function",
              "id": "erc20.token_volume",
              "version": 1
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "success"
        }
      ]
    },
    {
      "id": "rewards",
      "label": "Data liquidity & rewards",
      "title": "See what useful data earns",
      "description": "Inspect purchases and reward accounting, then see the captured claim result.",
      "examples": [
        44
      ],
      "exchanges": [
        {
          "id": "capture-44-1",
          "example": 44,
          "title": "Inspect claim rights, then claim by NFT id",
          "method": "claim_rewards",
          "category": "Rewards",
          "request": {
            "tool": "claim_rewards",
            "arguments": {
              "nft": "1"
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "success",
            "claimed": "0",
            "unclaimed": "208",
            "reason": "below_minimum"
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "success"
        }
      ]
    },
    {
      "id": "batch",
      "label": "Batch settlement",
      "title": "Many small payments, one channel",
      "description": "Explore captured quotes, channel inspections, and signed voucher payments.",
      "examples": [
        40,
        41
      ],
      "exchanges": [
        {
          "id": "capture-40-1",
          "example": 40,
          "title": "Unpaid materialize returns PaymentRequired and the quote",
          "method": "materialize",
          "category": "Materialization",
          "request": {
            "tool": "materialize",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "from_block": 100,
              "to_block": 110
            }
          },
          "request_kind": "Tool call",
          "response": {
            "isError": true,
            "structuredContent": {
              "x402Version": 2,
              "error": "payment_required",
              "resource": {
                "url": "mcp://tool/materialize",
                "mimeType": "application/json"
              },
              "accepts": [
                {
                  "scheme": "batch-settlement",
                  "network": "<OFFERED_NETWORK>",
                  "asset": "<OFFERED_USDC_ADDRESS>",
                  "payTo": "<OFFERED_RECEIVER>",
                  "amount": "1200",
                  "maxTimeoutSeconds": 3600,
                  "extra": {
                    "minDeposit": "10000"
                  }
                }
              ]
            },
            "content": [
              {
                "type": "text",
                "text": "<PaymentRequired JSON>"
              },
              {
                "type": "text",
                "text": "{\"quote_id\":\"quote:<id>\",\"amount\":{\"atoms\":\"1200\",\"usd\":\"$0.0012\"},\"lines\":[{\"label\":\"materialize_blocks\",\"units\":10,\"unit_price\":{\"atoms\":\"120\",\"usd\":\"$0.00012\"},\"amount\":{\"atoms\":\"1200\",\"usd\":\"$0.0012\"}}]}"
              }
            ]
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "response"
        },
        {
          "id": "capture-41-1",
          "example": 41,
          "title": "Repeat the identical materialize call with payment",
          "method": "materialize",
          "category": "Execution",
          "request": {
            "tool": "materialize",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "from_block": 100,
              "to_block": 110
            },
            "_meta": {
              "x402/payment": {
                "x402Version": 2,
                "accepted": "<COPIED_ACCEPTS_ROW>",
                "payload": "<SIGNED_PAYMENT_FIELDS>"
              }
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "success",
            "result": "materializing",
            "job": {
              "job_id": "job:<id>",
              "quote_id": "quote:<id>",
              "blocks_total": 10,
              "state": "queued"
            },
            "_meta": {
              "x402/payment-response": {
                "success": true,
                "network": "<SELECTED_NETWORK>",
                "payer": "<PAYER_ADDRESS>"
              }
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "success"
        }
      ]
    },
    {
      "id": "refunds",
      "label": "Stop & refund",
      "title": "Stop work that has not been delivered",
      "description": "A future window can be stopped by its payer. The response records unspent blocks and any refund.",
      "examples": [
        45
      ],
      "exchanges": [
        {
          "id": "capture-45-1",
          "example": 45,
          "title": "Stop returns one stopped-job record",
          "method": "stop",
          "category": "Refund",
          "request": {
            "tool": "stop",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "wallet": "<CURRENT_NFT_OWNER_ADDRESS>",
              "quote_id": "quote:<id>"
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "success",
            "bound_function_id": "sha256:<id>",
            "job": {
              "job_id": "job:<id>",
              "quote_id": "quote:<id>",
              "unspent_blocks": 10,
              "refunded": {
                "atoms": "1200",
                "usd": "$0.0012"
              }
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "success"
        }
      ]
    },
    {
      "id": "rehearsal",
      "label": "Same-call payment",
      "title": "Repeat the priced call",
      "description": "Attach payment to the identical call and retain the returned x402 receipt.",
      "examples": [
        41
      ],
      "exchanges": [
        {
          "id": "capture-41-1",
          "example": 41,
          "title": "Repeat the identical materialize call with payment",
          "method": "materialize",
          "category": "Execution",
          "request": {
            "tool": "materialize",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "from_block": 100,
              "to_block": 110
            },
            "_meta": {
              "x402/payment": {
                "x402Version": 2,
                "accepted": "<COPIED_ACCEPTS_ROW>",
                "payload": "<SIGNED_PAYMENT_FIELDS>"
              }
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "success",
            "result": "materializing",
            "job": {
              "job_id": "job:<id>",
              "quote_id": "quote:<id>",
              "blocks_total": 10,
              "state": "queued"
            },
            "_meta": {
              "x402/payment-response": {
                "success": true,
                "network": "<SELECTED_NETWORK>",
                "payer": "<PAYER_ADDRESS>"
              }
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "success"
        }
      ]
    },
    {
      "id": "recovery",
      "label": "Errors & recovery",
      "title": "A refusal tells the agent what to fix",
      "description": "Preserve the original payment while Testril resolves an uncertain settlement.",
      "examples": [
        46
      ],
      "exchanges": [
        {
          "id": "capture-46-1",
          "example": 46,
          "title": "Preserve a payment while recovery is pending",
          "method": "materialize",
          "category": "Execution",
          "request": {
            "tool": "materialize",
            "arguments": {
              "bound_function_id": "sha256:<id>",
              "from_block": 100,
              "to_block": 110
            },
            "_meta": {
              "x402/payment": "<ORIGINAL_SIGNED_PAYMENT>"
            }
          },
          "request_kind": "Tool call",
          "response": {
            "outcome": "error",
            "kind": "payment_recovery_pending",
            "message": "payment recovery pending; do not make another payment",
            "payment": {
              "quote_id": "quote:<id>",
              "network": "<SELECTED_NETWORK>",
              "amount": {
                "atoms": "1200",
                "usd": "$0.0012"
              },
              "settlement_status": "outcome_unknown",
              "settlement_reference": null
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "error"
        }
      ]
    },
    {
      "id": "rest",
      "label": "REST reads",
      "title": "One paid data route",
      "description": "Request bound-function data, receive an HTTP 402 quote, then retry the same GET with x402 payment.",
      "examples": [
        37
      ],
      "exchanges": [
        {
          "id": "capture-37-1",
          "example": 37,
          "title": "REST read — one data GET with x402 payment",
          "method": "GET data",
          "category": "REST",
          "request": {
            "method": "GET",
            "url": "https://dev.testril.ai/v1/bound_functions/sha256:7c1e…9a42/data?from_block=0&to_block=13&token=0xaf88…5831",
            "headers": {
              "Accept": "application/json"
            }
          },
          "request_kind": "HTTP request",
          "response": {
            "status": 402,
            "headers": {
              "PAYMENT-REQUIRED": "<base64-encoded x402 PaymentRequired>"
            },
            "body": {
              "quote_id": "quote:01b6…42f0",
              "amount": {
                "atoms": "23",
                "usd": "$0.000023"
              },
              "lines": [
                {
                  "label": "query_read",
                  "unit_price": {
                    "atoms": "10",
                    "usd": "$0.000010"
                  },
                  "amount": {
                    "atoms": "10",
                    "usd": "$0.000010"
                  }
                },
                {
                  "label": "query_blocks",
                  "units": 13,
                  "unit_price": {
                    "atoms": "1",
                    "usd": "$0.000001"
                  },
                  "amount": {
                    "atoms": "13",
                    "usd": "$0.000013"
                  }
                }
              ]
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "response"
        },
        {
          "id": "capture-37-2",
          "example": 37,
          "title": "REST read — one data GET with x402 payment",
          "method": "GET data",
          "category": "REST",
          "request": {
            "method": "GET",
            "url": "https://dev.testril.ai/v1/bound_functions/sha256:7c1e…9a42/data?from_block=0&to_block=13&token=0xaf88…5831",
            "headers": {
              "Accept": "application/json",
              "PAYMENT-SIGNATURE": "<base64-encoded x402 PaymentPayload>"
            }
          },
          "request_kind": "HTTP request",
          "response": {
            "status": 200,
            "headers": {
              "PAYMENT-RESPONSE": "<base64-encoded x402 payment response>"
            },
            "body": {
              "outcome": "success",
              "bound_function_id": "sha256:7c1e…9a42",
              "from_block": 0,
              "to_block": 13,
              "values": [
                {
                  "block": 7,
                  "token": "0xaf88…5831",
                  "count": "3",
                  "volume": "1181594340"
                },
                {
                  "block": 11,
                  "token": "0xaf88…5831",
                  "count": "1",
                  "volume": "42000000"
                }
              ]
            }
          },
          "response_kind": "Illustrative response",
          "rail": "Illustrative x402 HTTP",
          "outcome": "response"
        }
      ]
    }
  ]
}
