{"openapi":"3.0.0","info":{"title":"AstralBeam API","version":"0.6.0","description":"\nMulti-chain bridge API for transferring tokens between Casper Network and EVM-compatible chains.\n\n## Environments\nThe registry supports Robinhood Chain (robinhood) and Robinhood Chain Testnet (robinhood-testnet), alongside the other configured EVM networks.\nUse /api/v1/chains?enabled=true and /api/v1/tokens for this deployment's active routes.\nPublic testnet is independent of other deployments; IDs and mappings are not portable.\n\n## Token Types\n- **ERC-20 → Casper**: Lock ERC-20 tokens on EVM chain, mint wrapped tokens on Casper\n- **Casper → ERC-20**: Burn wrapped tokens on Casper, unlock ERC-20 tokens on EVM chain\n- **Native Casper → EVM**: Lock native Casper tokens, mint wrapped on EVM\n- **EVM → Native Casper**: Burn wrapped on EVM, unlock native on Casper\n      ","contact":{"name":"Bridge Team"},"license":{"name":"MIT"}},"servers":[{"url":"/","description":"Current deployment"},{"url":"https://api.testnet.astralbeam.io","description":"Public testnet"}],"tags":[{"name":"Tokens","description":"Token registry and multi-chain address management"},{"name":"Transactions","description":"Bridge transaction history and status"},{"name":"Stats","description":"Bridge statistics and health monitoring"},{"name":"Chains","description":"Supported EVM chain information"},{"name":"Exposure","description":"Exposure-control route state and pre-commit estimates (advisory; contracts are authoritative)"}],"paths":{"/api/v1/exposure/evm/{chain}/transfers/{transferId}":{"get":{"tags":["Exposure"],"summary":"Live status of one transfer, located by its EVM end","description":"Advisory only: contracts are authoritative, and nothing here authorizes a signature or feeds relayer signing. The status is the destination's section 11.2 status, read live: on EVM the locker's transferStatus view, on Casper the package's casperTransferStatus over the stored records at one state root. executed comes only from a destination read whose stored state is EXECUTED.","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string"},"description":"Configured EVM chain short name, e.g. `sepolia`"},{"name":"transferId","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},{"name":"sendId","in":"query","required":false,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"description":"The gateway message id of the transfer (TransferCommitted's sendId). With it the response carries receiveId and the destination gateway's delivered(receiveId)"}],"responses":{"200":{"description":"Both ends read (or the other end is not one this API reads): the status, including committed_not_delivered; error is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ExposureTransferState"},"error":{"type":"object","nullable":true,"enum":[null]}}}}}},"400":{"description":"EXPOSURE_INVALID_TRANSFER_ID (also a malformed sendId); data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"404":{"description":"EXPOSURE_CHAIN_UNKNOWN (no EVM chain of that name is configured; data null), or EXPOSURE_TRANSFER_UNKNOWN (the locating end holds no record of the transfer; status unknown)","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"anyOf":[{"$ref":"#/components/schemas/ExposureTransferState"},{"type":"object","nullable":true,"enum":[null]}]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"409":{"description":"EXPOSURE_ROUTE_UNSUPPORTED: an end is not a format-1 exposure-control contract this API reads; status delivery_unknown when it is the destination","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposureTransferState"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"429":{"description":"EXPOSURE_RATE_LIMITED; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"503":{"description":"EXPOSURE_READ_UNAVAILABLE or EXPOSURE_READ_STALE; status delivery_unknown when the destination (or the locating end) could not be read","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposureTransferState"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}}}}},"/api/v1/exposure/casper/transfers/{transferId}":{"get":{"tags":["Exposure"],"summary":"Live status of one transfer, located by its Casper end","description":"Advisory only: contracts are authoritative, and nothing here authorizes a signature or feeds relayer signing. The status is the destination's section 11.2 status, read live: on EVM the locker's transferStatus view, on Casper the package's casperTransferStatus over the stored records at one state root. executed comes only from a destination read whose stored state is EXECUTED.","parameters":[{"name":"transferId","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},{"name":"sendId","in":"query","required":false,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"description":"The gateway message id of the transfer (TransferCommitted's sendId). With it the response carries receiveId and the destination gateway's delivered(receiveId)"}],"responses":{"200":{"description":"Both ends read (or the other end is not one this API reads): the status, including committed_not_delivered; error is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ExposureTransferState"},"error":{"type":"object","nullable":true,"enum":[null]}}}}}},"400":{"description":"EXPOSURE_INVALID_TRANSFER_ID (also a malformed sendId); data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"404":{"description":"EXPOSURE_CHAIN_UNKNOWN (no Casper TokenFactory is configured; data null), or EXPOSURE_TRANSFER_UNKNOWN (the locating end holds no record of the transfer; status unknown)","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"anyOf":[{"$ref":"#/components/schemas/ExposureTransferState"},{"type":"object","nullable":true,"enum":[null]}]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"409":{"description":"EXPOSURE_ROUTE_UNSUPPORTED: an end is not a format-1 exposure-control contract this API reads; status delivery_unknown when it is the destination","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposureTransferState"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"429":{"description":"EXPOSURE_RATE_LIMITED; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"503":{"description":"EXPOSURE_READ_UNAVAILABLE or EXPOSURE_READ_STALE; status delivery_unknown when the destination (or the locating end) could not be read","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposureTransferState"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}}}}},"/api/v1/exposure/evm/{chain}/routes/{routeId}":{"get":{"tags":["Exposure"],"summary":"Exposure-control state of one route, located by its EVM end","description":"Advisory only: contracts are authoritative. Nothing here reserves capacity or authorizes a signature. Both ends are read, each at one observation (EVM block, Casper state root); a field comes from the end that owns it for the route's operation, and is unknown when that end could not be read (`not_applicable` when the route has no such quantity).","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string"},"description":"Configured EVM chain short name, e.g. `sepolia`"},{"name":"routeId","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Both ends read; error is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ExposureRouteState"},"error":{"type":"object","nullable":true,"enum":[null]}}}}}},"400":{"description":"EXPOSURE_INVALID_ROUTE_ID; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"404":{"description":"EXPOSURE_CHAIN_UNKNOWN (no EVM chain of that name is configured; data null), or EXPOSURE_ROUTE_UNKNOWN (data carries the observations; the ends' fields not_determinable)","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"anyOf":[{"$ref":"#/components/schemas/ExposureRouteState"},{"type":"object","nullable":true,"enum":[null]}]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"409":{"description":"EXPOSURE_ROUTE_UNSUPPORTED: an end is not a format-1 exposure-control contract this API reads, or the ends disagree on FORMAT_VERSION; the fields that need it unsupported","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposureRouteState"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"429":{"description":"EXPOSURE_RATE_LIMITED; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"503":{"description":"EXPOSURE_READ_UNAVAILABLE or EXPOSURE_READ_STALE; data carries the fields that need the failed end as unknown","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposureRouteState"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}}}}},"/api/v1/exposure/evm/{chain}/routes/{routeId}/preflight":{"get":{"tags":["Exposure"],"summary":"Pre-commit estimate for one amount, route located by its EVM end","description":"Advisory only: contracts are authoritative. Nothing here reserves capacity or authorizes a signature. Both ends are read, each at one observation (EVM block, Casper state root); a field comes from the end that owns it for the route's operation, and is unknown when that end could not be read (`not_applicable` when the route has no such quantity). A refusal is a 200 with admissible false and the contract error it predicts.","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string"},"description":"Configured EVM chain short name, e.g. `sepolia`"},{"name":"routeId","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},{"name":"amount","in":"query","required":true,"schema":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"},"description":"Raw amount in the asset's smallest unit, at most 2^256 - 1"}],"responses":{"200":{"description":"Both ends read; error is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ExposurePreflight"},"error":{"type":"object","nullable":true,"enum":[null]}}}}}},"400":{"description":"EXPOSURE_INVALID_ROUTE_ID or EXPOSURE_INVALID_AMOUNT; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"404":{"description":"EXPOSURE_CHAIN_UNKNOWN (no EVM chain of that name is configured; data null), or EXPOSURE_ROUTE_UNKNOWN (data carries the observations; the ends' fields not_determinable)","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"anyOf":[{"$ref":"#/components/schemas/ExposurePreflight"},{"type":"object","nullable":true,"enum":[null]}]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"409":{"description":"EXPOSURE_ROUTE_UNSUPPORTED: an end is not a format-1 exposure-control contract this API reads, or the ends disagree on FORMAT_VERSION; the fields that need it unsupported","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposurePreflight"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"429":{"description":"EXPOSURE_RATE_LIMITED; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"503":{"description":"EXPOSURE_READ_UNAVAILABLE or EXPOSURE_READ_STALE; data carries the fields that need the failed end as unknown","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposurePreflight"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}}}}},"/api/v1/exposure/casper/routes/{routeId}":{"get":{"tags":["Exposure"],"summary":"Exposure-control state of one route, located by its Casper end","description":"Advisory only: contracts are authoritative. Nothing here reserves capacity or authorizes a signature. Both ends are read, each at one observation (EVM block, Casper state root); a field comes from the end that owns it for the route's operation, and is unknown when that end could not be read (`not_applicable` when the route has no such quantity).","parameters":[{"name":"routeId","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Both ends read; error is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ExposureRouteState"},"error":{"type":"object","nullable":true,"enum":[null]}}}}}},"400":{"description":"EXPOSURE_INVALID_ROUTE_ID; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"404":{"description":"EXPOSURE_CHAIN_UNKNOWN (no Casper TokenFactory is configured; data null), or EXPOSURE_ROUTE_UNKNOWN (data carries the observations; the ends' fields not_determinable)","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"anyOf":[{"$ref":"#/components/schemas/ExposureRouteState"},{"type":"object","nullable":true,"enum":[null]}]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"409":{"description":"EXPOSURE_ROUTE_UNSUPPORTED: an end is not a format-1 exposure-control contract this API reads, or the ends disagree on FORMAT_VERSION; the fields that need it unsupported","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposureRouteState"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"429":{"description":"EXPOSURE_RATE_LIMITED; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"503":{"description":"EXPOSURE_READ_UNAVAILABLE or EXPOSURE_READ_STALE; data carries the fields that need the failed end as unknown","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposureRouteState"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}}}}},"/api/v1/exposure/casper/routes/{routeId}/preflight":{"get":{"tags":["Exposure"],"summary":"Pre-commit estimate for one amount, route located by its Casper end","description":"Advisory only: contracts are authoritative. Nothing here reserves capacity or authorizes a signature. Both ends are read, each at one observation (EVM block, Casper state root); a field comes from the end that owns it for the route's operation, and is unknown when that end could not be read (`not_applicable` when the route has no such quantity). A refusal is a 200 with admissible false and the contract error it predicts.","parameters":[{"name":"routeId","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},{"name":"amount","in":"query","required":true,"schema":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"},"description":"Raw amount in the asset's smallest unit, at most 2^256 - 1"}],"responses":{"200":{"description":"Both ends read; error is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ExposurePreflight"},"error":{"type":"object","nullable":true,"enum":[null]}}}}}},"400":{"description":"EXPOSURE_INVALID_ROUTE_ID or EXPOSURE_INVALID_AMOUNT; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"404":{"description":"EXPOSURE_CHAIN_UNKNOWN (no Casper TokenFactory is configured; data null), or EXPOSURE_ROUTE_UNKNOWN (data carries the observations; the ends' fields not_determinable)","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"anyOf":[{"$ref":"#/components/schemas/ExposurePreflight"},{"type":"object","nullable":true,"enum":[null]}]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"409":{"description":"EXPOSURE_ROUTE_UNSUPPORTED: an end is not a format-1 exposure-control contract this API reads, or the ends disagree on FORMAT_VERSION; the fields that need it unsupported","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposurePreflight"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"429":{"description":"EXPOSURE_RATE_LIMITED; data is null","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"type":"object","nullable":true,"enum":[null]},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}},"503":{"description":"EXPOSURE_READ_UNAVAILABLE or EXPOSURE_READ_STALE; data carries the fields that need the failed end as unknown","content":{"application/json":{"schema":{"type":"object","required":["success","data","error"],"additionalProperties":false,"properties":{"success":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/ExposurePreflight"},"error":{"$ref":"#/components/schemas/ExposureError"}}}}}}}}},"/livez":{"get":{"tags":["Stats"],"summary":"Process liveness","description":"Does not check database, indexers or relayers.","responses":{"200":{"description":"Successful response"}}}},"/api/v1/stats/casper-node":{"get":{"tags":["Stats"],"summary":"Casper node reachability","description":"Cached for 60 seconds. Inspect data.isUp even on HTTP 200.","responses":{"200":{"description":"Successful response"}}}},"/api/v1/stats/bridge-fee":{"get":{"tags":["Stats"],"summary":"Bridge fees","description":"Cached Casper and EVM fees. Null or absent values mean unavailable, not free.","responses":{"200":{"description":"Successful response"}}}},"/api/v1/rates/{fiatId}/latest":{"get":{"tags":["Stats"],"summary":"Latest CSPR fiat rate","description":"CSPR.cloud response forwarded unchanged. USD fiatId=1 enabled by default.","responses":{"200":{"description":"Successful response"},"400":{"description":"Unsupported fiat ID"},"429":{"description":"Rate limited"},"502":{"description":"Upstream failure"},"503":{"description":"Not configured"}},"parameters":[{"name":"fiatId","in":"path","required":true,"schema":{"type":"integer"}}]}},"/rates/{fiatId}/latest":{"get":{"tags":["Stats"],"summary":"Latest CSPR fiat rate alias","description":"Alias of /api/v1/rates/{fiatId}/latest.","responses":{"200":{"description":"Successful response"},"400":{"description":"Unsupported fiat ID"},"429":{"description":"Rate limited"},"502":{"description":"Upstream failure"},"503":{"description":"Not configured"}},"parameters":[{"name":"fiatId","in":"path","required":true,"schema":{"type":"integer"}}]}},"/api/v1/tokens":{"get":{"tags":["Tokens"],"summary":"List all tokens","description":"Returns all registered tokens with their addresses on each supported EVM chain, including available liquidity for bridge operations.","parameters":[{"name":"includeLiquidity","in":"query","description":"Include liquidity data in response (default: true)","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/TokenWithLiquidity"}}}}}}}}}},"/api/v1/tokens/chains":{"get":{"tags":["Chains"],"summary":"List supported chains","description":"Returns all supported EVM chains with their configuration","parameters":[{"name":"enabled","in":"query","description":"Filter by enabled status (default: true)","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Chain"}}}}}}}}}},"/api/v1/tokens/{id}":{"get":{"tags":["Tokens"],"summary":"Get token by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"includeLiquidity","in":"query","description":"Include liquidity data in response (default: true)","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/TokenWithLiquidity"}}}}}},"404":{"description":"Token not found"}}}},"/api/v1/tokens/address/{address}":{"get":{"tags":["Tokens"],"summary":"Get token by address","description":"Find a token by its address on any EVM chain","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"example":"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238"},{"name":"includeLiquidity","in":"query","description":"Include liquidity data in response (default: true)","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/TokenWithLiquidity"}}}}}},"404":{"description":"Token not found"}}}},"/api/v1/tokens/chain/{chainName}":{"get":{"tags":["Tokens"],"summary":"Get tokens by chain","description":"Get all tokens available on a specific EVM chain","parameters":[{"name":"chainName","in":"path","required":true,"schema":{"type":"string","enum":["sepolia","base-sepolia","arbitrum-sepolia","polygon-amoy","robinhood","robinhood-testnet"]}},{"name":"includeLiquidity","in":"query","description":"Include liquidity data in response (default: true)","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TokenWithLiquidity"}},"chain":{"type":"string"}}}}}}}}},"/api/v1/tokens/ethereum/{address}":{"get":{"tags":["Tokens"],"summary":"Get token by Ethereum address (legacy)","description":"Legacy endpoint — finds a token by its address on any EVM chain. Prefer /tokens/address/{address}.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"example":"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/TokenWithAddresses"}}}}}},"400":{"description":"Invalid Ethereum address format"},"404":{"description":"Token not found"}}}},"/api/v1/tokens/casper/{hash}":{"get":{"tags":["Tokens"],"summary":"Get token by Casper hash","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"},"example":"hash-a267e1862c79590dc668919ce239440cbf3e2b141cbfe341e2fa1d2b2a5f5e9f"},{"name":"includeLiquidity","in":"query","description":"Include liquidity data in response (default: true)","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/TokenWithLiquidity"}}}}}},"404":{"description":"Token not found"}}}},"/api/v1/transactions":{"get":{"tags":["Transactions"],"summary":"List transactions","description":"Get bridge transactions with optional filtering","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":100}},{"name":"direction","in":"query","schema":{"type":"string","enum":["eth2casper","casper2eth"]}},{"name":"status","in":"query","schema":{"type":"string","enum":["detected","confirming","finalized","attesting","submitted","completed","failed"]}},{"name":"token","in":"query","description":"Filter by token ID","schema":{"type":"integer"}},{"name":"address","in":"query","description":"Filter by address (matches either sender OR recipient). Works with both EVM addresses (0x...) and Casper addresses/hashes.","schema":{"type":"string"},"example":"0x1234567890abcdef1234567890abcdef12345678"},{"name":"sender","in":"query","description":"Filter by sender address only (origin of the bridge transaction)","schema":{"type":"string"}},{"name":"recipient","in":"query","description":"Filter by recipient address only (destination of the bridge transaction)","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of transactions","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Transaction"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid query parameters (a malformed filter, or a page or limit that is not a single value)"}}}},"/api/v1/transactions/{id}":{"get":{"tags":["Transactions"],"summary":"Get transaction by ID","description":"Get a transaction by its numeric database ID. For hash lookups use /transactions/hash/{txHash}.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Transaction details","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Transaction"}}}}}},"400":{"description":"Invalid transaction ID (must be numeric)"},"404":{"description":"Transaction not found"}}}},"/api/v1/transactions/hash/{txHash}":{"get":{"tags":["Transactions"],"summary":"Get transaction by source tx hash","description":"Supply sourceChainId and sourceEventIndex from the EVM receipt for event-specific tracking. Hash-only lookup returns 409 when multiple rows match. Legacy rows without verified event identity return 409 for event selection; historical missing events still require backfill.","parameters":[{"name":"sourceChainId","in":"query","description":"Source EVM chain ID; requires sourceEventIndex.","schema":{"type":"integer","minimum":1}},{"name":"sourceEventIndex","in":"query","description":"Actual receipt log index; requires sourceChainId. Unresolved legacy identity returns 409.","schema":{"type":"integer","minimum":0,"maximum":4294967295}},{"name":"allowMissing","in":"query","description":"For clients that poll until the source is indexed: when no transaction matches, return 200 with `data: null` instead of 404. Only the value `true` is accepted; any other value returns 400.","schema":{"type":"string","enum":["true"]}},{"name":"txHash","in":"path","required":true,"schema":{"type":"string"},"example":"0x3c5e1b0a9d3f2e8c7b6a5d4e3f2c1b0a9d8e7f6c5b4a3d2e1f0c9b8a7d6e5f4c"}],"responses":{"200":{"description":"Transaction details; `data` is null only when allowMissing=true and no transaction matches","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"anyOf":[{"$ref":"#/components/schemas/Transaction"},{"type":"object","nullable":true,"enum":[null]}]}}}}}},"400":{"description":"Malformed hash, incomplete or invalid event selector, allowMissing other than true, or an unknown query parameter"},"404":{"description":"Transaction not found (without allowMissing=true)"},"409":{"description":"Source hash matches multiple transfers. Use the transaction list and retrieve a transfer by its numeric ID."}}}},"/api/v1/transactions/address/{address}":{"get":{"tags":["Transactions"],"summary":"Get transactions for an address","description":"All bridge transactions where the address is sender or recipient. Works with EVM addresses and Casper addresses/hashes. Paginated.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"},"example":"0x1234567890abcdef1234567890abcdef12345678"},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":100}}],"responses":{"200":{"description":"Paginated transactions for the address","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Transaction"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid query parameters (a page or limit that is not a single value)"}}}},"/api/v1/transactions/status/pending":{"get":{"tags":["Transactions"],"summary":"Get pending transactions","description":"All transactions not yet completed or failed (statuses: detected, confirming, finalized, attesting, submitted). Useful for monitoring.","parameters":[{"name":"direction","in":"query","schema":{"type":"string","enum":["eth2casper","casper2eth"]}}],"responses":{"200":{"description":"Pending transactions","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Transaction"}},"count":{"type":"integer"}}}}}},"400":{"description":"Invalid query parameters"}}}},"/api/v1/stats":{"get":{"tags":["Stats"],"summary":"Get bridge statistics","description":"Returns overall statistics with per-chain breakdown. Each EVM chain shows both directions: eth2casper (locks starting on that chain) and casper2eth (unlocks/mints ending on that chain). The \"casper\" key shows aggregate stats for all Casper-originated transactions.","parameters":[{"name":"chain","in":"query","description":"Filter statistics by chain name","schema":{"type":"string"}}],"responses":{"200":{"description":"Bridge statistics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Stats"}}}}}}},"/api/v1/stats/chains":{"get":{"tags":["Stats"],"summary":"Get per-chain statistics","description":"Returns transaction statistics for each enabled chain","responses":{"200":{"description":"Per-chain statistics","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"name":{"type":"string"},"shortName":{"type":"string"},"stats":{"type":"object","properties":{"evm_chain_name":{"type":"string"},"total_count":{"oneOf":[{"type":"integer"},{"type":"string"}]},"completed_count":{"oneOf":[{"type":"integer"},{"type":"string"}]},"last_tx_at":{"type":"string","nullable":true,"format":"date-time"}}}}}}}}}}}}}},"/api/v1/stats/health":{"get":{"tags":["Stats"],"summary":"Health check","description":"Check API and indexer health status","responses":{"200":{"description":"System is healthy","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"checks":{"type":"object","properties":{"database":{"type":"string","enum":["ok","error"]},"indexers":{"type":"object","additionalProperties":{"type":"boolean"}}}},"timestamp":{"type":"string","format":"date-time"},"error":{"type":"string"}}}}}},"503":{"description":"System is degraded or unhealthy","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"checks":{"type":"object","properties":{"database":{"type":"string","enum":["ok","error"]},"indexers":{"type":"object","additionalProperties":{"type":"boolean"}}}},"timestamp":{"type":"string","format":"date-time"},"error":{"type":"string"}}}}}}}}},"/api/v1/stats/relayers":{"get":{"tags":["Stats"],"summary":"Get relayer statistics","description":"Returns statistics for all bridge relayers","responses":{"200":{"description":"Relayer statistics","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"balances":{"type":"object","properties":{"eth":{"type":"string","nullable":true},"cspr":{"type":"string","nullable":true}}},"attestationsSubmitted":{"type":"integer"},"lastSeen":{"type":"string","format":"date-time","nullable":true},"isActive":{"type":"boolean"}}}}}}}}}}}},"/api/v1/chains":{"get":{"tags":["Chains"],"summary":"List all chains","description":"Returns all supported EVM chains with configuration and explorer URLs","parameters":[{"name":"enabled","in":"query","description":"Filter to only enabled chains","schema":{"type":"boolean"}}],"responses":{"200":{"description":"List of chains","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Chain"}}}}}}}}}},"/api/v1/chains/{chainId}":{"get":{"tags":["Chains"],"summary":"Get chain by ID","description":"Returns chain configuration by chain ID","parameters":[{"name":"chainId","in":"path","required":true,"schema":{"type":"integer"},"example":11155111}],"responses":{"200":{"description":"Chain details","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Chain"}}}}}},"404":{"description":"Chain not found"}}}},"/api/v1/chains/explorers/all":{"get":{"tags":["Chains"],"summary":"Get all explorer URLs","description":"Returns block explorer URLs for all chains including Casper","responses":{"200":{"description":"Explorer URLs for all chains","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","additionalProperties":{"type":"object","properties":{"url":{"type":"string"},"txPath":{"type":"string"}}},"example":{"casper":{"url":"https://testnet.cspr.live","txPath":"/deploy/"},"sepolia":{"url":"https://sepolia.etherscan.io","txPath":"/tx/"},"robinhood-testnet":{"url":"https://explorer.testnet.chain.robinhood.com","txPath":"/tx/"}}}}}}}}}}}},"components":{"schemas":{"ExposureUnknown":{"type":"object","required":["known","reason"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[false]},"reason":{"type":"string","enum":["unavailable","stale","unsupported","not_determinable","not_applicable"]}}},"ExposureError":{"type":"object","required":["code","message","retryable"],"properties":{"code":{"type":"string","enum":["EXPOSURE_READ_UNAVAILABLE","EXPOSURE_READ_STALE","EXPOSURE_ROUTE_UNKNOWN","EXPOSURE_ROUTE_UNSUPPORTED","EXPOSURE_INVALID_AMOUNT","EXPOSURE_INVALID_ROUTE_ID","EXPOSURE_CHAIN_UNKNOWN","EXPOSURE_RATE_LIMITED","EXPOSURE_TRANSFER_UNKNOWN","EXPOSURE_INVALID_TRANSFER_ID"]},"message":{"type":"string"},"retryable":{"type":"boolean"}}},"ExposureEnd":{"type":"object","additionalProperties":false,"required":["readStatus","observationChain","observationBlock","observationBlockHash","observationStateRoot","observationTime","freshness","contractVersion","formatVersion","policyVersion","domainStatus","routeStatus","domainPaused","globalPaused","domainPausedFlags","globalPausedFlags","gatewayPausedFlags"],"properties":{"readStatus":{"type":"string","enum":["ok","stale","unavailable","unsupported","route_unknown","not_configured","not_read"],"description":"How this end was read; not_configured: this API does not read that contract; not_read: the locating end could not be read"},"observationChain":{"type":"string","pattern":"^(evm:[1-9][0-9]*|casper:[-_a-zA-Z0-9]{1,32})$","nullable":true},"observationBlock":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"EVM block number or Casper block height","nullable":true},"observationBlockHash":{"type":"string","nullable":true,"pattern":"^(0x)?[0-9a-f]{64}$"},"observationStateRoot":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Casper only: the state root every Casper value was read at"},"observationTime":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Block time, milliseconds","nullable":true},"freshness":{"type":"string","enum":["fresh","stale",null],"nullable":true,"description":"Null when no block could be read"},"contractVersion":{"description":"EVM locker VERSION, or the TokenFactory active build version","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"formatVersion":{"description":"FORMAT_VERSION of this end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"policyVersion":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"domainStatus":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["UNCONFIGURED","ACTIVE","DEPOSIT_PAUSED","FULLY_PAUSED","RETIRED"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"routeStatus":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["UNCONFIGURED","ACTIVE","DEPOSIT_PAUSED","FULLY_PAUSED","RETIRED"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"domainPaused":{"description":"The route's own pause flag at this end, domain scope","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"boolean"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"globalPaused":{"description":"EVM: the route's own flag in the global scope. Casper: TokenFactory's global pause","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"boolean"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"domainPausedFlags":{"description":"Every pause flag of the domain scope at this end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"globalPausedFlags":{"description":"EVM only; not_applicable on Casper","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"gatewayPausedFlags":{"description":"The linked gateway's pause flags (send 1, deliver 2); not_applicable when none is linked","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]}}},"ExposureRouteState":{"type":"object","additionalProperties":false,"required":["routeId","serverTime","evm","casper","backingDomainId","operationKind","sourceChain","destinationChain","assetDecimals","minimumCommitmentAmount","maximumCommitmentAmount","custodyCeiling","custodyUsed","custodyRemaining","representationCeiling","routeOutstanding","routeAllocation","largeReleaseThreshold","queueDelaySeconds","releaseCapacity","releaseWindowSeconds","releaseAvailableNow","releaseDebt","inboundQueueLength","inboundQueuedAmount","recoveryShortfall"],"properties":{"routeId":{"type":"string","pattern":"^0x[0-9a-f]{64}$"},"serverTime":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"The API's clock when the response was composed, milliseconds"},"evm":{"$ref":"#/components/schemas/ExposureEnd"},"casper":{"$ref":"#/components/schemas/ExposureEnd"},"backingDomainId":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"operationKind":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["LOCK_MINT","BURN_UNLOCK","LOCK_MINT_WRAPPED","BURN_WRAPPED_UNLOCK"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sourceChain":{"description":"The end that commits","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(evm:[1-9][0-9]*|casper:[-_a-zA-Z0-9]{1,32})$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"destinationChain":{"description":"The end that executes","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(evm:[1-9][0-9]*|casper:[-_a-zA-Z0-9]{1,32})$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"assetDecimals":{"description":"The source end's domain decimals","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"minimumCommitmentAmount":{"description":"Source end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"maximumCommitmentAmount":{"description":"Source end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"custodyCeiling":{"description":"Custody-inflow (lock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"custodyUsed":{"description":"Custody-inflow (lock) end: acceptedCustody","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"custodyRemaining":{"description":"Custody-inflow (lock) end; zero when a reduced ceiling is below use","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"representationCeiling":{"description":"Custody-inflow (lock) end: representation reserved by locks","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"routeOutstanding":{"description":"Custody-inflow (lock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"routeAllocation":{"description":"Custody-inflow (lock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"largeReleaseThreshold":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"queueDelaySeconds":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"releaseCapacity":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"releaseWindowSeconds":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"releaseAvailableNow":{"description":"Releasing (unlock) end, at its observation","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"releaseDebt":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"inboundQueueLength":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"inboundQueuedAmount":{"description":"Releasing (unlock) end; known for an empty or one-entry queue","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"recoveryShortfall":{"description":"The domain's origin custody end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]}}},"ExposurePreflight":{"type":"object","additionalProperties":false,"required":["routeId","serverTime","evm","casper","backingDomainId","operationKind","sourceChain","destinationChain","assetDecimals","minimumCommitmentAmount","maximumCommitmentAmount","custodyCeiling","custodyUsed","custodyRemaining","representationCeiling","routeOutstanding","routeAllocation","largeReleaseThreshold","queueDelaySeconds","releaseCapacity","releaseWindowSeconds","releaseAvailableNow","releaseDebt","inboundQueueLength","inboundQueuedAmount","recoveryShortfall","requestedAmountRaw","expectedCommittedAmountRaw","admissible","refusingRule","willQueue","destinationRefusingRule","destinationHoldReason","estimatedExecutionTime","bridgeFee","feeRefundability","notices"],"properties":{"routeId":{"type":"string","pattern":"^0x[0-9a-f]{64}$"},"serverTime":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"The API's clock when the response was composed, milliseconds"},"evm":{"$ref":"#/components/schemas/ExposureEnd"},"casper":{"$ref":"#/components/schemas/ExposureEnd"},"backingDomainId":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"operationKind":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["LOCK_MINT","BURN_UNLOCK","LOCK_MINT_WRAPPED","BURN_WRAPPED_UNLOCK"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sourceChain":{"description":"The end that commits","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(evm:[1-9][0-9]*|casper:[-_a-zA-Z0-9]{1,32})$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"destinationChain":{"description":"The end that executes","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(evm:[1-9][0-9]*|casper:[-_a-zA-Z0-9]{1,32})$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"assetDecimals":{"description":"The source end's domain decimals","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"minimumCommitmentAmount":{"description":"Source end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"maximumCommitmentAmount":{"description":"Source end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"custodyCeiling":{"description":"Custody-inflow (lock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"custodyUsed":{"description":"Custody-inflow (lock) end: acceptedCustody","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"custodyRemaining":{"description":"Custody-inflow (lock) end; zero when a reduced ceiling is below use","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"representationCeiling":{"description":"Custody-inflow (lock) end: representation reserved by locks","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"routeOutstanding":{"description":"Custody-inflow (lock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"routeAllocation":{"description":"Custody-inflow (lock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"largeReleaseThreshold":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"queueDelaySeconds":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"releaseCapacity":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"releaseWindowSeconds":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"releaseAvailableNow":{"description":"Releasing (unlock) end, at its observation","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"releaseDebt":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"inboundQueueLength":{"description":"Releasing (unlock) end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"inboundQueuedAmount":{"description":"Releasing (unlock) end; known for an empty or one-entry queue","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"recoveryShortfall":{"description":"The domain's origin custody end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"requestedAmountRaw":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"},"expectedCommittedAmountRaw":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Equals requestedAmountRaw: fixed-unit assets only; the fee is a separate native charge"},"admissible":{"description":"Source end: whether the commitment would be accepted at its observation","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"boolean"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"refusingRule":{"description":"Source end: the first contract error the commitment would revert with; null when admissible","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["Paused","CommitmentsNotActive","CommitmentsPaused","RepresentationTokenNotSet","AmountOutOfRange","CustodyCeilingExceeded","RouteAllocationExceeded","RepresentationCeilingExceeded","LinkNotSet","LinkMismatch","EnforcedPause","ArithmeticOverflow",null],"nullable":true}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"willQueue":{"description":"Releasing end: whether the release would queue instead of executing on arrival; needs both ends","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"boolean"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"destinationRefusingRule":{"description":"Destination end: the contract error a delivery would revert with now; null when accepted; needs both ends","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["EnforcedPause","ERC7786RecipientUnauthorizedGateway","NotLinkedGateway","NotLinkedSender","InvalidPayload","DecimalsMismatch","DecimalMismatch","ReleaseExceedsOutstanding","ArithmeticOverflow",null],"nullable":true}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"destinationHoldReason":{"description":"Destination end: why the transfer would be held on arrival, NONE if not; not_determinable when refused","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["NONE","STATUS","PAUSED","UNMAPPED","ALLOCATION","RECOVERY"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"estimatedExecutionTime":{"description":"Destination end: seconds after arrival until it can execute; only when determinable","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"bridgeFee":{"description":"Source end: native-currency fee (wei on EVM, motes on Casper)","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"feeRefundability":{"type":"string","enum":["non_refundable_after_commitment"]},"notices":{"type":"array","items":{"type":"string","enum":["This is an estimate, not a reservation. Concurrent transfers can change queue position and available capacity.","A committed transfer cannot be cancelled or refunded by the user.","The bridge fee is not refunded after commitment. Completing a queued or held transfer charges no protocol fee."]},"minItems":3,"maxItems":3}}},"ExposureTransferEnd":{"type":"object","additionalProperties":false,"required":["readStatus","role","observationChain","observationBlock","observationBlockHash","observationStateRoot","observationTime","freshness","contractVersion","formatVersion"],"properties":{"readStatus":{"type":"string","enum":["ok","stale","unavailable","unsupported","route_unknown","not_configured","not_read"],"description":"How this end was read; not_configured: this API does not read that contract; not_read: the locating end could not be read"},"role":{"type":"string","enum":["source","destination",null],"nullable":true,"description":"This end's role for the transfer's route; null when no route was read"},"observationChain":{"type":"string","pattern":"^(evm:[1-9][0-9]*|casper:[-_a-zA-Z0-9]{1,32})$","nullable":true},"observationBlock":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"EVM block number or Casper block height","nullable":true},"observationBlockHash":{"type":"string","nullable":true,"pattern":"^(0x)?[0-9a-f]{64}$"},"observationStateRoot":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Casper only: the state root every Casper value was read at"},"observationTime":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Block time, milliseconds","nullable":true},"freshness":{"type":"string","enum":["fresh","stale",null],"nullable":true,"description":"Null when no block could be read"},"contractVersion":{"description":"EVM locker VERSION, or the TokenFactory active build version","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"formatVersion":{"description":"FORMAT_VERSION of this end","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]}}},"ExposureTransferState":{"type":"object","additionalProperties":false,"required":["transferId","serverTime","status","evm","casper","routeId","backingDomainId","operationKind","sourceChain","destinationChain","sourceCommitted","sourceSequence","sourceCommitmentTime","sourcePolicyVersion","messageDelivered","sendId","sourceGateway","receiveId","gatewayDelivered","destinationState","heldReason","recordedHoldReason","amount","recipient","queuedAt","readyAt","queuePosition","queueHead","queueLength","completeBy","completeTarget","actionableNow"],"properties":{"transferId":{"type":"string","pattern":"^0x[0-9a-f]{64}$"},"serverTime":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"The API's clock when the response was composed, milliseconds"},"status":{"type":"string","enum":["unknown","unconfigured","paused","held","queued_waiting_delay","queued_waiting_capacity","queued_behind_head","queued_ready","recovery_held","executed","terminal","committed_not_delivered","delivery_unknown"],"description":"The section 11.2 status read at the destination, or committed_not_delivered / delivery_unknown"},"evm":{"$ref":"#/components/schemas/ExposureTransferEnd"},"casper":{"$ref":"#/components/schemas/ExposureTransferEnd"},"routeId":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"backingDomainId":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"operationKind":{"oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["LOCK_MINT","BURN_UNLOCK","LOCK_MINT_WRAPPED","BURN_WRAPPED_UNLOCK"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sourceChain":{"description":"The end that committed","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(evm:[1-9][0-9]*|casper:[-_a-zA-Z0-9]{1,32})$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"destinationChain":{"description":"The end that executes","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(evm:[1-9][0-9]*|casper:[-_a-zA-Z0-9]{1,32})$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sourceCommitted":{"description":"Source end: whether it holds the commitment","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"boolean"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sourceSequence":{"description":"Source end: the commitment's route sequence","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sourceCommitmentTime":{"description":"Source end: commitment block time, milliseconds","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sourcePolicyVersion":{"description":"Source end: the policy version the commitment was admitted under","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"messageDelivered":{"description":"Destination end: the gateway delivered the message (the destination holds the record its delivery wrote)","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"boolean"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sendId":{"description":"The gateway message id, when the request names it (?sendId=) and it is the sendId of the transfer's indexed source commitment; otherwise not_determinable, and so are receiveId and gatewayDelivered","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"sourceGateway":{"description":"Source end: its linked gateway's ERC-7930 address, the message's sourceGateway","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^0x([0-9a-f]{2})+$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"receiveId":{"description":"receiveId(sourceGateway, sendId) from @astralbeam-io/protocol","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"gatewayDelivered":{"description":"The destination gateway's delivered(receiveId), at the destination's observation","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"boolean"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"destinationState":{"description":"Destination end: the stored state","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["NONE","QUEUED","HELD","EXECUTED","TERMINAL"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"heldReason":{"description":"Destination end: the HELD_* condition blocking the transfer now, NONE if none","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["NONE","STATUS","PAUSED","UNMAPPED","ALLOCATION","RECIPIENT_REFUSED","RECOVERY"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"recordedHoldReason":{"description":"Destination end: the reason of its last hold, as stored","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["NONE","STATUS","PAUSED","UNMAPPED","ALLOCATION","RECIPIENT_REFUSED","RECOVERY"]}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"amount":{"description":"Destination end: the raw amount","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"recipient":{"description":"Destination end: the recipient (EVM address, or Casper account-hash-/hash- key)","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"queuedAt":{"description":"Queued: when it queued, milliseconds","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"readyAt":{"description":"Queued: readyAtMs, when it may complete, milliseconds","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"queuePosition":{"description":"Queued: its position in the domain queue","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"queueHead":{"description":"Queued: the queue head's position","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"queueLength":{"description":"Queued: the queue length","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Canonical decimal integer"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"completeBy":{"description":"The permissionless, fee-free call that completes it; null when nothing does","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","enum":["complete_queued_release","retry_held",null],"nullable":true}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"completeTarget":{"description":"Its argument: the backing domain id (complete_queued_release) or the transfer id (retry_held)","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"string","pattern":"^0x[0-9a-f]{64}$","nullable":true}}},{"$ref":"#/components/schemas/ExposureUnknown"}]},"actionableNow":{"description":"Whether that call, made at the destination's observation, moves it out of its state (a ready head is paid; a held transfer whose condition cleared executes or re-queues)","oneOf":[{"type":"object","required":["known","value"],"additionalProperties":false,"properties":{"known":{"type":"boolean","enum":[true]},"value":{"type":"boolean"}}},{"$ref":"#/components/schemas/ExposureUnknown"}]}}},"Token":{"type":"object","properties":{"id":{"type":"integer"},"casperHash":{"type":"string","nullable":true},"symbol":{"type":"string"},"name":{"type":"string"},"decimalsEth":{"type":"integer"},"decimalsCasper":{"type":"integer"},"originChain":{"type":"string","enum":["evm","casper"]},"wrappedAddress":{"type":"string","nullable":true},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"TokenWithAddresses":{"allOf":[{"$ref":"#/components/schemas/Token"},{"type":"object","properties":{"addresses":{"type":"object","description":"Token addresses on each chain (chainName -> address)","additionalProperties":{"type":"string"},"example":{"sepolia":"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238","base-sepolia":"0x036CbD53842c5426634e7929541eC2318f3dCF7e","polygon-amoy":"0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582"}}}}]},"TokenWithLiquidity":{"allOf":[{"$ref":"#/components/schemas/TokenWithAddresses"},{"type":"object","properties":{"evmLiquidity":{"type":"object","nullable":true,"description":"Available liquidity on each EVM chain for Casper→EVM bridge direction (unlocking ERC-20 tokens). Shows how much can be unlocked on each chain. A chain is absent until its first successful read and once its last successful read is older than 180 seconds (unknown, never 0). Only present for EVM-native tokens (originChain=evm). Returns null for Casper-native tokens since wrapped ERC-20s are minted/burned on demand.","additionalProperties":{"type":"string"},"example":{"sepolia":"5000.00","base-sepolia":"1200.50","polygon-amoy":"0.00"}},"casperLiquidity":{"type":"string","nullable":true,"description":"Accepted custody of the token's backing domain on the Casper TokenFactory (the accepted amount `get_custody_state(backingDomainId)` returns): the native CEP-18 the bridge holds for the asset, which backs the EVM→Casper direction (releasing CEP-18 tokens). One value for all EVM chains. Only present for native Casper tokens (originChain=casper); null for EVM-native tokens, since wrapped CEP-18s are minted/burned on demand, and null until the first successful read. A failed read keeps the last value read for at most 180 seconds after that read; then the value is null (unknown), never 0. Advisory: release capacity and the release queue (exposure preflight) also apply, and the contracts enforce the limits.","example":"10000.00"}}}]},"Chain":{"type":"object","properties":{"id":{"type":"integer"},"chainId":{"type":"integer","example":11155111},"name":{"type":"string","example":"Ethereum Sepolia"},"shortName":{"type":"string","example":"sepolia"},"explorerUrl":{"type":"string","nullable":true},"lockerAddress":{"type":"string","nullable":true,"description":"Locker contract address, resolved from environment config ({NAME}_LOCKER); null when the chain is not configured in this deployment."},"nativeCurrency":{"type":"string","example":"ETH"},"confirmations":{"type":"integer"},"blockTime":{"type":"string","example":"0.4000"},"isEnabled":{"type":"boolean"},"isPrimary":{"type":"boolean"}}},"Transaction":{"type":"object","properties":{"id":{"type":"string","pattern":"^[0-9]+$"},"txType":{"type":"string","enum":["lock","mint","burn","unlock","lock_native","mint_wrapped","burn_wrapped","unlock_native"]},"direction":{"type":"string","enum":["eth2casper","casper2eth"]},"evmChainId":{"type":"integer","nullable":true},"evmChainName":{"type":"string","nullable":true},"sourceChain":{"type":"string"},"sourceTxHash":{"type":"string"},"sourceVerified":{"type":"boolean","description":"False for provisional Casper source or destination-first observations until the API verifies the Casper execution. Such rows are visible for tracking but excluded from confirmed statistics and cannot be completed."},"sourceBlock":{"type":"string","nullable":true},"sourceLogIndex":{"type":"integer","nullable":true,"deprecated":true,"description":"Historical position: EVM transaction index, not event log index. Retained for compatibility."},"sourceEventIndex":{"type":"integer","nullable":true,"description":"Actual EVM receipt log index (ethers Log.index); null for unresolved legacy or Casper sources."},"sourceTxIndex":{"type":"integer","nullable":true,"description":"EVM transaction position used for Casper eth_tx_index correlation."},"sourceBlockHash":{"type":"string","nullable":true},"sourceContract":{"type":"string","nullable":true},"sourceEventIdentity":{"type":"string","nullable":true,"example":"evm:1:0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:7"},"tokenId":{"type":"integer","nullable":true},"sourceTimestamp":{"type":"string","format":"date-time","nullable":true},"destinationChain":{"type":"string","nullable":true},"destinationTxHash":{"type":"string","nullable":true,"description":"May be a provisional destination observation while status is submitted. A hash alone does not prove completion; use status. Provisional hashes can be cleared after a reorganization."},"amount":{"type":"string","nullable":true,"description":"Human-readable decimal amount; null when token decimals are unavailable","example":"0.05"},"amountRaw":{"type":"string","description":"Integer base units","example":"50000000000000000"},"destinationBlock":{"type":"string","nullable":true},"destinationTimestamp":{"type":"string","format":"date-time","nullable":true},"nonce":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"retryCount":{"type":"integer"},"sender":{"type":"string"},"recipient":{"type":"string"},"senderPublicKey":{"type":"string","nullable":true,"description":"SDK-verified Casper sender public key including 01/02 algorithm byte; null for unknown or non-Casper source. Does not replace sender."},"recipientPublicKey":{"type":"string","nullable":true,"description":"SDK-verified Casper recipient public key including 01/02 algorithm byte; null for unknown or non-Casper destination. Does not replace recipient."},"status":{"type":"string","enum":["detected","confirming","finalized","attesting","submitted","completed","failed"]},"signaturesCollected":{"type":"integer"},"signaturesRequired":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"transferId":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Exposure-control transfers only: the section 3.3 transferId both chains record (lowercase hex, no 0x). Null on legacy transfers."},"routeId":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Exposure-control transfers only: the route the transfer was committed on."},"sourceSequence":{"type":"string","nullable":true,"pattern":"^(0|[1-9][0-9]*)$","description":"Exposure-control transfers only: the route sequence of the commitment."},"policyVersion":{"type":"string","nullable":true,"pattern":"^(0|[1-9][0-9]*)$","description":"Exposure-control transfers only: the source policy version the transfer was committed under."},"sendId":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Exposure-control transfers only: the source gateway ERC-7786 message id."},"exposure":{"description":"Exposure-control transfers only: the destination outcome as indexed from finalized destination events. History, not authority: read the live status for the current state. Status is completed only from a canonical TransferExecuted. Null on legacy transfers.","anyOf":[{"$ref":"#/components/schemas/ExposureDestination"},{"type":"object","nullable":true,"enum":[null]}]},"explorerLinks":{"$ref":"#/components/schemas/ExplorerLinks"},"updatedAt":{"type":"string","format":"date-time"},"token":{"description":"Joined token metadata; can be absent on list/address/pending responses or null on ID/hash lookup","anyOf":[{"$ref":"#/components/schemas/Token"},{"type":"object","nullable":true,"enum":[null]}]}}},"ExposureDestination":{"type":"object","required":["destinationState","heldReason","queuePosition","queuedAtMs","executedImmediately","destinationUpdatedAt"],"properties":{"destinationState":{"type":"string","nullable":true,"enum":["QUEUED","HELD","EXECUTED","SKIPPED",null],"description":"Last destination event: EXECUTED (TransferExecuted, final), SKIPPED (QueuedTransferSkipped: the destination marked it TERMINAL and the queue moved past it), else the latest TransferQueued or TransferHeld. Null until the destination records the transfer."},"heldReason":{"type":"integer","nullable":true,"description":"HELD only: the HELD_* reason of the hold (1 status, 2 paused, 3 unmapped, 4 allocation, 5 recipient refused, 6 recovery)."},"queuePosition":{"type":"string","nullable":true,"description":"QUEUED only: the position the transfer queued at."},"queuedAtMs":{"type":"string","nullable":true,"description":"QUEUED only: destination block time it queued at, in milliseconds."},"executedImmediately":{"type":"boolean","nullable":true,"description":"EXECUTED only: true when it executed in its delivery transaction, false after a queue or hold."},"destinationUpdatedAt":{"type":"string","format":"date-time","nullable":true,"description":"Block time of the destination event the state comes from."}}},"ExplorerLinks":{"type":"object","description":"Block explorer URLs for transaction hashes","properties":{"source":{"type":"object","nullable":true,"properties":{"url":{"type":"string","example":"https://sepolia.etherscan.io/tx/0x..."},"explorerName":{"type":"string","example":"Ethereum Sepolia"}}},"destination":{"type":"object","nullable":true,"properties":{"url":{"type":"string","example":"https://testnet.cspr.live/deploy/..."},"explorerName":{"type":"string","example":"CSPR Live (Testnet)"}}}}},"Pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"}}},"Stats":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"overall":{"type":"object","description":"Aggregate statistics across all chains","properties":{"totalTransactions":{"type":"integer"},"completedTransactions":{"type":"integer"},"last24Hours":{"type":"object","properties":{"eth2casper":{"type":"integer","description":"Transactions from EVM to Casper in last 24h"},"casper2eth":{"type":"integer","description":"Transactions from Casper to EVM in last 24h"}}}}},"byChain":{"type":"object","description":"Per-chain statistics. Each EVM chain shows both directions (eth2casper for locks starting on that chain, casper2eth for unlocks/mints ending on that chain). The \"casper\" key shows aggregate stats for all Casper-originated transactions.","additionalProperties":{"type":"object","properties":{"transactionsByStatus":{"type":"object","description":"Transaction counts grouped by direction and status","properties":{"eth2casper":{"type":"object","description":"Transactions starting on this chain (locks)","additionalProperties":{"type":"integer"},"example":{"completed":6,"detected":1}},"casper2eth":{"type":"object","description":"Transactions ending on this chain (unlocks/mints from Casper)","additionalProperties":{"type":"integer"},"example":{"completed":8,"detected":4}}}},"volumes":{"type":"object","properties":{"byToken":{"type":"object","description":"Completed transaction volumes grouped by token symbol","additionalProperties":{"type":"object","properties":{"volume":{"type":"string","description":"Formatted volume with decimal adjustment"},"count":{"type":"integer","description":"Number of completed transactions"}}},"example":{"USDC":{"volume":"500.00","count":3},"sCSPR":{"volume":"6010.0","count":3}}}}},"last24Hours":{"type":"object","properties":{"eth2casper":{"type":"integer"},"casper2eth":{"type":"integer"}}}}}},"syncStates":{"type":"object","description":"Indexer sync status per EVM chain","additionalProperties":{"type":"object","properties":{"lastBlock":{"type":"integer"},"lastSyncedAt":{"type":"string","format":"date-time"}}}}}}}}}}}