{"surface":"Iris — the public JSON-RPC endpoint of a SourceLess node","protocol":"JSON-RPC 2.0 over HTTP POST at /. Named parameters only. Every call needs an id.","chainName":"SourceLess Asgard","routes":[{"path":"/","method":"POST","description":"JSON-RPC 2.0. One call or a bounded batch. Named params only; every request needs an id"},{"path":"/rpc","method":"GET","description":"this index: the method catalogue with the cost class of each, the bounds, and how this endpoint is exposed"},{"path":"/health","method":"GET","description":"liveness. Asks the chain nothing at all, so a probe cannot drive it"},{"path":"/ready","method":"GET","description":"readiness: 200 only when this node is fit to be sent client work, 503 with the reason when it is not. A node that is syncing, stuck or serving from state it has given up on is LIVE and NOT ready, and this is the route that can tell you apart"}],"methods":[{"name":"getStatus","cost":"read","params":"{}","description":"chain id, height, head hash, pending count, and whether a write submitted here reaches the network"},{"name":"submissionReach","cost":"read","params":"{}","description":"whether a record submitted here leaves this node, and when it does not, why not"},{"name":"parameters","cost":"read","params":"{}","description":"the consensus parameters actually in force, governed values included"},{"name":"genesis","cost":"read","params":"{}","description":"the genesis hash, the genesis chain id, and the two chain bindings a signature must carry"},{"name":"blockByHeight","cost":"read","params":"{ height }","description":"one block, whole, by its height. null past the head, because polling for the next block is not an error"},{"name":"refusedRecords","cost":"read","params":"{}","description":"records this node considered and did not seal, each with the reason - the answer to 'it was accepted and nothing happened'"},{"name":"attestationRetention","cost":"read","params":"{ height }","description":"what the attestation set for a height IS, not merely how long it is - the answer to \"the array was empty and nothing told me whether nobody signed or this node stopped holding them\""},{"name":"blockByHash","cost":"read","params":"{ hashHex }","description":"one block, whole, by its hash"},{"name":"blockRange","cost":"read","params":"{ fromHeight, count? }","description":"a bounded run of blocks from a height, for an indexer catching up; `count` defaults to 20 and the answer carries `nextHeight`, which is where to ask from next"},{"name":"succinctCheckpoint","cost":"compute","params":"{}","description":"this node's Urd checkpoint — the constant-size recursive proof folded over its whole chain, so a light client that folded the chain itself can compare its own proof against this node's at the same height in one 32-byte comparison. Priced as compute: the fold recomputes a hash per block, and a node still folding its history refuses with how far it has got"},{"name":"addressHistory","cost":"read","params":"{ address, depth? }","description":"transfers touching an address, newest first, so a wallet can show what it RECEIVED and not only what it sent; scans at most the recent-block window and the answer carries `reachedGenesis`, true when that window covered the whole chain"},{"name":"transactionProof","cost":"read","params":"{ txId }","description":"a merkle proof that a transaction is in a block, with the header root to check it against"},{"name":"balances","cost":"read","params":"{ address }","description":"all seven ledgers for one address, with the rule each imposes, plus the settled and next nonce"},{"name":"nonce","cost":"read","params":"{ address }","description":"the settled nonce, the nonce the next signature must carry, and how many are in flight"},{"name":"delegations","cost":"read","params":"{ master?, delegate? }","description":"live Gefjon spending authorities, with how much of each cap this window has left"},{"name":"transaction","cost":"read","params":"{ txId }","description":"queued, settled, final, diverged, abandoned or honestly unknown. `unknown` is not `rejected`"},{"name":"domainHolder","cost":"read","params":"{ domain }","description":"who holds an STR.domain, allocated or proved, or nothing"},{"name":"domainOf","cost":"read","params":"{ address }","description":"the proved STR.domain an address holds, or nothing. The inverse of domainHolder, and the only way to learn a name the CHAIN derived rather than one a wallet claimed"},{"name":"findDomain","cost":"read","params":"{ domain, address?, suggest? }","description":"the whole standing of a name: available, booked, held, in burn cooldown, or barred to `address`. A `null` from domainHolder cannot tell those apart"},{"name":"wnft","cost":"read","params":"{ wnftId }","description":"a wNFT as the chain holds it: entries, versions, slaves and the lock"},{"name":"wnftSequence","cost":"read","params":"{ wnftId }","description":"the next sequence number an identity record must carry"},{"name":"wnftAttribute","cost":"read","params":"{ wnftId, key }","description":"the active value of a PUBLIC attribute. A private entry is a commitment and is never opened here"},{"name":"contractNonce","cost":"read","params":"{ caller }","description":"the next call nonce a contract authorization must sign over, queued records included"},{"name":"contractCatalog","cost":"read","params":"{ address }","description":"the callable ABI of a deployed contract"},{"name":"contractEvents","cost":"read","params":"{ address, after?, limit? }","description":"a page of the event feed of a deployed contract, oldest first, after the sequence cursor `after`. Paged and clamped: at most 256 events and 1 MiB of rows, and the answer says which cap it hit (`clamped`), how many events this node retains and has dropped, whether more remain and the cursor to ask from next. An event too large to fit a page alone comes back with its args withheld and their size stated"},{"name":"contractStorage","cost":"read","params":"{ address, after?, limit? }","description":"a page of a contract's storage slots in key byte order, after the key cursor `after`. Paged and clamped: at most 512 slots and 1 MiB of rows, and the answer says which cap it hit (`clamped`), how many slots the contract holds, whether more remain and the cursor to ask from next. A value too large to fit a page alone comes back withheld with its size stated"},{"name":"governanceState","cost":"read","params":"{}","description":"the parameters in force and the assembly that decides them"},{"name":"validatorRoll","cost":"read","params":"{}","description":"who may seal a block, at the height of the head, with every admission, eviction and suspension that got it there"},{"name":"organisation","cost":"read","params":"{ domain }","description":"an organisation and its departments: who holds it, who may sign for it, and where each department is paid. A department is NOT a signer"},{"name":"collateralReserves","cost":"read","params":"{}","description":"reserves held against minted $TR, so a holder can check the peg themselves"},{"name":"bridgeAttestors","cost":"read","params":"{}","description":"the keys this chain's genesis authorises to mint $TR. An empty list is a real answer"},{"name":"simulateCall","cost":"compute","params":"{ address, functionName, caller, args?, trace? }","description":"runs a call against current state and commits nothing. Gas-bounded. Not a promise: state may move before a queued call is sealed. Set trace:true for a node-local developer-mode per-step VM trace"},{"name":"submitTransaction","cost":"write","params":"{ record }","description":"a signed transfer. Announced to the network when this node has a runtime"},{"name":"allocateDomain","cost":"write","params":"{ record }","description":"a signed STR.domain claim. Announced. An allocated domain may RECEIVE and nothing more; submitRegistration is what admits a transaction"},{"name":"submitRegistration","cost":"write","params":"{ record }","description":"a signed STR.domain proof, which locks 1000 STR. Announced. Takes a proof, never a key"},{"name":"submitWnft","cost":"write","params":"{ record }","description":"an identity record: a new version, a hide, a burn, a slave. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"submitGovernance","cost":"write","params":"{ record }","description":"a proposal, a ballot or an execution. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"submitCollateral","cost":"write","params":"{ record }","description":"a bridge mint or redemption, signed by a genesis attestor. Does NOT gossip"},{"name":"submitCollateralVeto","cost":"write","params":"{ record }","description":"holds a pending bridge mint that ONE declared attestor says is fraudulent, signed by that attestor. Announced to the network when this node has a runtime, unlike every other record submission here, because the challenge window is 600 blocks and a veto waiting for this node slot may arrive after the mint has credited. Holds indefinitely and does not reverse; governance is the only release"},{"name":"submitAttestorSuspension","cost":"write","params":"{ record }","description":"fetters a bridge attestor whose key a quorum believes is compromised. Announced, for the veto reason. From the next block the signature stops counting toward a mint quorum. The threshold is counted against the DECLARED set and never the active one, so a suspension can only make minting harder"},{"name":"submitDomainBurn","cost":"write","params":"{ record }","description":"a signed burn: the one path back out of the 1000 STR lock. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"submitDomainRelinquish","cost":"write","params":"{ record }","description":"a signed relinquish: gives a name up and starts a 30-day lapse clock. Refunds nothing and frees nothing yet. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"submitDomainLapseBurn","cost":"write","params":"{ record }","description":"a signed lapse burn: destroys a relinquished name after its 30 days. The refund goes to the FORMER HOLDER, never to the executor. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"submitWnftTransfer","cost":"write","params":"{ record }","description":"a domain sale, signed by BOTH parties over identical bytes. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"submitGefjon","cost":"write","params":"{ record }","description":"a spending delegation: a grant or revocation signed by the master, or a spend signed by the delegate. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"submitFenrir","cost":"write","params":"{ record }","description":"a validator bond record - Fenrir: a bond posted, its unbonding begun, or its withdrawal taken. Signed by the key that SEALS BLOCKS, because that is the key an ejection names, and a bond signed by any other key is refused at this door. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"submitWrapRecord","cost":"write","params":"{ record }","description":"a signed WSTR wrap or unwrap. Queued on THIS node and NOT gossiped from this door: Kvasir carries the kind between peers, but this method writes to the local chain queue, so it waits for the slot of THIS node - up to one full rotation of the validator roll. See submissionReach"},{"name":"submitKeyRotation","cost":"write","params":"{ record }","description":"an account key rotation: signed by BOTH the retiring key and the new one over identical bytes. Moves the STR.domain, the lock and every balance to the new address and retires the old one. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, because a holder rotating off an exposed key is racing whoever holds it. Checked at this door for shape, size and both signatures before it is announced. See submissionReach"},{"name":"accountAuthority","cost":"read","params":"{ address }","description":"where an account authority is now, and the rotation index the next rotation of it must carry"},{"name":"deployContract","cost":"write","params":"{ source: { name, source, compilerVersion? }, deployer, salt?, authorization? }","description":"queues a deployment and returns the address it will have. Nothing executes here. `compilerVersion`, when given, is checked BY NAME against the compiler this node runs and the rule version in force, and a mismatch is refused rather than compiled - the address is derived from the bytecode THIS node builds, so a foreign compiler is a different address on every node that runs one"},{"name":"callContract","cost":"write","params":"{ address, functionName, caller, args?, authorization? }","description":"queues a call for the next block. Returns a receipt, not a result — use simulateCall for that"},{"name":"space","cost":"read","params":"{ spaceId }","description":"one hostless space as this chain holds it: creator, visibility, price and the manifest root its content commits to. Public chain state, so no signature is asked for"},{"name":"spaceList","cost":"read","params":"{ limit?, after? }","description":"the hostless spaces this chain holds, in chain order, one page at a time: at most 64 rows, and `next` is the cursor to pass as `after` for the following page (null on the last). Says nothing about content: the chain never sees a chunk"},{"name":"spacesFor","cost":"read","params":"{ reader, limit?, after? }","description":"the spaces that name one reader — { kind: address|domain, id } — as their creator or on a grant, from the registry index rather than a scan, paged like spaceList. Each row says the role, any lapse height and whether the grant has lapsed. Public chain state, so no signature is asked for"},{"name":"spaceRecords","cost":"read","params":"{ spaceId }","description":"the creator-signed Oort records that built a space — create, grants, revokes and rotations. A light reader replays them itself to derive the anchored root from the creator's signature rather than this node's word. Public chain state, not a block body"},{"name":"spaceHolders","cost":"read","params":"{ spaceId }","description":"which nodes this node believes are holding a space, from its own Arecibo index, whether it is announcing the space itself, and the own id of this node (what a key request names as its audience)"},{"name":"submitOortRecord","cost":"write","params":"{ record }","description":"a signed Oort record — create, grant, revoke or rotate. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, so a space does not wait for the one seat a public endpoint happens to front. Checked at this door for shape, size, Styx and the creator signature against this chain before it is announced. See submissionReach"},{"name":"spaceAnnounce","cost":"write","params":"{ request, beacon }","description":"a creator-signed beacon, so this node announces it is holding the space. Refused unless the request is signed by the space's creator and the chain says the space is public"},{"name":"spacePublish","cost":"write","params":"{ request, manifest, chunk }","description":"one sealed 256 KiB chunk into this node's store, for it to serve. Refused unless the request is signed by the space's creator. No key crosses this door and this node cannot read what it serves"},{"name":"spaceFetch","cost":"write","params":"{ request }","description":"asks the holders Arecibo named for a whole space epoch, on behalf of a reader the chain says may read it. Returns a verdict, not the content"},{"name":"spaceManifest","cost":"write","params":"{ request, epoch? }","description":"what this node holds of a space and which chunks are still missing. Priced as a write: it costs a signature verification"},{"name":"spaceChunk","cost":"write","params":"{ request, epoch, index }","description":"one sealed chunk and its Merkle proof, to a reader the chain says may read it. Ciphertext only — the space key is never here, in either direction"},{"name":"spaceDeliverEnvelope","cost":"write","params":"{ envelope }","description":"a Perihelion key envelope: the space key wrapped to ONE reader's KEM public key and signed by the space's creator, kept on this holder for that reader to fetch. Refused unless the signature is the creator's on this chain and the chain admits the reader. This node cannot open it, and a validator seat keeps none"},{"name":"spaceEnvelope","cost":"write","params":"{ request }","description":"the key envelope this holder keeps for the reader who signed a KEY request naming this holder as its audience (its node id, from spaceHolders), or null and why. Refused on a validator seat, and to a reader the chain does not admit. Only the reader's own KEM secret opens it. Priced as a write: it costs a signature verification"},{"name":"occultationInbox","cost":"read","params":"{ domain }","description":"a participant's published inbox key — the hybrid KEM public key a sender seals to — as this chain holds it, or null. Public chain state"},{"name":"occultationThread","cost":"read","params":"{ threadId, reader? }","description":"a thread as this chain holds it: its head, its current key epoch, its opener, its current participants and every member it has ever had. The head is what a new post must name. With reader, also this chain's verdict on whether that domain may read the current epoch. Null for a thread this chain has never seen"},{"name":"occultationTranscript","cost":"read","params":"{ threadId, from?, limit? }","description":"a page of a thread's transcript index: each post's position, sender, epoch, commitment, the head it extended, the height it landed at, and every reader who has signed a receipt for it. Commitments only — the chain holds no message body, so neither does this. Paged and clamped; the answer says what it clamped to and whether more remain"},{"name":"occultationPost","cost":"read","params":"{ threadId, commitmentHex }","description":"one post as this chain holds it and the readers who signed for it — did the message land, where in the thread, at what height, and who acknowledged it. A receipt says a reader who MAY read was willing to sign for the message; it is not proof of delivery, which no chain can see"},{"name":"occultationMayRead","cost":"read","params":"{ threadId, reader, epoch }","description":"whether this chain says a domain may read a thread at a given key epoch, and the reason either way. Asked about an epoch and not about the present, because a message belongs to the epoch it was written under"},{"name":"occultationNonce","cost":"read","params":"{ address }","description":"the highest Occultation nonce a signer has SETTLED, or null for one that has never signed here. Settled, not pending: a client producing several records before the next block counts up locally from this"},{"name":"submitOccultationRecord","cost":"write","params":"{ record }","description":"a signed Occultation record — an inbox key published, a thread opened, re-keyed, posted to or acknowledged — queued for a block. The chain holds no plaintext: only the commitment. Announced to the network when this node has a runtime: it is gossiped over Kvasir and sealed by whichever node leads next, rather than waiting for the slot of THIS node. Checked at this door for shape, size and signature before it is announced. See submissionReach"},{"name":"occultationRekey","cost":"read","params":"{ threadId, epoch }","description":"the wrap commitment per participant that the open (epoch 0) or rekey record of a thread epoch carried, and the height and block it landed in, from a NODE-LOCAL index of the blocks this node holds. Not chain state and in no state root: a miss says whether it is authoritative (complete) or only this node not knowing (pruned, catching up). A reader checks a delivered wrap against this before keeping its key"},{"name":"courierStatus","cost":"read","params":"{}","description":"whether this node runs a Talaria courier for STR.talk, the reason when it does not, how full it is in counts only, and every bound it holds itself to. Off by default; never on a validator seat"},{"name":"courierDeposit","cost":"write","params":"{ parcel }","description":"one parcel sealed to a recipient's published Occultation inbox key, held until collected or expired. Anonymous, judged on shape and bounds only - the courier holds no key and cannot read it - and metered per client. Refused for a domain whose inbox key on this chain is not the one the parcel was sealed to"},{"name":"courierFetch","cost":"write","params":"{ request }","description":"a page of the signer's parcels, oldest first, to a fetch request signed by the account this chain says holds the domain. Sealed bytes only. Priced as a write: it costs a signature verification"},{"name":"courierAck","cost":"write","params":"{ request }","description":"forgets parcels the recipient has safely stored, to an acknowledgement signed by the holder of the domain. Ids addressed to anybody else are ignored"}],"bounds":{"maxBodyBytes":524288,"maxBatch":20,"maxUrlLength":2048,"contentLengthRequired":true,"note":"A POST must declare Content-Length. The length prefix is what lets an oversized or unaffordable body be refused before it is allocated, which is the same rule the wire framing follows and the reason a charge levied after the decode buys nothing."},"limits":{"keyedBy":"the client a policy the operator chose names, and the socket peer address otherwise. The policy this tree ships believes X-Real-IP from a loopback peer only, which is the local proxy in front of this port; a peer anywhere else is charged to its own socket.","read":{"perSecond":32,"burst":128},"writeAndCompute":{"perSecond":4,"burst":32},"bytes":{"perSecond":1048576,"burst":4194304},"refusal":"HTTP 429 with Retry-After and JSON-RPC code -32000. A refusal is a wait: no connection is dropped, no address is banned and nothing is remembered as hostile."},"exposure":{"kind":"loopback","host":"127.0.0.1","note":"Bound to loopback. Nothing leaves this machine."},"authentication":"None, and that is the design. Every write here is a record that carries its own signature over its own fields plus this chain's genesis hash, so there is no caller to authenticate — there is only work to bound, which is what the limits above do. This endpoint holds no key and will never take one: see JsonRpcSurface.submitRegistration.","reads":"Reads are public and answer whatever this node holds. `transaction` returns `unknown` for a transaction this node cannot find, and `unknown` is NOT a statement that it failed — do not render it as rejected.","notServedHere":{"blocks":"Bounded block reads only: blockByHeight, blockByHash and blockRange, which caps a call. A service that needs the whole chain should follow it itself rather than page a node for it: see Fylgja (src/explorer/fylgja.ts), which joins the network as its own read-only node and holds a full copy.","operations":"Nothing privileged. Producing a block, reading the audit trail and every other operator action lives on Gungnir and Astrolabe, behind a Themis role table, and none of it is reachable from here."}}