Version: 1.1.0 Category: actions Description: Complete catalog of all game actions/commands for AI agents
| Category | Actions |
|---|---|
| construction | MsgStructBuild, MsgStructBuildInitiate, MsgStructBuildComplete |
| combat | MsgStructAttack, MsgPlanetRaidComplete |
| resource | MsgReactorAllocate, MsgReactorInfuse, MsgReactorDefuse, MsgReactorBeginMigration, MsgReactorCancelDefusion, MsgSubstationConnect, MsgSubstationCreate, MsgSubstationPlayerConnect, MsgStructOreMinerComplete, MsgStructOreRefineryComplete |
| economic | MsgProviderCreate, MsgAgreementCreate, MsgOreMining, MsgOreRefining, MsgGeneratorAllocate |
| exploration | MsgPlanetExplore |
| fleet | MsgFleetMove |
| guild | MsgGuildCreate, MsgGuildMembershipJoin, MsgGuildMembershipLeave, MsgGuildMembershipJoinProxy, MsgGuildBankMint, MsgGuildBankRedeem |
| ugc | MsgPlayerUpdateName, MsgPlayerUpdatePfp, MsgGuildUpdateName, MsgGuildUpdatePfp, MsgPlanetUpdateName, MsgSubstationUpdateName, MsgSubstationUpdatePfp |
| struct-management | MsgStructActivate, MsgStructDeactivate, MsgStructStealthActivate, MsgStructStealthDeactivate, MsgStructDefenseSet, MsgStructDefenseClear, MsgStructMove |
| Requirement | Description |
|---|---|
| playerOnline | Player must be online (not halted) |
| sufficientResources | Player must have sufficient resources |
| sufficientCharge | Struct must have sufficient charge |
| proofOfWork | Action requires proof-of-work computation |
| validLocation | Location must be valid and accessible |
| validTarget | Target must be valid and attackable |
POST /cosmos/tx/v1beta1/txsIMPORTANT: Transaction status ‘broadcast’ does NOT mean action succeeded! Validation happens on-chain after broadcast. Always verify game state to confirm action occurred.
Common Validation Failures:
See patterns/validation-patterns.md for detailed validation patterns.
struct-build/structs.structs.MsgStructBuildPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, structType, locationType, locationId
Optional Fields: gridAttributes
Follow-Up Action: MsgStructBuildComplete
| Requirement | Details |
|---|---|
| playerOnline | true |
| sufficientResources | true |
| validLocation | true |
| commandShipOnline | If building on planet: Command Ship must be built AND online in fleet. Check: query fleet for Command Ship struct, verify status is ‘online’. |
| fleetOnStation | If building on planet: fleet must be ‘onStation’ (not ‘away’). Check: query fleet status. |
| sufficientPower | Must have power capacity > struct passive draw. Check: query player power capacity vs struct requirements. |
Transaction may broadcast but struct not created if requirements not met. Always verify game state after broadcast.
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructBuild",
"creator": "structs1...",
"structType": "1",
"locationType": 1,
"locationId": "1-1"
}
]
}
}
struct-build-initiate/structs.structs.MsgStructBuildInitiatePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_build_initiate.go:18-88proto/structs/structs/tx.proto:660-669Required Fields: creator, playerId, structTypeId, operatingAmbit, slot
Follow-Up Action: MsgStructBuildComplete
| Requirement | Details |
|---|---|
| playerOnline | true |
| sufficientResources | true |
| validLocation | true |
| sufficientPower | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructBuildInitiate",
"creator": "structs1...",
"playerId": "1-1",
"structTypeId": "1",
"operatingAmbit": 1,
"slot": 1
}
]
}
}
struct-build-complete/structs.structs.MsgStructBuildCompletePOST /cosmos/tx/v1beta1/txsRequired Fields: creator, structId, hash, nonce
| Requirement | Details |
|---|---|
| playerOnline | true |
| structInBuildingState | true |
| proofOfWork | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructBuildComplete",
"creator": "structs1...",
"structId": "1-1",
"hash": "proof-of-work-hash",
"nonce": "proof-of-work-nonce"
}
]
}
}
struct-attack/structs.structs.MsgStructAttackPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, structId, targetId
| Requirement | Details |
|---|---|
| playerOnline | true |
| sufficientCharge | true |
| structOnline | true |
| validTarget | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructAttack",
"creator": "structs1...",
"structId": "1-1",
"targetId": "2-1"
}
]
}
}
planet-raid-complete/structs.structs.MsgPlanetRaidCompletePOST /cosmos/tx/v1beta1/txsRequired Fields: creator, fleetId, planetId, hash, nonce
| Requirement | Details |
|---|---|
| playerOnline | true |
| fleetAway | true |
| fleetFirstInLine | true |
| proofOfWork | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgPlanetRaidComplete",
"creator": "structs1...",
"fleetId": "1-1",
"planetId": "2-1",
"hash": "proof-of-work-hash",
"nonce": "proof-of-work-nonce"
}
]
}
}
reactor-allocate/structs.structs.MsgReactorAllocatePOST /cosmos/tx/v1beta1/txsRequired Fields: creator, reactorId, destinationId, amount
| Requirement | Details |
|---|---|
| playerOnline | true |
| sufficientEnergy | true |
| validDestination | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgReactorAllocate",
"creator": "structs1...",
"reactorId": "1-1",
"destinationId": "2-1",
"amount": "1000000"
}
]
}
}
reactor-infuse/structs.structs.MsgReactorInfusePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_reactor_infuse.goproto/structs/structs/tx.proto:95This action abstracts validation delegation. When used for staking, it delegates validation stake to a validator. Reactor staking is managed at the player level, not reactor level.
Required Fields: creator, reactorId, amount
| Requirement | Details |
|---|---|
| playerOnline | true |
| reactorExists | true |
| sufficientAlphaMatter | true |
Conversion Rate: 1 gram Alpha Matter (1,000,000 micrograms) = 1,000 watts energy (1,000,000 milliwatts). Code reference: x/structs/types/keys.go (ReactorFuelToEnergyConversion = 1).
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgReactorInfuse",
"creator": "structs1...",
"reactorId": "1-1",
"amount": "1000000"
}
]
}
}
reactor-defuse/structs.structs.MsgReactorDefusePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_reactor_defuse.goproto/structs/structs/tx.proto:96This action abstracts validation undelegation. Reactor staking is managed at the player level, not reactor level.
Required Fields: creator, reactorId, amount
| Requirement | Details |
|---|---|
| playerOnline | true |
| reactorExists | true |
| sufficientFuel | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgReactorDefuse",
"creator": "structs1...",
"reactorId": "1-1",
"amount": "1000000"
}
]
}
}
reactor-begin-migration/structs.structs.MsgReactorBeginMigrationPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, reactorId
| Requirement | Details |
|---|---|
| playerOnline | true |
| reactorExists | true |
| hasActiveDelegation | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgReactorBeginMigration",
"creator": "structs1...",
"reactorId": "3-1"
}
]
}
}
reactor-cancel-defusion/structs.structs.MsgReactorCancelDefusionPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, reactorId
| Requirement | Details |
|---|---|
| playerOnline | true |
| reactorExists | true |
| inUndelegationPeriod | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgReactorCancelDefusion",
"creator": "structs1...",
"reactorId": "3-1"
}
]
}
}
substation-connect/structs.structs.MsgSubstationConnectPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, substationId, structId
| Requirement | Details |
|---|---|
| playerOnline | true |
| validSubstation | true |
| validStruct | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgSubstationConnect",
"creator": "structs1...",
"substationId": "1-1",
"structId": "2-1"
}
]
}
}
substation-create/structs.structs.MsgSubstationCreatePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_substation_create.goproto/structs/structs/tx.proto:131Required Fields: creator, planetId
| Requirement | Details |
|---|---|
| playerOnline | true |
| planetOwned | true |
| validLocation | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgSubstationCreate",
"creator": "structs1...",
"planetId": "2-1"
}
]
}
}
substation-player-connect/structs.structs.MsgSubstationPlayerConnectPOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_substation_player_connect.goproto/structs/structs/tx.proto:135Required Fields: creator, substationId
Effects: Player gains capacitySecondary from the substation’s connectionCapacity.
| Requirement | Details |
|---|---|
| playerOnline | true |
| substationExists | true |
| validConnection | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgSubstationPlayerConnect",
"creator": "structs1...",
"substationId": "1-1"
}
]
}
}
struct-ore-miner-complete/structs.structs.MsgStructOreMinerCompletePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_ore_miner_complete.goproto/structs/structs/tx.proto:763-770Required Fields: creator, structId, proof, nonce
| Requirement | Details |
|---|---|
| playerOnline | true |
| structOnline | true |
| planetHasOre | true |
| sufficientCharge | Charge >= structType.OreMiningCharge |
| proofOfWork | HashBuildAndCheckDifficulty with OreMiningDifficulty (14000) |
Effects: StoredOreIncrement(1) – fixed 1 ore per operation.
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructOreMinerComplete",
"creator": "structs1...",
"structId": "1-1",
"proof": "proof-of-work-hash",
"nonce": "proof-of-work-nonce"
}
]
}
}
struct-ore-refinery-complete/structs.structs.MsgStructOreRefineryCompletePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_ore_refinery_complete.goproto/structs/structs/tx.proto:777-784Required Fields: creator, structId, proof, nonce
| Requirement | Details |
|---|---|
| playerOnline | true |
| structOnline | true |
| hasStoredOre | true |
| sufficientCharge | Charge >= structType.OreRefiningCharge |
| proofOfWork | HashBuildAndCheckDifficulty with OreRefiningDifficulty (28000) |
Effects:
DepositRefinedAlpha() – mints 1,000,000 ualpha (1 gram)StoredOreDecrement(1){
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructOreRefineryComplete",
"creator": "structs1...",
"structId": "1-1",
"proof": "proof-of-work-hash",
"nonce": "proof-of-work-nonce"
}
]
}
}
provider-create/structs.structs.MsgProviderCreatePOST /cosmos/tx/v1beta1/txsRequired Fields: creator, rate, policy
| Requirement | Details |
|---|---|
| playerOnline | true |
| validRate | true |
| validPolicy | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgProviderCreate",
"creator": "structs1...",
"rate": {},
"policy": {}
}
]
}
}
agreement-create/structs.structs.MsgAgreementCreatePOST /cosmos/tx/v1beta1/txsRequired Fields: creator, providerId, terms
| Requirement | Details |
|---|---|
| playerOnline | true |
| validProvider | true |
| validTerms | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgAgreementCreate",
"creator": "structs1...",
"providerId": "1-1",
"terms": {}
}
]
}
}
ore-mining/structs.structs.MsgOreMiningPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, structId, hash, nonce
| Requirement | Details |
|---|---|
| playerOnline | true |
| structOnline | true |
| oreExtractorBuilt | true |
| planetHasOre | true |
| sufficientCharge | true |
| proofOfWork | true |
Security: Alpha Ore can be stolen by other players. Refine to Alpha Matter for security.
Costs:
| Cost | Value |
|---|---|
| buildDraw | 500,000 milliwatts |
| passiveDraw | 500,000 milliwatts |
| miningCharge | 20 |
| miningDifficulty | 14,000 |
Result: Alpha Ore amount extracted (grams). Ore is stealable.
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgOreMining",
"creator": "structs1...",
"structId": "1-1",
"hash": "proof-of-work-hash",
"nonce": "proof-of-work-nonce"
}
]
}
}
ore-refining/structs.structs.MsgOreRefiningPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, structId, hash, nonce
| Requirement | Details |
|---|---|
| playerOnline | true |
| structOnline | true |
| oreRefineryBuilt | true |
| hasAlphaOre | true |
| sufficientCharge | true |
| proofOfWork | true |
Security: Alpha Matter cannot be stolen once refined. This secures your resources.
Costs:
| Cost | Value |
|---|---|
| buildDraw | 500,000 milliwatts |
| passiveDraw | 500,000 milliwatts |
| refiningCharge | 20 |
| refiningDifficulty | 28,000 |
Conversion: 1 gram Alpha Ore = 1 gram Alpha Matter.
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgOreRefining",
"creator": "structs1...",
"structId": "1-1",
"hash": "proof-of-work-hash",
"nonce": "proof-of-work-nonce"
}
]
}
}
generator-allocate/structs.structs.MsgGeneratorAllocatePOST /cosmos/tx/v1beta1/txsRequired Fields: creator, generatorId, destinationType, destinationId, alphaMatterAmount
| Requirement | Details |
|---|---|
| playerOnline | true |
| generatorActive | true |
| sufficientAlphaMatter | true |
| validDestination | true |
Generator Types:
| Generator | Rate | Formula | Risk |
|---|---|---|---|
| Field Generator | 2 | Energy (kW) = Alpha Matter (grams) x 2 | high |
| Continental Power Plant | 5 | Energy (kW) = Alpha Matter (grams) x 5 | high |
| World Engine | 10 | Energy (kW) = Alpha Matter (grams) x 10 | high |
Energy Properties: Energy is ephemeral – must be consumed immediately upon production, cannot be stored. Energy is shared across all Structs connected to the same power source.
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgGeneratorAllocate",
"creator": "structs1...",
"generatorId": "1-1",
"destinationType": 1,
"destinationId": "2-1",
"alphaMatterAmount": "100000000"
}
]
}
}
Note: alphaMatterAmount is in micrograms (100 grams = 100,000,000 micrograms).
planet-explore/structs.structs.MsgPlanetExplorePOST /cosmos/tx/v1beta1/txsRequired Fields: creator
| Requirement | Details |
|---|---|
| playerOnline | true |
| currentPlanetEmpty | Only enforced if the player already owns a planet — current planet must have 0 ore remaining (all ore mined). New players exploring for the first time are exempt. |
| fleetOnStation | Only enforced if the player already owns a planet — fleet must be onStation at the current planet (not away). New players have no current planet, so this check is skipped. The chain rejects with fleet must be onStation to explore if violated. |
Transaction may broadcast but planet ownership unchanged if requirements are not met. Always verify game state after broadcast.
Result:
Planet Starting Properties:
| Property | Value |
|---|---|
| maxOre | 5 |
| spaceSlots | 4 |
| airSlots | 4 |
| landSlots | 4 |
| waterSlots | 4 |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgPlanetExplore",
"creator": "structs1..."
}
]
}
}
fleet-move/structs.structs.MsgFleetMovePOST /cosmos/tx/v1beta1/txsRequired Fields: creator, fleetId, destinationType, destinationId
| Requirement | Details |
|---|---|
| playerOnline | true |
| commandShipOnline | Command Ship must be online in fleet |
| validDestination | Destination must exist and be accessible |
Fleet Status:
| Status | Description | Can Build | Can Raid |
|---|---|---|---|
| onStation | Fleet is at planet | Yes | No |
| away | Fleet is away from planet | No | Yes |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgFleetMove",
"creator": "structs1...",
"fleetId": "1-1",
"destinationType": 1,
"destinationId": "2-1"
}
]
}
}
guild-create/structs.structs.MsgGuildCreatePOST /cosmos/tx/v1beta1/txsRequired Fields: creator, reactorId, endpoint, entrySubstationId
| Requirement | Details |
|---|---|
| playerOnline | true |
| permReactorGuildCreate | Requires PermReactorGuildCreate (524288) on the reactor |
| permSubstationConnection | Also requires PermSubstationConnection (1024) on the entry substation |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgGuildCreate",
"creator": "structs1..."
}
]
}
}
guild-membership-join/structs.structs.MsgGuildMembershipJoinPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, guildId
| Requirement | Details |
|---|---|
| playerOnline | true |
| notInGuild | Player must not already be in a guild |
| guildExists | Guild must exist. Check: query guild by ID. |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgGuildMembershipJoin",
"creator": "structs1...",
"guildId": "0-1"
}
]
}
}
guild-membership-join-proxy/structs.structs.MsgGuildMembershipJoinProxyPOST /cosmos/tx/v1beta1/txsualpha to pay fees. As of v0.16.0 the proxy can also seed the new player’s UGC name and pfp directly so the chain becomes the single source of truth for player identity from creation.Required Fields: creator, address, proofPubKey, proofSignature
Optional Fields: substationId (override the guild’s default entry substation), playerName (set new player’s name immediately), playerPfp (set new player’s pfp immediately)
| Requirement | Details |
|---|---|
| permGuildMembership | Caller needs PermGuildMembership (512) on the guild |
| permSubstationConnection | Also PermSubstationConnection (1024) on the substation if substationId is set |
| validProof | proofPubKey and proofSignature must derive to address (secp256k1 sign-of-pubkey self-proof) |
| validPlayerName | If playerName is set, must satisfy ValidatePlayerName (3-20 runes, ^[\p{L}0-9\-_]{3,20}$, NFC, no combining/bidi/object-id-shaped) |
| validPlayerPfp | If playerPfp is set, must satisfy ValidatePfp (see UGC actions) |
Self-proof construction: Sign the secp256k1 compressed pubkey bytes with the corresponding private key; submit the signature as proofSignature. The chain rederives the address from proofPubKey and rejects mismatches.
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgGuildMembershipJoinProxy",
"creator": "structs1moderator...",
"address": "structs1newplayer...",
"proofPubKey": "Aqg...base64...",
"proofSignature": "MEU...base64...",
"substationId": "4-3",
"playerName": "Andromeda7",
"playerPfp": "ipfs://bafy..."
}
]
}
}
guild-membership-leave/structs.structs.MsgGuildMembershipLeavePOST /cosmos/tx/v1beta1/txsRequired Fields: creator
| Requirement | Details |
|---|---|
| playerOnline | true |
| inGuild | Player must be in a guild. Check: query player.guildId, must not be null or empty. |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgGuildMembershipLeave",
"creator": "structs1..."
}
]
}
}
guild-bank-mint/structs.structs.MsgGuildBankMintPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, guildId, amount
| Requirement | Details |
|---|---|
| playerOnline | true |
| inGuild | Player must be in the guild |
| guildPermission | Player must have permission to mint tokens. Trust-based system – no technical safeguards against revocation or inflation. |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgGuildBankMint",
"creator": "structs1...",
"guildId": "0-1",
"amount": "1000000"
}
]
}
}
guild-bank-redeem/structs.structs.MsgGuildBankRedeemPOST /cosmos/tx/v1beta1/txsRequired Fields: creator, guildId, amount
| Requirement | Details |
|---|---|
| playerOnline | true |
| inGuild | Player must be in the guild |
| sufficientTokens | Player must have sufficient guild tokens |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgGuildBankRedeem",
"creator": "structs1...",
"guildId": "0-1",
"amount": "1000000"
}
]
}
}
guild-update-entry-rank/structs.structs.MsgGuildUpdateEntryRankRequired Fields: creator, newEntryRank
| Requirement | Details |
|---|---|
| permUpdate | Requires PermUpdate (4) on the guild |
| rankConstraint | New entry rank must be >= caller’s own rank |
player-update-guild-rank/structs.structs.MsgPlayerUpdateGuildRankRequired Fields: creator, playerId, guildRank
| Requirement | Details |
|---|---|
| permAdmin | Requires PermAdmin (2) on the guild; falls back to rank-based authority (actor rank must be strictly better than target’s current rank) |
player-send/structs.structs.MsgPlayerSendRequired Fields: creator, fromAddress, toAddress, amount
| Requirement | Details |
|---|---|
| permTokenTransfer | Requires PermTokenTransfer (16) on the player |
permission-guild-rank-set/structs.structs.MsgPermissionGuildRankSetRequired Fields: creator, objectId, guildId, permission, rank
| Requirement | Details |
|---|---|
| callerHasPermission | Caller must already have the specified permission on the object |
permission-guild-rank-revoke/structs.structs.MsgPermissionGuildRankRevokeRequired Fields: creator, objectId, guildId, permission
| Requirement | Details |
|---|---|
| callerHasPermission | Caller must already have the specified permission on the object |
User-generated content (name and pfp) updates. Added in v0.16.0. All seven messages are part of the free-gas Structs path. The Update*Name and Update*Pfp messages on player, planet, and substation route through UGCPermissionCheck (self-service via PermUpdate on the target, OR guild moderation via PermGuildUGCUpdate on the target owner’s guild). Guild rename/repfp uses the standard PermissionCheck with PermUpdate on the guild itself. Validation is enforced by types.ValidatePlayerName / ValidateEntityName / ValidatePlanetName / ValidatePfp (see schemas/validation.md and knowledge/mechanics/ugc-moderation.md). When the actor is not the target’s owner, the chain emits a ugc_moderated event.
player-update-name/structs.structs.MsgPlayerUpdateNameRequired Fields: creator, playerId, name
| Requirement | Details |
|---|---|
| permission | PermUpdate (4) on the player OR PermGuildUGCUpdate (16777216) on the player’s guild |
| validName | Must satisfy ValidatePlayerName (3-20 runes after NFC, ^[\p{L}0-9\-_]{3,20}$, no spaces, apostrophes, combining marks, bidi/zero-width, or object-id-shaped strings) |
player-update-pfp/structs.structs.MsgPlayerUpdatePfpRequired Fields: creator, playerId, pfp
| Requirement | Details |
|---|---|
| permission | PermUpdate (4) on the player OR PermGuildUGCUpdate (16777216) on the player’s guild |
| validPfp | Must satisfy ValidatePfp (empty string clears; otherwise <=256 runes, no control/bidi/whitespace/<>"\\ chars; no : -> ^[A-Za-z0-9._/\-]{1,256}$; with : -> scheme in {https, http, ipfs, ipns, ar} and parses cleanly) |
guild-update-name/structs.structs.MsgGuildUpdateNameRequired Fields: creator, guildId, name
| Requirement | Details |
|---|---|
| permission | PermUpdate (4) on the guild |
| validName | Must satisfy ValidateEntityName (3-20 runes after NFC, ^[\p{L}0-9\-_' ]{3,20}$, no leading/trailing spaces, no double space, no combining marks, no bidi/zero-width, not object-id-shaped) |
| uniqueness | Names must be unique under NormalizeName (NFC + lowercase + trim) — chain rejects duplicates |
guild-update-pfp/structs.structs.MsgGuildUpdatePfpRequired Fields: creator, guildId, pfp
| Requirement | Details |
|---|---|
| permission | PermUpdate (4) on the guild |
| validPfp | Must satisfy ValidatePfp (see player-update-pfp) |
planet-update-name/structs.structs.MsgPlanetUpdateNameRequired Fields: creator, planetId, name
| Requirement | Details |
|---|---|
| permission | PermUpdate (4) on the planet OR PermGuildUGCUpdate (16777216) on the planet owner’s guild |
| validName | Must satisfy ValidatePlanetName (3-25 runes after NFC, ^[\p{L}0-9\-_' ]{3,25}$, no leading/trailing spaces, no double space, no combining marks, no bidi/zero-width, not object-id-shaped) |
substation-update-name/structs.structs.MsgSubstationUpdateNameRequired Fields: creator, substationId, name
| Requirement | Details |
|---|---|
| permission | PermUpdate (4) on the substation OR PermGuildUGCUpdate (16777216) on the substation owner’s guild |
| validName | Must satisfy ValidateEntityName |
substation-update-pfp/structs.structs.MsgSubstationUpdatePfpRequired Fields: creator, substationId, pfp
| Requirement | Details |
|---|---|
| permission | PermUpdate (4) on the substation OR PermGuildUGCUpdate (16777216) on the substation owner’s guild |
| validPfp | Must satisfy ValidatePfp |
struct-activate/structs.structs.MsgStructActivatePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_activate.goproto/structs/structs/tx.proto:644-649Required Fields: creator, structId
| Requirement | Details |
|---|---|
| playerOnline | true |
| structBuilt | true |
| structOffline | true |
| sufficientCharge | Charge >= structType.ActivateCharge |
| sufficientPower | Available capacity >= structType.PassiveDraw |
Effects:
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructActivate",
"creator": "structs1...",
"structId": "1-1"
}
]
}
}
struct-deactivate/structs.structs.MsgStructDeactivatePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_deactivate.goproto/structs/structs/tx.proto:651-656Required Fields: creator, structId
| Requirement | Details |
|---|---|
| structBuilt | true |
| structOnline | true |
| ownerOffline | Owner must be offline (halted) |
Effects:
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructDeactivate",
"creator": "structs1...",
"structId": "1-1"
}
]
}
}
struct-stealth-activate/structs.structs.MsgStructStealthActivatePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_stealth_activate.goproto/structs/structs/tx.proto:117Required Fields: creator, structId
| Requirement | Details |
|---|---|
| playerOnline | true |
| structCommandable | true |
| structNotHidden | true |
| hasStealthSystem | Struct must have stealth system |
| sufficientCharge | Charge >= structType.StealthActivateCharge |
Effects:
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructStealthActivate",
"creator": "structs1...",
"structId": "1-1"
}
]
}
}
struct-stealth-deactivate/structs.structs.MsgStructStealthDeactivatePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_stealth_deactivate.goproto/structs/structs/tx.proto:118Required Fields: creator, structId
| Requirement | Details |
|---|---|
| playerOnline | true |
| structCommandable | true |
| structHidden | true |
| hasStealthSystem | true |
Effects: Removes hidden status from struct.
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructStealthDeactivate",
"creator": "structs1...",
"structId": "1-1"
}
]
}
}
struct-defense-set/structs.structs.MsgStructDefenseSetPOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_defense_set.goproto/structs/structs/tx.proto:702-708Required Fields: creator, defenderStructId, protectedStructId
| Requirement | Details |
|---|---|
| playerOnline | true |
| defenderExists | true |
| protectedExists | true |
| sameAmbit | Defender and protected must be in same ambit for full blocking |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructDefenseSet",
"creator": "structs1...",
"defenderStructId": "1-1",
"protectedStructId": "2-1"
}
]
}
}
struct-defense-clear/structs.structs.MsgStructDefenseClearPOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_defense_clear.goproto/structs/structs/tx.proto:710-715Required Fields: creator, defenderStructId
| Requirement | Details |
|---|---|
| playerOnline | true |
| defenderExists | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructDefenseClear",
"creator": "structs1...",
"defenderStructId": "1-1"
}
]
}
}
struct-move/structs.structs.MsgStructMovePOST /cosmos/tx/v1beta1/txsx/structs/keeper/msg_server_struct_move.goproto/structs/structs/tx.proto:717-725Required Fields: creator, structId, locationType, ambit, slot
| Requirement | Details |
|---|---|
| playerOnline | true |
| structBuilt | true |
| validLocation | true |
{
"body": {
"messages": [
{
"@type": "/structs.structs.MsgStructMove",
"creator": "structs1...",
"structId": "1-1",
"locationType": 1,
"ambit": 1,
"slot": 1
}
]
}
}
| Field | Value |
|---|---|
| Verified | true |
| Verified By | GameCodeAnalyst |
| Verified Date | 2025-01-XX |
| Method | code-analysis |
| Confidence | high |
| Total Actions | 30 |
| Verified Actions | 30 |
| Percentage | 100% |
| Note | All documented actions verified against codebase. Additional actions exist in proto file but not yet documented. |