XGR.NETWORK / DOCUMENTATION

Interchain JSON-RPC

Interchain JSON-RPC reference

Documentation index. Source: public xgr-node jsonrpc/xgr_interchain.go, xgr_interchain_validators.go, xgr_iln_quorum.go, xgr_iln_indexer_status.go.

Parameter conventions

The examples below are request/response shapes, not observations of a live transfer. Replace ROUTE, MESSAGE_ID, SOURCE_BLOCK, SET_ID and PROPOSAL_ID with independently obtained values. Numeric uint64 parameters use JSON numbers, not hex quantity strings. Very large numbers require an exact-integer client; do not round with JavaScript Number.

For route ID 0x followed by 64 lowercase hex digits, the canonical node route name is:

iln_<sourceDomain>_<destinationDomain>_<routeIdWithout0x>

The parser rejects zero domains, zero route ID, extra components, nonhex characters and noncanonical decimal representations. A route name is not just base or arbitrum; those names are used for physical-chain configuration/membership commands.

xgr_requestILNQuorum(route, messageId, sourceBlockNumber)

Parameters, in order: canonical route name (string), nonzero 0x-prefixed 32-byte original message ID (string), nonzero original source RPC block number (uint64). This creates an idempotent discovery/processing hint, not an instruction to sign supplied bytes. The worker must reconstruct and validate actual source evidence.

{"jsonrpc":"2.0","id":1,"method":"xgr_requestILNQuorum","params":["ROUTE","MESSAGE_ID",12345678]}

Successful result shape:

{"route":"ROUTE","messageId":"MESSAGE_ID","sourceBlockNumber":12345678,"status":"PENDING"}

The node requires a fresh worker heartbeat (10-second admission check), local Interchain storage and either a discovered route or parseable deterministic discovery hint. Unknown route hints and per-route message request queues are bounded to 128 entries. A 15-minute request lease permits retry of stale hints; repeating the same identity/source block is idempotent. Reusing a live request with a different source block is rejected. Queue admission never replaces Registry/source validation.

Typical error messages include ILN worker not available, route is not configured or discovered locally, ILN discovery hint queue full, ILN request queue full; retry later, invalid message ID, missing source block and conflicting persisted request identity.

xgr_getILNQuorum(route, messageId)

{"jsonrpc":"2.0","id":2,"method":"xgr_getILNQuorum","params":["ROUTE","MESSAGE_ID"]}

Returns route, messageId, sourceBlockNumber, status and, when recorded, votes, quorumThreshold, failureCategory, updatedUnix.

Status Meaning and action
NOT_FOUND No local archived quorum/progress/request; request the original message using its source block
PENDING An admission hint exists; no conclusion about valid signatures yet
EXPIRED_RETRY Admission hint exceeded its lease; repeat the same original identity
PARTIAL_QUORUM Recorded valid progress below threshold; inspect votes/eligible validator availability
RETRYING_VALIDATION Worker is retrying canonical evidence validation; inspect failure category/source RPC
AVAILABLE_UNVERIFIED Local quorum data exists; current destination set and execution validity still require verification

Progress records are diagnostics, not authorization. The implementation bounds accepted progress-record size and age, and matches recorded route/message identity. AVAILABLE_UNVERIFIED can refer to a stale set after rotation and is never equivalent to Mailbox.delivered == true.

xgr_getILNQuorumAttestation(route, messageId, setId)

{"jsonrpc":"2.0","id":3,"method":"xgr_getILNQuorumAttestation","params":["ROUTE","MESSAGE_ID",7]}

Returns the complete archived attestation for the explicitly requested nonzero destination set. It does not silently choose another set. The reader enforces Direct-BLS domain, required fields, canonical payload consistency, nonempty bitmap and aggregate lengths. It returns an error if no matching attestation exists, storage is invalid or archived identity/set does not match.

Result field Type and meaning
version XITA_DIRECT_MESSAGE_V1
chain, optional destination Node route label and destination diagnostic label
originChainId, originDomain, destinationDomain Signed source/destination identities
routeId, setId, sourceBlockNumber Signed directed route, destination epoch and original source block
registry, gateway, sourceRouter, mailbox Signed source contract bindings
destinationRouter, destinationIsm, destinationRegistry Signed recipient/authentication contract bindings
validatorFeeWei Exact unsigned fee as a decimal string
authorizedMessageId Original dispatched message hash
payload Canonical fixed-width signing bytes, hex
signerBitmap Bitmap in canonical destination Registry order, hex
aggregateSignatureCompressed 96-byte compressed aggregate, hex
aggregateSignature 256-byte EIP-2537 aggregate, hex

Do not sort validators before interpreting the bitmap. Compare setId with the live destination registry and verify the quorum/ISM on that destination. The archival read does not prove that the set is current, that the recipient can execute or that the message has not already been delivered.

xgr_getInterchainAttestation(route) and xgr_getILNInterchainAttestation(route,messageId)

These compatibility methods read the route's latest archive or its message archive respectively. They return the same validated Direct-BLS result structure. Old implementation comments or method labels containing “checkpoint” do not turn the current result into a Merkle proof. For delivery prefer the explicit-set method above, because an arbitrary latest entry need not be the desired message/current set. xgr_getInterchainAttestationByCheckpoint is not documented as a supported current method.

xgr_getInterchainValidators(destinationName)

{"jsonrpc":"2.0","id":4,"method":"xgr_getInterchainValidators","params":["base"]}

Result fields: destination, chainId, domain, configured registry, setId, count, quorumThreshold and ordered validators entries with address and 48-byte compressed blsPublicKey. This reads the configured destination's membership set; callers cannot supply their own RPC/Registry. It rejects unknown destinations and invalid, empty, duplicate or malformed set entries.

Quorum threshold is ceil(2*n/3) = (2*n+2)/3 with integer division. This is not XGRChain stake-weighted voting. A one-member set is representable; the API does not prove sufficient operational decentralization or current node uptime.

xgr_getILNGovernanceQuorum(proposalId)

{"jsonrpc":"2.0","id":5,"method":"xgr_getILNGovernanceQuorum","params":["PROPOSAL_ID"]}

Read-only retrieval of a completed source fee quorum. Result fields: version, proposalId, sourceChainId, sourceDomain, registry, decimal-string validatorFeeWei, setId, nonce, Unix validUntil, canonical hex payload, signerBitmap, both aggregate signature encodings. Reading does not create, approve or execute a proposal. Validate source bindings, current set, expiry and next on-chain nonce before execution; the method does not expose a route-admission governance mechanism.

xgr_getILNIndexerStatus()

{"jsonrpc":"2.0","id":6,"method":"xgr_getILNIndexerStatus","params":[]}

Top-level fields: version (schema 2), updatedUnix, workerAlive, state, routes. Each route includes route, source, destination, state, sourceHead, scanCursor, blockLag, sourceHeadKnown, scanCursorKnown, optional lastSuccessfulScanUnix, updatedUnix, optional error.

The implementation marks a heartbeat snapshot older than two minutes, or more than 30 seconds in the future, as stalled. It derives aggregate state from worker and per-route states; therefore inspect per-route errors and timestamps rather than treating a single summary string as a cryptographic health certificate. Unknown head/cursor fields are not evidence of zero lag. This monitor is independent of the XITA transfer indexer's database.

HTTP transport and error handling

curl -fsS http://127.0.0.1:8545 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"xgr_getILNIndexerStatus","params":[]}'

Check JSON-RPC error, not only HTTP status or curl exit code. Application errors use the node dispatcher's JSON-RPC envelope with a message; this reference does not assign invented stable error codes to implementation errors. Missing files, malformed storage, worker unavailability and destination RPC failures must remain visible and must not be transformed into successful proof readiness. Deploy authenticated/rate-limited RPC infrastructure according to operator policy; public quorum hints never provide arbitrary signing authority.

Local storage diagnostics

Disk usage is exposed by the local xgrchain ibft interchain storage-status --json command, not by an Interchain JSON-RPC method. See the CLI result schema. The eight methods above expose message, membership, fee-quorum and worker state; they do not expose filesystem counters.