@aephia/atlas-kit 0.6.0-next.36 → 0.6.0-next.37
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/dist/combat/actions/index.d.ts.map +1 -1
- package/dist/combat/actions/index.js +16 -3
- package/dist/combat/actions/index.js.map +1 -1
- package/dist/crafting/actions/index.d.ts.map +1 -1
- package/dist/crafting/actions/index.js +36 -13
- package/dist/crafting/actions/index.js.map +1 -1
- package/dist/internal/c4/character-registration.d.ts.map +1 -1
- package/dist/internal/c4/character-registration.js +2 -0
- package/dist/internal/c4/character-registration.js.map +1 -1
- package/dist/internal/c4/crafting-process-codec.d.ts +13 -0
- package/dist/internal/c4/crafting-process-codec.d.ts.map +1 -0
- package/dist/internal/c4/crafting-process-codec.js +34 -0
- package/dist/internal/c4/crafting-process-codec.js.map +1 -0
- package/dist/internal/c4/crafting.d.ts +10 -0
- package/dist/internal/c4/crafting.d.ts.map +1 -1
- package/dist/internal/c4/crafting.js +22 -5
- package/dist/internal/c4/crafting.js.map +1 -1
- package/dist/internal/c4/fleet-creation.js +1 -1
- package/dist/internal/c4/fleet-creation.js.map +1 -1
- package/dist/internal/c4/game.d.ts +2 -0
- package/dist/internal/c4/game.d.ts.map +1 -1
- package/dist/internal/c4/game.js +5 -0
- package/dist/internal/c4/game.js.map +1 -1
- package/dist/internal/c4/market.d.ts +1 -1
- package/dist/internal/c4/market.d.ts.map +1 -1
- package/dist/internal/c4/market.js +2 -0
- package/dist/internal/c4/market.js.map +1 -1
- package/dist/internal/c4/profile-permissions.d.ts +1 -1
- package/dist/internal/c4/profile-permissions.d.ts.map +1 -1
- package/dist/internal/c4/profile-permissions.js +1 -0
- package/dist/internal/c4/profile-permissions.js.map +1 -1
- package/dist/internal/c4/runtime-bindings.d.ts +2 -0
- package/dist/internal/c4/runtime-bindings.d.ts.map +1 -0
- package/dist/internal/c4/runtime-bindings.js +3 -0
- package/dist/internal/c4/runtime-bindings.js.map +1 -0
- package/dist/internal/c4/scanning.d.ts +1 -1
- package/dist/internal/c4/scanning.d.ts.map +1 -1
- package/dist/internal/c4/scanning.js +2 -0
- package/dist/internal/c4/scanning.js.map +1 -1
- package/dist/internal/c4/ship-stats.js +2 -2
- package/dist/internal/c4/ship-stats.js.map +1 -1
- package/dist/internal/planning/action-runtime.d.ts +38 -0
- package/dist/internal/planning/action-runtime.d.ts.map +1 -0
- package/dist/internal/planning/action-runtime.js +63 -0
- package/dist/internal/planning/action-runtime.js.map +1 -0
- package/dist/internal/planning/authorization-adapter.d.ts +2 -0
- package/dist/internal/planning/authorization-adapter.d.ts.map +1 -1
- package/dist/internal/planning/authorization-adapter.js +49 -0
- package/dist/internal/planning/authorization-adapter.js.map +1 -1
- package/dist/internal/planning/democracy-history.d.ts +51 -0
- package/dist/internal/planning/democracy-history.d.ts.map +1 -0
- package/dist/internal/planning/democracy-history.js +202 -0
- package/dist/internal/planning/democracy-history.js.map +1 -0
- package/dist/internal/planning/governance-fees.d.ts +64 -0
- package/dist/internal/planning/governance-fees.d.ts.map +1 -0
- package/dist/internal/planning/governance-fees.js +239 -0
- package/dist/internal/planning/governance-fees.js.map +1 -0
- package/dist/internal/planning/runtime-guards.d.ts +43 -0
- package/dist/internal/planning/runtime-guards.d.ts.map +1 -0
- package/dist/internal/planning/runtime-guards.js +552 -0
- package/dist/internal/planning/runtime-guards.js.map +1 -0
- package/dist/internal/planning/xp-runtime.d.ts +22 -0
- package/dist/internal/planning/xp-runtime.d.ts.map +1 -0
- package/dist/internal/planning/xp-runtime.js +102 -0
- package/dist/internal/planning/xp-runtime.js.map +1 -0
- package/dist/markets/actions/index.d.ts.map +1 -1
- package/dist/markets/actions/index.js +41 -16
- package/dist/markets/actions/index.js.map +1 -1
- package/dist/planning/assembly.d.ts.map +1 -1
- package/dist/planning/assembly.js +2 -0
- package/dist/planning/assembly.js.map +1 -1
- package/dist/planning/execution.d.ts.map +1 -1
- package/dist/planning/execution.js +4 -1
- package/dist/planning/execution.js.map +1 -1
- package/dist/planning/index.d.ts +16 -4
- package/dist/planning/index.d.ts.map +1 -1
- package/dist/planning/index.js +28 -12
- package/dist/planning/index.js.map +1 -1
- package/dist/registry/xp-runtime.d.ts +4 -0
- package/dist/registry/xp-runtime.d.ts.map +1 -0
- package/dist/registry/xp-runtime.js +14 -0
- package/dist/registry/xp-runtime.js.map +1 -0
- package/dist/scanning/index.d.ts +1 -1
- package/dist/scanning/index.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { getAddressEncoder, getProgramDerivedAddress, getU64Encoder, } from '@solana/kit';
|
|
2
|
+
import { SageSdkError } from '../../client/errors.js';
|
|
3
|
+
import { readContextRawAccounts } from '../../client/reconciliation.js';
|
|
4
|
+
import { DEMOCRACY_GENERATION_HISTORY_DISCRIMINATOR, DEMOCRACY_HISTORY_POLICY_DISCRIMINATOR, DEMOCRACY_SYSTEM_HISTORY_DISCRIMINATOR, SAGE_PROGRAM_ADDRESS, getDemocracyGenerationHistoryDecoder, getDemocracyHistoryPolicyDecoder, getDemocracySystemHistoryDecoder, } from '../c4/runtime-bindings.js';
|
|
5
|
+
import { CLOCK_ADDRESS, readClock } from './faction-enrollment.js';
|
|
6
|
+
const NONE = '11111111111111111111111111111111';
|
|
7
|
+
const DOMAIN = new TextEncoder().encode('DEMHST01');
|
|
8
|
+
function requireHistory(condition, reason) {
|
|
9
|
+
if (!condition)
|
|
10
|
+
throw new SageSdkError('ACTION_PRECONDITION_FAILED', `${reason} Refresh the Starbase's Democracy history before recreating this action; ask its operator to initialize or close pending daily checkpoints when needed.`);
|
|
11
|
+
}
|
|
12
|
+
async function derive(literal, scope, generation) {
|
|
13
|
+
return getProgramDerivedAddress({
|
|
14
|
+
programAddress: SAGE_PROGRAM_ADDRESS,
|
|
15
|
+
seeds: [
|
|
16
|
+
new TextEncoder().encode(literal),
|
|
17
|
+
getAddressEncoder().encode(scope),
|
|
18
|
+
...(generation === undefined ? [] : [getU64Encoder().encode(generation)]),
|
|
19
|
+
],
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function decode(raw, address, bump, discriminator, decoder) {
|
|
23
|
+
requireHistory(raw &&
|
|
24
|
+
raw.address === address &&
|
|
25
|
+
raw.owner === SAGE_PROGRAM_ADDRESS &&
|
|
26
|
+
!raw.executable, 'A required Democracy account is missing or has an unexpected owner or address.');
|
|
27
|
+
requireHistory(discriminator.every((byte, index) => raw.data[index] === byte), 'A Democracy account has the wrong discriminator.');
|
|
28
|
+
let value;
|
|
29
|
+
let consumed;
|
|
30
|
+
try {
|
|
31
|
+
[value, consumed] = decoder.read(raw.data, 0);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new SageSdkError('ACTION_PRECONDITION_FAILED', 'A Democracy account cannot be decoded. Refresh the deployment and recreate this action with supported account data.');
|
|
35
|
+
}
|
|
36
|
+
requireHistory(consumed === raw.data.length, 'A Democracy account has an unexpected data length.');
|
|
37
|
+
requireHistory(value.version === 1 &&
|
|
38
|
+
value.bump === bump &&
|
|
39
|
+
value.domain.length === 8 &&
|
|
40
|
+
value.domain.every((byte, index) => byte === DOMAIN[index]) &&
|
|
41
|
+
value.reserved.every((byte) => byte === 0), 'A Democracy account has an unsupported version, domain, bump or reserved field.');
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
function equalBytes(a, b) {
|
|
45
|
+
return a.length === b.length && a.every((byte, index) => byte === b[index]);
|
|
46
|
+
}
|
|
47
|
+
function params(value) {
|
|
48
|
+
return {
|
|
49
|
+
craftingFeeBps: value.craftingFeeBps,
|
|
50
|
+
localMarketFeeBps: value.localMarketFeeBps,
|
|
51
|
+
localTreasuryShareBps: value.localTreasuryShareBps,
|
|
52
|
+
treasuryDistributionBps: value.treasuryDistributionBps,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Resolve a fresh, canonical history context without initializing or repairing it. */
|
|
56
|
+
export async function resolveDemocracyHistory(ctx, scope) {
|
|
57
|
+
const [historyAddress, historyBump] = await derive('DemocracySystemHistory', scope.system);
|
|
58
|
+
const [policyAddress, policyBump] = await derive('DemocracyHistoryPolicy', scope.game);
|
|
59
|
+
let floor = 0n;
|
|
60
|
+
const read = async (addresses) => {
|
|
61
|
+
// Absence has no slot in this transport; Clock supplies batch provenance. We
|
|
62
|
+
// cannot request minContextSlot, so reject inconsistent/regressing responses.
|
|
63
|
+
const rows = await readContextRawAccounts(ctx, [...addresses, CLOCK_ADDRESS], { commitment: 'confirmed' });
|
|
64
|
+
requireHistory(rows.length === addresses.length + 1, 'The Democracy history read was incomplete.');
|
|
65
|
+
const clock = rows[rows.length - 1];
|
|
66
|
+
requireHistory(clock?.address === CLOCK_ADDRESS, 'The chain Clock is missing from the Democracy history read.');
|
|
67
|
+
const now = readClock(clock);
|
|
68
|
+
requireHistory(clock.slot >= floor &&
|
|
69
|
+
rows.every((row) => row === undefined || row.slot === clock.slot), 'The Democracy history response has inconsistent or regressing slots.');
|
|
70
|
+
floor = clock.slot;
|
|
71
|
+
return { rows, now };
|
|
72
|
+
};
|
|
73
|
+
const history = (raw) => {
|
|
74
|
+
const value = decode(raw, historyAddress, historyBump, DEMOCRACY_SYSTEM_HISTORY_DISCRIMINATOR, getDemocracySystemHistoryDecoder());
|
|
75
|
+
requireHistory(value.gameId === scope.game &&
|
|
76
|
+
value.system === scope.system &&
|
|
77
|
+
value.policy === policyAddress &&
|
|
78
|
+
value.enabled <= 1 &&
|
|
79
|
+
value.cutoverDay <= value.openDay &&
|
|
80
|
+
value.generationStartedDay <= value.openDay, 'The Democracy history scope or calendar is invalid.');
|
|
81
|
+
return value;
|
|
82
|
+
};
|
|
83
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
84
|
+
const first = (await read([historyAddress])).rows[0];
|
|
85
|
+
if (!first)
|
|
86
|
+
return {
|
|
87
|
+
intent: {
|
|
88
|
+
game: scope.game,
|
|
89
|
+
system: scope.system,
|
|
90
|
+
address: historyAddress,
|
|
91
|
+
state: 'absent',
|
|
92
|
+
},
|
|
93
|
+
accounts: { democracyHistoryHistory: historyAddress },
|
|
94
|
+
slot: floor,
|
|
95
|
+
};
|
|
96
|
+
const initial = history(first);
|
|
97
|
+
const generationPda = initial.generation === NONE
|
|
98
|
+
? undefined
|
|
99
|
+
: await derive('DemocracyGenerationHistory', scope.system, initial.generationNumber);
|
|
100
|
+
requireHistory(!generationPda || generationPda[0] === initial.generation, 'The Democracy history references a noncanonical generation.');
|
|
101
|
+
const batch = await read([
|
|
102
|
+
historyAddress,
|
|
103
|
+
policyAddress,
|
|
104
|
+
...(generationPda ? [generationPda[0]] : []),
|
|
105
|
+
]);
|
|
106
|
+
const second = batch.rows[0];
|
|
107
|
+
if (!second || !equalBytes(first.data, second.data))
|
|
108
|
+
continue;
|
|
109
|
+
const current = history(second);
|
|
110
|
+
const policy = decode(batch.rows[1], policyAddress, policyBump, DEMOCRACY_HISTORY_POLICY_DISCRIMINATOR, getDemocracyHistoryPolicyDecoder());
|
|
111
|
+
requireHistory(policy.gameId === scope.game &&
|
|
112
|
+
[
|
|
113
|
+
policy.noControllerRevenue,
|
|
114
|
+
policy.zeroPowerRevenue,
|
|
115
|
+
policy.successorBaseline,
|
|
116
|
+
policy.captureIncomingEligibility,
|
|
117
|
+
].every((value) => value === 1 || value === 2), 'The Democracy policy scope or explicit policy flags are invalid.');
|
|
118
|
+
const generation = generationPda
|
|
119
|
+
? decode(batch.rows[2], generationPda[0], generationPda[1], DEMOCRACY_GENERATION_HISTORY_DISCRIMINATOR, getDemocracyGenerationHistoryDecoder())
|
|
120
|
+
: undefined;
|
|
121
|
+
if (generation)
|
|
122
|
+
requireHistory(generation.gameId === scope.game &&
|
|
123
|
+
generation.system === scope.system &&
|
|
124
|
+
generation.generation === current.generationNumber &&
|
|
125
|
+
generation.starbaseSeqId === current.starbaseSeqId &&
|
|
126
|
+
generation.governance === current.governance &&
|
|
127
|
+
generation.controller === current.controller &&
|
|
128
|
+
generation.enabled === current.enabled &&
|
|
129
|
+
generation.openDay === current.openDay &&
|
|
130
|
+
generation.retired === 0 &&
|
|
131
|
+
generation.fundedAtlas >= generation.claimedAtlas &&
|
|
132
|
+
generation.rewardVault ===
|
|
133
|
+
generation.fundedAtlas - generation.claimedAtlas, 'The Democracy generation scope, eligibility or reward funding does not match its history.');
|
|
134
|
+
requireHistory(current.controller === 0 || generation, 'The current Democracy controller has no initialized generation.');
|
|
135
|
+
requireHistory(batch.now >= 0n && batch.now / 86400n === current.openDay, 'The Democracy history has pending daily checkpoints or the chain day changed.');
|
|
136
|
+
const intent = {
|
|
137
|
+
game: scope.game,
|
|
138
|
+
system: scope.system,
|
|
139
|
+
address: historyAddress,
|
|
140
|
+
state: 'initialized',
|
|
141
|
+
openDay: current.openDay,
|
|
142
|
+
enabled: current.enabled,
|
|
143
|
+
controller: current.controller,
|
|
144
|
+
...(generationPda ? { generation: generationPda[0] } : {}),
|
|
145
|
+
generationNumber: current.generationNumber,
|
|
146
|
+
governance: current.governance,
|
|
147
|
+
starbaseSeqId: current.starbaseSeqId,
|
|
148
|
+
policy: policyAddress,
|
|
149
|
+
policyFlags: {
|
|
150
|
+
noControllerRevenue: policy.noControllerRevenue,
|
|
151
|
+
zeroPowerRevenue: policy.zeroPowerRevenue,
|
|
152
|
+
successorBaseline: policy.successorBaseline,
|
|
153
|
+
captureIncomingEligibility: policy.captureIncomingEligibility,
|
|
154
|
+
},
|
|
155
|
+
effectiveParams: params(current.enabled === 0
|
|
156
|
+
? {
|
|
157
|
+
craftingFeeBps: 10000,
|
|
158
|
+
localMarketFeeBps: 0,
|
|
159
|
+
localTreasuryShareBps: 0,
|
|
160
|
+
treasuryDistributionBps: 0,
|
|
161
|
+
}
|
|
162
|
+
: (generation?.activeParams ?? policy.defaultParams)),
|
|
163
|
+
};
|
|
164
|
+
return {
|
|
165
|
+
intent,
|
|
166
|
+
accounts: {
|
|
167
|
+
democracyHistoryHistory: historyAddress,
|
|
168
|
+
democracyHistoryPolicy: policyAddress,
|
|
169
|
+
...(generationPda
|
|
170
|
+
? { democracyHistoryGeneration: generationPda[0] }
|
|
171
|
+
: {}),
|
|
172
|
+
},
|
|
173
|
+
slot: floor,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
throw new SageSdkError('ACTION_PRECONDITION_FAILED', 'Democracy history changed during both preparation attempts. Refresh the Starbase and recreate this action.');
|
|
177
|
+
}
|
|
178
|
+
/** Compare only eligibility and consumed fee policy, never shared financial counters. */
|
|
179
|
+
export function matchDemocracyHistoryIntent(expected, actual) {
|
|
180
|
+
if (expected.game !== actual.game ||
|
|
181
|
+
expected.system !== actual.system ||
|
|
182
|
+
expected.address !== actual.address ||
|
|
183
|
+
expected.state !== actual.state)
|
|
184
|
+
return false;
|
|
185
|
+
if (expected.state === 'absent' || actual.state === 'absent')
|
|
186
|
+
return true;
|
|
187
|
+
return (expected.openDay === actual.openDay &&
|
|
188
|
+
expected.enabled === actual.enabled &&
|
|
189
|
+
expected.controller === actual.controller &&
|
|
190
|
+
expected.generation === actual.generation &&
|
|
191
|
+
expected.generationNumber === actual.generationNumber &&
|
|
192
|
+
expected.governance === actual.governance &&
|
|
193
|
+
expected.starbaseSeqId === actual.starbaseSeqId &&
|
|
194
|
+
expected.policy === actual.policy &&
|
|
195
|
+
Object.entries(expected.policyFlags).every(([key, value]) => actual.policyFlags[key] === value) &&
|
|
196
|
+
Object.entries(expected.effectiveParams).every(([key, value]) => actual.effectiveParams[key] === value));
|
|
197
|
+
}
|
|
198
|
+
export async function validateDemocracyHistoryIntent(ctx, expected) {
|
|
199
|
+
const actual = await resolveDemocracyHistory(ctx, expected);
|
|
200
|
+
requireHistory(matchDemocracyHistoryIntent(expected, actual.intent), 'Democracy history eligibility or its consumed fee policy changed since planning.');
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=democracy-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"democracy-history.js","sourceRoot":"","sources":["../../../src/internal/planning/democracy-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Address, SageContext } from '../../client/contracts.js';
|
|
2
|
+
import { type CraftingProcessAccountData } from '../c4/crafting.js';
|
|
3
|
+
import type { ResolvedDemocracyHistory } from './democracy-history.js';
|
|
4
|
+
export interface FeeRequest {
|
|
5
|
+
readonly game: Address;
|
|
6
|
+
readonly system: Address;
|
|
7
|
+
readonly starbaseSeqId: bigint;
|
|
8
|
+
readonly mode: 'market' | 'crafting-start' | 'crafting-complete';
|
|
9
|
+
readonly hasHab?: boolean;
|
|
10
|
+
readonly process?: Address;
|
|
11
|
+
}
|
|
12
|
+
export interface FeeParams {
|
|
13
|
+
readonly craftingFeeBps: number;
|
|
14
|
+
readonly localMarketFeeBps: number;
|
|
15
|
+
readonly localTreasuryShareBps: number;
|
|
16
|
+
readonly treasuryDistributionBps?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface FeeIntent {
|
|
19
|
+
readonly request: FeeRequest;
|
|
20
|
+
readonly governance?: {
|
|
21
|
+
readonly address: Address;
|
|
22
|
+
readonly state: 'absent' | 'initialized';
|
|
23
|
+
readonly version?: number;
|
|
24
|
+
readonly enabled?: number;
|
|
25
|
+
readonly controllerFaction?: number;
|
|
26
|
+
readonly starbaseSeqId?: bigint;
|
|
27
|
+
readonly activeParams?: FeeParams;
|
|
28
|
+
};
|
|
29
|
+
readonly currencyCache?: {
|
|
30
|
+
readonly address: Address;
|
|
31
|
+
readonly version: number;
|
|
32
|
+
};
|
|
33
|
+
readonly treasury?: {
|
|
34
|
+
readonly address: Address;
|
|
35
|
+
readonly state: 'absent' | 'initialized';
|
|
36
|
+
readonly version?: number;
|
|
37
|
+
readonly governance?: Address;
|
|
38
|
+
};
|
|
39
|
+
readonly process?: {
|
|
40
|
+
readonly address: Address;
|
|
41
|
+
readonly version: number;
|
|
42
|
+
readonly feeRecipient?: 'atlas' | 'dao-atlas';
|
|
43
|
+
readonly feeGovernance?: Address;
|
|
44
|
+
readonly feeSnapshot?: CraftingProcessAccountData['feeSnapshot'];
|
|
45
|
+
};
|
|
46
|
+
readonly quote: {
|
|
47
|
+
readonly source: 'default' | 'governance' | 'history-policy' | 'history-generation' | 'history-disabled' | 'process-snapshot' | 'legacy-process';
|
|
48
|
+
readonly params?: FeeParams;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface ResolvedGovernanceFees {
|
|
52
|
+
readonly intent: FeeIntent;
|
|
53
|
+
readonly accounts: {
|
|
54
|
+
readonly starbaseGovernance?: Address;
|
|
55
|
+
readonly currencyCache?: Address;
|
|
56
|
+
readonly starbaseTreasury?: Address;
|
|
57
|
+
};
|
|
58
|
+
readonly description: string;
|
|
59
|
+
}
|
|
60
|
+
/** Resolve current fee accounts and a finite quote without creating or funding anything. */
|
|
61
|
+
export declare function resolveGovernanceFees(ctx: SageContext, request: FeeRequest, history: ResolvedDemocracyHistory): Promise<ResolvedGovernanceFees>;
|
|
62
|
+
/** Compare finite serialized fields; mutable shared balances are deliberately absent. */
|
|
63
|
+
export declare function matchGovernanceFeesIntent(expected: FeeIntent, actual: FeeIntent): boolean;
|
|
64
|
+
//# sourceMappingURL=governance-fees.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance-fees.d.ts","sourceRoot":"","sources":["../../../src/internal/planning/governance-fees.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { getAddressEncoder, getProgramDerivedAddress, getU64Encoder, } from '@solana/kit';
|
|
2
|
+
import { SageSdkError } from '../../client/errors.js';
|
|
3
|
+
import { readContextRawAccounts } from '../../client/reconciliation.js';
|
|
4
|
+
import { CURRENCY_CONFIG_CACHE_DISCRIMINATOR, SAGE_PROGRAM_ADDRESS, STARBASE_GOVERNANCE_DISCRIMINATOR, STARBASE_TREASURY_DISCRIMINATOR, getCurrencyConfigCacheDecoder, getStarbaseGovernanceDecoder, getStarbaseTreasuryDecoder, } from '../c4/runtime-bindings.js';
|
|
5
|
+
import { deriveStarSystemAddress, starSystemAccountDefinition, } from '../c4/world.js';
|
|
6
|
+
import { craftingProcessAccountDefinition, } from '../c4/crafting.js';
|
|
7
|
+
function requireFee(condition, reason) {
|
|
8
|
+
if (!condition)
|
|
9
|
+
throw new SageSdkError('ACTION_PRECONDITION_FAILED', `${reason} Refresh the Starbase fee configuration and recreate this action; ask its operator to initialize missing fee-routing accounts.`);
|
|
10
|
+
}
|
|
11
|
+
async function derive(literal, scope, sequence) {
|
|
12
|
+
return getProgramDerivedAddress({
|
|
13
|
+
programAddress: SAGE_PROGRAM_ADDRESS,
|
|
14
|
+
seeds: [
|
|
15
|
+
new TextEncoder().encode(literal),
|
|
16
|
+
getAddressEncoder().encode(scope),
|
|
17
|
+
...(sequence === undefined ? [] : [getU64Encoder().encode(sequence)]),
|
|
18
|
+
],
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function decode(raw, address, discriminator, decoder) {
|
|
22
|
+
requireFee(raw &&
|
|
23
|
+
raw.address === address &&
|
|
24
|
+
raw.owner === SAGE_PROGRAM_ADDRESS &&
|
|
25
|
+
!raw.executable, `Fee-routing account ${address} is missing or has an unexpected owner or address.`);
|
|
26
|
+
requireFee(discriminator.every((byte, index) => raw.data[index] === byte), `Fee-routing account ${address} has the wrong discriminator.`);
|
|
27
|
+
try {
|
|
28
|
+
const [value, consumed] = decoder.read(raw.data, 0);
|
|
29
|
+
requireFee(consumed === raw.data.length, `Fee-routing account ${address} has trailing bytes.`);
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
catch (cause) {
|
|
33
|
+
if (cause instanceof SageSdkError)
|
|
34
|
+
throw cause;
|
|
35
|
+
throw new SageSdkError('ACTION_PRECONDITION_FAILED', `Fee-routing account ${address} cannot be decoded. Refresh the deployment and recreate this action with supported account data.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function params(value) {
|
|
39
|
+
return {
|
|
40
|
+
craftingFeeBps: value.craftingFeeBps,
|
|
41
|
+
localMarketFeeBps: value.localMarketFeeBps,
|
|
42
|
+
localTreasuryShareBps: value.localTreasuryShareBps,
|
|
43
|
+
treasuryDistributionBps: value.treasuryDistributionBps,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function description(intent) {
|
|
47
|
+
const quote = intent.quote;
|
|
48
|
+
if (!quote.params)
|
|
49
|
+
return 'Legacy Crafting Process has no captured governance fee snapshot. No governed fee amount or recipient is inferred from synthetic defaults.';
|
|
50
|
+
const value = quote.params;
|
|
51
|
+
return `Fee policy source: ${quote.source}. Recipe fee multiplier: ${value.craftingFeeBps} basis points (10,000 = 1×); Local Market fee: ${value.localMarketFeeBps} basis points of executed ATLAS value; local Treasury share: ${value.localTreasuryShareBps} basis points of governed fees.${intent.process?.feeRecipient ? ` Captured original recipe recipient: ${intent.process.feeRecipient}.` : ''}${intent.treasury?.state === 'initialized' ? ` Treasury: ${intent.treasury.address}.` : ''} These rates do not predict an executed debit and can race a policy change after validation.`;
|
|
52
|
+
}
|
|
53
|
+
/** Resolve current fee accounts and a finite quote without creating or funding anything. */
|
|
54
|
+
export async function resolveGovernanceFees(ctx, request, history) {
|
|
55
|
+
requireFee(history.intent.game === request.game &&
|
|
56
|
+
history.intent.system === request.system, 'Fee and history scopes do not match.');
|
|
57
|
+
requireFee(request.mode === 'crafting-complete'
|
|
58
|
+
? request.process !== undefined
|
|
59
|
+
: request.process === undefined, 'The fee route has an invalid Crafting Process selection.');
|
|
60
|
+
const [governanceAddress, governanceBump] = await derive('StarbaseGovernance', request.system, request.starbaseSeqId);
|
|
61
|
+
const [cacheAddress, cacheBump] = await derive('CurrencyConfig', request.game);
|
|
62
|
+
const needsCache = request.mode !== 'crafting-start' || request.hasHab === true;
|
|
63
|
+
const firstAddresses = request.mode === 'crafting-complete'
|
|
64
|
+
? [request.process, cacheAddress]
|
|
65
|
+
: [
|
|
66
|
+
governanceAddress,
|
|
67
|
+
...(needsCache ? [cacheAddress] : []),
|
|
68
|
+
request.system,
|
|
69
|
+
];
|
|
70
|
+
const read = async (addresses) => {
|
|
71
|
+
const rows = await readContextRawAccounts(ctx, addresses, {
|
|
72
|
+
commitment: 'confirmed',
|
|
73
|
+
});
|
|
74
|
+
requireFee(rows.length === addresses.length &&
|
|
75
|
+
rows.every((raw, index) => !raw ||
|
|
76
|
+
(raw.address === addresses[index] && raw.slot >= history.slot)), 'Fee-routing reads are incomplete or older than their history context.');
|
|
77
|
+
return rows;
|
|
78
|
+
};
|
|
79
|
+
const rows = await read(firstAddresses);
|
|
80
|
+
if (request.mode !== 'crafting-complete') {
|
|
81
|
+
const raw = rows[rows.length - 1];
|
|
82
|
+
requireFee(raw && !raw.executable, 'The fee route System account is missing or invalid.');
|
|
83
|
+
const system = starSystemAccountDefinition.decode(raw);
|
|
84
|
+
const canonical = await deriveStarSystemAddress(request.game, system.systemId);
|
|
85
|
+
requireFee(raw.address === request.system &&
|
|
86
|
+
canonical === request.system &&
|
|
87
|
+
system.game === request.game &&
|
|
88
|
+
system.sequenceId === request.starbaseSeqId &&
|
|
89
|
+
system.starbase !== undefined, 'The fee route System does not match its canonical address, Game or active Starbase sequence.');
|
|
90
|
+
}
|
|
91
|
+
let currencyCache;
|
|
92
|
+
if (needsCache) {
|
|
93
|
+
const value = decode(rows[1], cacheAddress, CURRENCY_CONFIG_CACHE_DISCRIMINATOR, getCurrencyConfigCacheDecoder());
|
|
94
|
+
requireFee(value.gameId === request.game && value.bump === cacheBump, 'CurrencyCache does not match the configured Game or canonical PDA bump.');
|
|
95
|
+
currencyCache = { address: cacheAddress, version: value.version };
|
|
96
|
+
}
|
|
97
|
+
let governance;
|
|
98
|
+
let process;
|
|
99
|
+
let quote;
|
|
100
|
+
let treasuryGovernance;
|
|
101
|
+
let treasuryRequired = false;
|
|
102
|
+
if (request.mode === 'crafting-complete') {
|
|
103
|
+
const raw = rows[0];
|
|
104
|
+
requireFee(raw && raw.address === request.process && !raw.executable, 'The selected Crafting Process is missing or invalid.');
|
|
105
|
+
const value = craftingProcessAccountDefinition.decode(raw);
|
|
106
|
+
requireFee(value.system === request.system &&
|
|
107
|
+
value.starbaseSequenceId === request.starbaseSeqId, 'The Crafting Process belongs to a different System or Starbase generation.');
|
|
108
|
+
process = {
|
|
109
|
+
address: request.process,
|
|
110
|
+
version: value.version,
|
|
111
|
+
...(value.feeRecipient === undefined
|
|
112
|
+
? {}
|
|
113
|
+
: { feeRecipient: value.feeRecipient }),
|
|
114
|
+
...(value.feeGovernance === undefined
|
|
115
|
+
? {}
|
|
116
|
+
: { feeGovernance: value.feeGovernance }),
|
|
117
|
+
...(value.feeSnapshot === undefined
|
|
118
|
+
? {}
|
|
119
|
+
: { feeSnapshot: value.feeSnapshot }),
|
|
120
|
+
};
|
|
121
|
+
quote = value.feeSnapshot
|
|
122
|
+
? {
|
|
123
|
+
source: 'process-snapshot',
|
|
124
|
+
params: {
|
|
125
|
+
craftingFeeBps: value.feeSnapshot.craftingFeeBasisPoints,
|
|
126
|
+
localMarketFeeBps: value.feeSnapshot.localMarketFeeBasisPoints,
|
|
127
|
+
localTreasuryShareBps: value.feeSnapshot.localTreasuryShareBasisPoints,
|
|
128
|
+
},
|
|
129
|
+
}
|
|
130
|
+
: { source: 'legacy-process' };
|
|
131
|
+
treasuryGovernance = value.feeGovernance;
|
|
132
|
+
treasuryRequired = treasuryGovernance !== undefined;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const raw = rows[0];
|
|
136
|
+
const value = raw
|
|
137
|
+
? decode(raw, governanceAddress, STARBASE_GOVERNANCE_DISCRIMINATOR, getStarbaseGovernanceDecoder())
|
|
138
|
+
: undefined;
|
|
139
|
+
if (value) {
|
|
140
|
+
requireFee(value.version === 2 || value.version === 3, 'Starbase governance has an unsupported schema version.');
|
|
141
|
+
requireFee(value.gameId === request.game &&
|
|
142
|
+
value.system === request.system &&
|
|
143
|
+
value.starbaseSeqId === request.starbaseSeqId &&
|
|
144
|
+
value.bump === governanceBump &&
|
|
145
|
+
value.enabled <= 1, 'Starbase governance has invalid scope, sequence, bump or enabled state.');
|
|
146
|
+
requireFee(!(value.version === 3 && history.intent.state === 'absent'), 'This Starbase governance requires initialized daily Democracy history.');
|
|
147
|
+
governance = {
|
|
148
|
+
address: governanceAddress,
|
|
149
|
+
state: 'initialized',
|
|
150
|
+
version: value.version,
|
|
151
|
+
enabled: value.enabled,
|
|
152
|
+
controllerFaction: value.controllerFaction,
|
|
153
|
+
starbaseSeqId: value.starbaseSeqId,
|
|
154
|
+
...(history.intent.state === 'absent' && value.enabled === 1
|
|
155
|
+
? { activeParams: params(value.activeParams) }
|
|
156
|
+
: {}),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
else
|
|
160
|
+
governance = { address: governanceAddress, state: 'absent' };
|
|
161
|
+
if (history.intent.state === 'initialized')
|
|
162
|
+
quote = {
|
|
163
|
+
source: history.intent.enabled === 0
|
|
164
|
+
? 'history-disabled'
|
|
165
|
+
: history.intent.generation
|
|
166
|
+
? 'history-generation'
|
|
167
|
+
: 'history-policy',
|
|
168
|
+
params: params(history.intent.effectiveParams),
|
|
169
|
+
};
|
|
170
|
+
else if (value?.enabled)
|
|
171
|
+
quote = { source: 'governance', params: params(value.activeParams) };
|
|
172
|
+
else
|
|
173
|
+
quote = {
|
|
174
|
+
source: 'default',
|
|
175
|
+
params: {
|
|
176
|
+
craftingFeeBps: 10000,
|
|
177
|
+
localMarketFeeBps: 0,
|
|
178
|
+
localTreasuryShareBps: 0,
|
|
179
|
+
treasuryDistributionBps: 0,
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
if (request.mode === 'market') {
|
|
183
|
+
treasuryGovernance = governanceAddress;
|
|
184
|
+
treasuryRequired = quote.params.localTreasuryShareBps > 0;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
let treasury;
|
|
188
|
+
if (treasuryGovernance) {
|
|
189
|
+
const [treasuryAddress, treasuryBump] = await derive('StarbaseTreasury', treasuryGovernance);
|
|
190
|
+
const [raw] = await read([treasuryAddress]);
|
|
191
|
+
if (raw) {
|
|
192
|
+
const value = decode(raw, treasuryAddress, STARBASE_TREASURY_DISCRIMINATOR, getStarbaseTreasuryDecoder());
|
|
193
|
+
requireFee(value.governance === treasuryGovernance &&
|
|
194
|
+
value.bump === treasuryBump &&
|
|
195
|
+
(request.mode !== 'market' || governance?.state === 'initialized'), 'Starbase Treasury does not match its governance or canonical PDA.');
|
|
196
|
+
treasury = {
|
|
197
|
+
address: treasuryAddress,
|
|
198
|
+
state: 'initialized',
|
|
199
|
+
version: value.version,
|
|
200
|
+
governance: value.governance,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
requireFee(!treasuryRequired, 'This fee route requires a Starbase Treasury that has not been initialized.');
|
|
205
|
+
treasury = { address: treasuryAddress, state: 'absent' };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const intent = {
|
|
209
|
+
request: { ...request },
|
|
210
|
+
...(governance ? { governance } : {}),
|
|
211
|
+
...(currencyCache ? { currencyCache } : {}),
|
|
212
|
+
...(treasury ? { treasury } : {}),
|
|
213
|
+
...(process ? { process } : {}),
|
|
214
|
+
quote,
|
|
215
|
+
};
|
|
216
|
+
return {
|
|
217
|
+
intent,
|
|
218
|
+
accounts: {
|
|
219
|
+
...(request.mode === 'crafting-complete'
|
|
220
|
+
? {}
|
|
221
|
+
: { starbaseGovernance: governanceAddress }),
|
|
222
|
+
...(currencyCache ? { currencyCache: cacheAddress } : {}),
|
|
223
|
+
...(treasury?.state === 'initialized'
|
|
224
|
+
? { starbaseTreasury: treasury.address }
|
|
225
|
+
: {}),
|
|
226
|
+
},
|
|
227
|
+
description: description(intent),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/** Compare finite serialized fields; mutable shared balances are deliberately absent. */
|
|
231
|
+
export function matchGovernanceFeesIntent(expected, actual) {
|
|
232
|
+
const canonical = (value) => JSON.stringify(value, (_key, field) => typeof field === 'bigint'
|
|
233
|
+
? field.toString()
|
|
234
|
+
: field && typeof field === 'object' && !Array.isArray(field)
|
|
235
|
+
? Object.fromEntries(Object.entries(field).sort(([left], [right]) => left.localeCompare(right)))
|
|
236
|
+
: field);
|
|
237
|
+
return canonical(expected) === canonical(actual);
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=governance-fees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance-fees.js","sourceRoot":"","sources":["../../../src/internal/planning/governance-fees.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,aAAa,GAGd,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EACL,mCAAmC,EAEnC,oBAAoB,EACpB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gCAAgC,GAEjC,MAAM,mBAAmB,CAAC;AAkE3B,SAAS,UAAU,CAAC,SAAkB,EAAE,MAAc;IACpD,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,YAAY,CACpB,4BAA4B,EAC5B,GAAG,MAAM,gIAAgI,CAC1I,CAAC;AACN,CAAC;AACD,KAAK,UAAU,MAAM,CAAC,OAAe,EAAE,KAAc,EAAE,QAAiB;IACtE,OAAO,wBAAwB,CAAC;QAC9B,cAAc,EAAE,oBAAoB;QACpC,KAAK,EAAE;YACL,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;YACjC,iBAAiB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;YACjC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;SACtE;KACF,CAAC,CAAC;AACL,CAAC;AACD,SAAS,MAAM,CACb,GAA2B,EAC3B,OAAgB,EAChB,aAAiC,EACjC,OAAmB;IAEnB,UAAU,CACR,GAAG;QACD,GAAG,CAAC,OAAO,KAAK,OAAO;QACvB,GAAG,CAAC,KAAK,KAAK,oBAAoB;QAClC,CAAC,GAAG,CAAC,UAAU,EACjB,uBAAuB,OAAO,oDAAoD,CACnF,CAAC;IACF,UAAU,CACR,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAC9D,uBAAuB,OAAO,+BAA+B,CAC9D,CAAC;IACF,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,UAAU,CACR,QAAQ,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,EAC5B,uBAAuB,OAAO,sBAAsB,CACrD,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,YAAY;YAAE,MAAM,KAAK,CAAC;QAC/C,MAAM,IAAI,YAAY,CACpB,4BAA4B,EAC5B,uBAAuB,OAAO,kGAAkG,CACjI,CAAC;IACJ,CAAC;AACH,CAAC;AACD,SAAS,MAAM,CAAC,KAAuB;IACrC,OAAO;QACL,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;QAClD,uBAAuB,EAAE,KAAK,CAAC,uBAAuB;KACvD,CAAC;AACJ,CAAC;AACD,SAAS,WAAW,CAAC,MAAiB;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,MAAM;QACf,OAAO,2IAA2I,CAAC;IACrJ,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,sBAAsB,KAAK,CAAC,MAAM,4BAA4B,KAAK,CAAC,cAAc,kDAAkD,KAAK,CAAC,iBAAiB,gEAAgE,KAAK,CAAC,qBAAqB,kCAAkC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,wCAAwC,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,8FAA8F,CAAC;AACrkB,CAAC;AACD,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAgB,EAChB,OAAmB,EACnB,OAAiC;IAEjC,UAAU,CACR,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;QAClC,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAC1C,sCAAsC,CACvC,CAAC;IACF,UAAU,CACR,OAAO,CAAC,IAAI,KAAK,mBAAmB;QAClC,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,EACjC,0DAA0D,CAC3D,CAAC;IACF,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,GAAG,MAAM,MAAM,CACtD,oBAAoB,EACpB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,aAAa,CACtB,CAAC;IACF,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,MAAM,MAAM,CAC5C,gBAAgB,EAChB,OAAO,CAAC,IAAI,CACb,CAAC;IACF,MAAM,UAAU,GACd,OAAO,CAAC,IAAI,KAAK,gBAAgB,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;IAC/D,MAAM,cAAc,GAClB,OAAO,CAAC,IAAI,KAAK,mBAAmB;QAClC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAQ,EAAE,YAAY,CAAC;QAClC,CAAC,CAAC;YACE,iBAAiB;YACjB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM;SACf,CAAC;IACR,MAAM,IAAI,GAAG,KAAK,EAAE,SAA6B,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE;YACxD,UAAU,EAAE,WAAW;SACxB,CAAC,CAAC;QACH,UAAU,CACR,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;YAC9B,IAAI,CAAC,KAAK,CACR,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACb,CAAC,GAAG;gBACJ,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CACjE,EACH,uEAAuE,CACxE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClC,UAAU,CACR,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EACtB,qDAAqD,CACtD,CAAC;QACF,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAC7C,OAAO,CAAC,IAAI,EACZ,MAAM,CAAC,QAAQ,CAChB,CAAC;QACF,UAAU,CACR,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM;YAC5B,SAAS,KAAK,OAAO,CAAC,MAAM;YAC5B,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;YAC5B,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,aAAa;YAC3C,MAAM,CAAC,QAAQ,KAAK,SAAS,EAC/B,8FAA8F,CAC/F,CAAC;IACJ,CAAC;IACD,IAAI,aAAyC,CAAC;IAC9C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,MAAM,CAClB,IAAI,CAAC,CAAC,CAAC,EACP,YAAY,EACZ,mCAAmC,EACnC,6BAA6B,EAAE,CAChC,CAAC;QACF,UAAU,CACR,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EACzD,yEAAyE,CAC1E,CAAC;QACF,aAAa,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,UAAmC,CAAC;IACxC,IAAI,OAA6B,CAAC;IAClC,IAAI,KAAyB,CAAC;IAC9B,IAAI,kBAAuC,CAAC;IAC5C,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,UAAU,CACR,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EACzD,sDAAsD,CACvD,CAAC;QACF,MAAM,KAAK,GAAG,gCAAgC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3D,UAAU,CACR,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YAC7B,KAAK,CAAC,kBAAkB,KAAK,OAAO,CAAC,aAAa,EACpD,4EAA4E,CAC7E,CAAC;QACF,OAAO,GAAG;YACR,OAAO,EAAE,OAAO,CAAC,OAAQ;YACzB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS;gBAClC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;YACzC,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS;gBACnC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;YAC3C,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;gBACjC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;SACxC,CAAC;QACF,KAAK,GAAG,KAAK,CAAC,WAAW;YACvB,CAAC,CAAC;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,MAAM,EAAE;oBACN,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,sBAAsB;oBACxD,iBAAiB,EAAE,KAAK,CAAC,WAAW,CAAC,yBAAyB;oBAC9D,qBAAqB,EACnB,KAAK,CAAC,WAAW,CAAC,6BAA6B;iBAClD;aACF;YACH,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QACjC,kBAAkB,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,gBAAgB,GAAG,kBAAkB,KAAK,SAAS,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,GAAG;YACf,CAAC,CAAC,MAAM,CACJ,GAAG,EACH,iBAAiB,EACjB,iCAAiC,EACjC,4BAA4B,EAAE,CAC/B;YACH,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CACR,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,EAC1C,wDAAwD,CACzD,CAAC;YACF,UAAU,CACR,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI;gBAC3B,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;gBAC/B,KAAK,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa;gBAC7C,KAAK,CAAC,IAAI,KAAK,cAAc;gBAC7B,KAAK,CAAC,OAAO,IAAI,CAAC,EACpB,yEAAyE,CAC1E,CAAC;YACF,UAAU,CACR,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,EAC3D,wEAAwE,CACzE,CAAC;YACF,UAAU,GAAG;gBACX,OAAO,EAAE,iBAAiB;gBAC1B,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;gBAC1C,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC;oBAC1D,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;;YAAM,UAAU,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACpE,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,aAAa;YACxC,KAAK,GAAG;gBACN,MAAM,EACJ,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC;oBAC1B,CAAC,CAAC,kBAAkB;oBACpB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU;wBACzB,CAAC,CAAC,oBAAoB;wBACtB,CAAC,CAAC,gBAAgB;gBACxB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;aAC/C,CAAC;aACC,IAAI,KAAK,EAAE,OAAO;YACrB,KAAK,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;;YAErE,KAAK,GAAG;gBACN,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE;oBACN,cAAc,EAAE,KAAK;oBACrB,iBAAiB,EAAE,CAAC;oBACpB,qBAAqB,EAAE,CAAC;oBACxB,uBAAuB,EAAE,CAAC;iBAC3B;aACF,CAAC;QACJ,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,kBAAkB,GAAG,iBAAiB,CAAC;YACvC,gBAAgB,GAAG,KAAK,CAAC,MAAO,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,IAAI,QAA+B,CAAC;IACpC,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,GAAG,MAAM,MAAM,CAClD,kBAAkB,EAClB,kBAAkB,CACnB,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5C,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,KAAK,GAAG,MAAM,CAClB,GAAG,EACH,eAAe,EACf,+BAA+B,EAC/B,0BAA0B,EAAE,CAC7B,CAAC;YACF,UAAU,CACR,KAAK,CAAC,UAAU,KAAK,kBAAkB;gBACrC,KAAK,CAAC,IAAI,KAAK,YAAY;gBAC3B,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,EAAE,KAAK,KAAK,aAAa,CAAC,EACpE,mEAAmE,CACpE,CAAC;YACF,QAAQ,GAAG;gBACT,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CACR,CAAC,gBAAgB,EACjB,4EAA4E,CAC7E,CAAC;YACF,QAAQ,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAc;QACxB,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE;QACvB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,KAAK;KACN,CAAC;IACF,OAAO;QACL,MAAM;QACN,QAAQ,EAAE;YACR,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,mBAAmB;gBACtC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;YAC9C,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,QAAQ,EAAE,KAAK,KAAK,aAAa;gBACnC,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,OAAO,EAAE;gBACxC,CAAC,CAAC,EAAE,CAAC;SACR;QACD,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC;KACjC,CAAC;AACJ,CAAC;AACD,yFAAyF;AACzF,MAAM,UAAU,yBAAyB,CACvC,QAAmB,EACnB,MAAiB;IAEjB,MAAM,SAAS,GAAG,CAAC,KAAc,EAAU,EAAE,CAC3C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAc,EAAE,EAAE,CAC7C,OAAO,KAAK,KAAK,QAAQ;QACvB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;QAClB,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAC3D,CAAC,CAAC,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAC7C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAC1B,CACF;YACH,CAAC,CAAC,KAAK,CACZ,CAAC;IACJ,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type Address } from '@solana/kit';
|
|
2
|
+
import type { SageContext } from '../../client/contracts.js';
|
|
3
|
+
import type { PlanPrecondition, PlanStep } from '../../planning/index.js';
|
|
4
|
+
import { type HistoryIntent, type ResolvedDemocracyHistory } from './democracy-history.js';
|
|
5
|
+
import { type XpRuntimeIntent, type XpRuntimeAccounts } from './xp-runtime.js';
|
|
6
|
+
import { resolveGovernanceFees, type FeeIntent } from './governance-fees.js';
|
|
7
|
+
type FeeAccounts = Awaited<ReturnType<typeof resolveGovernanceFees>>['accounts'];
|
|
8
|
+
type BaseGuard = {
|
|
9
|
+
readonly address: Address;
|
|
10
|
+
readonly describes: string;
|
|
11
|
+
readonly dataHash?: never;
|
|
12
|
+
};
|
|
13
|
+
/** Finite runtime eligibility and consumed fee routes, excluding changing balances. */
|
|
14
|
+
export type RuntimeGuard = BaseGuard & ({
|
|
15
|
+
readonly kind: 'democracy-history';
|
|
16
|
+
readonly intent: HistoryIntent;
|
|
17
|
+
readonly accounts: ResolvedDemocracyHistory['accounts'];
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: 'xp-runtime';
|
|
20
|
+
readonly intent: XpRuntimeIntent;
|
|
21
|
+
readonly accounts: XpRuntimeAccounts;
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: 'governance-fees';
|
|
24
|
+
readonly intent: FeeIntent;
|
|
25
|
+
readonly accounts: FeeAccounts;
|
|
26
|
+
});
|
|
27
|
+
export type RuntimeWire<T> = T extends bigint ? string : T extends Address ? string : T extends object ? {
|
|
28
|
+
readonly [K in keyof T]: RuntimeWire<T[K]>;
|
|
29
|
+
} : T;
|
|
30
|
+
export type RuntimeGuardJson = RuntimeWire<RuntimeGuard>;
|
|
31
|
+
export declare function isRuntimeGuard(value: {
|
|
32
|
+
readonly kind?: unknown;
|
|
33
|
+
}): value is RuntimeGuard;
|
|
34
|
+
/** Strict nested runtime parsing applies both to factory values and persisted JSON. */
|
|
35
|
+
export declare function normalizeRuntimeGuard(value: unknown, field: string, wire?: boolean): RuntimeGuard;
|
|
36
|
+
/** Bigints use canonical decimal strings; schema validation excludes arbitrary object graphs. */
|
|
37
|
+
export declare function runtimeGuardToJSON(guard: RuntimeGuard): RuntimeGuardJson;
|
|
38
|
+
/** Resolve canonical accounts again; shared balances and XP counters are not compared. */
|
|
39
|
+
export declare function revalidateRuntimeGuards(ctx: SageContext, guards: readonly RuntimeGuard[]): Promise<void>;
|
|
40
|
+
/** Old layouts and unguarded persisted instructions fail before assembly or signing. */
|
|
41
|
+
export declare function validateRuntimeInstructions(steps: readonly PlanStep[], preconditions: readonly PlanPrecondition[]): void;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=runtime-guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-guards.d.ts","sourceRoot":"","sources":["../../../src/internal/planning/runtime-guards.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EAGb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAgB7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAGL,KAAK,aAAa,EAElB,KAAK,wBAAwB,EAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EAErB,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAE9B,KAAK,WAAW,GAAG,OAAO,CACxB,UAAU,CAAC,OAAO,qBAAqB,CAAC,CACzC,CAAC,UAAU,CAAC,CAAC;AACd,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;CAC3B,CAAC;AACF,uFAAuF;AACvF,MAAM,MAAM,YAAY,GAAG,SAAS,GAClC,CACI;IACE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC,UAAU,CAAC,CAAC;CACzD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;CACtC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC,CACJ,CAAC;AACJ,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GACzC,MAAM,GACN,CAAC,SAAS,OAAO,GACf,MAAM,GACN,CAAC,SAAS,MAAM,GACd;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC9C,CAAC,CAAC;AACV,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;AACzD,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,KAAK,IAAI,YAAY,CAMxB;AAkLD,uFAAuF;AACvF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,UAAQ,GACX,YAAY,CAuDd;AACD,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,gBAAgB,CAMxE;AAiBD,0FAA0F;AAC1F,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,OAAO,CAAC,IAAI,CAAC,CAuCf;AAgTD,wFAAwF;AACxF,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,aAAa,EAAE,SAAS,gBAAgB,EAAE,GACzC,IAAI,CAkIN"}
|