The webapp API, native LCD and native transaction messages are different contracts. Use the matching deployed API revision and release codecs. This index points to verified field definitions rather than treating one generic body as valid everywhere.
| Request family | Canonical contract |
|---|---|
| Wallet login, bearer and guild signup | Authentication API |
| Device activation, consent and metadata | Player address API |
| Player/search queries | Player API |
| Public guild directory/filter | Guild API |
| Native signed broadcast | Submit transaction |
| Native message fields | Release message catalog |
POST /api/auth/signup requires primary_address, signature, pubkey and
guild_id. Optional profile fields are username, pfp and
pfp_client_render_attributes. The proof is over
GUILD{guildId}ADDRESS{address}NONCE0. HTTP 202 accepts asynchronous onboarding;
it does not establish native registration or a login session.
POST /api/auth/login or /api/auth/token requires address, signature,
pubkey, guild_id and canonical decimal unix_timestamp. Sign SHA-256 of the
exact UTF-8 bytes LOGIN_GUILD{guildId}ADDRESS{address}DATETIME{unix_timestamp}.
The timestamp must be less than 600 seconds from server time in either direction.
These proofs use a compressed secp256k1 public key as 66 hex characters and a raw
R+S signature as 128 hex characters. There is no caller-selected message field.
See authentication schemas for response and session handling.
Names and PFPs use native MsgPlayerUpdateName, MsgPlayerUpdatePfp and
MsgPlayerUpdatePfpClientRenderAttributes. Validate with the release rules and
encode the native message; a webapp profile request does not replace a transaction.
Use the deployed player search parameters. Do not add
invented status filters or assume entity-detail fields are accepted query inputs.
Use the player transfer search contract. Player selection resolves the recipient’s vault for payment; a literal non-player address remains literal. Search results do not authorize the sender’s spend.
POST /api/auth/player-address requires player_id, guild_id, code,
activation_id, address, signature and pubkey; user_agent is optional.
The proof is bound to the current native registration context and issued activation
UUID. Persist the new key once and retain its consent; acceptance is not registration.
POST /api/player-address/meta requires an authenticated owner, address,
guild_id and optional user_agent. The server derives IP from the request.
It is private device metadata, not an arbitrary metadata-object write.
POST /api/player-address/activation-code accepts logged_in_address and
guild_id from the authenticated owner. Retain the returned code and UUID together.
A reused short code is a different activation instance.
PUT /api/player-address/pending/permissions accepts code, activation_id,
address and a numeric permissions mask, not a list of names. This records an
owner’s proposal; the native registration transaction establishes authority.
See the device API for accepted mask bounds.
PUT /api/player-address/permissions returns 410 chain_transaction_required.
Prepare MsgPermissionSetOnAddress, preserving unexposed bits and checking the
signer’s ceiling over both removed and granted permissions. Observe inclusion
before adopting the indexed result.
POST /cosmos/tx/v1beta1/txs accepts this broadcast envelope:
{"tx_bytes":"BASE64_OF_SIGNED_TXRAW","mode":"BROADCAST_MODE_SYNC"}
The signed protobuf TxRaw contains encoded body/auth-info and signatures. A JSON
object containing body, auth_info and signatures is not the LCD request above.
Keep account number, sequence, amounts, ranks and heights exact; select fees for
the actual message set. Ordinary fees use the chain’s configured denomination
(ualpha here), not an invented ustructs asset.
Prepare native messages, memo and applicable timeout height, then encode them with the matching release codecs. Never change an already signed body to retry a timeout.
Encode the ordinary signer’s public key/mode/sequence and chosen fee/gas policy. A player or guild vault is an asset owner and never a substitute signing key.
Native JSON descriptions use registered @type URLs, but actual broadcast carries
signed protobuf bytes. Refer to the message catalog
and release tx.proto for fields. For example, MsgAllocationTransfer takes
creator, allocationId and ownerId (player or guild), not an old controller
field. Native uint64 values must not pass through lossy JavaScript Numbers.
A CheckTx code zero means admitted, not committed. Persist the one signed identity and reconcile its outcome; do not repeat the send after an uncertain response.
Pagination is endpoint-specific. Native key pagination and webapp page/limit parameters are not interchangeable. Respect advertised limits and continuation fields; an incomplete page is not a complete empty balance or permission result.
Use the public /api/guild/name filter fields in the guild contract.
Use the public /api/guild/directory paging fields in the guild contract.
Preserve its response shape and exact values; do not invent a universal 20-row limit.
Reviewed against: webapp 43bc1086 authentication/device/query contracts and
structsd release 96cea3a transaction definitions.