@aephia/atlas-kit 0.6.0-next.3 → 0.6.0-next.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +4 -1
  2. package/dist/cargo/actions/deposit.d.ts.map +1 -1
  3. package/dist/cargo/actions/deposit.js +51 -9
  4. package/dist/cargo/actions/deposit.js.map +1 -1
  5. package/dist/cargo/actions/wallet-context.d.ts +2 -3
  6. package/dist/cargo/actions/wallet-context.d.ts.map +1 -1
  7. package/dist/cargo/actions/wallet-context.js +6 -33
  8. package/dist/cargo/actions/wallet-context.js.map +1 -1
  9. package/dist/cargo/actions/wallet-token.d.ts +1 -1
  10. package/dist/cargo/actions/wallet-token.d.ts.map +1 -1
  11. package/dist/cargo/actions/wallet-token.js +1 -9
  12. package/dist/cargo/actions/wallet-token.js.map +1 -1
  13. package/dist/cargo/actions/withdrawal.d.ts.map +1 -1
  14. package/dist/cargo/actions/withdrawal.js +54 -11
  15. package/dist/cargo/actions/withdrawal.js.map +1 -1
  16. package/dist/client/errors.d.ts +4 -0
  17. package/dist/client/errors.d.ts.map +1 -1
  18. package/dist/client/errors.js +31 -1
  19. package/dist/client/errors.js.map +1 -1
  20. package/dist/client/index.d.ts +1 -0
  21. package/dist/client/index.d.ts.map +1 -1
  22. package/dist/client/index.js +1 -0
  23. package/dist/client/index.js.map +1 -1
  24. package/dist/client/rpc-subscription-provider.d.ts +35 -0
  25. package/dist/client/rpc-subscription-provider.d.ts.map +1 -0
  26. package/dist/client/rpc-subscription-provider.js +190 -0
  27. package/dist/client/rpc-subscription-provider.js.map +1 -0
  28. package/dist/factions/actions/index.d.ts +36 -0
  29. package/dist/factions/actions/index.d.ts.map +1 -0
  30. package/dist/factions/actions/index.js +136 -0
  31. package/dist/factions/actions/index.js.map +1 -0
  32. package/dist/factions/index.d.ts +1 -0
  33. package/dist/factions/index.d.ts.map +1 -1
  34. package/dist/factions/index.js +1 -0
  35. package/dist/factions/index.js.map +1 -1
  36. package/dist/factions/profile-faction.d.ts +58 -0
  37. package/dist/factions/profile-faction.d.ts.map +1 -0
  38. package/dist/factions/profile-faction.js +63 -0
  39. package/dist/factions/profile-faction.js.map +1 -0
  40. package/dist/fleets/actions/add-ship.d.ts +35 -0
  41. package/dist/fleets/actions/add-ship.d.ts.map +1 -0
  42. package/dist/fleets/actions/add-ship.js +149 -0
  43. package/dist/fleets/actions/add-ship.js.map +1 -0
  44. package/dist/fleets/actions/create-fleet.d.ts +36 -0
  45. package/dist/fleets/actions/create-fleet.d.ts.map +1 -0
  46. package/dist/fleets/actions/create-fleet.js +138 -0
  47. package/dist/fleets/actions/create-fleet.js.map +1 -0
  48. package/dist/fleets/actions/index.d.ts +3 -0
  49. package/dist/fleets/actions/index.d.ts.map +1 -1
  50. package/dist/fleets/actions/index.js +3 -0
  51. package/dist/fleets/actions/index.js.map +1 -1
  52. package/dist/fleets/actions/ship-import.d.ts +48 -0
  53. package/dist/fleets/actions/ship-import.d.ts.map +1 -0
  54. package/dist/fleets/actions/ship-import.js +309 -0
  55. package/dist/fleets/actions/ship-import.js.map +1 -0
  56. package/dist/identity/actions/create-profile.d.ts +56 -0
  57. package/dist/identity/actions/create-profile.d.ts.map +1 -0
  58. package/dist/identity/actions/create-profile.js +139 -0
  59. package/dist/identity/actions/create-profile.js.map +1 -0
  60. package/dist/identity/actions/index.d.ts +38 -0
  61. package/dist/identity/actions/index.d.ts.map +1 -0
  62. package/dist/identity/actions/index.js +109 -0
  63. package/dist/identity/actions/index.js.map +1 -0
  64. package/dist/identity/index.d.ts +15 -0
  65. package/dist/identity/index.d.ts.map +1 -1
  66. package/dist/identity/index.js +15 -0
  67. package/dist/identity/index.js.map +1 -1
  68. package/dist/identity/permissions.d.ts +124 -0
  69. package/dist/identity/permissions.d.ts.map +1 -0
  70. package/dist/identity/permissions.js +171 -0
  71. package/dist/identity/permissions.js.map +1 -0
  72. package/dist/internal/c4/cargo-bytes-config.d.ts +7 -0
  73. package/dist/internal/c4/cargo-bytes-config.d.ts.map +1 -0
  74. package/dist/internal/c4/cargo-bytes-config.js +19 -0
  75. package/dist/internal/c4/cargo-bytes-config.js.map +1 -0
  76. package/dist/internal/c4/character-registration.d.ts +9 -0
  77. package/dist/internal/c4/character-registration.d.ts.map +1 -0
  78. package/dist/internal/c4/character-registration.js +21 -0
  79. package/dist/internal/c4/character-registration.js.map +1 -0
  80. package/dist/internal/c4/faction-adapter.d.ts +12 -0
  81. package/dist/internal/c4/faction-adapter.d.ts.map +1 -0
  82. package/dist/internal/c4/faction-adapter.js +52 -0
  83. package/dist/internal/c4/faction-adapter.js.map +1 -0
  84. package/dist/internal/c4/faction-enrollment.d.ts +6 -0
  85. package/dist/internal/c4/faction-enrollment.d.ts.map +1 -0
  86. package/dist/internal/c4/faction-enrollment.js +8 -0
  87. package/dist/internal/c4/faction-enrollment.js.map +1 -0
  88. package/dist/internal/c4/faction-epoch-meter.d.ts +10 -0
  89. package/dist/internal/c4/faction-epoch-meter.d.ts.map +1 -0
  90. package/dist/internal/c4/faction-epoch-meter.js +31 -0
  91. package/dist/internal/c4/faction-epoch-meter.js.map +1 -0
  92. package/dist/internal/c4/faction-treasury.d.ts +23 -0
  93. package/dist/internal/c4/faction-treasury.d.ts.map +1 -0
  94. package/dist/internal/c4/faction-treasury.js +48 -0
  95. package/dist/internal/c4/faction-treasury.js.map +1 -0
  96. package/dist/internal/c4/factions.d.ts +9 -30
  97. package/dist/internal/c4/factions.d.ts.map +1 -1
  98. package/dist/internal/c4/factions.js +22 -107
  99. package/dist/internal/c4/factions.js.map +1 -1
  100. package/dist/internal/c4/fleet-creation.d.ts +7 -0
  101. package/dist/internal/c4/fleet-creation.d.ts.map +1 -0
  102. package/dist/internal/c4/fleet-creation.js +180 -0
  103. package/dist/internal/c4/fleet-creation.js.map +1 -0
  104. package/dist/internal/c4/fleet-crew-binding.d.ts +2 -0
  105. package/dist/internal/c4/fleet-crew-binding.d.ts.map +1 -1
  106. package/dist/internal/c4/fleet-crew-binding.js +5 -0
  107. package/dist/internal/c4/fleet-crew-binding.js.map +1 -1
  108. package/dist/internal/c4/fleet-ship-assembly.d.ts +11 -0
  109. package/dist/internal/c4/fleet-ship-assembly.d.ts.map +1 -0
  110. package/dist/internal/c4/fleet-ship-assembly.js +44 -0
  111. package/dist/internal/c4/fleet-ship-assembly.js.map +1 -0
  112. package/dist/internal/c4/game.d.ts +18 -6
  113. package/dist/internal/c4/game.d.ts.map +1 -1
  114. package/dist/internal/c4/game.js +34 -9
  115. package/dist/internal/c4/game.js.map +1 -1
  116. package/dist/internal/c4/identity.d.ts +2 -7
  117. package/dist/internal/c4/identity.d.ts.map +1 -1
  118. package/dist/internal/c4/identity.js +2 -23
  119. package/dist/internal/c4/identity.js.map +1 -1
  120. package/dist/internal/c4/legacy-cargo-config.d.ts +6 -0
  121. package/dist/internal/c4/legacy-cargo-config.d.ts.map +1 -0
  122. package/dist/internal/c4/legacy-cargo-config.js +26 -0
  123. package/dist/internal/c4/legacy-cargo-config.js.map +1 -0
  124. package/dist/internal/c4/market.js +10 -6
  125. package/dist/internal/c4/market.js.map +1 -1
  126. package/dist/internal/c4/profile-creation.d.ts +17 -0
  127. package/dist/internal/c4/profile-creation.d.ts.map +1 -0
  128. package/dist/internal/c4/profile-creation.js +36 -0
  129. package/dist/internal/c4/profile-creation.js.map +1 -0
  130. package/dist/internal/c4/profile-faction.d.ts.map +1 -1
  131. package/dist/internal/c4/profile-faction.js +2 -0
  132. package/dist/internal/c4/profile-faction.js.map +1 -1
  133. package/dist/internal/c4/profile-permissions.d.ts +14 -0
  134. package/dist/internal/c4/profile-permissions.d.ts.map +1 -0
  135. package/dist/internal/c4/profile-permissions.js +80 -0
  136. package/dist/internal/c4/profile-permissions.js.map +1 -0
  137. package/dist/internal/c4/starbase.js +4 -3
  138. package/dist/internal/c4/starbase.js.map +1 -1
  139. package/dist/internal/c4/wallet-cargo-cache.d.ts +3 -0
  140. package/dist/internal/c4/wallet-cargo-cache.d.ts.map +1 -0
  141. package/dist/internal/c4/wallet-cargo-cache.js +24 -0
  142. package/dist/internal/c4/wallet-cargo-cache.js.map +1 -0
  143. package/dist/internal/c4/world.js +2 -1
  144. package/dist/internal/c4/world.js.map +1 -1
  145. package/dist/internal/loyalty-atlas-bank-state.d.ts +16 -0
  146. package/dist/internal/loyalty-atlas-bank-state.d.ts.map +1 -0
  147. package/dist/internal/loyalty-atlas-bank-state.js +10 -0
  148. package/dist/internal/loyalty-atlas-bank-state.js.map +1 -0
  149. package/dist/internal/planning/account-state.d.ts +4 -0
  150. package/dist/internal/planning/account-state.d.ts.map +1 -0
  151. package/dist/internal/planning/account-state.js +11 -0
  152. package/dist/internal/planning/account-state.js.map +1 -0
  153. package/dist/internal/planning/authorization-adapter.d.ts +17 -0
  154. package/dist/internal/planning/authorization-adapter.d.ts.map +1 -1
  155. package/dist/internal/planning/authorization-adapter.js +50 -0
  156. package/dist/internal/planning/authorization-adapter.js.map +1 -1
  157. package/dist/internal/planning/faction-enrollment.d.ts +12 -0
  158. package/dist/internal/planning/faction-enrollment.d.ts.map +1 -0
  159. package/dist/internal/planning/faction-enrollment.js +67 -0
  160. package/dist/internal/planning/faction-enrollment.js.map +1 -0
  161. package/dist/internal/planning/faction-trade-state.d.ts +16 -0
  162. package/dist/internal/planning/faction-trade-state.d.ts.map +1 -0
  163. package/dist/internal/planning/faction-trade-state.js +39 -0
  164. package/dist/internal/planning/faction-trade-state.js.map +1 -0
  165. package/dist/internal/planning/fleet-creation.d.ts +29 -0
  166. package/dist/internal/planning/fleet-creation.d.ts.map +1 -0
  167. package/dist/internal/planning/fleet-creation.js +106 -0
  168. package/dist/internal/planning/fleet-creation.js.map +1 -0
  169. package/dist/internal/planning/fleet-ship-assembly.d.ts +35 -0
  170. package/dist/internal/planning/fleet-ship-assembly.d.ts.map +1 -0
  171. package/dist/internal/planning/fleet-ship-assembly.js +135 -0
  172. package/dist/internal/planning/fleet-ship-assembly.js.map +1 -0
  173. package/dist/internal/planning/ship-token.d.ts +10 -0
  174. package/dist/internal/planning/ship-token.d.ts.map +1 -0
  175. package/dist/internal/planning/ship-token.js +47 -0
  176. package/dist/internal/planning/ship-token.js.map +1 -0
  177. package/dist/internal/planning/token-mint.d.ts +4 -0
  178. package/dist/internal/planning/token-mint.d.ts.map +1 -0
  179. package/dist/internal/planning/token-mint.js +15 -0
  180. package/dist/internal/planning/token-mint.js.map +1 -0
  181. package/dist/internal/planning/trade-faction-market.d.ts +20 -0
  182. package/dist/internal/planning/trade-faction-market.d.ts.map +1 -0
  183. package/dist/internal/planning/trade-faction-market.js +56 -0
  184. package/dist/internal/planning/trade-faction-market.js.map +1 -0
  185. package/dist/loyalty/actions/index.d.ts.map +1 -1
  186. package/dist/loyalty/actions/index.js +4 -3
  187. package/dist/loyalty/actions/index.js.map +1 -1
  188. package/dist/loyalty/index.d.ts.map +1 -1
  189. package/dist/loyalty/index.js +2 -6
  190. package/dist/loyalty/index.js.map +1 -1
  191. package/dist/markets/actions/index.d.ts +1 -0
  192. package/dist/markets/actions/index.d.ts.map +1 -1
  193. package/dist/markets/actions/index.js +1 -0
  194. package/dist/markets/actions/index.js.map +1 -1
  195. package/dist/markets/actions/trade-faction-market.d.ts +43 -0
  196. package/dist/markets/actions/trade-faction-market.d.ts.map +1 -0
  197. package/dist/markets/actions/trade-faction-market.js +288 -0
  198. package/dist/markets/actions/trade-faction-market.js.map +1 -0
  199. package/dist/mining/actions/index.d.ts +86 -0
  200. package/dist/mining/actions/index.d.ts.map +1 -0
  201. package/dist/mining/actions/index.js +295 -0
  202. package/dist/mining/actions/index.js.map +1 -0
  203. package/dist/planning/execution.d.ts.map +1 -1
  204. package/dist/planning/execution.js +191 -16
  205. package/dist/planning/execution.js.map +1 -1
  206. package/dist/planning/index.d.ts +316 -4
  207. package/dist/planning/index.d.ts.map +1 -1
  208. package/dist/planning/index.js +528 -14
  209. package/dist/planning/index.js.map +1 -1
  210. package/dist/planning/simulation.d.ts +18 -1
  211. package/dist/planning/simulation.d.ts.map +1 -1
  212. package/dist/planning/simulation.js +56 -10
  213. package/dist/planning/simulation.js.map +1 -1
  214. package/dist/registry/cargo.d.ts +9 -6
  215. package/dist/registry/cargo.d.ts.map +1 -1
  216. package/dist/registry/cargo.js +30 -4
  217. package/dist/registry/cargo.js.map +1 -1
  218. package/dist/registry/onboarding.d.ts +6 -0
  219. package/dist/registry/onboarding.d.ts.map +1 -0
  220. package/dist/registry/onboarding.js +24 -0
  221. package/dist/registry/onboarding.js.map +1 -0
  222. package/dist/registry/ships.d.ts +28 -0
  223. package/dist/registry/ships.d.ts.map +1 -0
  224. package/dist/registry/ships.js +51 -0
  225. package/dist/registry/ships.js.map +1 -0
  226. package/package.json +13 -1
@@ -0,0 +1,295 @@
1
+ import { InvalidActionInputError, SageSdkError } from '../../client/errors.js';
2
+ import { readContextRawAccounts } from '../../client/reconciliation.js';
3
+ import { sage } from '../../internal/c4/bindings.js';
4
+ import { deriveFleetAddress, fleetAccountDefinition, } from '../../internal/c4/fleet.js';
5
+ import { characterAccountDefinition, findCharacterPda, } from '../../internal/c4/identity.js';
6
+ import { deriveRegionTrackerAddress, regionTrackerAccountDefinition, } from '../../internal/c4/factions.js';
7
+ import { celestialBodyAccountDefinition, deriveCelestialBodyAddress, deriveStarSystemAddress, starSystemAccountDefinition, } from '../../internal/c4/world.js';
8
+ import { deriveFleetCrewBindingAddress, fleetCrewBindingAccountDefinition, } from '../../internal/c4/fleet-crew-binding.js';
9
+ import { requireGameAddress } from '../../internal/game-context.js';
10
+ import { adaptStartMiningAsteroidInstruction, adaptStopMiningAsteroidInstruction, validatePlanAuthorization, } from '../../internal/planning/authorization-adapter.js';
11
+ import { createPlan } from '../../planning/index.js';
12
+ function fail(address, message) {
13
+ throw new SageSdkError('ACTION_PRECONDITION_FAILED', message, { address });
14
+ }
15
+ const remedies = {
16
+ docked: 'Undock the Fleet',
17
+ mining: 'Stop mining with planFleetStopMining',
18
+ respawn: 'Wait for the Fleet to recover',
19
+ destroyed: 'Respawn the Fleet through an appropriate game client',
20
+ claimStakeTransfer: 'Finish the Claim Stake transfer',
21
+ };
22
+ function actionCoordinate(fleet) {
23
+ if (fleet.state.kind === 'idle')
24
+ return fleet.location;
25
+ if (fleet.state.kind === 'warp' || fleet.state.kind === 'subwarp')
26
+ return fleet.state.to;
27
+ return fail(fleet.address, `Fleet ${fleet.name} is ${fleet.state.kind} and cannot start mining. ${remedies[fleet.state.kind]}, refresh the Fleet, and retry from idle or a warp/subwarp arrival at the Asteroid's Star System.`);
28
+ }
29
+ function validateOptionsObject(value, field) {
30
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
31
+ throw new InvalidActionInputError(field, value, 'an object containing the mining action options or Profile authorization', `Supply ${field} with the documented mining action fields before retrying.`);
32
+ }
33
+ }
34
+ function validateResources(ids, available) {
35
+ if (!Array.isArray(ids) || ids.length === 0) {
36
+ throw new InvalidActionInputError('resourceIds', ids, 'a dense non-empty ascending list of deposit cargo ids', 'Supply at least one resource cargo id from the Asteroid deposit before retrying.');
37
+ }
38
+ for (let i = 0; i < ids.length; i += 1) {
39
+ const id = ids[i];
40
+ if (!Object.hasOwn(ids, i) ||
41
+ !Number.isInteger(id) ||
42
+ id < 0 ||
43
+ id > 65535 ||
44
+ (i > 0 && ids[i - 1] >= id) ||
45
+ !available.includes(id)) {
46
+ throw new InvalidActionInputError('resourceIds', ids, 'unique ascending u16 cargo ids selected from the deposit', 'Select resource cargo ids present in the Asteroid deposit, remove holes and duplicates, and sort them in ascending order before retrying.');
47
+ }
48
+ }
49
+ }
50
+ function required(account, address, label) {
51
+ if (account === undefined) {
52
+ return fail(address, `${label} is missing or returned at a different address. Refresh the Fleet and Asteroid dependencies in the configured Game and retry.`);
53
+ }
54
+ return account;
55
+ }
56
+ /** Plans one inert Fleet mining start at an Asteroid, without signing or simulation.
57
+ *
58
+ * Idle Fleets use their current coordinate; warp/subwarp Fleets use their arrival
59
+ * coordinate, never a local clock. Moving snapshots support explicit composition
60
+ * with planFleetSettleArrival; this planner emits only the mining instruction and
61
+ * adds neither settlement nor a funder. Direct mining needs Idle: mining-specific
62
+ * PTR evidence rejected an elapsed warp despite its canonical Character account,
63
+ * while explicit settlement followed by mining succeeded. An in-transit subwarp
64
+ * also rejected; elapsed-subwarp mining composition remains unmeasured on chain.
65
+ * These results do not inherit startSubwarp's automatic refresh behavior.
66
+ * Explicitly prepend settlement with a visible funder, or settle and reload the
67
+ * Fleet before planning mining. Idle Fleets do not need that extra step.
68
+ * Simulate the complete Plan before execution; arrival, permissions, range, fuel,
69
+ * and mining eligibility remain program-authoritative. This planner neither
70
+ * estimates mining output nor stops mining. No FleetCrewBinding account exists
71
+ * in the pinned ten-account instruction.
72
+ *
73
+ * @example
74
+ * ```ts
75
+ * declare const ctx: SageContext;
76
+ * declare const fleet: FleetSnapshot;
77
+ * declare const authorization: PlanAuthorization;
78
+ * declare const asteroid: ResourceDepositSnapshot;
79
+ * const plan = await planFleetStartMining(ctx, fleet, { authorization, asteroid, resourceIds: [8] });
80
+ * ```
81
+ */
82
+ export async function planFleetStartMining(ctx, fleet, options) {
83
+ const game = requireGameAddress(ctx);
84
+ validateOptionsObject(options, 'options');
85
+ validateOptionsObject(options.authorization, 'authorization');
86
+ const { asteroid } = options;
87
+ const authorization = {
88
+ profile: options.authorization.profile,
89
+ authority: options.authorization.authority,
90
+ keyIndex: options.authorization.keyIndex,
91
+ ...(options.authorization.certificate === undefined
92
+ ? {}
93
+ : { certificate: options.authorization.certificate }),
94
+ };
95
+ validatePlanAuthorization(authorization);
96
+ const coordinate = actionCoordinate(fleet);
97
+ const movingSnapshot = fleet.state.kind !== 'idle';
98
+ if (fleet.game !== game ||
99
+ asteroid.game !== game ||
100
+ fleet.ownerProfile.address !== authorization.profile) {
101
+ fail(fleet.address, `Fleet ${fleet.name} and Asteroid ${asteroid.name} must belong to configured Game ${game}, and the Fleet must belong to authorized Profile ${authorization.profile}. Choose the owning Profile and matching Game, refresh both snapshots, and retry.`);
102
+ }
103
+ validateResources(options.resourceIds, asteroid.resources.map((r) => r.cargo.id));
104
+ // Copy before any asynchronous reads so caller mutation cannot change selection.
105
+ const resourceIds = [...options.resourceIds];
106
+ const character = await findCharacterPda(authorization.profile, game);
107
+ const regionTracker = await deriveRegionTrackerAddress(game);
108
+ const addresses = [
109
+ fleet.address,
110
+ asteroid.address,
111
+ asteroid.system.address,
112
+ character,
113
+ regionTracker,
114
+ ];
115
+ const values = await readContextRawAccounts(ctx, addresses);
116
+ const labels = [
117
+ 'Fleet',
118
+ 'Asteroid',
119
+ 'Star System',
120
+ 'Character',
121
+ 'RegionTracker',
122
+ ];
123
+ const accounts = addresses.map((address, index) => required(values[index], address, labels[index]));
124
+ const [fleetAccount, asteroidAccount, systemAccount, characterAccount, trackerAccount,] = accounts;
125
+ const current = fleetAccountDefinition.decode(fleetAccount);
126
+ const currentCoordinate = current.state.kind === 'idle'
127
+ ? current.location
128
+ : current.state.kind === 'warp' || current.state.kind === 'subwarp'
129
+ ? current.state.to
130
+ : undefined;
131
+ if (current.game !== game ||
132
+ current.ownerProfile !== authorization.profile ||
133
+ (await deriveFleetAddress(current)) !== fleet.address ||
134
+ (current.state.kind !== fleet.state.kind &&
135
+ !(current.state.kind === 'idle' &&
136
+ (fleet.state.kind === 'warp' || fleet.state.kind === 'subwarp'))) ||
137
+ currentCoordinate?.x !== coordinate.x ||
138
+ currentCoordinate?.y !== coordinate.y) {
139
+ fail(fleet.address, `Fleet ${fleet.name} no longer matches its Game, Profile, canonical address, state, or mining coordinate. Refresh the Fleet and create a new mining Plan before retrying.`);
140
+ }
141
+ const deposit = celestialBodyAccountDefinition.decode(asteroidAccount);
142
+ if (deposit.kind !== 'asteroid' ||
143
+ deposit.game !== game ||
144
+ deposit.id !== asteroid.bodyId ||
145
+ (await deriveCelestialBodyAddress(game, deposit.id)) !== asteroid.address ||
146
+ deposit.system !== asteroid.system.address) {
147
+ fail(asteroid.address, `Asteroid ${asteroid.name} no longer matches its Game, canonical address, or Star System. Refresh the resource deposit and choose an Asteroid in the Fleet's current or arrival Star System before retrying.`);
148
+ }
149
+ validateResources(resourceIds, deposit.details.resources.map((r) => r.cargoId));
150
+ const system = starSystemAccountDefinition.decode(systemAccount);
151
+ if (system.game !== game ||
152
+ (await deriveStarSystemAddress(game, system.systemId)) !==
153
+ systemAccount.address) {
154
+ fail(systemAccount.address, 'Star System does not match its Game or canonical address. Refresh the Asteroid and Star System in the configured Game before retrying.');
155
+ }
156
+ // Compare stored fixed-point coordinates, not rounded display numbers.
157
+ const exactFleet = sage.getFleetDecoder().decode(fleetAccount.data);
158
+ const exactCoordinate = exactFleet.state.__kind === 'MoveWarp'
159
+ ? exactFleet.state.fields[0].to
160
+ : exactFleet.state.__kind === 'MoveSubwarp'
161
+ ? exactFleet.state.fields[0].journey.to
162
+ : exactFleet.location;
163
+ const exactSystem = sage.getStarSystemDecoder().decode(systemAccount.data);
164
+ if (exactCoordinate[0].raw !== exactSystem.coordinates[0].raw ||
165
+ exactCoordinate[1].raw !== exactSystem.coordinates[1].raw) {
166
+ fail(asteroid.address, `Asteroid ${asteroid.name} is not in Fleet ${fleet.name}'s current or arrival Star System. Choose a deposit at the Fleet's mining coordinate or move the Fleet there, refresh, and retry.`);
167
+ }
168
+ const characterData = characterAccountDefinition.decode(characterAccount);
169
+ if (characterData.game !== game ||
170
+ characterData.playerProfile !== authorization.profile) {
171
+ fail(character, 'Character does not match the owning Profile and configured Game. Refresh or repair the canonical Character registration before retrying.');
172
+ }
173
+ const tracker = regionTrackerAccountDefinition.decode(trackerAccount);
174
+ if (tracker.game !== game) {
175
+ fail(regionTracker, 'RegionTracker does not match the configured Game. Refresh world region data for this Game before retrying.');
176
+ }
177
+ const resources = resourceIds
178
+ .map((id) => {
179
+ const resource = asteroid.resources.find((r) => r.cargo.id === id);
180
+ return `${resource.cargo.name} (cargo ${id})`;
181
+ })
182
+ .join(', ');
183
+ const describes = `Start mining with Fleet ${fleet.name} at Asteroid ${asteroid.name}: ${resources}.`;
184
+ const settlementWarning = movingSnapshot
185
+ ? ' Direct mining needs Idle. Explicitly prepend planFleetSettleArrival with a visible funder, or settle and reload the Fleet before planning mining. Settlement plus mining is verified by unsigned PTR simulation for an elapsed warp only; elapsed-subwarp composition remains unmeasured.'
186
+ : '';
187
+ return createPlan({
188
+ kind: 'fleet.start-mining',
189
+ summary: describes,
190
+ steps: [
191
+ {
192
+ describes: `${describes}${settlementWarning} Simulate before execution; arrival, permissions, range, fuel, and mining eligibility remain chain-authoritative.`,
193
+ signers: [authorization.authority],
194
+ instruction: adaptStartMiningAsteroidInstruction({
195
+ authorization,
196
+ fleet: fleet.address,
197
+ character,
198
+ starSystem: systemAccount.address,
199
+ regionTracker,
200
+ asteroid: asteroid.address,
201
+ game,
202
+ resources: resourceIds,
203
+ }),
204
+ },
205
+ ],
206
+ preconditions: [],
207
+ });
208
+ }
209
+ /** Plans one inert stop-mining instruction using the Asteroid in Fleet state.
210
+ *
211
+ * The snapshot must be mining; refresh any non-mining snapshot before retrying.
212
+ * If mining resolves to idle after planning, the instruction can still consume
213
+ * planet-exit fuel, as observed on PTR, or fail cargo/upkeep checks. Refresh
214
+ * before planning and simulate before execution; Idle is not a free no-op.
215
+ * No yield, cargo amount, or execution success is promised. DO_MINING
216
+ * permission remains chain-authoritative. Only validated canonical optional
217
+ * accounts are included, including the chain-created neutral CrewBinding at
218
+ * its canonical PDA; proven absence uses the generated omitted-account sentinel.
219
+ * Planning does not sign, simulate, or submit a transaction.
220
+ *
221
+ * @example
222
+ * ```ts
223
+ * declare const ctx: SageContext;
224
+ * declare const fleet: FleetSnapshot;
225
+ * declare const authorization: PlanAuthorization;
226
+ * const plan = await planFleetStopMining(ctx, fleet, { authorization });
227
+ * ```
228
+ */
229
+ export async function planFleetStopMining(ctx, fleet, options) {
230
+ const game = requireGameAddress(ctx);
231
+ validateOptionsObject(options, 'options');
232
+ validateOptionsObject(options.authorization, 'authorization');
233
+ const authorization = {
234
+ profile: options.authorization.profile,
235
+ authority: options.authorization.authority,
236
+ keyIndex: options.authorization.keyIndex,
237
+ ...(options.authorization.certificate === undefined
238
+ ? {}
239
+ : { certificate: options.authorization.certificate }),
240
+ };
241
+ validatePlanAuthorization(authorization);
242
+ if (fleet.state.kind !== 'mining') {
243
+ fail(fleet.address, `Fleet ${fleet.name} is ${fleet.state.kind} and cannot stop mining. Refresh the Fleet and retry only with a mining snapshot; an idle Fleet has already stopped.`);
244
+ }
245
+ if (fleet.game !== game ||
246
+ fleet.ownerProfile.address !== authorization.profile) {
247
+ fail(fleet.address, `Fleet ${fleet.name} must belong to configured Game ${game} and authorized Profile ${authorization.profile}. Choose the owning Profile and matching Game, refresh the Fleet, and retry.`);
248
+ }
249
+ const asteroid = fleet.state.asteroid.address;
250
+ const [character, crewBinding, regionTracker] = await Promise.all([
251
+ findCharacterPda(authorization.profile, game),
252
+ deriveFleetCrewBindingAddress(fleet.address),
253
+ deriveRegionTrackerAddress(game),
254
+ ]);
255
+ const [crewAccount, regionAccount] = await readContextRawAccounts(ctx, [
256
+ crewBinding,
257
+ regionTracker,
258
+ ]);
259
+ if (crewAccount !== undefined) {
260
+ const crew = fleetCrewBindingAccountDefinition.decode(crewAccount);
261
+ if (crewAccount.address !== crewBinding ||
262
+ (!crew.isNeutral &&
263
+ (crew.fleet !== fleet.address ||
264
+ crew.ownerProfile !== authorization.profile))) {
265
+ fail(crewBinding, 'FleetCrewBinding does not match its canonical address, Fleet, or owning Profile. Refresh the Fleet crew registration and retry.');
266
+ }
267
+ }
268
+ if (regionAccount !== undefined) {
269
+ const region = regionTrackerAccountDefinition.decode(regionAccount);
270
+ if (regionAccount.address !== regionTracker || region.game !== game) {
271
+ fail(regionTracker, 'RegionTracker does not match its canonical address or configured Game. Refresh world region data for this Game and retry.');
272
+ }
273
+ }
274
+ return createPlan({
275
+ kind: 'fleet.stop-mining',
276
+ summary: `Stop mining for Fleet ${fleet.name}.`,
277
+ steps: [
278
+ {
279
+ describes: `Stop mining for Fleet ${fleet.name} at Asteroid ${asteroid}, returning it to idle; already idle Fleets are refreshed and can fail cargo/upkeep checks. Simulate before execution; permission and mining results remain chain-authoritative.`,
280
+ signers: [authorization.authority],
281
+ instruction: adaptStopMiningAsteroidInstruction({
282
+ authorization,
283
+ character,
284
+ fleet: fleet.address,
285
+ game,
286
+ asteroid,
287
+ ...(crewAccount === undefined ? {} : { crewBinding }),
288
+ ...(regionAccount === undefined ? {} : { regionTracker }),
289
+ }),
290
+ },
291
+ ],
292
+ preconditions: [],
293
+ });
294
+ }
295
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mining/actions/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/planning/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAaL,KAAK,UAAU,EACf,KAAK,SAAS,EAOd,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAEV,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,EAAE,IAAI,EAAoB,MAAM,YAAY,CAAC;AAgBzD;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,CAAC;IACP,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC,GACF,QAAQ,CAAC;IACP,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,YAAY,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAC9D,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC,CAAC;AAEP;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAYhF,2EAA2E;AAC3E,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,UAAU,EAAE,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AA2wBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAE9B;AAED,mFAAmF;AACnF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,kBAAkB,EAC3B,SAAS,CAAC,EAAE,sBAAsB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAiD9B"}
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/planning/execution.ts"],"names":[],"mappings":"AAqBA,OAAO,EAcL,KAAK,UAAU,EACf,KAAK,SAAS,EAOd,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAEV,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,EAAE,IAAI,EAAoB,MAAM,YAAY,CAAC;AAgBzD;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,CAAC;IACP,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC,GACF,QAAQ,CAAC;IACP,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,YAAY,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAC9D,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC,CAAC;AAEP;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAYhF,2EAA2E;AAC3E,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,UAAU,EAAE,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAi+BD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAE9B;AAED,mFAAmF;AACnF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,kBAAkB,EAC3B,SAAS,CAAC,EAAE,sBAAsB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAiD9B"}
@@ -1,4 +1,13 @@
1
- import { getAddressEncoder, getAddressDecoder, getBase58Decoder, getBase64EncodedWireTransaction, getSignatureFromTransaction, isAddress, isTransactionModifyingSigner, isTransactionPartialSigner, isTransactionSendingSigner, signAndSendTransactionWithSigners, signTransactionWithSigners, } from '@solana/kit';
1
+ import { matchesFactionTradeState } from '../internal/planning/faction-trade-state.js';
2
+ import { resolveFleetShipAssembly, validateFleetShipAssembly, } from '../internal/planning/fleet-ship-assembly.js';
3
+ import { resolveFleetCreation, validateFleetCreation, } from '../internal/planning/fleet-creation.js';
4
+ import { validateTokenMint } from '../internal/planning/token-mint.js';
5
+ import { hashGameShipConfigurations, decodeGameShipAssemblyCatalog, } from '../registry/ships.js';
6
+ import { validateGameForCharacterRegistration } from '../registry/onboarding.js';
7
+ import { hashAccountState } from '../internal/planning/account-state.js';
8
+ import { hashGameCargoConfigurationGuards } from '../registry/cargo.js';
9
+ import { validateWalletCargoCache } from '../internal/c4/wallet-cargo-cache.js';
10
+ import { getAddressEncoder, getProgramDerivedAddress, getAddressDecoder, getBase58Decoder, getBase64EncodedWireTransaction, getSignatureFromTransaction, isAddress, isTransactionModifyingSigner, isTransactionPartialSigner, isTransactionSendingSigner, signAndSendTransactionWithSigners, signTransactionWithSigners, } from '@solana/kit';
2
11
  import { InvalidActionInputError, SageSdkError } from '../client/errors.js';
3
12
  import { invalidateContextAddresses, readContextRawAccounts, } from '../client/reconciliation.js';
4
13
  import { assemblePlan, validateAssemblyPolicy, validatePlanAssemblyPolicy, validatePlan, } from './assembly.js';
@@ -31,8 +40,8 @@ class MissingWriteTransportError extends SageSdkError {
31
40
  class ActionPreconditionFailedError extends SageSdkError {
32
41
  describes;
33
42
  observedSlot;
34
- constructor(precondition, observedSlot) {
35
- super('ACTION_PRECONDITION_FAILED', `The account state required by this Plan changed at ${precondition.address}: ${precondition.describes} Refresh the affected game state and create a new Plan before retrying.`, { address: precondition.address });
43
+ constructor(precondition, observedSlot, cause) {
44
+ super('ACTION_PRECONDITION_FAILED', `The account state required by this Plan changed at ${precondition.address}: ${cause ?? precondition.describes} Refresh the affected game state and create a new Plan before retrying.`, { address: precondition.address });
36
45
  this.describes = precondition.describes;
37
46
  this.observedSlot = observedSlot;
38
47
  }
@@ -271,14 +280,6 @@ function readFinalLastValidBlockHeight(transaction) {
271
280
  }
272
281
  return value;
273
282
  }
274
- async function hashAccountState(owner, data) {
275
- const ownerBytes = getAddressEncoder().encode(owner);
276
- const canonical = new Uint8Array(ownerBytes.length + data.length);
277
- canonical.set(ownerBytes);
278
- canonical.set(data, ownerBytes.length);
279
- const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', canonical));
280
- return [...digest].map((byte) => byte.toString(16).padStart(2, '0')).join('');
281
- }
282
283
  // Original Token Account layout: mint/authority at 0/32, initialized state at
283
284
  // 108, and u32 COption tags at 72/109/129. No capability decoder is imported.
284
285
  function matchesTokenAccount(account, expected) {
@@ -287,7 +288,9 @@ function matchesTokenAccount(account, expected) {
287
288
  account.data.length !== 165)
288
289
  return false;
289
290
  const bytes = new DataView(account.data.buffer, account.data.byteOffset, account.data.byteLength);
290
- if (bytes.getUint8(108) !== 1 ||
291
+ if ((expected.kind === 'token-account' &&
292
+ bytes.getBigUint64(64, true) < expected.minimumBalance) ||
293
+ bytes.getUint8(108) !== 1 ||
291
294
  [72, 109, 129].some((offset) => bytes.getUint32(offset, true) > 1))
292
295
  return false;
293
296
  const decoder = getAddressDecoder();
@@ -295,16 +298,188 @@ function matchesTokenAccount(account, expected) {
295
298
  decoder.decode(account.data.subarray(32, 64)) === expected.owner);
296
299
  }
297
300
  async function checkPreconditions(context, preconditions, commitment) {
298
- const addresses = [...new Set(preconditions.map(({ address }) => address))];
301
+ const fleetCreationAccounts = new Map();
302
+ const fleetAssemblyAccounts = new Map();
303
+ const assemblyGames = new Set();
304
+ const assemblyCatalogs = new Map();
305
+ const requiredAddresses = new Set(preconditions.map(({ address }) => address));
306
+ for (const guard of preconditions) {
307
+ if (guard.kind !== 'fleet-create')
308
+ continue;
309
+ const resolved = await resolveFleetCreation(guard);
310
+ if (resolved.fleet !== guard.address)
311
+ throw new ActionPreconditionFailedError(guard, undefined, 'The Fleet address does not match this Game, Profile and exact label. Recreate the Fleet creation Plan from its intended label.');
312
+ fleetCreationAccounts.set(guard, resolved);
313
+ for (const address of [
314
+ resolved.game,
315
+ resolved.profile,
316
+ resolved.system,
317
+ resolved.character,
318
+ resolved.profileFaction,
319
+ resolved.starbasePlayer,
320
+ resolved.fleet,
321
+ resolved.rent,
322
+ resolved.clock,
323
+ ])
324
+ requiredAddresses.add(address);
325
+ }
326
+ for (const guard of preconditions) {
327
+ if (guard.kind !== 'fleet-add-ship')
328
+ continue;
329
+ const resolved = await resolveFleetShipAssembly(guard);
330
+ fleetAssemblyAccounts.set(guard, resolved);
331
+ assemblyGames.add(resolved.game);
332
+ for (const address of [
333
+ resolved.game,
334
+ resolved.profile,
335
+ resolved.system,
336
+ resolved.character,
337
+ resolved.profileFaction,
338
+ resolved.starbasePlayer,
339
+ resolved.fleet,
340
+ resolved.rent,
341
+ resolved.clock,
342
+ ])
343
+ requiredAddresses.add(address);
344
+ }
345
+ const addresses = [...requiredAddresses];
299
346
  const accounts = await readContextRawAccounts(context, addresses, {
300
347
  commitment,
301
348
  });
302
349
  const byAddress = new Map(addresses.map((address, index) => [address, accounts[index]]));
350
+ const cargoIdsByGame = new Map();
351
+ for (const guard of preconditions) {
352
+ if (guard.kind !== 'game-cargo-config' &&
353
+ guard.kind !== 'game-cargo-bytes-config')
354
+ continue;
355
+ const ids = cargoIdsByGame.get(guard.address) ?? { legacy: [], bytes: [] };
356
+ ids[guard.kind === 'game-cargo-config' ? 'legacy' : 'bytes'].push(guard.cargoId);
357
+ cargoIdsByGame.set(guard.address, ids);
358
+ }
359
+ const shipIdsByGame = new Map();
360
+ for (const guard of preconditions) {
361
+ if (guard.kind !== 'game-ship-config')
362
+ continue;
363
+ const ids = shipIdsByGame.get(guard.address) ?? [];
364
+ ids.push(guard.shipId);
365
+ shipIdsByGame.set(guard.address, ids);
366
+ }
367
+ const shipHashesByGame = new Map();
368
+ // Invocation-local only: every execution attempt still reads and decodes fresh state.
369
+ const cargoHashesByGame = new Map();
370
+ const validatedGames = new Set();
303
371
  for (const precondition of preconditions) {
304
372
  const account = byAddress.get(precondition.address);
305
- if ((precondition.kind === 'token-account-or-absent' &&
306
- account !== undefined &&
307
- !matchesTokenAccount(account, precondition)) ||
373
+ if (precondition.kind === 'fleet-add-ship') {
374
+ try {
375
+ const game = byAddress.get(precondition.game);
376
+ let catalog = assemblyCatalogs.get(precondition.game);
377
+ if (!catalog && game) {
378
+ catalog = decodeGameShipAssemblyCatalog(game);
379
+ assemblyCatalogs.set(precondition.game, catalog);
380
+ }
381
+ await validateFleetShipAssembly(precondition, fleetAssemblyAccounts.get(precondition), byAddress, precondition, catalog);
382
+ }
383
+ catch (error) {
384
+ throw new ActionPreconditionFailedError(precondition, account?.slot, String(error));
385
+ }
386
+ continue;
387
+ }
388
+ if (precondition.kind === 'fleet-create') {
389
+ try {
390
+ await validateFleetCreation(precondition, fleetCreationAccounts.get(precondition), byAddress, precondition.maximumProfileDebit);
391
+ }
392
+ catch (error) {
393
+ throw new ActionPreconditionFailedError(precondition, account?.slot, String(error));
394
+ }
395
+ continue;
396
+ }
397
+ let narrowed = true;
398
+ if (precondition.kind === 'token-account')
399
+ narrowed =
400
+ account !== undefined && matchesTokenAccount(account, precondition);
401
+ if (precondition.kind === 'faction-treasury-buy' ||
402
+ precondition.kind === 'faction-treasury-sell' ||
403
+ precondition.kind === 'faction-epoch-meter' ||
404
+ precondition.kind === 'token-mint' ||
405
+ precondition.kind === 'game-ship-config' ||
406
+ precondition.kind === 'game-account' ||
407
+ precondition.kind === 'game-cargo-config' ||
408
+ precondition.kind === 'game-cargo-bytes-config' ||
409
+ precondition.kind === 'cargo-cache') {
410
+ try {
411
+ if (!account)
412
+ narrowed = false;
413
+ else if (precondition.kind === 'faction-treasury-buy' ||
414
+ precondition.kind === 'faction-treasury-sell' ||
415
+ precondition.kind === 'faction-epoch-meter') {
416
+ narrowed = await matchesFactionTradeState(account, precondition);
417
+ }
418
+ else if (precondition.kind === 'token-mint') {
419
+ narrowed = validateTokenMint(account) === precondition.decimals;
420
+ }
421
+ else if (precondition.kind === 'game-ship-config') {
422
+ let hashes = shipHashesByGame.get(precondition.address);
423
+ if (!hashes) {
424
+ let catalog = assemblyCatalogs.get(precondition.address);
425
+ if (!catalog && assemblyGames.has(precondition.address)) {
426
+ catalog = decodeGameShipAssemblyCatalog(account);
427
+ assemblyCatalogs.set(precondition.address, catalog);
428
+ }
429
+ hashes = await hashGameShipConfigurations(account, shipIdsByGame.get(precondition.address), catalog);
430
+ shipHashesByGame.set(precondition.address, hashes);
431
+ }
432
+ narrowed =
433
+ hashes.get(precondition.shipId) === precondition.configHash;
434
+ }
435
+ else if (precondition.kind === 'game-account') {
436
+ if (!validatedGames.has(account.address)) {
437
+ if (assemblyGames.has(precondition.address)) {
438
+ if (!assemblyCatalogs.has(precondition.address))
439
+ assemblyCatalogs.set(precondition.address, decodeGameShipAssemblyCatalog(account));
440
+ }
441
+ else
442
+ validateGameForCharacterRegistration(account);
443
+ validatedGames.add(account.address);
444
+ }
445
+ }
446
+ else if (precondition.kind === 'game-cargo-config' ||
447
+ precondition.kind === 'game-cargo-bytes-config') {
448
+ let hashes = cargoHashesByGame.get(precondition.address);
449
+ if (!hashes) {
450
+ const ids = cargoIdsByGame.get(precondition.address);
451
+ hashes = await hashGameCargoConfigurationGuards(account, ids.legacy, ids.bytes);
452
+ cargoHashesByGame.set(precondition.address, hashes);
453
+ }
454
+ narrowed =
455
+ hashes[precondition.kind === 'game-cargo-config' ? 'legacy' : 'bytes'].get(precondition.cargoId) === precondition.configHash;
456
+ }
457
+ else {
458
+ validateWalletCargoCache(account, precondition.game, precondition.bump);
459
+ const [canonical, bump] = await getProgramDerivedAddress({
460
+ programAddress: account.owner,
461
+ seeds: [
462
+ new TextEncoder().encode('CargoDefinitionsCache'),
463
+ getAddressEncoder().encode(precondition.game),
464
+ ],
465
+ });
466
+ narrowed =
467
+ canonical === account.address && bump === precondition.bump;
468
+ }
469
+ }
470
+ catch {
471
+ narrowed = false;
472
+ }
473
+ }
474
+ if (!narrowed ||
475
+ (precondition.kind === 'token-account-or-absent' &&
476
+ account !== undefined &&
477
+ !matchesTokenAccount(account, precondition)) ||
478
+ (precondition.kind === 'system-account-or-absent' &&
479
+ account !== undefined &&
480
+ (account.owner !== '11111111111111111111111111111111' ||
481
+ account.executable ||
482
+ account.data.length !== 0)) ||
308
483
  (precondition.kind === 'account-absent' && account !== undefined) ||
309
484
  (precondition.kind === 'account-state' &&
310
485
  (account === undefined ||