@aephia/atlas-kit 0.0.0
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.
- package/LICENSE +202 -0
- package/README.md +124 -0
- package/dist/bindings.d.ts +11 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +11 -0
- package/dist/bindings.js.map +1 -0
- package/dist/cargo/actions/index.d.ts +122 -0
- package/dist/cargo/actions/index.d.ts.map +1 -0
- package/dist/cargo/actions/index.js +526 -0
- package/dist/cargo/actions/index.js.map +1 -0
- package/dist/cargo/index.d.ts +77 -0
- package/dist/cargo/index.d.ts.map +1 -0
- package/dist/cargo/index.js +102 -0
- package/dist/cargo/index.js.map +1 -0
- package/dist/claim-stakes/index.d.ts +64 -0
- package/dist/claim-stakes/index.d.ts.map +1 -0
- package/dist/claim-stakes/index.js +97 -0
- package/dist/claim-stakes/index.js.map +1 -0
- package/dist/client/context.d.ts +21 -0
- package/dist/client/context.d.ts.map +1 -0
- package/dist/client/context.js +1374 -0
- package/dist/client/context.js.map +1 -0
- package/dist/client/contracts.d.ts +671 -0
- package/dist/client/contracts.d.ts.map +1 -0
- package/dist/client/contracts.js +2 -0
- package/dist/client/contracts.js.map +1 -0
- package/dist/client/deployments.d.ts +3 -0
- package/dist/client/deployments.d.ts.map +1 -0
- package/dist/client/deployments.js +2 -0
- package/dist/client/deployments.js.map +1 -0
- package/dist/client/errors.d.ts +227 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +288 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/lifecycle.d.ts +4 -0
- package/dist/client/lifecycle.d.ts.map +1 -0
- package/dist/client/lifecycle.js +10 -0
- package/dist/client/lifecycle.js.map +1 -0
- package/dist/client/provider-errors.d.ts +9 -0
- package/dist/client/provider-errors.d.ts.map +1 -0
- package/dist/client/provider-errors.js +12 -0
- package/dist/client/provider-errors.js.map +1 -0
- package/dist/client/reconciliation.d.ts +10 -0
- package/dist/client/reconciliation.d.ts.map +1 -0
- package/dist/client/reconciliation.js +9 -0
- package/dist/client/reconciliation.js.map +1 -0
- package/dist/client/refs.d.ts +23 -0
- package/dist/client/refs.d.ts.map +1 -0
- package/dist/client/refs.js +12 -0
- package/dist/client/refs.js.map +1 -0
- package/dist/combat/index.d.ts +256 -0
- package/dist/combat/index.d.ts.map +1 -0
- package/dist/combat/index.js +222 -0
- package/dist/combat/index.js.map +1 -0
- package/dist/crafting/index.d.ts +308 -0
- package/dist/crafting/index.d.ts.map +1 -0
- package/dist/crafting/index.js +400 -0
- package/dist/crafting/index.js.map +1 -0
- package/dist/factions/index.d.ts +292 -0
- package/dist/factions/index.d.ts.map +1 -0
- package/dist/factions/index.js +334 -0
- package/dist/factions/index.js.map +1 -0
- package/dist/fleets/actions/index.d.ts +200 -0
- package/dist/fleets/actions/index.d.ts.map +1 -0
- package/dist/fleets/actions/index.js +854 -0
- package/dist/fleets/actions/index.js.map +1 -0
- package/dist/fleets/index.d.ts +100 -0
- package/dist/fleets/index.d.ts.map +1 -0
- package/dist/fleets/index.js +124 -0
- package/dist/fleets/index.js.map +1 -0
- package/dist/identity/index.d.ts +225 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +341 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +401 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +519 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/c4/adapter.d.ts +6 -0
- package/dist/internal/c4/adapter.d.ts.map +1 -0
- package/dist/internal/c4/adapter.js +2 -0
- package/dist/internal/c4/adapter.js.map +1 -0
- package/dist/internal/c4/bindings.d.ts +4 -0
- package/dist/internal/c4/bindings.d.ts.map +1 -0
- package/dist/internal/c4/bindings.js +4 -0
- package/dist/internal/c4/bindings.js.map +1 -0
- package/dist/internal/c4/character-modifier.d.ts +5 -0
- package/dist/internal/c4/character-modifier.d.ts.map +1 -0
- package/dist/internal/c4/character-modifier.js +100 -0
- package/dist/internal/c4/character-modifier.js.map +1 -0
- package/dist/internal/c4/claim-stake.d.ts +140 -0
- package/dist/internal/c4/claim-stake.d.ts.map +1 -0
- package/dist/internal/c4/claim-stake.js +205 -0
- package/dist/internal/c4/claim-stake.js.map +1 -0
- package/dist/internal/c4/combat.d.ts +98 -0
- package/dist/internal/c4/combat.d.ts.map +1 -0
- package/dist/internal/c4/combat.js +232 -0
- package/dist/internal/c4/combat.js.map +1 -0
- package/dist/internal/c4/crafting.d.ts +170 -0
- package/dist/internal/c4/crafting.d.ts.map +1 -0
- package/dist/internal/c4/crafting.js +387 -0
- package/dist/internal/c4/crafting.js.map +1 -0
- package/dist/internal/c4/factions.d.ts +248 -0
- package/dist/internal/c4/factions.d.ts.map +1 -0
- package/dist/internal/c4/factions.js +589 -0
- package/dist/internal/c4/factions.js.map +1 -0
- package/dist/internal/c4/fleet-crew-binding.d.ts +12 -0
- package/dist/internal/c4/fleet-crew-binding.d.ts.map +1 -0
- package/dist/internal/c4/fleet-crew-binding.js +51 -0
- package/dist/internal/c4/fleet-crew-binding.js.map +1 -0
- package/dist/internal/c4/fleet.d.ts +310 -0
- package/dist/internal/c4/fleet.d.ts.map +1 -0
- package/dist/internal/c4/fleet.js +393 -0
- package/dist/internal/c4/fleet.js.map +1 -0
- package/dist/internal/c4/game.d.ts +192 -0
- package/dist/internal/c4/game.d.ts.map +1 -0
- package/dist/internal/c4/game.js +396 -0
- package/dist/internal/c4/game.js.map +1 -0
- package/dist/internal/c4/identity.d.ts +193 -0
- package/dist/internal/c4/identity.d.ts.map +1 -0
- package/dist/internal/c4/identity.js +180 -0
- package/dist/internal/c4/identity.js.map +1 -0
- package/dist/internal/c4/loot-layout.d.ts +20 -0
- package/dist/internal/c4/loot-layout.d.ts.map +1 -0
- package/dist/internal/c4/loot-layout.js +29 -0
- package/dist/internal/c4/loot-layout.js.map +1 -0
- package/dist/internal/c4/loyalty.d.ts +102 -0
- package/dist/internal/c4/loyalty.d.ts.map +1 -0
- package/dist/internal/c4/loyalty.js +318 -0
- package/dist/internal/c4/loyalty.js.map +1 -0
- package/dist/internal/c4/market.d.ts +112 -0
- package/dist/internal/c4/market.d.ts.map +1 -0
- package/dist/internal/c4/market.js +247 -0
- package/dist/internal/c4/market.js.map +1 -0
- package/dist/internal/c4/pda.d.ts +6 -0
- package/dist/internal/c4/pda.d.ts.map +1 -0
- package/dist/internal/c4/pda.js +45 -0
- package/dist/internal/c4/pda.js.map +1 -0
- package/dist/internal/c4/profile-faction.d.ts +14 -0
- package/dist/internal/c4/profile-faction.d.ts.map +1 -0
- package/dist/internal/c4/profile-faction.js +69 -0
- package/dist/internal/c4/profile-faction.js.map +1 -0
- package/dist/internal/c4/rewards.d.ts +135 -0
- package/dist/internal/c4/rewards.d.ts.map +1 -0
- package/dist/internal/c4/rewards.js +305 -0
- package/dist/internal/c4/rewards.js.map +1 -0
- package/dist/internal/c4/scanning.d.ts +85 -0
- package/dist/internal/c4/scanning.d.ts.map +1 -0
- package/dist/internal/c4/scanning.js +180 -0
- package/dist/internal/c4/scanning.js.map +1 -0
- package/dist/internal/c4/starbase.d.ts +186 -0
- package/dist/internal/c4/starbase.d.ts.map +1 -0
- package/dist/internal/c4/starbase.js +259 -0
- package/dist/internal/c4/starbase.js.map +1 -0
- package/dist/internal/c4/world.d.ts +294 -0
- package/dist/internal/c4/world.d.ts.map +1 -0
- package/dist/internal/c4/world.js +417 -0
- package/dist/internal/c4/world.js.map +1 -0
- package/dist/internal/cargo.d.ts +65 -0
- package/dist/internal/cargo.d.ts.map +1 -0
- package/dist/internal/cargo.js +46 -0
- package/dist/internal/cargo.js.map +1 -0
- package/dist/internal/claim-stake.d.ts +31 -0
- package/dist/internal/claim-stake.d.ts.map +1 -0
- package/dist/internal/claim-stake.js +20 -0
- package/dist/internal/claim-stake.js.map +1 -0
- package/dist/internal/fleet.d.ts +165 -0
- package/dist/internal/fleet.d.ts.map +1 -0
- package/dist/internal/fleet.js +179 -0
- package/dist/internal/fleet.js.map +1 -0
- package/dist/internal/game-context.d.ts +4 -0
- package/dist/internal/game-context.d.ts.map +1 -0
- package/dist/internal/game-context.js +9 -0
- package/dist/internal/game-context.js.map +1 -0
- package/dist/internal/immutable-tree.d.ts +5 -0
- package/dist/internal/immutable-tree.d.ts.map +1 -0
- package/dist/internal/immutable-tree.js +47 -0
- package/dist/internal/immutable-tree.js.map +1 -0
- package/dist/internal/json.d.ts +7 -0
- package/dist/internal/json.d.ts.map +1 -0
- package/dist/internal/json.js +33 -0
- package/dist/internal/json.js.map +1 -0
- package/dist/internal/planning/authorization-adapter.d.ts +63 -0
- package/dist/internal/planning/authorization-adapter.d.ts.map +1 -0
- package/dist/internal/planning/authorization-adapter.js +222 -0
- package/dist/internal/planning/authorization-adapter.js.map +1 -0
- package/dist/internal/read-meta.d.ts +84 -0
- package/dist/internal/read-meta.d.ts.map +1 -0
- package/dist/internal/read-meta.js +28 -0
- package/dist/internal/read-meta.js.map +1 -0
- package/dist/internal/resolved-snapshot.d.ts +3 -0
- package/dist/internal/resolved-snapshot.d.ts.map +1 -0
- package/dist/internal/resolved-snapshot.js +11 -0
- package/dist/internal/resolved-snapshot.js.map +1 -0
- package/dist/internal/zink/provider.d.ts +9 -0
- package/dist/internal/zink/provider.d.ts.map +1 -0
- package/dist/internal/zink/provider.js +213 -0
- package/dist/internal/zink/provider.js.map +1 -0
- package/dist/loyalty/index.d.ts +195 -0
- package/dist/loyalty/index.d.ts.map +1 -0
- package/dist/loyalty/index.js +289 -0
- package/dist/loyalty/index.js.map +1 -0
- package/dist/markets/index.d.ts +195 -0
- package/dist/markets/index.d.ts.map +1 -0
- package/dist/markets/index.js +232 -0
- package/dist/markets/index.js.map +1 -0
- package/dist/mining/index.d.ts +156 -0
- package/dist/mining/index.d.ts.map +1 -0
- package/dist/mining/index.js +236 -0
- package/dist/mining/index.js.map +1 -0
- package/dist/planning/assembly.d.ts +42 -0
- package/dist/planning/assembly.d.ts.map +1 -0
- package/dist/planning/assembly.js +141 -0
- package/dist/planning/assembly.js.map +1 -0
- package/dist/planning/composition.d.ts +4 -0
- package/dist/planning/composition.d.ts.map +1 -0
- package/dist/planning/composition.js +76 -0
- package/dist/planning/composition.js.map +1 -0
- package/dist/planning/execution.d.ts +93 -0
- package/dist/planning/execution.d.ts.map +1 -0
- package/dist/planning/execution.js +549 -0
- package/dist/planning/execution.js.map +1 -0
- package/dist/planning/index.d.ts +219 -0
- package/dist/planning/index.d.ts.map +1 -0
- package/dist/planning/index.js +375 -0
- package/dist/planning/index.js.map +1 -0
- package/dist/planning/plan-instances.d.ts +3 -0
- package/dist/planning/plan-instances.d.ts.map +1 -0
- package/dist/planning/plan-instances.js +8 -0
- package/dist/planning/plan-instances.js.map +1 -0
- package/dist/planning/plan-sequence-checkpoint.d.ts +154 -0
- package/dist/planning/plan-sequence-checkpoint.d.ts.map +1 -0
- package/dist/planning/plan-sequence-checkpoint.js +449 -0
- package/dist/planning/plan-sequence-checkpoint.js.map +1 -0
- package/dist/planning/plan-sequence-execution.d.ts +72 -0
- package/dist/planning/plan-sequence-execution.d.ts.map +1 -0
- package/dist/planning/plan-sequence-execution.js +410 -0
- package/dist/planning/plan-sequence-execution.js.map +1 -0
- package/dist/planning/plan-sequence.d.ts +244 -0
- package/dist/planning/plan-sequence.d.ts.map +1 -0
- package/dist/planning/plan-sequence.js +264 -0
- package/dist/planning/plan-sequence.js.map +1 -0
- package/dist/planning/simulation.d.ts +50 -0
- package/dist/planning/simulation.d.ts.map +1 -0
- package/dist/planning/simulation.js +69 -0
- package/dist/planning/simulation.js.map +1 -0
- package/dist/registry/combat.d.ts +5 -0
- package/dist/registry/combat.d.ts.map +1 -0
- package/dist/registry/combat.js +7 -0
- package/dist/registry/combat.js.map +1 -0
- package/dist/registry/index.d.ts +138 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +397 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/rewards/index.d.ts +202 -0
- package/dist/rewards/index.d.ts.map +1 -0
- package/dist/rewards/index.js +290 -0
- package/dist/rewards/index.js.map +1 -0
- package/dist/scanning/index.d.ts +185 -0
- package/dist/scanning/index.d.ts.map +1 -0
- package/dist/scanning/index.js +207 -0
- package/dist/scanning/index.js.map +1 -0
- package/dist/starbases/actions/index.d.ts +60 -0
- package/dist/starbases/actions/index.d.ts.map +1 -0
- package/dist/starbases/actions/index.js +245 -0
- package/dist/starbases/actions/index.js.map +1 -0
- package/dist/starbases/index.d.ts +165 -0
- package/dist/starbases/index.d.ts.map +1 -0
- package/dist/starbases/index.js +213 -0
- package/dist/starbases/index.js.map +1 -0
- package/dist/world/index.d.ts +180 -0
- package/dist/world/index.d.ts.map +1 -0
- package/dist/world/index.js +265 -0
- package/dist/world/index.js.map +1 -0
- package/package.json +140 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { AccountDecodeError, InvalidDerivationInputError, entityRef, } from '../client/index.js';
|
|
2
|
+
import { celestialBodyAccountDefinition, deriveCelestialBodyAddress, } from '../internal/c4/world.js';
|
|
3
|
+
import { assertCanonicalFleetAddress, discoverFleetAccounts, fleetAccountDefinition, } from '../internal/c4/fleet.js';
|
|
4
|
+
import { requireGameAddress } from '../internal/game-context.js';
|
|
5
|
+
import { attachJsonSerialization } from '../internal/json.js';
|
|
6
|
+
import { attachReadMeta, readMeta } from '../internal/read-meta.js';
|
|
7
|
+
import { freezeResolvedSnapshot } from '../internal/resolved-snapshot.js';
|
|
8
|
+
import { resolveCargo, } from '../registry/index.js';
|
|
9
|
+
const DEPOSIT_SNAPSHOTS = new WeakMap();
|
|
10
|
+
const MINING_SNAPSHOTS = new WeakMap();
|
|
11
|
+
function directMetadata(envelope) {
|
|
12
|
+
return {
|
|
13
|
+
commitment: envelope.commitment,
|
|
14
|
+
slot: envelope.slot,
|
|
15
|
+
source: envelope.source,
|
|
16
|
+
strategy: 'direct',
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function assertConfiguredGame(context, accountType, envelope) {
|
|
20
|
+
const game = requireGameAddress(context);
|
|
21
|
+
if (envelope.data.game === game)
|
|
22
|
+
return;
|
|
23
|
+
throw new AccountDecodeError(accountType, envelope.address, new RangeError(`The decoded ${accountType} references a different Game.`), `The ${accountType} at ${envelope.address} belongs to Game ${envelope.data.game}, not configured Game ${game}. Verify the address, cluster, and pinned binding version before retrying.`);
|
|
24
|
+
}
|
|
25
|
+
async function createResourceDepositSnapshot(context, envelope) {
|
|
26
|
+
assertConfiguredGame(context, 'celestialBody', envelope);
|
|
27
|
+
if (envelope.data.kind !== 'asteroid') {
|
|
28
|
+
throw new AccountDecodeError('celestialBody', envelope.address, new RangeError('The decoded CelestialBody is not an Asteroid.'), `CelestialBody ${envelope.address} is not an Asteroid and has no Fleet-mining resource deposit. Supply an Asteroid address before retrying.`);
|
|
29
|
+
}
|
|
30
|
+
const asteroid = envelope.data;
|
|
31
|
+
const canonicalAddress = await deriveCelestialBodyAddress(asteroid.game, asteroid.id);
|
|
32
|
+
if (envelope.address !== canonicalAddress) {
|
|
33
|
+
throw new AccountDecodeError('celestialBody', envelope.address, new RangeError('The decoded Asteroid is stored at a noncanonical CelestialBody address.'), `CelestialBody ${envelope.address} decoded id ${asteroid.id}, whose canonical CelestialBody address is ${canonicalAddress}. Refresh the Asteroid pointer and verify the configured cluster and pinned binding version before retrying.`);
|
|
34
|
+
}
|
|
35
|
+
const resources = await Promise.all(asteroid.details.resources.map(async (resource) => ({
|
|
36
|
+
activeMinerCountRaw: resource.miners,
|
|
37
|
+
amountMinedUnitsRaw: resource.amountMined,
|
|
38
|
+
cargo: await resolveCargo(context, resource.cargoId),
|
|
39
|
+
richness: resource.richness,
|
|
40
|
+
})));
|
|
41
|
+
return freezeResolvedSnapshot(attachReadMeta(attachJsonSerialization({
|
|
42
|
+
address: envelope.address,
|
|
43
|
+
bodyId: asteroid.id,
|
|
44
|
+
game: asteroid.game,
|
|
45
|
+
kind: 'resourceDeposit',
|
|
46
|
+
lastSyncedAtUnixSeconds: asteroid.lastSyncAtUnixSeconds,
|
|
47
|
+
name: asteroid.name,
|
|
48
|
+
resources,
|
|
49
|
+
system: entityRef('starSystem', asteroid.system),
|
|
50
|
+
systemSequenceId: asteroid.systemSequenceId,
|
|
51
|
+
}), directMetadata(envelope)));
|
|
52
|
+
}
|
|
53
|
+
function toResourceDepositSnapshot(context, envelope) {
|
|
54
|
+
const existing = DEPOSIT_SNAPSHOTS.get(envelope);
|
|
55
|
+
if (existing !== undefined)
|
|
56
|
+
return existing;
|
|
57
|
+
const pending = createResourceDepositSnapshot(context, envelope);
|
|
58
|
+
DEPOSIT_SNAPSHOTS.set(envelope, pending);
|
|
59
|
+
void pending.catch(() => DEPOSIT_SNAPSHOTS.delete(envelope));
|
|
60
|
+
return pending;
|
|
61
|
+
}
|
|
62
|
+
/** Reads a required Asteroid resource deposit by CelestialBody address.
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* declare const ctx: SageContext;
|
|
66
|
+
* declare const asteroid: Address;
|
|
67
|
+
* const deposit = await getResourceDeposit(ctx, asteroid);
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export async function getResourceDeposit(context, asteroid, options) {
|
|
71
|
+
requireGameAddress(context);
|
|
72
|
+
return toResourceDepositSnapshot(context, await context.data.read(celestialBodyAccountDefinition, asteroid, options));
|
|
73
|
+
}
|
|
74
|
+
/** Reads an optional Asteroid resource deposit by CelestialBody address.
|
|
75
|
+
*
|
|
76
|
+
* Returns `undefined` only when the account does not exist. A present
|
|
77
|
+
* non-Asteroid CelestialBody throws {@link AccountDecodeError} because it is
|
|
78
|
+
* not a resource deposit.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```ts
|
|
82
|
+
* declare const ctx: SageContext;
|
|
83
|
+
* declare const asteroid: Address;
|
|
84
|
+
* const deposit = await maybeGetResourceDeposit(ctx, asteroid);
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export async function maybeGetResourceDeposit(context, asteroid, options) {
|
|
88
|
+
requireGameAddress(context);
|
|
89
|
+
const [envelope] = await context.data.readMany(celestialBodyAccountDefinition, [asteroid], options);
|
|
90
|
+
return envelope === undefined
|
|
91
|
+
? undefined
|
|
92
|
+
: toResourceDepositSnapshot(context, envelope);
|
|
93
|
+
}
|
|
94
|
+
/** Derives mining-state age in whole seconds and clamps future timestamps.
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* const age = deriveMiningStateAgeSeconds(100n, 112n); // 12
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export function deriveMiningStateAgeSeconds(lastUpdatedAtUnixSeconds, atUnixSeconds) {
|
|
101
|
+
const elapsed = atUnixSeconds - lastUpdatedAtUnixSeconds;
|
|
102
|
+
return elapsed > 0n ? Number(elapsed) : 0;
|
|
103
|
+
}
|
|
104
|
+
const MINING_DERIVATION_REMEDY = 'Mining derivations require a finite, nonnegative value. Supply a finite value greater than or equal to zero before deriving mining output.';
|
|
105
|
+
/** Derives each selected output rate as Fleet units/second times deposit richness.
|
|
106
|
+
* @example
|
|
107
|
+
* ```ts
|
|
108
|
+
* const rates = deriveMiningOutputRates(2, [{ cargoId: 8, richness: 1.5 }]);
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export function deriveMiningOutputRates(fleetUnitsPerSecond, outputs) {
|
|
112
|
+
if (!Number.isFinite(fleetUnitsPerSecond) || fleetUnitsPerSecond < 0) {
|
|
113
|
+
throw new InvalidDerivationInputError('Fleet mining units per second', fleetUnitsPerSecond, MINING_DERIVATION_REMEDY);
|
|
114
|
+
}
|
|
115
|
+
return Object.freeze(outputs.map(({ cargoId, richness }) => {
|
|
116
|
+
if (!Number.isFinite(richness) || richness < 0) {
|
|
117
|
+
throw new InvalidDerivationInputError(`Asteroid resource richness for cargo id ${String(cargoId)}`, richness, MINING_DERIVATION_REMEDY);
|
|
118
|
+
}
|
|
119
|
+
return Object.freeze({
|
|
120
|
+
cargoId,
|
|
121
|
+
unitsPerSecond: fleetUnitsPerSecond * richness,
|
|
122
|
+
});
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
/** Projects nominal output units from a rate and elapsed seconds.
|
|
126
|
+
* @example
|
|
127
|
+
* ```ts
|
|
128
|
+
* const units = projectMiningOutputUnits(4.5, 20); // 90
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export function projectMiningOutputUnits(unitsPerSecond, elapsedSeconds) {
|
|
132
|
+
if (!Number.isFinite(unitsPerSecond) ||
|
|
133
|
+
unitsPerSecond < 0 ||
|
|
134
|
+
!Number.isFinite(elapsedSeconds) ||
|
|
135
|
+
elapsedSeconds < 0) {
|
|
136
|
+
const [field, value] = !Number.isFinite(unitsPerSecond) || unitsPerSecond < 0
|
|
137
|
+
? ['Mining units per second', unitsPerSecond]
|
|
138
|
+
: ['Mining elapsed seconds', elapsedSeconds];
|
|
139
|
+
throw new InvalidDerivationInputError(field, value, MINING_DERIVATION_REMEDY);
|
|
140
|
+
}
|
|
141
|
+
return unitsPerSecond * elapsedSeconds;
|
|
142
|
+
}
|
|
143
|
+
function activeMiningState(fleet) {
|
|
144
|
+
return fleet.state.kind === 'mining' ? fleet.state : undefined;
|
|
145
|
+
}
|
|
146
|
+
function validateSelectedCargoIds(fleetAddress, resourceIds) {
|
|
147
|
+
for (let index = 1; index < resourceIds.length; index += 1) {
|
|
148
|
+
if (resourceIds[index - 1] < resourceIds[index])
|
|
149
|
+
continue;
|
|
150
|
+
throw new AccountDecodeError('fleet', fleetAddress, new RangeError('Selected mining cargo ids are not canonical.'), `Fleet ${fleetAddress} stores duplicate or unsorted mining cargo ids. Refresh the Fleet and verify the pinned binding version before retrying.`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function createFleetMiningSnapshot(context, envelope, options) {
|
|
154
|
+
assertConfiguredGame(context, 'fleet', envelope);
|
|
155
|
+
const state = activeMiningState(envelope.data);
|
|
156
|
+
if (state === undefined)
|
|
157
|
+
return undefined;
|
|
158
|
+
validateSelectedCargoIds(envelope.address, state.resourceIds);
|
|
159
|
+
const deposit = await getResourceDeposit(context, state.asteroid, options);
|
|
160
|
+
const depositByCargoId = new Map(deposit.resources.map((resource) => [resource.cargo.id, resource]));
|
|
161
|
+
const selected = state.resourceIds.map((cargoId) => {
|
|
162
|
+
const resource = depositByCargoId.get(cargoId);
|
|
163
|
+
if (resource !== undefined)
|
|
164
|
+
return resource;
|
|
165
|
+
throw new AccountDecodeError('fleet', envelope.address, new RangeError(`Selected cargo id ${cargoId} is absent from the Asteroid.`), `Fleet ${envelope.address} selected cargo id ${cargoId} for mining, but Asteroid ${deposit.address} does not expose that resource. Refresh both accounts and verify the pinned binding version before retrying.`);
|
|
166
|
+
});
|
|
167
|
+
const rates = deriveMiningOutputRates(envelope.data.stats.cargo.miningRate.value, selected.map((resource) => ({
|
|
168
|
+
cargoId: resource.cargo.id,
|
|
169
|
+
richness: resource.richness.value,
|
|
170
|
+
})));
|
|
171
|
+
const outputs = selected.map((resource, index) => ({
|
|
172
|
+
...resource,
|
|
173
|
+
unitsPerSecond: rates[index].unitsPerSecond,
|
|
174
|
+
}));
|
|
175
|
+
const depositMeta = readMeta(deposit);
|
|
176
|
+
const metadata = directMetadata(envelope);
|
|
177
|
+
return freezeResolvedSnapshot(attachReadMeta(attachJsonSerialization({
|
|
178
|
+
asteroid: entityRef('celestialBody', state.asteroid),
|
|
179
|
+
fleet: entityRef('fleet', envelope.address),
|
|
180
|
+
kind: 'fleetMining',
|
|
181
|
+
lastUpdatedAtUnixSeconds: envelope.data.lastUpdateAt,
|
|
182
|
+
miningRate: {
|
|
183
|
+
raw: envelope.data.stats.cargo.miningRate.raw,
|
|
184
|
+
unitsPerSecond: envelope.data.stats.cargo.miningRate.value,
|
|
185
|
+
},
|
|
186
|
+
outputs,
|
|
187
|
+
ownerProfile: entityRef('profile', envelope.data.ownerProfile),
|
|
188
|
+
regionXpModifier: {
|
|
189
|
+
raw: state.regionXpModifierRaw,
|
|
190
|
+
value: state.regionXpModifier,
|
|
191
|
+
},
|
|
192
|
+
}), {
|
|
193
|
+
...metadata,
|
|
194
|
+
slot: depositMeta.slot < metadata.slot ? depositMeta.slot : metadata.slot,
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
function toFleetMiningSnapshot(context, envelope, options) {
|
|
198
|
+
const existing = MINING_SNAPSHOTS.get(envelope);
|
|
199
|
+
if (existing !== undefined)
|
|
200
|
+
return existing;
|
|
201
|
+
const pending = createFleetMiningSnapshot(context, envelope, options);
|
|
202
|
+
MINING_SNAPSHOTS.set(envelope, pending);
|
|
203
|
+
void pending.catch(() => MINING_SNAPSHOTS.delete(envelope));
|
|
204
|
+
return pending;
|
|
205
|
+
}
|
|
206
|
+
/** Reads a Fleet and returns its active extraction relationship, if mining.
|
|
207
|
+
* @example
|
|
208
|
+
* ```ts
|
|
209
|
+
* declare const ctx: SageContext;
|
|
210
|
+
* declare const fleet: Address;
|
|
211
|
+
* const mining = await getFleetMiningState(ctx, fleet);
|
|
212
|
+
* ```
|
|
213
|
+
*/
|
|
214
|
+
export async function getFleetMiningState(context, fleet, options) {
|
|
215
|
+
requireGameAddress(context);
|
|
216
|
+
const envelope = await context.data.read(fleetAccountDefinition, fleet, options);
|
|
217
|
+
assertConfiguredGame(context, 'fleet', envelope);
|
|
218
|
+
await assertCanonicalFleetAddress(envelope);
|
|
219
|
+
return toFleetMiningSnapshot(context, envelope, options);
|
|
220
|
+
}
|
|
221
|
+
/** Finds active mining Fleets for one owner through stable Fleet filters.
|
|
222
|
+
* @example
|
|
223
|
+
* ```ts
|
|
224
|
+
* declare const ctx: SageContext;
|
|
225
|
+
* declare const owner: Address;
|
|
226
|
+
* const mining = await getFleetMiningStatesByOwner(ctx, owner);
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
229
|
+
export async function getFleetMiningStatesByOwner(context, owner, options) {
|
|
230
|
+
requireGameAddress(context);
|
|
231
|
+
const envelopes = await discoverFleetAccounts(context, owner, options);
|
|
232
|
+
const metadata = readMeta(envelopes);
|
|
233
|
+
const states = (await Promise.all(envelopes.map((envelope) => toFleetMiningSnapshot(context, envelope, options)))).filter((state) => state !== undefined);
|
|
234
|
+
return Object.freeze(attachReadMeta(states, metadata));
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mining/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Address, type Commitment, type Transaction, type TransactionWithBlockhashLifetime } from '@solana/kit';
|
|
2
|
+
import type { SageContext, SageWriteRpc } from '../client/contracts.js';
|
|
3
|
+
import type { Plan } from './index.js';
|
|
4
|
+
/** Policy for assembling an unsigned transaction from one Plan.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* declare const feePayer: Address;
|
|
9
|
+
* const policy: AssemblyPolicy = { feePayer, computeUnitLimit: 400_000 };
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export interface AssemblyPolicy {
|
|
13
|
+
readonly feePayer: Address;
|
|
14
|
+
readonly computeUnitLimit?: number;
|
|
15
|
+
readonly priorityFeeMicroLamports?: bigint;
|
|
16
|
+
readonly commitment?: Commitment;
|
|
17
|
+
}
|
|
18
|
+
export interface ValidatedAssemblyPolicy {
|
|
19
|
+
readonly feePayer: Address;
|
|
20
|
+
readonly computeUnitLimit: number | undefined;
|
|
21
|
+
readonly priorityFeeMicroLamports: bigint | undefined;
|
|
22
|
+
readonly commitment: Commitment;
|
|
23
|
+
}
|
|
24
|
+
export declare function requireWriteRpc(context: SageContext): SageWriteRpc;
|
|
25
|
+
export declare function validateAssemblyPolicy(policy: AssemblyPolicy, mapInvalidValue?: (value: unknown) => unknown): ValidatedAssemblyPolicy;
|
|
26
|
+
export declare function validatePlan(plan: unknown): asserts plan is Plan;
|
|
27
|
+
/** Assembles one Plan into an unsigned blockhash-lifetime transaction.
|
|
28
|
+
*
|
|
29
|
+
* Assembly validates compute and priority-fee policy before RPC, fetches one
|
|
30
|
+
* latest blockhash, and never signs, simulates, or submits the transaction.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* declare const ctx: SageContext;
|
|
35
|
+
* declare const plan: Plan;
|
|
36
|
+
* declare const feePayer: Address;
|
|
37
|
+
* const transaction = await assemblePlan(ctx, plan, { feePayer });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function assemblePlan(context: SageContext, plan: Plan, policy: AssemblyPolicy): Promise<Transaction & TransactionWithBlockhashLifetime>;
|
|
41
|
+
export declare function assembleValidatedPlan(writeRpc: SageWriteRpc, plan: Plan, validatedPolicy: ValidatedAssemblyPolicy): Promise<Transaction & TransactionWithBlockhashLifetime>;
|
|
42
|
+
//# sourceMappingURL=assembly.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembly.d.ts","sourceRoot":"","sources":["../../src/planning/assembly.ts"],"names":[],"mappings":"AAAA,OAAO,EAgBL,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,gCAAgC,EACtC,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAevC;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAgCD,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,CAIlE;AAaD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,eAAe,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAA4B,GAChE,uBAAuB,CAmFzB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAwBhE;AASD;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,WAAW,GAAG,gCAAgC,CAAC,CAIzD;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAAC,WAAW,GAAG,gCAAgC,CAAC,CAoCzD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { appendTransactionMessageInstructions, compileTransaction, createTransactionMessage, getTransactionSize, getTransactionSizeLimit, isAddress, isSolanaError, setTransactionMessageComputeUnitLimit, setTransactionMessageComputeUnitPrice, setTransactionMessageFeePayer, setTransactionMessageLifetimeUsingBlockhash, SOLANA_ERROR__TRANSACTION__TOO_MANY_ACCOUNT_ADDRESSES, SOLANA_ERROR__TRANSACTION__TOO_MANY_ACCOUNTS_IN_INSTRUCTION, SOLANA_ERROR__TRANSACTION__TOO_MANY_INSTRUCTIONS, SOLANA_ERROR__TRANSACTION__TOO_MANY_SIGNER_ADDRESSES, } from '@solana/kit';
|
|
2
|
+
import { InvalidActionInputError, SageSdkError } from '../client/errors.js';
|
|
3
|
+
import { validatePlanComposition } from './composition.js';
|
|
4
|
+
import { isPlanInstance } from './plan-instances.js';
|
|
5
|
+
const MAX_COMPUTE_UNIT_LIMIT = 1_400_000;
|
|
6
|
+
const MAX_PRIORITY_FEE_MICRO_LAMPORTS = 18446744073709551615n;
|
|
7
|
+
const DEFAULT_COMMITMENT = 'confirmed';
|
|
8
|
+
const COMPUTE_BUDGET_PROGRAM_ADDRESS = 'ComputeBudget111111111111111111111111111111';
|
|
9
|
+
const TRANSACTION_COMPILE_LIMIT_ERROR_CODES = new Set([
|
|
10
|
+
SOLANA_ERROR__TRANSACTION__TOO_MANY_ACCOUNT_ADDRESSES,
|
|
11
|
+
SOLANA_ERROR__TRANSACTION__TOO_MANY_ACCOUNTS_IN_INSTRUCTION,
|
|
12
|
+
SOLANA_ERROR__TRANSACTION__TOO_MANY_INSTRUCTIONS,
|
|
13
|
+
SOLANA_ERROR__TRANSACTION__TOO_MANY_SIGNER_ADDRESSES,
|
|
14
|
+
]);
|
|
15
|
+
class MissingWriteTransportError extends SageSdkError {
|
|
16
|
+
constructor() {
|
|
17
|
+
super('MISSING_WRITE_TRANSPORT', 'This SAGE context has no writeRpc transport, so it cannot assemble a Plan. Pass the optional writeRpc transport when creating the context, then retry.');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class TransactionTooLargeError extends SageSdkError {
|
|
21
|
+
actualSize;
|
|
22
|
+
limit;
|
|
23
|
+
constructor(details) {
|
|
24
|
+
super('TRANSACTION_TOO_LARGE', details === undefined
|
|
25
|
+
? 'The Plan exceeds a z.ink/Solana transaction account, signer, or instruction capacity limit and cannot fit one transaction; split the combined Plan into separately assembled and confirmed Plans before retrying.'
|
|
26
|
+
: `The assembled transaction is ${String(details.actualSize)} bytes, exceeding the ${String(details.limit)}-byte single-transaction limit; split the combined Plan into separately assembled and confirmed Plans before retrying.`);
|
|
27
|
+
if (details !== undefined) {
|
|
28
|
+
this.actualSize = details.actualSize;
|
|
29
|
+
this.limit = details.limit;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function requireWriteRpc(context) {
|
|
34
|
+
const writeRpc = context.writeRpc;
|
|
35
|
+
if (writeRpc === undefined)
|
|
36
|
+
throw new MissingWriteTransportError();
|
|
37
|
+
return writeRpc;
|
|
38
|
+
}
|
|
39
|
+
function invalid(field, value, acceptedRange, remedy) {
|
|
40
|
+
throw new InvalidActionInputError(field, value, acceptedRange, remedy);
|
|
41
|
+
}
|
|
42
|
+
const retainInvalidValue = (value) => value;
|
|
43
|
+
export function validateAssemblyPolicy(policy, mapInvalidValue = retainInvalidValue) {
|
|
44
|
+
if (policy === null || typeof policy !== 'object' || Array.isArray(policy)) {
|
|
45
|
+
invalid('policy', mapInvalidValue(policy), 'an AssemblyPolicy object', 'Pass the fee payer and optional assembly policy fields in one object before retrying.');
|
|
46
|
+
}
|
|
47
|
+
const feePayer = policy.feePayer;
|
|
48
|
+
if (!isAddress(feePayer)) {
|
|
49
|
+
invalid('feePayer', mapInvalidValue(feePayer), 'a valid base58 z.ink/Solana address', 'Pass the address of the account that will pay the transaction fee before retrying.');
|
|
50
|
+
}
|
|
51
|
+
const commitment = policy.commitment ?? DEFAULT_COMMITMENT;
|
|
52
|
+
if (commitment !== 'processed' &&
|
|
53
|
+
commitment !== 'confirmed' &&
|
|
54
|
+
commitment !== 'finalized') {
|
|
55
|
+
invalid('commitment', mapInvalidValue(commitment), 'processed, confirmed, or finalized', 'Choose a supported z.ink/Solana commitment before retrying.');
|
|
56
|
+
}
|
|
57
|
+
const computeUnitLimit = policy.computeUnitLimit;
|
|
58
|
+
if (computeUnitLimit !== undefined &&
|
|
59
|
+
(!Number.isInteger(computeUnitLimit) ||
|
|
60
|
+
computeUnitLimit < 1 ||
|
|
61
|
+
computeUnitLimit > MAX_COMPUTE_UNIT_LIMIT)) {
|
|
62
|
+
invalid('computeUnitLimit', mapInvalidValue(computeUnitLimit), 'an integer from 1 through 1400000 compute units', 'Set computeUnitLimit within the finite z.ink/Solana transaction limit before retrying.');
|
|
63
|
+
}
|
|
64
|
+
const priorityFeeMicroLamports = policy.priorityFeeMicroLamports;
|
|
65
|
+
if (priorityFeeMicroLamports !== undefined &&
|
|
66
|
+
(typeof priorityFeeMicroLamports !== 'bigint' ||
|
|
67
|
+
priorityFeeMicroLamports < 0n ||
|
|
68
|
+
priorityFeeMicroLamports > MAX_PRIORITY_FEE_MICRO_LAMPORTS)) {
|
|
69
|
+
invalid('priorityFeeMicroLamports', mapInvalidValue(priorityFeeMicroLamports), 'a bigint from 0n through 18446744073709551615n micro-lamports per compute unit', 'Set priorityFeeMicroLamports within the unsigned 64-bit range before retrying.');
|
|
70
|
+
}
|
|
71
|
+
if (priorityFeeMicroLamports !== undefined &&
|
|
72
|
+
priorityFeeMicroLamports > 0n &&
|
|
73
|
+
computeUnitLimit === undefined) {
|
|
74
|
+
invalid('priorityFeeMicroLamports', mapInvalidValue(priorityFeeMicroLamports), '0n micro-lamports or a non-zero value paired with an explicit computeUnitLimit', 'Set computeUnitLimit so the maximum priority fee is bounded before retrying.');
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
commitment,
|
|
78
|
+
computeUnitLimit,
|
|
79
|
+
feePayer,
|
|
80
|
+
priorityFeeMicroLamports,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function validatePlan(plan) {
|
|
84
|
+
if (!isPlanInstance(plan)) {
|
|
85
|
+
invalid('plan', plan, 'a Plan created by createPlan, planFromJSON, or combinePlans', 'Recreate or hydrate the Plan through an approved planning factory before retrying.');
|
|
86
|
+
}
|
|
87
|
+
const validatedPlan = plan;
|
|
88
|
+
validatePlanComposition(validatedPlan.steps);
|
|
89
|
+
for (let index = 0; index < validatedPlan.steps.length; index += 1) {
|
|
90
|
+
if (validatedPlan.steps[index]?.instruction.programAddress ===
|
|
91
|
+
COMPUTE_BUDGET_PROGRAM_ADDRESS) {
|
|
92
|
+
invalid(`plan.steps[${String(index)}].instruction.programAddress`, COMPUTE_BUDGET_PROGRAM_ADDRESS, 'a non-Compute Budget program address', 'Remove the Plan-carried Compute Budget instruction and express compute limits and priority fees only through the assembly policy before retrying.');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function isTransactionCompileLimitError(cause) {
|
|
97
|
+
return (isSolanaError(cause) &&
|
|
98
|
+
TRANSACTION_COMPILE_LIMIT_ERROR_CODES.has(cause.context.__code));
|
|
99
|
+
}
|
|
100
|
+
/** Assembles one Plan into an unsigned blockhash-lifetime transaction.
|
|
101
|
+
*
|
|
102
|
+
* Assembly validates compute and priority-fee policy before RPC, fetches one
|
|
103
|
+
* latest blockhash, and never signs, simulates, or submits the transaction.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* declare const ctx: SageContext;
|
|
108
|
+
* declare const plan: Plan;
|
|
109
|
+
* declare const feePayer: Address;
|
|
110
|
+
* const transaction = await assemblePlan(ctx, plan, { feePayer });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export async function assemblePlan(context, plan, policy) {
|
|
114
|
+
validatePlan(plan);
|
|
115
|
+
const validatedPolicy = validateAssemblyPolicy(policy);
|
|
116
|
+
return assembleValidatedPlan(requireWriteRpc(context), plan, validatedPolicy);
|
|
117
|
+
}
|
|
118
|
+
export async function assembleValidatedPlan(writeRpc, plan, validatedPolicy) {
|
|
119
|
+
const { value: lifetime } = await writeRpc
|
|
120
|
+
.getLatestBlockhash({ commitment: validatedPolicy.commitment })
|
|
121
|
+
.send();
|
|
122
|
+
const policyMessage = setTransactionMessageComputeUnitPrice(validatedPolicy.priorityFeeMicroLamports, setTransactionMessageComputeUnitLimit(validatedPolicy.computeUnitLimit, createTransactionMessage({ version: 0 })));
|
|
123
|
+
const message = setTransactionMessageLifetimeUsingBlockhash(lifetime, setTransactionMessageFeePayer(validatedPolicy.feePayer, appendTransactionMessageInstructions(plan.steps.map((step) => step.instruction), policyMessage)));
|
|
124
|
+
let transaction;
|
|
125
|
+
try {
|
|
126
|
+
transaction = compileTransaction(message);
|
|
127
|
+
}
|
|
128
|
+
catch (cause) {
|
|
129
|
+
if (isTransactionCompileLimitError(cause)) {
|
|
130
|
+
throw new TransactionTooLargeError();
|
|
131
|
+
}
|
|
132
|
+
throw cause;
|
|
133
|
+
}
|
|
134
|
+
const actualSize = getTransactionSize(transaction);
|
|
135
|
+
const limit = getTransactionSizeLimit(transaction);
|
|
136
|
+
if (actualSize > limit) {
|
|
137
|
+
throw new TransactionTooLargeError({ actualSize, limit });
|
|
138
|
+
}
|
|
139
|
+
return transaction;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=assembly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembly.js","sourceRoot":"","sources":["../../src/planning/assembly.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../src/planning/composition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6E7D,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI,CAyCxE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { SageSdkError } from '../client/errors.js';
|
|
2
|
+
const REMEDY = 'Use separate confirmed transactions for these Plans, or use the future W4 sequence API when it becomes available.';
|
|
3
|
+
function describeEffect(fact) {
|
|
4
|
+
return fact.kind === 'invalidates'
|
|
5
|
+
? `invalidation of "${fact.fact}"`
|
|
6
|
+
: `transition from "${fact.from}" to "${fact.to}"`;
|
|
7
|
+
}
|
|
8
|
+
class IncompatiblePlanCompositionError extends SageSdkError {
|
|
9
|
+
conflictingFact;
|
|
10
|
+
conflictingStepDescription;
|
|
11
|
+
conflictingStepIndex;
|
|
12
|
+
remedy = REMEDY;
|
|
13
|
+
requirement;
|
|
14
|
+
requiringStepDescription;
|
|
15
|
+
requiringStepIndex;
|
|
16
|
+
resource;
|
|
17
|
+
constructor(requirement, requiringStep, requiringStepIndex, conflict) {
|
|
18
|
+
super('INCOMPATIBLE_PLAN_COMPOSITION', `Plan step ${String(requiringStepIndex)} ("${requiringStep.describes}") requires "${requirement.fact}" for resource "${requirement.resource}", but step ${String(conflict.stepIndex)} ("${conflict.stepDescription}") made it unavailable with its ${describeEffect(conflict.fact)}. ${REMEDY}`);
|
|
19
|
+
this.conflictingFact = Object.freeze({ ...conflict.fact });
|
|
20
|
+
this.conflictingStepDescription = conflict.stepDescription;
|
|
21
|
+
this.conflictingStepIndex = conflict.stepIndex;
|
|
22
|
+
this.requirement = Object.freeze({ ...requirement });
|
|
23
|
+
this.requiringStepDescription = requiringStep.describes;
|
|
24
|
+
this.requiringStepIndex = requiringStepIndex;
|
|
25
|
+
this.resource = requirement.resource;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function getFactState(states, resource, fact) {
|
|
29
|
+
return states.get(resource)?.get(fact);
|
|
30
|
+
}
|
|
31
|
+
function setFactState(states, resource, fact, state) {
|
|
32
|
+
let resourceStates = states.get(resource);
|
|
33
|
+
if (resourceStates === undefined) {
|
|
34
|
+
resourceStates = new Map();
|
|
35
|
+
states.set(resource, resourceStates);
|
|
36
|
+
}
|
|
37
|
+
resourceStates.set(fact, state);
|
|
38
|
+
}
|
|
39
|
+
/** Validates the exact opaque semantic facts on one flattened Plan step list. */
|
|
40
|
+
export function validatePlanComposition(steps) {
|
|
41
|
+
const states = new Map();
|
|
42
|
+
for (let stepIndex = 0; stepIndex < steps.length; stepIndex += 1) {
|
|
43
|
+
const step = steps[stepIndex];
|
|
44
|
+
const semantics = step.semantics ?? [];
|
|
45
|
+
for (const semantic of semantics) {
|
|
46
|
+
if (semantic.kind !== 'requires')
|
|
47
|
+
continue;
|
|
48
|
+
const state = getFactState(states, semantic.resource, semantic.fact);
|
|
49
|
+
if (state?.available === false) {
|
|
50
|
+
throw new IncompatiblePlanCompositionError(semantic, step, stepIndex, state.conflict);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
for (const semantic of semantics) {
|
|
54
|
+
if (semantic.kind === 'requires')
|
|
55
|
+
continue;
|
|
56
|
+
const conflict = {
|
|
57
|
+
fact: semantic,
|
|
58
|
+
stepDescription: step.describes,
|
|
59
|
+
stepIndex,
|
|
60
|
+
};
|
|
61
|
+
if (semantic.kind === 'invalidates') {
|
|
62
|
+
setFactState(states, semantic.resource, semantic.fact, {
|
|
63
|
+
available: false,
|
|
64
|
+
conflict,
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
setFactState(states, semantic.resource, semantic.from, {
|
|
69
|
+
available: false,
|
|
70
|
+
conflict,
|
|
71
|
+
});
|
|
72
|
+
setFactState(states, semantic.resource, semantic.to, { available: true });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=composition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/planning/composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type Commitment, type Signature, type TransactionSigner } from '@solana/kit';
|
|
2
|
+
import type { SageContext } from '../client/contracts.js';
|
|
3
|
+
import type { Plan } from './index.js';
|
|
4
|
+
/** Options for signing, submitting, confirming, and reconciling one Plan.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import type { TransactionSigner } from '@solana/kit';
|
|
9
|
+
*
|
|
10
|
+
* declare const feePayer: TransactionSigner;
|
|
11
|
+
* const options: ExecutePlanOptions = { feePayer };
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export interface ExecutePlanOptions {
|
|
15
|
+
readonly feePayer: TransactionSigner;
|
|
16
|
+
readonly signers?: readonly TransactionSigner[];
|
|
17
|
+
readonly computeUnitLimit?: number;
|
|
18
|
+
readonly priorityFeeMicroLamports?: bigint;
|
|
19
|
+
readonly commitment?: Commitment;
|
|
20
|
+
readonly timeoutMs?: number;
|
|
21
|
+
readonly pollIntervalMs?: number;
|
|
22
|
+
}
|
|
23
|
+
/** A transaction confirmed at the requested commitment.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* declare const result: ConfirmedPlanExecution;
|
|
28
|
+
* console.log(result.signature, result.slot);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export interface ConfirmedPlanExecution {
|
|
32
|
+
readonly status: 'confirmed';
|
|
33
|
+
readonly signature: Signature;
|
|
34
|
+
readonly slot: bigint;
|
|
35
|
+
readonly commitment: Commitment;
|
|
36
|
+
}
|
|
37
|
+
/** A submitted transaction whose terminal state remains unknown.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* declare const result: UnknownPlanExecution;
|
|
42
|
+
* console.log(result.signature, result.lastValidBlockHeight);
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export type UnknownPlanExecution = Readonly<{
|
|
46
|
+
status: 'unknown';
|
|
47
|
+
signature: Signature;
|
|
48
|
+
reason: 'timeout';
|
|
49
|
+
lastCheckedBlockHeight: bigint;
|
|
50
|
+
lastValidBlockHeight: bigint | null;
|
|
51
|
+
}> | Readonly<{
|
|
52
|
+
status: 'unknown';
|
|
53
|
+
signature: Signature;
|
|
54
|
+
reason: 'transport-error';
|
|
55
|
+
operation: 'submission' | 'signature-status' | 'block-height';
|
|
56
|
+
lastCheckedBlockHeight: bigint | null;
|
|
57
|
+
lastValidBlockHeight: bigint | null;
|
|
58
|
+
}>;
|
|
59
|
+
/** Every non-throwing terminal outcome from `executePlan`.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* declare const result: PlanExecutionResult;
|
|
64
|
+
* if (result.status === 'unknown') console.log(result.signature);
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export type PlanExecutionResult = ConfirmedPlanExecution | UnknownPlanExecution;
|
|
68
|
+
/** @internal Lifecycle seam shared only by Plan execution coordinators. */
|
|
69
|
+
export interface PlanExecutionLifecycle {
|
|
70
|
+
onPrepared(signerMode: 'observable' | 'opaque'): Promise<void>;
|
|
71
|
+
onBeforeSign(): Promise<void>;
|
|
72
|
+
onBeforeOpaqueInvoke(): Promise<void>;
|
|
73
|
+
onSigned(signature: Signature): Promise<void>;
|
|
74
|
+
onBeforeSubmit(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
/** Executes one Plan through local signer matching, freshness re-check, one
|
|
77
|
+
* submission, terminal confirmation, and confirmed-only cache invalidation.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* import type { TransactionSigner } from '@solana/kit';
|
|
82
|
+
*
|
|
83
|
+
* declare const ctx: SageContext;
|
|
84
|
+
* declare const plan: Plan;
|
|
85
|
+
* declare const feePayer: TransactionSigner;
|
|
86
|
+
* const result = await executePlan(ctx, plan, { feePayer });
|
|
87
|
+
* console.log(result.status, result.signature);
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare function executePlan(context: SageContext, plan: Plan, options: ExecutePlanOptions): Promise<PlanExecutionResult>;
|
|
91
|
+
/** @internal Executes one Plan with sequence-owned write-ahead lifecycle hooks. */
|
|
92
|
+
export declare function executePlanWithLifecycle(context: SageContext, plan: Plan, options: ExecutePlanOptions, lifecycle?: PlanExecutionLifecycle): Promise<PlanExecutionResult>;
|
|
93
|
+
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/planning/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,UAAU,EACf,KAAK,SAAS,EAOd,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,wBAAwB,CAAC;AAMxE,OAAO,KAAK,EAAE,IAAI,EAAoB,MAAM,YAAY,CAAC;AAezD;;;;;;;;;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;AAyuBD;;;;;;;;;;;;;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,CAgD9B"}
|