@plasius/economy 0.8.0 → 0.10.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/README.md +26 -1
- package/dist/index.cjs +370 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +97 -4
- package/dist/index.d.ts +97 -4
- package/dist/index.js +362 -30
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/amount.ts","../src/canonical-order.ts","../src/contracts.ts","../src/acquisition.ts","../src/admin-reporting.ts","../src/allocations.ts","../src/audit.ts","../src/authority.ts","../src/ledger.ts","../src/audit-graph.ts","../src/early-backers.ts","../src/integrity.ts","../src/lots.ts","../src/module-allowances.ts","../src/operations.ts","../src/operator-adjustments.ts","../src/paid-lots.ts","../src/ports/persistence.ts","../src/wallets.ts","../src/projection.ts","../src/ports/query.ts","../src/purchase-caps.ts","../src/purchase-intents.ts","../src/recurrence.ts","../src/recovery.ts","../src/spend-requests.ts","../src/wallet-initialization.ts"],"sourcesContent":["/** Stable machine-readable failures exposed by the economy domain. */\nexport type EconomyErrorCode =\n | \"INVALID_AMOUNT\"\n | \"AMOUNT_OUT_OF_RANGE\"\n | \"AMOUNT_NOT_WHOLE_TOKEN\"\n | \"INVALID_CONTRACT\"\n | \"UNBALANCED_TRANSACTION\"\n | \"DUPLICATE_IDENTIFIER\"\n | \"DUPLICATE_TRANSACTION\"\n | \"INSUFFICIENT_BALANCE\"\n | \"INSUFFICIENT_ELIGIBLE_LOTS\"\n | \"SOURCE_LOT_RESTRICTED\"\n | \"REVERSAL_ALREADY_EXISTS\"\n | \"NEGATIVE_PROJECTION\"\n | \"INVALID_TIME_WINDOW\"\n | \"ADJUSTMENT_SELF_APPROVAL\"\n | \"ADJUSTMENT_EXPIRED\"\n | \"ADJUSTMENT_PREVIEW_MISMATCH\"\n | \"ADJUSTMENT_NOT_APPROVED\";\n\nexport interface EconomyErrorEnvelopeV1 {\n readonly schemaVersion: \"1\";\n readonly error: {\n readonly code: EconomyErrorCode;\n readonly message: string;\n readonly requestId?: string;\n };\n}\n\n/**\n * Domain error with a stable code and deliberately non-sensitive message.\n * Provider evidence, identities, and payment details must not be included.\n */\nexport class EconomyError extends Error {\n readonly code: EconomyErrorCode;\n\n constructor(code: EconomyErrorCode, message: string) {\n super(message);\n this.name = \"EconomyError\";\n this.code = code;\n }\n}\n\n/** Throws a stable economy error when a domain assertion fails. */\nexport function economyAssert(\n condition: unknown,\n code: EconomyErrorCode,\n message: string,\n): asserts condition {\n if (!condition) {\n throw new EconomyError(code, message);\n }\n}\n\n/** Creates a bounded, non-sensitive error contract for an HTTP adapter. */\nexport function toEconomyErrorEnvelope(\n error: EconomyError,\n requestId?: string,\n): EconomyErrorEnvelopeV1 {\n return {\n schemaVersion: \"1\",\n error: {\n code: error.code,\n message: error.message.slice(0, 256),\n ...(requestId === undefined ? {} : { requestId }),\n },\n };\n}\n","import { EconomyError, economyAssert } from \"./errors.js\";\n\n/** Number of indivisible subunits in one public Token. */\nexport const TOKEN_SUBUNITS_PER_TOKEN = 1_000n;\n\n/** PostgreSQL-compatible signed bigint bounds. */\nexport const TOKEN_SUBUNITS_MIN = -(2n ** 63n);\nexport const TOKEN_SUBUNITS_MAX = 2n ** 63n - 1n;\n\ndeclare const tokenSubunitStringBrand: unique symbol;\n\n/** Canonical base-10 representation used at JSON and persistence boundaries. */\nexport type TokenSubunitString = string & {\n readonly [tokenSubunitStringBrand]: \"TokenSubunitString\";\n};\n\nconst CANONICAL_INTEGER = /^(?:0|-?[1-9][0-9]*)$/u;\n\nfunction assertInRange(amount: bigint): void {\n economyAssert(\n amount >= TOKEN_SUBUNITS_MIN && amount <= TOKEN_SUBUNITS_MAX,\n \"AMOUNT_OUT_OF_RANGE\",\n \"TokenSubunit amount is outside the signed 64-bit range\",\n );\n}\n\n/** Parses a canonical base-10 TokenSubunit string without floating point. */\nexport function parseTokenSubunits(value: string): bigint {\n economyAssert(\n typeof value === \"string\" && CANONICAL_INTEGER.test(value),\n \"INVALID_AMOUNT\",\n \"TokenSubunit amount must be a canonical base-10 integer string\",\n );\n\n try {\n const amount = BigInt(value);\n assertInRange(amount);\n return amount;\n } catch (error) {\n if (error instanceof EconomyError) {\n throw error;\n }\n throw new EconomyError(\"INVALID_AMOUNT\", \"TokenSubunit amount is invalid\");\n }\n}\n\n/** Serializes a signed 64-bit TokenSubunit amount to canonical base-10. */\nexport function serializeTokenSubunits(amount: bigint): TokenSubunitString {\n assertInRange(amount);\n return amount.toString(10) as TokenSubunitString;\n}\n\n/** Converts an exact whole-Token integer into TokenSubunits. */\nexport function wholeTokensToSubunits(tokens: bigint): bigint {\n const amount = tokens * TOKEN_SUBUNITS_PER_TOKEN;\n assertInRange(amount);\n return amount;\n}\n\n/** Returns true when a subunit amount represents an exact whole Token. */\nexport function isWholeTokenAmount(amount: bigint): boolean {\n return amount % TOKEN_SUBUNITS_PER_TOKEN === 0n;\n}\n\n/** Converts TokenSubunits to whole Tokens, rejecting fractional progress. */\nexport function subunitsToWholeTokens(amount: bigint): bigint {\n economyAssert(\n isWholeTokenAmount(amount),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Amount must contain whole Tokens\",\n );\n return amount / TOKEN_SUBUNITS_PER_TOKEN;\n}\n\n/** Sums amount strings with signed 64-bit overflow protection. */\nexport function sumTokenSubunits(values: readonly string[]): bigint {\n let total = 0n;\n for (const value of values) {\n total += parseTokenSubunits(value);\n assertInRange(total);\n }\n return total;\n}\n","/**\n * Compares strings using locale-independent ECMAScript UTF-16 code-unit order.\n *\n * Canonical transaction identifiers and metadata keys use a validated ASCII\n * alphabet, so this ordering is byte-for-byte equivalent to PostgreSQL\n * `COLLATE \"C\"` for those fields.\n */\nexport function compareUnicodeCodeUnits(left: string, right: string): number {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n}\n","import { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport const ECONOMY_CONTRACT_VERSION = \"1\" as const;\nexport type EconomyContractVersion = typeof ECONOMY_CONTRACT_VERSION;\n\nexport type AccountId = string;\nexport type AllocationId = string;\nexport type HouseholdId = string;\nexport type LearningEntitlementId = string;\nexport type LearningModuleVersionId = string;\nexport type LotId = string;\nexport type ModuleAllowanceId = string;\nexport type ModuleSpendHoldId = string;\nexport type ModuleSpendQuoteId = string;\nexport type PostingId = string;\nexport type ProviderEventId = string;\nexport type TransactionId = string;\nexport type WalletId = string;\nexport type IsoTimestamp = string;\n\nconst IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;\n\n/** Validates opaque pseudonymous domain identifiers. */\nexport function assertEconomyIdentifier(\n value: string,\n label = \"identifier\",\n): void {\n economyAssert(\n typeof value === \"string\" && IDENTIFIER.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a non-empty opaque identifier`,\n );\n}\n\n/** Parses a bounded ISO timestamp and returns milliseconds since epoch. */\nexport function parseIsoTimestamp(value: IsoTimestamp): number {\n economyAssert(\n typeof value === \"string\",\n \"INVALID_CONTRACT\",\n \"Timestamp must be an ISO-8601 UTC value\",\n );\n const match = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{3}))?Z$/u.exec(\n value,\n );\n economyAssert(\n match !== null,\n \"INVALID_CONTRACT\",\n \"Timestamp must be an ISO-8601 UTC value\",\n );\n const milliseconds = Date.parse(value);\n const base = match[1];\n const fraction = match[2] ?? \"000\";\n economyAssert(\n Number.isFinite(milliseconds) &&\n base !== undefined &&\n new Date(milliseconds).toISOString() === `${base}.${fraction}Z`,\n \"INVALID_CONTRACT\",\n \"Timestamp must be valid\",\n );\n return milliseconds;\n}\n\n/** Returns a new record with keys sorted by locale-independent code units. */\nexport function sortStringRecord(\n value: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> {\n return Object.fromEntries(\n Object.entries(value).sort(([left], [right]) =>\n compareUnicodeCodeUnits(left, right),\n ),\n );\n}\n","import {\n TOKEN_SUBUNITS_PER_TOKEN,\n isWholeTokenAmount,\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type ProviderEventId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { ActivityStatus, ActivityType } from \"./ledger.js\";\n\nexport interface TokenPackV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly packId: string;\n readonly catalogVersion: string;\n readonly currency: \"GBP\";\n readonly priceMinorUnits: string;\n readonly grantAmount: TokenSubunitString;\n readonly active: boolean;\n}\n\n/** Product-copy reference only; it is not a redemption or exchange promise. */\nexport interface TokenReferenceRateV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly rateVersion: string;\n readonly currency: \"GBP\";\n readonly referenceMinorUnitsPerToken: string;\n readonly tokenSubunitsPerToken: string;\n readonly cashRedemptionAllowed: false;\n}\n\nexport const BASELINE_GBP_REFERENCE_RATE: TokenReferenceRateV1 = Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n rateVersion: \"gbp-reference-v1\",\n currency: \"GBP\",\n referenceMinorUnitsPerToken: \"10\",\n tokenSubunitsPerToken: TOKEN_SUBUNITS_PER_TOKEN.toString(10),\n cashRedemptionAllowed: false,\n});\n\nexport const BASELINE_GBP_CATALOG_VERSION = \"gbp-v1\" as const;\n\n/** Initial flat-price public catalog. Changes require a new catalog version. */\nexport const BASELINE_GBP_TOKEN_PACKS: readonly TokenPackV1[] = Object.freeze([\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n packId: \"gbp_5_50_v1\",\n catalogVersion: BASELINE_GBP_CATALOG_VERSION,\n currency: \"GBP\",\n priceMinorUnits: \"500\",\n grantAmount: serializeTokenSubunits(50_000n),\n active: true,\n }),\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n packId: \"gbp_10_100_v1\",\n catalogVersion: BASELINE_GBP_CATALOG_VERSION,\n currency: \"GBP\",\n priceMinorUnits: \"1000\",\n grantAmount: serializeTokenSubunits(100_000n),\n active: true,\n }),\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n packId: \"gbp_25_250_v1\",\n catalogVersion: BASELINE_GBP_CATALOG_VERSION,\n currency: \"GBP\",\n priceMinorUnits: \"2500\",\n grantAmount: serializeTokenSubunits(250_000n),\n active: true,\n }),\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n packId: \"gbp_50_500_v1\",\n catalogVersion: BASELINE_GBP_CATALOG_VERSION,\n currency: \"GBP\",\n priceMinorUnits: \"5000\",\n grantAmount: serializeTokenSubunits(500_000n),\n active: true,\n }),\n]);\n\nexport interface PurchaseLimitPolicyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly maxOrderPriceMinorUnits: string;\n readonly rollingPayerPriceMinorUnits: string;\n readonly rollingHouseholdPriceMinorUnits: string;\n readonly rollingDays: number;\n}\n\n/** Default server limits; household controls may only lower these values. */\nexport const BASELINE_PURCHASE_LIMIT_POLICY: PurchaseLimitPolicyV1 =\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n maxOrderPriceMinorUnits: \"5000\",\n rollingPayerPriceMinorUnits: \"10000\",\n rollingHouseholdPriceMinorUnits: \"10000\",\n rollingDays: 30,\n });\n\nexport type PurchaseIntentStatus =\n | \"created\"\n | \"checkout-created\"\n | \"paid-unreconciled\"\n | \"credited\"\n | \"expired\"\n | \"cancelled\"\n | \"disputed\";\n\n/** Short-lived server authority binding checkout facts to a payer/household. */\nexport interface PurchaseIntentV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly intentId: string;\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly receivingWalletId: WalletId;\n readonly packId: string;\n readonly catalogVersion: string;\n readonly expectedCurrency: \"GBP\";\n readonly expectedPriceMinorUnits: string;\n readonly grantAmount: TokenSubunitString;\n readonly status: PurchaseIntentStatus;\n readonly createdAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n readonly providerCheckoutReferenceHash?: string;\n}\n\nexport interface RewardRateV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly rateVersion: string;\n readonly provider: \"ayet\" | \"bitlabs\";\n /** TokenSubunits granted per denominator of authoritative GBP minor units. */\n readonly tokenSubunitsNumerator: string;\n readonly gbpMinorUnitsDenominator: string;\n readonly effectiveFrom: IsoTimestamp;\n readonly effectiveUntil?: IsoTimestamp;\n}\n\nexport interface FxSnapshotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly snapshotId: string;\n readonly sourceCurrency: string;\n readonly quoteCurrency: \"GBP\";\n /** Exact rational conversion to GBP minor units. */\n readonly gbpMinorUnitsNumerator: string;\n readonly sourceMinorUnitsDenominator: string;\n readonly capturedAt: IsoTimestamp;\n}\n\nexport type RewardConversionStatus =\n | \"pending\"\n | \"completed\"\n | \"reconciled\";\n\nexport type BitLabsConversionState =\n | \"PENDING\"\n | \"COMPLETED\"\n | \"RECONCILED\";\n\nexport interface RewardActivityTransitionV1 {\n readonly conversionStatus: RewardConversionStatus;\n readonly activityType: ActivityType;\n readonly activityStatus: ActivityStatus;\n}\n\nexport interface RewardConversionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly provider: \"ayet\" | \"bitlabs\";\n readonly providerEventId: ProviderEventId;\n readonly beneficiaryAccountId: AccountId;\n readonly walletId: WalletId;\n readonly status: RewardConversionStatus;\n readonly providerPayoutMinorUnits: string;\n readonly providerCurrency: string;\n readonly gbpMinorUnits: string;\n readonly tokenSubunits: TokenSubunitString;\n readonly rateVersion: string;\n readonly fxSnapshotId: string;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Validates a minimized, signed-provider conversion record before journaling. */\nexport function assertRewardConversion(\n conversion: RewardConversionV1,\n): void {\n economyAssert(\n conversion.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported reward-conversion contract version\",\n );\n economyAssert(\n conversion.provider === \"ayet\" || conversion.provider === \"bitlabs\",\n \"INVALID_CONTRACT\",\n \"Unsupported reward-conversion provider\",\n );\n assertEconomyIdentifier(conversion.providerEventId, \"providerEventId\");\n assertEconomyIdentifier(\n conversion.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n assertEconomyIdentifier(conversion.walletId, \"walletId\");\n economyAssert(\n [\"pending\", \"completed\", \"reconciled\"].includes(conversion.status),\n \"INVALID_CONTRACT\",\n \"Unsupported reward-conversion status\",\n );\n economyAssert(\n /^[A-Z]{3}$/u.test(conversion.providerCurrency),\n \"INVALID_CONTRACT\",\n \"Reward payout currency must use an uppercase ISO code\",\n );\n economyAssert(\n parseNonNegativeInteger(\n conversion.providerPayoutMinorUnits,\n \"Provider payout\",\n ) > 0n &&\n parseNonNegativeInteger(conversion.gbpMinorUnits, \"GBP payout\") >= 0n &&\n parseTokenSubunits(conversion.tokenSubunits) > 0n,\n \"INVALID_AMOUNT\",\n \"Reward conversion must carry positive payout and Token values\",\n );\n assertEconomyIdentifier(conversion.rateVersion, \"rateVersion\");\n assertEconomyIdentifier(conversion.fxSnapshotId, \"fxSnapshotId\");\n parseIsoTimestamp(conversion.occurredAt);\n}\n\nfunction parseNonNegativeInteger(value: string, label: string): bigint {\n economyAssert(\n /^(?:0|[1-9][0-9]*)$/u.test(value),\n \"INVALID_AMOUNT\",\n `${label} must be a non-negative integer string`,\n );\n return BigInt(value);\n}\n\n/** Validates a paid pack; pack grants are whole Tokens in the baseline. */\nexport function assertTokenPack(pack: TokenPackV1): void {\n economyAssert(\n pack.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported Token pack contract version\",\n );\n assertEconomyIdentifier(pack.packId, \"packId\");\n assertEconomyIdentifier(pack.catalogVersion, \"catalogVersion\");\n economyAssert(\n pack.currency === \"GBP\" && typeof pack.active === \"boolean\",\n \"INVALID_CONTRACT\",\n \"Token packs must use GBP and declare whether they are active\",\n );\n economyAssert(\n parseNonNegativeInteger(pack.priceMinorUnits, \"Pack price\") > 0n,\n \"INVALID_AMOUNT\",\n \"Pack price must be positive\",\n );\n const grant = parseTokenSubunits(pack.grantAmount);\n economyAssert(\n grant > 0n && isWholeTokenAmount(grant),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Paid pack grants must contain whole Tokens\",\n );\n}\n\n/** Validates nominal reference metadata without creating redemption rights. */\nexport function assertTokenReferenceRate(\n rate: TokenReferenceRateV1,\n): void {\n economyAssert(\n rate.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported Token reference-rate contract version\",\n );\n assertEconomyIdentifier(rate.rateVersion, \"rateVersion\");\n const referenceMinorUnits = parseNonNegativeInteger(\n rate.referenceMinorUnitsPerToken,\n \"Reference minor units per Token\",\n );\n const subunitsPerToken = parseNonNegativeInteger(\n rate.tokenSubunitsPerToken,\n \"TokenSubunits per Token\",\n );\n economyAssert(\n rate.currency === \"GBP\" &&\n referenceMinorUnits > 0n &&\n subunitsPerToken === TOKEN_SUBUNITS_PER_TOKEN &&\n rate.cashRedemptionAllowed === false,\n \"INVALID_CONTRACT\",\n \"Token reference rate must preserve the GBP nominal, subunit, and no-redemption boundary\",\n );\n}\n\n/** Proves that every pack in one catalog uses the same flat nominal ratio. */\nexport function assertFlatTokenCatalog(\n packs: readonly TokenPackV1[],\n referenceRate: TokenReferenceRateV1,\n): void {\n assertTokenReferenceRate(referenceRate);\n economyAssert(\n packs.length > 0,\n \"INVALID_CONTRACT\",\n \"Token catalog must contain at least one pack\",\n );\n const packIds = new Set<string>();\n const catalogVersion = packs[0]?.catalogVersion;\n const referenceMinorUnits = BigInt(\n referenceRate.referenceMinorUnitsPerToken,\n );\n const subunitsPerToken = BigInt(referenceRate.tokenSubunitsPerToken);\n for (const pack of packs) {\n assertTokenPack(pack);\n economyAssert(\n !packIds.has(pack.packId),\n \"DUPLICATE_IDENTIFIER\",\n \"Token catalog pack IDs must be unique\",\n );\n economyAssert(\n pack.catalogVersion === catalogVersion,\n \"INVALID_CONTRACT\",\n \"Token catalog packs must share one catalog version\",\n );\n packIds.add(pack.packId);\n const scaledReference =\n parseTokenSubunits(pack.grantAmount) * referenceMinorUnits;\n economyAssert(\n scaledReference % subunitsPerToken === 0n &&\n scaledReference / subunitsPerToken === BigInt(pack.priceMinorUnits),\n \"INVALID_CONTRACT\",\n \"Token catalog must use the declared flat nominal reference ratio\",\n );\n }\n}\n\n/** Validates server-side order and rolling acquisition ceilings. */\nexport function assertPurchaseLimitPolicy(\n policy: PurchaseLimitPolicyV1,\n): void {\n economyAssert(\n policy.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-limit contract version\",\n );\n const maxOrder = parseNonNegativeInteger(\n policy.maxOrderPriceMinorUnits,\n \"Maximum order\",\n );\n const payer = parseNonNegativeInteger(\n policy.rollingPayerPriceMinorUnits,\n \"Rolling payer limit\",\n );\n const household = parseNonNegativeInteger(\n policy.rollingHouseholdPriceMinorUnits,\n \"Rolling household limit\",\n );\n economyAssert(\n maxOrder > 0n && payer >= maxOrder && household >= maxOrder,\n \"INVALID_AMOUNT\",\n \"Rolling purchase limits must cover at least one maximum order\",\n );\n economyAssert(\n Number.isSafeInteger(policy.rollingDays) &&\n policy.rollingDays >= 1 &&\n policy.rollingDays <= 365,\n \"INVALID_CONTRACT\",\n \"Purchase-limit rolling window must be a bounded whole-day count\",\n );\n}\n\n/** Validates the immutable server-side facts bound into a purchase intent. */\nexport function assertPurchaseIntentBinding(\n intent: PurchaseIntentV1,\n pack: TokenPackV1,\n): void {\n assertTokenPack(pack);\n economyAssert(\n intent.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-intent contract version\",\n );\n assertEconomyIdentifier(intent.intentId, \"intentId\");\n assertEconomyIdentifier(intent.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(intent.receivingHouseholdId, \"receivingHouseholdId\");\n assertEconomyIdentifier(intent.receivingWalletId, \"receivingWalletId\");\n assertEconomyIdentifier(intent.packId, \"packId\");\n assertEconomyIdentifier(intent.catalogVersion, \"catalogVersion\");\n\n const createdAt = parseIsoTimestamp(intent.createdAt);\n const expiresAt = parseIsoTimestamp(intent.expiresAt);\n economyAssert(\n expiresAt > createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase intent expiry must follow its creation time\",\n );\n economyAssert(\n intent.expectedCurrency === \"GBP\" &&\n intent.packId === pack.packId &&\n intent.catalogVersion === pack.catalogVersion &&\n intent.expectedCurrency === pack.currency &&\n intent.expectedPriceMinorUnits === pack.priceMinorUnits &&\n intent.grantAmount === pack.grantAmount,\n \"INVALID_CONTRACT\",\n \"Purchase intent does not match its authoritative catalog pack\",\n );\n parseNonNegativeInteger(intent.expectedPriceMinorUnits, \"Expected price\");\n parseTokenSubunits(intent.grantAmount);\n economyAssert(\n [\n \"created\",\n \"checkout-created\",\n \"paid-unreconciled\",\n \"credited\",\n \"expired\",\n \"cancelled\",\n \"disputed\",\n ].includes(intent.status),\n \"INVALID_CONTRACT\",\n \"Purchase intent has an unsupported status\",\n );\n if (intent.providerCheckoutReferenceHash !== undefined) {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(intent.providerCheckoutReferenceHash),\n \"INVALID_CONTRACT\",\n \"Checkout references must be stored as sanitized SHA-256 hashes\",\n );\n }\n}\n\n/** Rejects stale, inactive, or already-consumed intents before checkout creation. */\nexport function assertOpenPurchaseIntent(\n intent: PurchaseIntentV1,\n pack: TokenPackV1,\n checkedAt: IsoTimestamp,\n): void {\n assertPurchaseIntentBinding(intent, pack);\n const checkedAtValue = parseIsoTimestamp(checkedAt);\n economyAssert(\n pack.active &&\n (intent.status === \"created\" || intent.status === \"checkout-created\") &&\n checkedAtValue >= parseIsoTimestamp(intent.createdAt) &&\n checkedAtValue < parseIsoTimestamp(intent.expiresAt),\n \"INVALID_TIME_WINDOW\",\n \"Purchase intent is inactive, expired, or not open for checkout\",\n );\n}\n\nexport function assertRewardRate(rate: RewardRateV1): void {\n economyAssert(\n rate.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported reward-rate contract version\",\n );\n assertEconomyIdentifier(rate.rateVersion, \"rateVersion\");\n economyAssert(\n rate.provider === \"ayet\" || rate.provider === \"bitlabs\",\n \"INVALID_CONTRACT\",\n \"Unsupported reward provider\",\n );\n const effectiveFrom = parseIsoTimestamp(rate.effectiveFrom);\n if (rate.effectiveUntil !== undefined) {\n economyAssert(\n parseIsoTimestamp(rate.effectiveUntil) > effectiveFrom,\n \"INVALID_TIME_WINDOW\",\n \"Reward-rate expiry must follow its effective time\",\n );\n }\n}\n\nexport function assertFxSnapshot(fx: FxSnapshotV1): void {\n economyAssert(\n fx.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported FX snapshot contract version\",\n );\n assertEconomyIdentifier(fx.snapshotId, \"snapshotId\");\n economyAssert(\n /^[A-Z]{3}$/u.test(fx.sourceCurrency) && fx.quoteCurrency === \"GBP\",\n \"INVALID_CONTRACT\",\n \"FX snapshots must convert an ISO currency into GBP\",\n );\n parseIsoTimestamp(fx.capturedAt);\n}\n\n/** Converts provider payout using exact rational FX and rate snapshots. */\nexport function convertRewardPayout(\n providerPayoutMinorUnits: string,\n rate: RewardRateV1,\n fx: FxSnapshotV1,\n): { readonly gbpMinorUnits: string; readonly tokenSubunits: TokenSubunitString } {\n assertRewardRate(rate);\n assertFxSnapshot(fx);\n const payout = parseNonNegativeInteger(\n providerPayoutMinorUnits,\n \"Provider payout\",\n );\n const fxNumerator = parseNonNegativeInteger(\n fx.gbpMinorUnitsNumerator,\n \"FX numerator\",\n );\n const fxDenominator = parseNonNegativeInteger(\n fx.sourceMinorUnitsDenominator,\n \"FX denominator\",\n );\n const tokenNumerator = parseNonNegativeInteger(\n rate.tokenSubunitsNumerator,\n \"Rate numerator\",\n );\n const tokenDenominator = parseNonNegativeInteger(\n rate.gbpMinorUnitsDenominator,\n \"Rate denominator\",\n );\n economyAssert(\n fxDenominator > 0n && tokenDenominator > 0n,\n \"INVALID_AMOUNT\",\n \"FX and reward-rate denominators must be positive\",\n );\n economyAssert(\n fxNumerator > 0n && tokenNumerator > 0n,\n \"INVALID_AMOUNT\",\n \"FX and reward-rate numerators must be positive\",\n );\n\n const gbpMinorUnits = (payout * fxNumerator) / fxDenominator;\n const tokenSubunits = (gbpMinorUnits * tokenNumerator) / tokenDenominator;\n return {\n gbpMinorUnits: gbpMinorUnits.toString(10),\n tokenSubunits: serializeTokenSubunits(tokenSubunits),\n };\n}\n\n/** Maps BitLabs' signed callback state into an immutable journal transition. */\nexport function mapBitLabsConversionState(\n state: string,\n): RewardActivityTransitionV1 {\n const transitions: Readonly<\n Record<BitLabsConversionState, RewardActivityTransitionV1>\n > = {\n PENDING: {\n conversionStatus: \"pending\",\n activityType: \"hold\",\n activityStatus: \"held\",\n },\n COMPLETED: {\n conversionStatus: \"completed\",\n activityType: \"offerwall\",\n activityStatus: \"settled\",\n },\n RECONCILED: {\n conversionStatus: \"reconciled\",\n activityType: \"reversal\",\n activityStatus: \"reversed\",\n },\n };\n const transition = transitions[state as BitLabsConversionState];\n economyAssert(\n transition !== undefined,\n \"INVALID_CONTRACT\",\n \"Unsupported BitLabs conversion state\",\n );\n return transition;\n}\n","import {\n parseTokenSubunits,\n TOKEN_SUBUNITS_MAX,\n TOKEN_SUBUNITS_MIN,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport const ADMIN_TOKEN_DEFAULT_WINDOW_DAYS = 30;\nexport const ADMIN_TOKEN_MAXIMUM_WINDOW_DAYS = 365;\nexport const ADMIN_TOKEN_MAXIMUM_HOURLY_WINDOW_DAYS = 31;\nexport const ADMIN_TOKEN_MAXIMUM_PAGE_SIZE = 100;\nexport const ADMIN_TOKEN_MAXIMUM_TREND_POINTS =\n ADMIN_TOKEN_MAXIMUM_HOURLY_WINDOW_DAYS * 24 * 5;\nexport const ADMIN_TOKEN_MINIMUM_COHORT_SIZE = 5;\nexport const ADMIN_TOKEN_ANOMALY_BASELINE_DAYS = 28;\n\nconst DAY_MILLISECONDS = 86_400_000;\nconst HOUR_MILLISECONDS = 3_600_000;\n\nexport type AdminTokenActivityTypeV1 =\n | \"acquisition\"\n | \"spend\"\n | \"reversal\"\n | \"hold\"\n | \"failure\";\n\nexport type AdminTokenActivityStatusV1 =\n | \"pending\"\n | \"held\"\n | \"settled\"\n | \"reversed\"\n | \"failed\";\n\n/**\n * Privacy-safe source groupings. Provider names and provider identifiers are\n * intentionally absent from this public reporting boundary.\n */\nexport type AdminTokenActivitySourceV1 =\n | \"paid-purchase\"\n | \"subscription\"\n | \"rewarded-activity\"\n | \"gameplay\"\n | \"system-adjustment\"\n | \"unknown\";\n\nexport type AdminTokenActivitySortV1 =\n | \"occurred-at-desc\"\n | \"amount-absolute-desc\";\n\n/**\n * Closed, non-identifying label codes. Presentation layers map these codes to\n * localized text instead of forwarding source metadata into a response.\n */\nexport type AdminTokenSafeLabelV1 =\n | \"token-acquisition\"\n | \"token-spend\"\n | \"token-reversal\"\n | \"token-hold\"\n | \"token-activity-failed\"\n | \"token-system-adjustment\"\n | \"token-activity-unclassified\";\n\nexport type AdminTokenPseudonymAudienceV1 =\n | \"admin-token-activity\"\n | \"mcp-token-activity\";\n\nexport type AdminTokenBalancePseudonymAudienceV1 =\n | \"admin-token-balances\"\n | \"mcp-token-balances\";\n\nexport interface AdminTokenReportingWindowV1 {\n readonly fromInclusive: IsoTimestamp;\n readonly toExclusive: IsoTimestamp;\n}\n\n/**\n * One deliberately narrow reporting row. Aliases are generated by a\n * consuming service using its approved audience-separated pseudonym adapter.\n * `safeLabel` is a closed code that presentation maps to text; it is never\n * copied from ledger metadata.\n */\nexport interface AdminTokenActivityEntryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly occurredAt: IsoTimestamp;\n readonly activityType: AdminTokenActivityTypeV1;\n readonly status: AdminTokenActivityStatusV1;\n readonly source: AdminTokenActivitySourceV1;\n readonly amount: TokenSubunitString;\n readonly safeLabel: AdminTokenSafeLabelV1;\n readonly rowAlias: string;\n readonly subjectAlias: string;\n}\n\nexport interface AdminTokenActivityFilterV1 {\n readonly activityTypes?: readonly AdminTokenActivityTypeV1[];\n readonly statuses?: readonly AdminTokenActivityStatusV1[];\n readonly sources?: readonly AdminTokenActivitySourceV1[];\n readonly subjectAlias?: string;\n}\n\n/**\n * Trusted, server-decoded scope carried inside a signed opaque cursor. A host\n * must authenticate the opaque cursor before constructing this binding.\n */\nexport interface AdminTokenActivityCursorBindingV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly sort: AdminTokenActivitySortV1;\n readonly window: AdminTokenReportingWindowV1;\n readonly filter?: AdminTokenActivityFilterV1;\n readonly audience: AdminTokenPseudonymAudienceV1;\n readonly pseudonymVersion: string;\n}\n\nexport interface AdminTokenActivityPageRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly limit: number;\n readonly cursor?: string;\n /**\n * Required exactly when `cursor` is present. This is produced only after the\n * host authenticates and decodes the opaque cursor.\n */\n readonly cursorBinding?: AdminTokenActivityCursorBindingV1;\n readonly sort: AdminTokenActivitySortV1;\n readonly window: AdminTokenReportingWindowV1;\n readonly filter?: AdminTokenActivityFilterV1;\n /** Fixed by the authenticated host endpoint, never selected by a client. */\n readonly audience: AdminTokenPseudonymAudienceV1;\n /** Fixed by the host's active pseudonym key/version policy. */\n readonly pseudonymVersion: string;\n}\n\nexport interface AdminTokenActivityResultMetadataV1\n extends AdminTokenReportingWindowV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly generatedAt: IsoTimestamp;\n readonly sort: AdminTokenActivitySortV1;\n readonly filter?: AdminTokenActivityFilterV1;\n readonly pageLimit: number;\n readonly audience: AdminTokenPseudonymAudienceV1;\n readonly pseudonymVersion: string;\n /** This literal is a machine-testable non-disclosure assertion. */\n readonly rawIdentifiersIncluded: false;\n}\n\nexport interface AdminTokenActivityPageV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly entries: readonly AdminTokenActivityEntryV1[];\n readonly hasMore: boolean;\n readonly nextCursor?: string;\n readonly metadata: AdminTokenActivityResultMetadataV1;\n}\n\nexport interface AdminTokenAggregateBalancesV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly available: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly rewardProgress: TokenSubunitString;\n}\n\nexport interface AdminTokenAggregateLifetimeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly bought: TokenSubunitString;\n readonly earned: TokenSubunitString;\n readonly allocated: TokenSubunitString;\n readonly reclaimed: TokenSubunitString;\n readonly spent: TokenSubunitString;\n readonly reversed: TokenSubunitString;\n}\n\n/** Point-read global projection. It contains no account or wallet identity. */\nexport interface AdminTokenEconomySummaryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly generatedAt: IsoTimestamp;\n readonly projectionAsOf: IsoTimestamp;\n readonly authoritySequence: string;\n readonly walletCount: number;\n readonly activeWalletCount: number;\n readonly balances: AdminTokenAggregateBalancesV1;\n readonly lifetime: AdminTokenAggregateLifetimeV1;\n readonly rawIdentifiersIncluded: false;\n}\n\nexport type AdminTokenWalletComponentV1 =\n | \"household\"\n | \"personal\"\n | \"gameplay-allocation\";\n\nexport type AdminTokenWalletStatusV1 = \"active\" | \"closed\";\n\nexport type AdminTokenWalletBalanceSortV1 =\n | \"available-desc\"\n | \"updated-at-desc\";\n\nexport interface AdminTokenWalletBalanceEntryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletAlias: string;\n readonly subjectAlias: string;\n readonly component: AdminTokenWalletComponentV1;\n readonly status: AdminTokenWalletStatusV1;\n readonly available: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly rewardProgress: TokenSubunitString;\n readonly updatedAt: IsoTimestamp;\n readonly authoritySequence: string;\n}\n\nexport interface AdminTokenWalletBalanceFilterV1 {\n readonly components?: readonly AdminTokenWalletComponentV1[];\n readonly statuses?: readonly AdminTokenWalletStatusV1[];\n readonly subjectAlias?: string;\n}\n\nexport interface AdminTokenWalletBalanceCursorBindingV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly sort: AdminTokenWalletBalanceSortV1;\n readonly filter?: AdminTokenWalletBalanceFilterV1;\n readonly audience: AdminTokenBalancePseudonymAudienceV1;\n readonly pseudonymVersion: string;\n}\n\nexport interface AdminTokenWalletBalancePageRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly limit: number;\n readonly cursor?: string;\n /** Trusted binding produced only after the host verifies the opaque cursor. */\n readonly cursorBinding?: AdminTokenWalletBalanceCursorBindingV1;\n readonly sort: AdminTokenWalletBalanceSortV1;\n readonly filter?: AdminTokenWalletBalanceFilterV1;\n readonly audience: AdminTokenBalancePseudonymAudienceV1;\n readonly pseudonymVersion: string;\n}\n\nexport interface AdminTokenWalletBalanceResultMetadataV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly generatedAt: IsoTimestamp;\n readonly sort: AdminTokenWalletBalanceSortV1;\n readonly filter?: AdminTokenWalletBalanceFilterV1;\n readonly pageLimit: number;\n readonly audience: AdminTokenBalancePseudonymAudienceV1;\n readonly pseudonymVersion: string;\n readonly rawIdentifiersIncluded: false;\n}\n\nexport interface AdminTokenWalletBalancePageV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly entries: readonly AdminTokenWalletBalanceEntryV1[];\n readonly hasMore: boolean;\n readonly nextCursor?: string;\n readonly metadata: AdminTokenWalletBalanceResultMetadataV1;\n}\n\nexport type AdminTokenTrendGranularityV1 = \"hour\" | \"day\";\n\nexport interface AdminTokenTrendRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly window: AdminTokenReportingWindowV1;\n readonly granularity: AdminTokenTrendGranularityV1;\n readonly activityTypes?: readonly AdminTokenActivityTypeV1[];\n}\n\nexport interface SuppressedAdminTokenTrendAggregateV1 {\n readonly visibility: \"suppressed\";\n readonly reason: \"cohort-below-minimum\";\n readonly threshold: typeof ADMIN_TOKEN_MINIMUM_COHORT_SIZE;\n}\n\nexport interface ReportedAdminTokenTrendAggregateV1 {\n readonly visibility: \"reported\";\n readonly distinctSubjects: number;\n readonly activityCount: number;\n readonly signedAmount: TokenSubunitString;\n}\n\nexport type AdminTokenTrendAggregateV1 =\n | SuppressedAdminTokenTrendAggregateV1\n | ReportedAdminTokenTrendAggregateV1;\n\nexport type AdminTokenAnomalyStatusV1 = \"normal\" | \"irregular-spike\";\n\nexport type AdminTokenAnomalyExplanationCodeV1 =\n | \"below-absolute-minimum\"\n | \"within-baseline-variation\"\n | \"zero-mad-absolute-threshold-exceeded\"\n | \"median-mad-and-absolute-threshold-exceeded\";\n\nexport interface AdminTokenExactStatisticV1 {\n /** Canonical signed integer numerator. */\n readonly numerator: string;\n /** Reduced exact denominator; half-subunits cover both median operations. */\n readonly denominator: 1 | 2;\n}\n\nexport interface AdminTokenAnomalyIndicatorV1 {\n readonly method: \"same-window-median-mad-v1\";\n readonly status: AdminTokenAnomalyStatusV1;\n readonly baselineWindowCount: typeof ADMIN_TOKEN_ANOMALY_BASELINE_DAYS;\n readonly medianAmount: AdminTokenExactStatisticV1;\n readonly medianAbsoluteDeviation: AdminTokenExactStatisticV1;\n readonly minimumAbsoluteDelta: TokenSubunitString;\n readonly deviationFromMedian: AdminTokenExactStatisticV1;\n readonly madMultiplierMilli: number;\n readonly explanationCode: AdminTokenAnomalyExplanationCodeV1;\n}\n\nexport type AdminTokenAnomalyUnavailableReasonV1 =\n | \"insufficient-history\"\n | \"privacy-suppressed-baseline\";\n\nexport interface AdminTokenAnomalyUnavailableV1 {\n readonly method: \"same-window-median-mad-v1\";\n readonly status: \"unavailable\";\n readonly reason: AdminTokenAnomalyUnavailableReasonV1;\n readonly eligibleBaselineWindowCount: number;\n readonly requiredBaselineWindowCount:\n typeof ADMIN_TOKEN_ANOMALY_BASELINE_DAYS;\n}\n\nexport type AdminTokenAnomalyV1 =\n | AdminTokenAnomalyIndicatorV1\n | AdminTokenAnomalyUnavailableV1;\n\nexport interface AdminTokenAnomalyBaselineSampleV1 {\n readonly amount: TokenSubunitString;\n readonly distinctSubjects: number;\n}\n\nexport interface CreateAdminTokenAnomalyIndicatorInputV1 {\n readonly observedAmount: TokenSubunitString;\n /** Exactly 28 preceding, non-suppressed values for the same time window. */\n readonly baselineSamples: readonly AdminTokenAnomalyBaselineSampleV1[];\n readonly minimumAbsoluteDelta: TokenSubunitString;\n /** Fixed-point multiplier where 1,000 represents one MAD. */\n readonly madMultiplierMilli: number;\n}\n\nexport interface CreateAdminTokenAnomalyUnavailableInputV1 {\n readonly reason: AdminTokenAnomalyUnavailableReasonV1;\n readonly eligibleBaselineWindowCount: number;\n}\n\ninterface AdminTokenTrendPointBaseV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly bucketStart: IsoTimestamp;\n readonly bucketEnd: IsoTimestamp;\n readonly activityType: AdminTokenActivityTypeV1;\n}\n\nexport interface SuppressedAdminTokenTrendPointV1\n extends AdminTokenTrendPointBaseV1 {\n readonly aggregate: SuppressedAdminTokenTrendAggregateV1;\n readonly anomaly?: never;\n}\n\nexport interface ReportedAdminTokenTrendPointV1\n extends AdminTokenTrendPointBaseV1 {\n readonly aggregate: ReportedAdminTokenTrendAggregateV1;\n readonly anomaly: AdminTokenAnomalyV1;\n}\n\nexport type AdminTokenTrendPointV1 =\n | SuppressedAdminTokenTrendPointV1\n | ReportedAdminTokenTrendPointV1;\n\nexport interface AdminTokenTrendResultMetadataV1\n extends AdminTokenReportingWindowV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly generatedAt: IsoTimestamp;\n readonly granularity: AdminTokenTrendGranularityV1;\n /** Explicit server-normalized activity types represented by this result. */\n readonly activityTypes: readonly AdminTokenActivityTypeV1[];\n readonly minimumCohortSize: typeof ADMIN_TOKEN_MINIMUM_COHORT_SIZE;\n readonly anomalyBaselineDays: typeof ADMIN_TOKEN_ANOMALY_BASELINE_DAYS;\n /** This literal is a machine-testable non-disclosure assertion. */\n readonly rawIdentifiersIncluded: false;\n}\n\nexport interface AdminTokenTrendResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly series: readonly AdminTokenTrendPointV1[];\n readonly metadata: AdminTokenTrendResultMetadataV1;\n}\n\n/**\n * Provider-neutral read boundary. Authentication, authorization, HMAC aliases,\n * query timeouts, rate limits, and database access remain host responsibilities.\n */\nexport interface AdminEconomyReportingQueryPortV1 {\n getAdminTokenEconomySummary(): Promise<AdminTokenEconomySummaryV1>;\n listAdminTokenWalletBalances(\n request: AdminTokenWalletBalancePageRequestV1,\n ): Promise<AdminTokenWalletBalancePageV1>;\n listAdminTokenActivity(\n request: AdminTokenActivityPageRequestV1,\n ): Promise<AdminTokenActivityPageV1>;\n getAdminTokenTrends(\n request: AdminTokenTrendRequestV1,\n ): Promise<AdminTokenTrendResultV1>;\n}\n\nconst ACTIVITY_TYPES = new Set<AdminTokenActivityTypeV1>([\n \"acquisition\",\n \"spend\",\n \"reversal\",\n \"hold\",\n \"failure\",\n]);\nconst ACTIVITY_STATUSES = new Set<AdminTokenActivityStatusV1>([\n \"pending\",\n \"held\",\n \"settled\",\n \"reversed\",\n \"failed\",\n]);\nconst ACTIVITY_SOURCES = new Set<AdminTokenActivitySourceV1>([\n \"paid-purchase\",\n \"subscription\",\n \"rewarded-activity\",\n \"gameplay\",\n \"system-adjustment\",\n \"unknown\",\n]);\nconst SAFE_LABELS = new Set<AdminTokenSafeLabelV1>([\n \"token-acquisition\",\n \"token-spend\",\n \"token-reversal\",\n \"token-hold\",\n \"token-activity-failed\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n]);\nconst SAFE_LABELS_BY_ACTIVITY_TYPE: Readonly<\n Record<AdminTokenActivityTypeV1, ReadonlySet<AdminTokenSafeLabelV1>>\n> = {\n acquisition: new Set([\n \"token-acquisition\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n ]),\n spend: new Set([\n \"token-spend\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n ]),\n reversal: new Set([\n \"token-reversal\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n ]),\n hold: new Set([\n \"token-hold\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n ]),\n failure: new Set([\n \"token-activity-failed\",\n \"token-activity-unclassified\",\n ]),\n};\nconst ACTIVITY_SORTS = new Set<AdminTokenActivitySortV1>([\n \"occurred-at-desc\",\n \"amount-absolute-desc\",\n]);\nconst PSEUDONYM_AUDIENCES = new Set<AdminTokenPseudonymAudienceV1>([\n \"admin-token-activity\",\n \"mcp-token-activity\",\n]);\nconst BALANCE_PSEUDONYM_AUDIENCES =\n new Set<AdminTokenBalancePseudonymAudienceV1>([\n \"admin-token-balances\",\n \"mcp-token-balances\",\n ]);\nconst WALLET_COMPONENTS = new Set<AdminTokenWalletComponentV1>([\n \"household\",\n \"personal\",\n \"gameplay-allocation\",\n]);\nconst WALLET_STATUSES = new Set<AdminTokenWalletStatusV1>([\n \"active\",\n \"closed\",\n]);\nconst WALLET_BALANCE_SORTS = new Set<AdminTokenWalletBalanceSortV1>([\n \"available-desc\",\n \"updated-at-desc\",\n]);\nconst TREND_GRANULARITIES = new Set<AdminTokenTrendGranularityV1>([\n \"hour\",\n \"day\",\n]);\nconst ALIAS = /^[A-Za-z0-9_-]{16,96}$/u;\nconst OPAQUE_CURSOR = /^c1\\.[A-Za-z0-9_-]{32,480}$/u;\nconst PSEUDONYM_VERSION = /^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/u;\nconst EXACT_STATISTIC_INTEGER = /^(?:0|-?[1-9][0-9]*)$/u;\nconst POSITIVE_UNSIGNED_INTEGER = /^[1-9][0-9]*$/u;\nconst MAXIMUM_STATISTIC_HALF_SUBUNITS =\n (TOKEN_SUBUNITS_MAX - TOKEN_SUBUNITS_MIN) * 2n;\nconst ANOMALY_UNAVAILABLE_REASONS =\n new Set<AdminTokenAnomalyUnavailableReasonV1>([\n \"insufficient-history\",\n \"privacy-suppressed-baseline\",\n ]);\n\nfunction assertPlainObject(\n value: unknown,\n label: string,\n): asserts value is Readonly<Record<PropertyKey, unknown>> {\n economyAssert(\n typeof value === \"object\" && value !== null && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n const prototype = Object.getPrototypeOf(value);\n economyAssert(\n (prototype === Object.prototype || prototype === null)\n && !Reflect.has(value, \"toJSON\"),\n \"INVALID_CONTRACT\",\n `${label} must be a plain data object without serialization hooks`,\n );\n}\n\nfunction assertExactKeys(\n value: unknown,\n allowedKeys: readonly string[],\n label: string,\n): void {\n assertPlainObject(value, label);\n const allowed = new Set(allowedKeys);\n const keys = Reflect.ownKeys(value);\n economyAssert(\n allowedKeys.every(\n (key) => !Reflect.has(value, key) || Object.hasOwn(value, key),\n ) && keys.every((key) => {\n if (typeof key !== \"string\" || !allowed.has(key)) {\n return false;\n }\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor !== undefined\n && descriptor.enumerable\n && \"value\" in descriptor;\n }),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported, identifying, or non-data property`,\n );\n}\n\nfunction assertAlias(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && ALIAS.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be an opaque pseudonymous alias`,\n );\n}\n\nfunction assertOpaqueCursor(value: string): void {\n economyAssert(\n typeof value === \"string\" && OPAQUE_CURSOR.test(value),\n \"INVALID_CONTRACT\",\n \"Admin Token cursor must be a bounded confidentiality-protected opaque value\",\n );\n}\n\nfunction assertUniqueValues<T extends string>(\n values: readonly T[],\n allowed: ReadonlySet<T>,\n label: string,\n): void {\n economyAssert(\n Array.isArray(values),\n \"INVALID_CONTRACT\",\n `${label} must be a list`,\n );\n const unique = new Set(values);\n economyAssert(\n values.length > 0\n && values.length === unique.size\n && values.every((value) => allowed.has(value)),\n \"INVALID_CONTRACT\",\n `${label} must contain unique supported values`,\n );\n}\n\nfunction absolute(value: bigint): bigint {\n return value < 0n ? -value : value;\n}\n\nfunction compareTextDescending(left: string, right: string): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}\n\nfunction assertReportingWindow(\n window: AdminTokenReportingWindowV1,\n maximumDays = ADMIN_TOKEN_MAXIMUM_WINDOW_DAYS,\n): { readonly from: number; readonly to: number } {\n assertExactKeys(\n window,\n [\"fromInclusive\", \"toExclusive\"],\n \"Admin Token reporting window\",\n );\n const from = parseIsoTimestamp(window.fromInclusive);\n const to = parseIsoTimestamp(window.toExclusive);\n economyAssert(\n from < to && to - from <= maximumDays * DAY_MILLISECONDS,\n \"INVALID_TIME_WINDOW\",\n `Admin Token reporting window must be positive and no longer than ${maximumDays} days`,\n );\n return { from, to };\n}\n\n/** Constructs the deterministic 30-day interactive default ending at `asOf`. */\nexport function createDefaultAdminTokenReportingWindow(\n asOf: IsoTimestamp,\n): AdminTokenReportingWindowV1 {\n const to = parseIsoTimestamp(asOf);\n return {\n fromInclusive: new Date(\n to - ADMIN_TOKEN_DEFAULT_WINDOW_DAYS * DAY_MILLISECONDS,\n ).toISOString(),\n toExclusive: new Date(to).toISOString(),\n };\n}\n\nfunction assertNonNegativeTokenAmounts(\n amounts: readonly TokenSubunitString[],\n label: string,\n): void {\n economyAssert(\n amounts.every((amount) => parseTokenSubunits(amount) >= 0n),\n \"INVALID_AMOUNT\",\n `${label} cannot contain a negative amount`,\n );\n}\n\nfunction assertPositiveAuthoritySequence(\n sequence: string,\n label: string,\n): void {\n economyAssert(\n typeof sequence === \"string\"\n && POSITIVE_UNSIGNED_INTEGER.test(sequence),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical positive integer`,\n );\n}\n\n/** Validates a point-read global economy projection with exact totals. */\nexport function assertAdminTokenEconomySummary(\n summary: AdminTokenEconomySummaryV1,\n): void {\n assertExactKeys(\n summary,\n [\n \"schemaVersion\",\n \"generatedAt\",\n \"projectionAsOf\",\n \"authoritySequence\",\n \"walletCount\",\n \"activeWalletCount\",\n \"balances\",\n \"lifetime\",\n \"rawIdentifiersIncluded\",\n ],\n \"Admin Token economy summary\",\n );\n assertExactKeys(\n summary.balances,\n [\"schemaVersion\", \"available\", \"reserved\", \"held\", \"rewardProgress\"],\n \"Admin Token aggregate balances\",\n );\n assertExactKeys(\n summary.lifetime,\n [\n \"schemaVersion\",\n \"bought\",\n \"earned\",\n \"allocated\",\n \"reclaimed\",\n \"spent\",\n \"reversed\",\n ],\n \"Admin Token aggregate lifetime\",\n );\n economyAssert(\n summary.schemaVersion === ECONOMY_CONTRACT_VERSION\n && summary.balances.schemaVersion === ECONOMY_CONTRACT_VERSION\n && summary.lifetime.schemaVersion === ECONOMY_CONTRACT_VERSION\n && summary.rawIdentifiersIncluded === false\n && Number.isSafeInteger(summary.walletCount)\n && summary.walletCount >= 0\n && Number.isSafeInteger(summary.activeWalletCount)\n && summary.activeWalletCount >= 0\n && summary.activeWalletCount <= summary.walletCount,\n \"INVALID_CONTRACT\",\n \"Admin Token economy summary metadata is invalid\",\n );\n const generatedAt = parseIsoTimestamp(summary.generatedAt);\n const projectionAsOf = parseIsoTimestamp(summary.projectionAsOf);\n economyAssert(\n projectionAsOf <= generatedAt,\n \"INVALID_TIME_WINDOW\",\n \"Admin Token projection cannot be newer than its generated result\",\n );\n assertPositiveAuthoritySequence(\n summary.authoritySequence,\n \"Admin Token summary authority sequence\",\n );\n assertNonNegativeTokenAmounts(\n [\n summary.balances.available,\n summary.balances.reserved,\n summary.balances.held,\n summary.balances.rewardProgress,\n summary.lifetime.bought,\n summary.lifetime.earned,\n summary.lifetime.allocated,\n summary.lifetime.reclaimed,\n summary.lifetime.spent,\n summary.lifetime.reversed,\n ],\n \"Admin Token economy summary\",\n );\n}\n\nfunction assertAdminTokenWalletBalanceFilter(\n filter: AdminTokenWalletBalanceFilterV1,\n): void {\n assertExactKeys(\n filter,\n [\"components\", \"statuses\", \"subjectAlias\"],\n \"Admin Token wallet balance filter\",\n );\n if (filter.components !== undefined) {\n assertUniqueValues(\n filter.components,\n WALLET_COMPONENTS,\n \"Admin Token wallet components\",\n );\n }\n if (filter.statuses !== undefined) {\n assertUniqueValues(\n filter.statuses,\n WALLET_STATUSES,\n \"Admin Token wallet statuses\",\n );\n }\n if (filter.subjectAlias !== undefined) {\n assertAlias(filter.subjectAlias, \"Wallet subject alias filter\");\n }\n}\n\nfunction sameWalletBalanceFilter(\n left: AdminTokenWalletBalanceFilterV1 | undefined,\n right: AdminTokenWalletBalanceFilterV1 | undefined,\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right;\n }\n return sameOptionalValues(left.components, right.components)\n && sameOptionalValues(left.statuses, right.statuses)\n && left.subjectAlias === right.subjectAlias;\n}\n\nexport function assertAdminTokenWalletBalanceCursorBinding(\n binding: AdminTokenWalletBalanceCursorBindingV1,\n): void {\n assertExactKeys(\n binding,\n [\n \"schemaVersion\",\n \"sort\",\n \"filter\",\n \"audience\",\n \"pseudonymVersion\",\n ],\n \"Admin Token wallet balance cursor binding\",\n );\n economyAssert(\n binding.schemaVersion === ECONOMY_CONTRACT_VERSION\n && WALLET_BALANCE_SORTS.has(binding.sort)\n && BALANCE_PSEUDONYM_AUDIENCES.has(binding.audience)\n && PSEUDONYM_VERSION.test(binding.pseudonymVersion),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token wallet balance cursor binding\",\n );\n if (binding.filter !== undefined) {\n assertAdminTokenWalletBalanceFilter(binding.filter);\n }\n}\n\nexport function assertAdminTokenWalletBalancePageRequest(\n request: AdminTokenWalletBalancePageRequestV1,\n): void {\n assertExactKeys(\n request,\n [\n \"schemaVersion\",\n \"limit\",\n \"cursor\",\n \"cursorBinding\",\n \"sort\",\n \"filter\",\n \"audience\",\n \"pseudonymVersion\",\n ],\n \"Admin Token wallet balance request\",\n );\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION\n && Number.isSafeInteger(request.limit)\n && request.limit >= 1\n && request.limit <= ADMIN_TOKEN_MAXIMUM_PAGE_SIZE\n && WALLET_BALANCE_SORTS.has(request.sort)\n && BALANCE_PSEUDONYM_AUDIENCES.has(request.audience)\n && PSEUDONYM_VERSION.test(request.pseudonymVersion),\n \"INVALID_CONTRACT\",\n \"Unsupported or unbounded Admin Token wallet balance request\",\n );\n if (request.filter !== undefined) {\n assertAdminTokenWalletBalanceFilter(request.filter);\n }\n economyAssert(\n (request.cursor === undefined) === (request.cursorBinding === undefined),\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance cursor and binding must be provided together\",\n );\n if (request.cursor === undefined || request.cursorBinding === undefined) {\n return;\n }\n assertOpaqueCursor(request.cursor);\n assertAdminTokenWalletBalanceCursorBinding(request.cursorBinding);\n economyAssert(\n request.cursorBinding.sort === request.sort\n && request.cursorBinding.audience === request.audience\n && request.cursorBinding.pseudonymVersion === request.pseudonymVersion\n && sameWalletBalanceFilter(request.cursorBinding.filter, request.filter),\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance cursor is not bound to the normalized query\",\n );\n}\n\nfunction assertAdminTokenWalletBalanceEntry(\n entry: AdminTokenWalletBalanceEntryV1,\n): void {\n assertExactKeys(\n entry,\n [\n \"schemaVersion\",\n \"walletAlias\",\n \"subjectAlias\",\n \"component\",\n \"status\",\n \"available\",\n \"reserved\",\n \"held\",\n \"rewardProgress\",\n \"updatedAt\",\n \"authoritySequence\",\n ],\n \"Admin Token wallet balance entry\",\n );\n economyAssert(\n entry.schemaVersion === ECONOMY_CONTRACT_VERSION\n && WALLET_COMPONENTS.has(entry.component)\n && WALLET_STATUSES.has(entry.status),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token wallet balance entry\",\n );\n assertAlias(entry.walletAlias, \"Wallet alias\");\n assertAlias(entry.subjectAlias, \"Wallet subject alias\");\n economyAssert(\n entry.walletAlias !== entry.subjectAlias,\n \"INVALID_CONTRACT\",\n \"Wallet and subject aliases must use separate pseudonym domains\",\n );\n assertNonNegativeTokenAmounts(\n [entry.available, entry.reserved, entry.held, entry.rewardProgress],\n \"Admin Token wallet balance entry\",\n );\n parseIsoTimestamp(entry.updatedAt);\n assertPositiveAuthoritySequence(\n entry.authoritySequence,\n \"Admin Token wallet balance authority sequence\",\n );\n}\n\nfunction compareWalletBalanceEntries(\n left: AdminTokenWalletBalanceEntryV1,\n right: AdminTokenWalletBalanceEntryV1,\n sort: AdminTokenWalletBalanceSortV1,\n): number {\n if (sort === \"available-desc\") {\n const leftAvailable = parseTokenSubunits(left.available);\n const rightAvailable = parseTokenSubunits(right.available);\n if (leftAvailable !== rightAvailable) {\n return leftAvailable > rightAvailable ? -1 : 1;\n }\n }\n const leftUpdatedAt = parseIsoTimestamp(left.updatedAt);\n const rightUpdatedAt = parseIsoTimestamp(right.updatedAt);\n if (leftUpdatedAt !== rightUpdatedAt) {\n return leftUpdatedAt > rightUpdatedAt ? -1 : 1;\n }\n return compareTextDescending(left.walletAlias, right.walletAlias);\n}\n\nexport function assertAdminTokenWalletBalancePage(\n page: AdminTokenWalletBalancePageV1,\n): void {\n assertExactKeys(\n page,\n [\"schemaVersion\", \"entries\", \"hasMore\", \"nextCursor\", \"metadata\"],\n \"Admin Token wallet balance page\",\n );\n assertExactKeys(\n page.metadata,\n [\n \"schemaVersion\",\n \"generatedAt\",\n \"sort\",\n \"filter\",\n \"pageLimit\",\n \"audience\",\n \"pseudonymVersion\",\n \"rawIdentifiersIncluded\",\n ],\n \"Admin Token wallet balance metadata\",\n );\n economyAssert(\n page.schemaVersion === ECONOMY_CONTRACT_VERSION\n && page.metadata.schemaVersion === ECONOMY_CONTRACT_VERSION\n && typeof page.hasMore === \"boolean\"\n && page.metadata.rawIdentifiersIncluded === false\n && WALLET_BALANCE_SORTS.has(page.metadata.sort)\n && BALANCE_PSEUDONYM_AUDIENCES.has(page.metadata.audience)\n && PSEUDONYM_VERSION.test(page.metadata.pseudonymVersion)\n && Number.isSafeInteger(page.metadata.pageLimit)\n && page.metadata.pageLimit >= 1\n && page.metadata.pageLimit <= ADMIN_TOKEN_MAXIMUM_PAGE_SIZE\n && Array.isArray(page.entries)\n && page.entries.length <= page.metadata.pageLimit\n && page.hasMore === (page.nextCursor !== undefined)\n && (!page.hasMore || page.entries.length > 0),\n \"INVALID_CONTRACT\",\n \"Unsupported or unbounded Admin Token wallet balance page\",\n );\n if (page.metadata.filter !== undefined) {\n assertAdminTokenWalletBalanceFilter(page.metadata.filter);\n }\n parseIsoTimestamp(page.metadata.generatedAt);\n if (page.nextCursor !== undefined) {\n assertOpaqueCursor(page.nextCursor);\n }\n\n const walletAliases = new Set<string>();\n let previous: AdminTokenWalletBalanceEntryV1 | undefined;\n for (const entry of page.entries) {\n assertAdminTokenWalletBalanceEntry(entry);\n const filter = page.metadata.filter;\n economyAssert(\n filter === undefined\n || ((filter.components === undefined\n || filter.components.includes(entry.component))\n && (filter.statuses === undefined\n || filter.statuses.includes(entry.status))\n && (filter.subjectAlias === undefined\n || filter.subjectAlias === entry.subjectAlias)),\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance result contains an unrequested row\",\n );\n economyAssert(\n !walletAliases.has(entry.walletAlias),\n \"DUPLICATE_IDENTIFIER\",\n \"Admin Token wallet balance page cannot repeat a wallet alias\",\n );\n walletAliases.add(entry.walletAlias);\n if (previous !== undefined) {\n economyAssert(\n compareWalletBalanceEntries(previous, entry, page.metadata.sort) < 0,\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance page does not use its declared stable sort\",\n );\n }\n previous = entry;\n }\n}\n\nexport function assertAdminTokenWalletBalancePageForRequest(\n page: AdminTokenWalletBalancePageV1,\n request: AdminTokenWalletBalancePageRequestV1,\n): void {\n assertAdminTokenWalletBalancePageRequest(request);\n assertAdminTokenWalletBalancePage(page);\n economyAssert(\n page.metadata.sort === request.sort\n && sameWalletBalanceFilter(page.metadata.filter, request.filter)\n && page.metadata.pageLimit === request.limit\n && page.metadata.audience === request.audience\n && page.metadata.pseudonymVersion === request.pseudonymVersion,\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance result does not match its normalized request\",\n );\n}\n\n/** Validates one narrow row and rejects all undeclared identifier properties. */\nexport function assertAdminTokenActivityEntry(\n entry: AdminTokenActivityEntryV1,\n): void {\n assertExactKeys(\n entry,\n [\n \"schemaVersion\",\n \"occurredAt\",\n \"activityType\",\n \"status\",\n \"source\",\n \"amount\",\n \"safeLabel\",\n \"rowAlias\",\n \"subjectAlias\",\n ],\n \"Admin Token activity entry\",\n );\n economyAssert(\n entry.schemaVersion === ECONOMY_CONTRACT_VERSION\n && ACTIVITY_TYPES.has(entry.activityType)\n && ACTIVITY_STATUSES.has(entry.status)\n && ACTIVITY_SOURCES.has(entry.source),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token activity contract\",\n );\n parseIsoTimestamp(entry.occurredAt);\n const amount = parseTokenSubunits(entry.amount);\n economyAssert(\n (amount !== 0n || entry.activityType === \"failure\")\n && (entry.activityType !== \"acquisition\" || amount > 0n)\n && (entry.activityType !== \"spend\" || amount < 0n),\n \"INVALID_AMOUNT\",\n \"Admin Token activity amount has an invalid sign or zero value\",\n );\n economyAssert(\n (entry.activityType === \"failure\") === (entry.status === \"failed\"),\n \"INVALID_CONTRACT\",\n \"Failed rows must use the failure activity type\",\n );\n economyAssert(\n SAFE_LABELS.has(entry.safeLabel)\n && SAFE_LABELS_BY_ACTIVITY_TYPE[entry.activityType]?.has(entry.safeLabel)\n === true,\n \"INVALID_CONTRACT\",\n \"Admin Token activity label must use the approved non-identifying allowlist\",\n );\n assertAlias(entry.rowAlias, \"Row alias\");\n assertAlias(entry.subjectAlias, \"Subject alias\");\n economyAssert(\n entry.rowAlias !== entry.subjectAlias,\n \"INVALID_CONTRACT\",\n \"Row and subject aliases must use separate pseudonym domains\",\n );\n}\n\n/** Validates a bounded, normalized Admin activity query. */\nfunction assertAdminTokenActivityFilter(\n filter: AdminTokenActivityFilterV1,\n): void {\n assertExactKeys(\n filter,\n [\n \"activityTypes\",\n \"statuses\",\n \"sources\",\n \"subjectAlias\",\n ],\n \"Admin Token activity filter\",\n );\n if (filter.activityTypes !== undefined) {\n assertUniqueValues(\n filter.activityTypes,\n ACTIVITY_TYPES,\n \"Admin Token activity types\",\n );\n }\n if (filter.statuses !== undefined) {\n assertUniqueValues(\n filter.statuses,\n ACTIVITY_STATUSES,\n \"Admin Token activity statuses\",\n );\n }\n if (filter.sources !== undefined) {\n assertUniqueValues(\n filter.sources,\n ACTIVITY_SOURCES,\n \"Admin Token activity sources\",\n );\n }\n if (filter.subjectAlias !== undefined) {\n assertAlias(filter.subjectAlias, \"Subject alias filter\");\n }\n}\n\nfunction sameOptionalValues<T extends string>(\n left: readonly T[] | undefined,\n right: readonly T[] | undefined,\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right;\n }\n return left.length === right.length\n && left.every((value) => right.includes(value));\n}\n\nfunction sameActivityFilter(\n left: AdminTokenActivityFilterV1 | undefined,\n right: AdminTokenActivityFilterV1 | undefined,\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right;\n }\n return sameOptionalValues(left.activityTypes, right.activityTypes)\n && sameOptionalValues(left.statuses, right.statuses)\n && sameOptionalValues(left.sources, right.sources)\n && left.subjectAlias === right.subjectAlias;\n}\n\n/** Validates the trusted query scope decoded from a signed opaque cursor. */\nexport function assertAdminTokenActivityCursorBinding(\n binding: AdminTokenActivityCursorBindingV1,\n): void {\n assertExactKeys(\n binding,\n [\n \"schemaVersion\",\n \"sort\",\n \"window\",\n \"filter\",\n \"audience\",\n \"pseudonymVersion\",\n ],\n \"Admin Token activity cursor binding\",\n );\n economyAssert(\n binding.schemaVersion === ECONOMY_CONTRACT_VERSION\n && ACTIVITY_SORTS.has(binding.sort)\n && PSEUDONYM_AUDIENCES.has(binding.audience)\n && PSEUDONYM_VERSION.test(binding.pseudonymVersion),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token activity cursor binding\",\n );\n assertReportingWindow(binding.window);\n if (binding.filter !== undefined) {\n assertAdminTokenActivityFilter(binding.filter);\n }\n}\n\n/** Validates a bounded, normalized Admin activity query. */\nexport function assertAdminTokenActivityPageRequest(\n request: AdminTokenActivityPageRequestV1,\n): void {\n assertExactKeys(\n request,\n [\n \"schemaVersion\",\n \"limit\",\n \"cursor\",\n \"cursorBinding\",\n \"sort\",\n \"window\",\n \"filter\",\n \"audience\",\n \"pseudonymVersion\",\n ],\n \"Admin Token activity request\",\n );\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION\n && Number.isSafeInteger(request.limit)\n && request.limit >= 1\n && request.limit <= ADMIN_TOKEN_MAXIMUM_PAGE_SIZE\n && ACTIVITY_SORTS.has(request.sort)\n && PSEUDONYM_AUDIENCES.has(request.audience)\n && PSEUDONYM_VERSION.test(request.pseudonymVersion),\n \"INVALID_CONTRACT\",\n \"Unsupported or unbounded Admin Token activity request\",\n );\n assertReportingWindow(request.window);\n if (request.filter !== undefined) {\n assertAdminTokenActivityFilter(request.filter);\n }\n economyAssert(\n (request.cursor === undefined) === (request.cursorBinding === undefined),\n \"INVALID_CONTRACT\",\n \"Admin Token activity cursor and trusted binding must be provided together\",\n );\n if (request.cursor === undefined || request.cursorBinding === undefined) {\n return;\n }\n assertOpaqueCursor(request.cursor);\n assertAdminTokenActivityCursorBinding(request.cursorBinding);\n economyAssert(\n request.cursorBinding.sort === request.sort\n && request.cursorBinding.window.fromInclusive\n === request.window.fromInclusive\n && request.cursorBinding.window.toExclusive === request.window.toExclusive\n && request.cursorBinding.audience === request.audience\n && request.cursorBinding.pseudonymVersion === request.pseudonymVersion\n && sameActivityFilter(request.cursorBinding.filter, request.filter),\n \"INVALID_CONTRACT\",\n \"Admin Token cursor is not bound to the normalized query\",\n );\n}\n\nfunction compareActivityEntries(\n left: AdminTokenActivityEntryV1,\n right: AdminTokenActivityEntryV1,\n sort: AdminTokenActivitySortV1,\n): number {\n if (sort === \"amount-absolute-desc\") {\n const leftAmount = absolute(parseTokenSubunits(left.amount));\n const rightAmount = absolute(parseTokenSubunits(right.amount));\n if (leftAmount !== rightAmount) {\n return leftAmount > rightAmount ? -1 : 1;\n }\n }\n const leftTime = parseIsoTimestamp(left.occurredAt);\n const rightTime = parseIsoTimestamp(right.occurredAt);\n if (leftTime !== rightTime) {\n return leftTime > rightTime ? -1 : 1;\n }\n return compareTextDescending(left.rowAlias, right.rowAlias);\n}\n\n/** Validates page privacy metadata, bounds, uniqueness, and stable order. */\nexport function assertAdminTokenActivityPage(\n page: AdminTokenActivityPageV1,\n): void {\n assertExactKeys(\n page,\n [\"schemaVersion\", \"entries\", \"hasMore\", \"nextCursor\", \"metadata\"],\n \"Admin Token activity page\",\n );\n assertExactKeys(\n page.metadata,\n [\n \"schemaVersion\",\n \"generatedAt\",\n \"fromInclusive\",\n \"toExclusive\",\n \"sort\",\n \"filter\",\n \"pageLimit\",\n \"audience\",\n \"pseudonymVersion\",\n \"rawIdentifiersIncluded\",\n ],\n \"Admin Token activity metadata\",\n );\n economyAssert(\n page.schemaVersion === ECONOMY_CONTRACT_VERSION\n && page.metadata.schemaVersion === ECONOMY_CONTRACT_VERSION\n && typeof page.hasMore === \"boolean\"\n && page.metadata.rawIdentifiersIncluded === false\n && ACTIVITY_SORTS.has(page.metadata.sort)\n && PSEUDONYM_AUDIENCES.has(page.metadata.audience)\n && PSEUDONYM_VERSION.test(page.metadata.pseudonymVersion)\n && Number.isSafeInteger(page.metadata.pageLimit)\n && page.metadata.pageLimit >= 1\n && page.metadata.pageLimit <= ADMIN_TOKEN_MAXIMUM_PAGE_SIZE,\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token activity result metadata\",\n );\n const window = assertReportingWindow({\n fromInclusive: page.metadata.fromInclusive,\n toExclusive: page.metadata.toExclusive,\n });\n if (page.metadata.filter !== undefined) {\n assertAdminTokenActivityFilter(page.metadata.filter);\n }\n parseIsoTimestamp(page.metadata.generatedAt);\n economyAssert(\n Array.isArray(page.entries)\n && page.entries.length <= page.metadata.pageLimit\n && page.hasMore === (page.nextCursor !== undefined)\n && (!page.hasMore || page.entries.length > 0),\n \"INVALID_CONTRACT\",\n \"Admin Token activity page is unbounded or has inconsistent pagination\",\n );\n if (page.nextCursor !== undefined) {\n assertOpaqueCursor(page.nextCursor);\n }\n\n const rowAliases = new Set<string>();\n let previous: AdminTokenActivityEntryV1 | undefined;\n for (const entry of page.entries) {\n assertAdminTokenActivityEntry(entry);\n const occurredAt = parseIsoTimestamp(entry.occurredAt);\n economyAssert(\n occurredAt >= window.from && occurredAt < window.to,\n \"INVALID_TIME_WINDOW\",\n \"Admin Token activity falls outside the declared result window\",\n );\n const filter = page.metadata.filter;\n economyAssert(\n filter === undefined\n || ((filter.activityTypes === undefined\n || filter.activityTypes.includes(entry.activityType))\n && (filter.statuses === undefined\n || filter.statuses.includes(entry.status))\n && (filter.sources === undefined\n || filter.sources.includes(entry.source))\n && (filter.subjectAlias === undefined\n || filter.subjectAlias === entry.subjectAlias)),\n \"INVALID_CONTRACT\",\n \"Admin Token activity result contains a row outside its metadata filters\",\n );\n economyAssert(\n !rowAliases.has(entry.rowAlias),\n \"DUPLICATE_IDENTIFIER\",\n \"Admin Token activity page cannot repeat a row alias\",\n );\n rowAliases.add(entry.rowAlias);\n if (previous !== undefined) {\n economyAssert(\n compareActivityEntries(previous, entry, page.metadata.sort) < 0,\n \"INVALID_CONTRACT\",\n \"Admin Token activity page does not use its declared stable sort\",\n );\n }\n previous = entry;\n }\n}\n\n/**\n * Proves that a result retained the server-normalized window, sort, audience,\n * pseudonym version, page bound, and filters of its request.\n */\nexport function assertAdminTokenActivityPageForRequest(\n page: AdminTokenActivityPageV1,\n request: AdminTokenActivityPageRequestV1,\n): void {\n assertAdminTokenActivityPageRequest(request);\n assertAdminTokenActivityPage(page);\n economyAssert(\n page.metadata.fromInclusive === request.window.fromInclusive\n && page.metadata.toExclusive === request.window.toExclusive\n && page.metadata.sort === request.sort\n && sameActivityFilter(page.metadata.filter, request.filter)\n && page.metadata.pageLimit === request.limit\n && page.metadata.audience === request.audience\n && page.metadata.pseudonymVersion === request.pseudonymVersion,\n \"INVALID_CONTRACT\",\n \"Admin Token activity result metadata does not match its normalized request\",\n );\n}\n\n/** Validates a bounded trend request before a reporting adapter runs it. */\nexport function assertAdminTokenTrendRequest(\n request: AdminTokenTrendRequestV1,\n): void {\n assertExactKeys(\n request,\n [\"schemaVersion\", \"window\", \"granularity\", \"activityTypes\"],\n \"Admin Token trend request\",\n );\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION\n && TREND_GRANULARITIES.has(request.granularity),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token trend request\",\n );\n assertReportingWindow(\n request.window,\n request.granularity === \"hour\"\n ? ADMIN_TOKEN_MAXIMUM_HOURLY_WINDOW_DAYS\n : ADMIN_TOKEN_MAXIMUM_WINDOW_DAYS,\n );\n if (request.activityTypes !== undefined) {\n assertUniqueValues(\n request.activityTypes,\n ACTIVITY_TYPES,\n \"Admin Token trend activity types\",\n );\n }\n}\n\n/**\n * Returns a conventional median for values already expressed in half\n * TokenSubunits. Inputs produced by this module guarantee an integral result.\n */\nfunction medianHalfSubunits(values: readonly bigint[]): bigint {\n const ordered = [...values].sort((left, right) =>\n left === right ? 0 : left < right ? -1 : 1,\n );\n const lower = ordered[Math.floor((ordered.length - 1) / 2)];\n const upper = ordered[Math.floor(ordered.length / 2)];\n economyAssert(\n lower !== undefined && upper !== undefined,\n \"INVALID_CONTRACT\",\n \"Median requires at least one value\",\n );\n const sum = lower + upper;\n economyAssert(\n sum % 2n === 0n,\n \"INVALID_AMOUNT\",\n \"Median cannot be represented in exact half TokenSubunits\",\n );\n return sum / 2n;\n}\n\nfunction serializeExactStatistic(\n halfSubunits: bigint,\n): AdminTokenExactStatisticV1 {\n economyAssert(\n absolute(halfSubunits) <= MAXIMUM_STATISTIC_HALF_SUBUNITS,\n \"AMOUNT_OUT_OF_RANGE\",\n \"Admin Token statistic exceeds its exact bounded representation\",\n );\n if (halfSubunits % 2n === 0n) {\n return {\n numerator: (halfSubunits / 2n).toString(10),\n denominator: 1,\n };\n }\n return {\n numerator: halfSubunits.toString(10),\n denominator: 2,\n };\n}\n\nfunction parseExactStatistic(\n value: AdminTokenExactStatisticV1,\n label: string,\n): bigint {\n assertExactKeys(value, [\"numerator\", \"denominator\"], label);\n economyAssert(\n typeof value.numerator === \"string\"\n && value.numerator.length <= 22\n && EXACT_STATISTIC_INTEGER.test(value.numerator)\n && (value.denominator === 1 || value.denominator === 2),\n \"INVALID_AMOUNT\",\n `${label} must be an exact bounded rational TokenSubunit value`,\n );\n const numerator = BigInt(value.numerator);\n economyAssert(\n value.denominator === 1 || numerator % 2n !== 0n,\n \"INVALID_AMOUNT\",\n `${label} must use a reduced exact representation`,\n );\n const halfSubunits =\n numerator * BigInt(2 / value.denominator);\n economyAssert(\n absolute(halfSubunits) <= MAXIMUM_STATISTIC_HALF_SUBUNITS,\n \"AMOUNT_OUT_OF_RANGE\",\n `${label} exceeds its exact bounded representation`,\n );\n return halfSubunits;\n}\n\nfunction classifyAnomaly(options: {\n absoluteDeltaHalfSubunits: bigint;\n medianAbsoluteDeviationHalfSubunits: bigint;\n minimumAbsoluteDeltaHalfSubunits: bigint;\n madMultiplierMilli: number;\n}): Pick<\n AdminTokenAnomalyIndicatorV1,\n \"status\" | \"explanationCode\"\n> {\n if (\n options.absoluteDeltaHalfSubunits\n < options.minimumAbsoluteDeltaHalfSubunits\n ) {\n return {\n status: \"normal\",\n explanationCode: \"below-absolute-minimum\",\n };\n }\n if (options.medianAbsoluteDeviationHalfSubunits === 0n) {\n return options.absoluteDeltaHalfSubunits > 0n\n ? {\n status: \"irregular-spike\",\n explanationCode: \"zero-mad-absolute-threshold-exceeded\",\n }\n : {\n status: \"normal\",\n explanationCode: \"within-baseline-variation\",\n };\n }\n const exceedsBaseline =\n options.absoluteDeltaHalfSubunits * 1_000n\n >= options.medianAbsoluteDeviationHalfSubunits\n * BigInt(options.madMultiplierMilli);\n return exceedsBaseline\n ? {\n status: \"irregular-spike\",\n explanationCode: \"median-mad-and-absolute-threshold-exceeded\",\n }\n : {\n status: \"normal\",\n explanationCode: \"within-baseline-variation\",\n };\n}\n\n/**\n * Creates an exact, explainable conventional same-window median/MAD indicator.\n * Exact rational statistics avoid floating-point and preserve half-TokenSubunit\n * results from the two even-sized median operations.\n */\nexport function createAdminTokenAnomalyIndicator(\n input: CreateAdminTokenAnomalyIndicatorInputV1,\n): AdminTokenAnomalyIndicatorV1 {\n assertExactKeys(\n input,\n [\n \"observedAmount\",\n \"baselineSamples\",\n \"minimumAbsoluteDelta\",\n \"madMultiplierMilli\",\n ],\n \"Admin Token anomaly input\",\n );\n economyAssert(\n Array.isArray(input.baselineSamples)\n && input.baselineSamples.length === ADMIN_TOKEN_ANOMALY_BASELINE_DAYS\n && Number.isSafeInteger(input.madMultiplierMilli)\n && input.madMultiplierMilli >= 1\n && input.madMultiplierMilli <= 1_000_000,\n \"INVALID_CONTRACT\",\n \"Admin Token anomaly input requires 28 baselines and a bounded fixed-point multiplier\",\n );\n const observed = parseTokenSubunits(input.observedAmount);\n const baseline = input.baselineSamples.map((sample) => {\n assertExactKeys(\n sample,\n [\"amount\", \"distinctSubjects\"],\n \"Admin Token anomaly baseline sample\",\n );\n economyAssert(\n Number.isSafeInteger(sample.distinctSubjects)\n && sample.distinctSubjects >= ADMIN_TOKEN_MINIMUM_COHORT_SIZE,\n \"INVALID_CONTRACT\",\n \"Admin Token anomaly baselines must exclude privacy-suppressed cohorts\",\n );\n return parseTokenSubunits(sample.amount);\n });\n const minimum = parseTokenSubunits(input.minimumAbsoluteDelta);\n economyAssert(\n minimum > 0n,\n \"INVALID_AMOUNT\",\n \"Admin Token anomaly absolute minimum must be positive\",\n );\n const baselineHalfSubunits = baseline.map((amount) => amount * 2n);\n const medianHalf = medianHalfSubunits(baselineHalfSubunits);\n const medianAbsoluteDeviationHalf = medianHalfSubunits(\n baselineHalfSubunits.map((amount) => absolute(amount - medianHalf)),\n );\n const deviationHalf = observed * 2n - medianHalf;\n const classification = classifyAnomaly({\n absoluteDeltaHalfSubunits: absolute(deviationHalf),\n medianAbsoluteDeviationHalfSubunits:\n medianAbsoluteDeviationHalf,\n minimumAbsoluteDeltaHalfSubunits: minimum * 2n,\n madMultiplierMilli: input.madMultiplierMilli,\n });\n return {\n method: \"same-window-median-mad-v1\",\n ...classification,\n baselineWindowCount: ADMIN_TOKEN_ANOMALY_BASELINE_DAYS,\n medianAmount: serializeExactStatistic(medianHalf),\n medianAbsoluteDeviation:\n serializeExactStatistic(medianAbsoluteDeviationHalf),\n minimumAbsoluteDelta: input.minimumAbsoluteDelta,\n deviationFromMedian: serializeExactStatistic(deviationHalf),\n madMultiplierMilli: input.madMultiplierMilli,\n };\n}\n\n/** Creates a non-identifying explanation when 28 eligible baselines do not exist. */\nexport function createAdminTokenAnomalyUnavailable(\n input: CreateAdminTokenAnomalyUnavailableInputV1,\n): AdminTokenAnomalyUnavailableV1 {\n assertExactKeys(\n input,\n [\"reason\", \"eligibleBaselineWindowCount\"],\n \"Unavailable Admin Token anomaly input\",\n );\n economyAssert(\n ANOMALY_UNAVAILABLE_REASONS.has(input.reason)\n && Number.isSafeInteger(input.eligibleBaselineWindowCount)\n && input.eligibleBaselineWindowCount >= 0\n && input.eligibleBaselineWindowCount\n < ADMIN_TOKEN_ANOMALY_BASELINE_DAYS,\n \"INVALID_CONTRACT\",\n \"Unavailable Admin Token anomaly requires a bounded reason and eligible baseline count\",\n );\n return {\n method: \"same-window-median-mad-v1\",\n status: \"unavailable\",\n reason: input.reason,\n eligibleBaselineWindowCount: input.eligibleBaselineWindowCount,\n requiredBaselineWindowCount: ADMIN_TOKEN_ANOMALY_BASELINE_DAYS,\n };\n}\n\nfunction assertAdminTokenAnomalyIndicator(\n anomaly: AdminTokenAnomalyIndicatorV1,\n observedAmount: TokenSubunitString,\n): void {\n assertExactKeys(\n anomaly,\n [\n \"method\",\n \"status\",\n \"baselineWindowCount\",\n \"medianAmount\",\n \"medianAbsoluteDeviation\",\n \"minimumAbsoluteDelta\",\n \"deviationFromMedian\",\n \"madMultiplierMilli\",\n \"explanationCode\",\n ],\n \"Admin Token anomaly indicator\",\n );\n const observed = parseTokenSubunits(observedAmount);\n const medianHalf = parseExactStatistic(\n anomaly.medianAmount,\n \"Admin Token anomaly median\",\n );\n const madHalf = parseExactStatistic(\n anomaly.medianAbsoluteDeviation,\n \"Admin Token anomaly median absolute deviation\",\n );\n const minimum = parseTokenSubunits(anomaly.minimumAbsoluteDelta);\n const deviationHalf = parseExactStatistic(\n anomaly.deviationFromMedian,\n \"Admin Token anomaly deviation\",\n );\n economyAssert(\n anomaly.method === \"same-window-median-mad-v1\"\n && anomaly.baselineWindowCount === ADMIN_TOKEN_ANOMALY_BASELINE_DAYS\n && medianHalf >= TOKEN_SUBUNITS_MIN * 2n\n && medianHalf <= TOKEN_SUBUNITS_MAX * 2n\n && madHalf >= 0n\n && minimum > 0n\n && Number.isSafeInteger(anomaly.madMultiplierMilli)\n && anomaly.madMultiplierMilli >= 1\n && anomaly.madMultiplierMilli <= 1_000_000\n && deviationHalf === observed * 2n - medianHalf,\n \"INVALID_CONTRACT\",\n \"Admin Token anomaly arithmetic or method is invalid\",\n );\n const expected = classifyAnomaly({\n absoluteDeltaHalfSubunits: absolute(deviationHalf),\n medianAbsoluteDeviationHalfSubunits: madHalf,\n minimumAbsoluteDeltaHalfSubunits: minimum * 2n,\n madMultiplierMilli: anomaly.madMultiplierMilli,\n });\n economyAssert(\n anomaly.status === expected.status\n && anomaly.explanationCode === expected.explanationCode,\n \"INVALID_CONTRACT\",\n \"Admin Token anomaly classification is inconsistent with its explanation\",\n );\n}\n\nfunction assertAdminTokenAnomalyUnavailable(\n anomaly: AdminTokenAnomalyUnavailableV1,\n): void {\n assertExactKeys(\n anomaly,\n [\n \"method\",\n \"status\",\n \"reason\",\n \"eligibleBaselineWindowCount\",\n \"requiredBaselineWindowCount\",\n ],\n \"Unavailable Admin Token anomaly\",\n );\n economyAssert(\n anomaly.method === \"same-window-median-mad-v1\"\n && anomaly.status === \"unavailable\"\n && ANOMALY_UNAVAILABLE_REASONS.has(anomaly.reason)\n && Number.isSafeInteger(anomaly.eligibleBaselineWindowCount)\n && anomaly.eligibleBaselineWindowCount >= 0\n && anomaly.eligibleBaselineWindowCount\n < ADMIN_TOKEN_ANOMALY_BASELINE_DAYS\n && anomaly.requiredBaselineWindowCount\n === ADMIN_TOKEN_ANOMALY_BASELINE_DAYS,\n \"INVALID_CONTRACT\",\n \"Unavailable Admin Token anomaly metadata is invalid\",\n );\n}\n\nfunction assertTrendBucketAlignment(\n start: number,\n end: number,\n granularity: AdminTokenTrendGranularityV1,\n): void {\n const expectedDuration =\n granularity === \"hour\" ? HOUR_MILLISECONDS : DAY_MILLISECONDS;\n const date = new Date(start);\n const aligned =\n date.getUTCMinutes() === 0\n && date.getUTCSeconds() === 0\n && date.getUTCMilliseconds() === 0\n && (granularity === \"hour\" || date.getUTCHours() === 0);\n economyAssert(\n aligned && end - start === expectedDuration,\n \"INVALID_TIME_WINDOW\",\n \"Admin Token trend bucket is not aligned to its declared granularity\",\n );\n}\n\nfunction assertTrendAggregate(\n aggregate: AdminTokenTrendAggregateV1,\n): void {\n assertPlainObject(aggregate, \"Admin Token trend aggregate\");\n if (aggregate.visibility === \"suppressed\") {\n assertExactKeys(\n aggregate,\n [\"visibility\", \"reason\", \"threshold\"],\n \"Suppressed Admin Token trend aggregate\",\n );\n economyAssert(\n aggregate.reason === \"cohort-below-minimum\"\n && aggregate.threshold === ADMIN_TOKEN_MINIMUM_COHORT_SIZE,\n \"INVALID_CONTRACT\",\n \"Suppressed Admin Token trend aggregate has invalid privacy metadata\",\n );\n return;\n }\n assertExactKeys(\n aggregate,\n [\n \"visibility\",\n \"distinctSubjects\",\n \"activityCount\",\n \"signedAmount\",\n ],\n \"Reported Admin Token trend aggregate\",\n );\n parseTokenSubunits(aggregate.signedAmount);\n economyAssert(\n aggregate.visibility === \"reported\"\n && Number.isSafeInteger(aggregate.distinctSubjects)\n && aggregate.distinctSubjects >= ADMIN_TOKEN_MINIMUM_COHORT_SIZE\n && Number.isSafeInteger(aggregate.activityCount)\n && aggregate.activityCount >= aggregate.distinctSubjects,\n \"INVALID_CONTRACT\",\n \"Reported Admin Token trend aggregate is invalid or below the privacy threshold\",\n );\n}\n\n/** Validates suppression, bucket bounds, exact arithmetic, and anomaly details. */\nexport function assertAdminTokenTrendResult(\n result: AdminTokenTrendResultV1,\n): void {\n assertExactKeys(\n result,\n [\"schemaVersion\", \"series\", \"metadata\"],\n \"Admin Token trend result\",\n );\n assertExactKeys(\n result.metadata,\n [\n \"schemaVersion\",\n \"generatedAt\",\n \"fromInclusive\",\n \"toExclusive\",\n \"granularity\",\n \"activityTypes\",\n \"minimumCohortSize\",\n \"anomalyBaselineDays\",\n \"rawIdentifiersIncluded\",\n ],\n \"Admin Token trend metadata\",\n );\n economyAssert(\n result.schemaVersion === ECONOMY_CONTRACT_VERSION\n && result.metadata.schemaVersion === ECONOMY_CONTRACT_VERSION\n && TREND_GRANULARITIES.has(result.metadata.granularity)\n && result.metadata.minimumCohortSize\n === ADMIN_TOKEN_MINIMUM_COHORT_SIZE\n && result.metadata.anomalyBaselineDays\n === ADMIN_TOKEN_ANOMALY_BASELINE_DAYS\n && result.metadata.rawIdentifiersIncluded === false\n && Array.isArray(result.series)\n && result.series.length <= ADMIN_TOKEN_MAXIMUM_TREND_POINTS,\n \"INVALID_CONTRACT\",\n \"Unsupported or unbounded Admin Token trend result\",\n );\n assertUniqueValues(\n result.metadata.activityTypes,\n ACTIVITY_TYPES,\n \"Admin Token trend result activity types\",\n );\n const window = assertReportingWindow(\n {\n fromInclusive: result.metadata.fromInclusive,\n toExclusive: result.metadata.toExclusive,\n },\n result.metadata.granularity === \"hour\"\n ? ADMIN_TOKEN_MAXIMUM_HOURLY_WINDOW_DAYS\n : ADMIN_TOKEN_MAXIMUM_WINDOW_DAYS,\n );\n parseIsoTimestamp(result.metadata.generatedAt);\n\n const pointKeys = new Set<string>();\n let previousKey: string | undefined;\n for (const point of result.series) {\n assertExactKeys(\n point,\n [\n \"schemaVersion\",\n \"bucketStart\",\n \"bucketEnd\",\n \"activityType\",\n \"aggregate\",\n \"anomaly\",\n ],\n \"Admin Token trend point\",\n );\n economyAssert(\n point.schemaVersion === ECONOMY_CONTRACT_VERSION\n && ACTIVITY_TYPES.has(point.activityType)\n && result.metadata.activityTypes.includes(point.activityType),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token trend point\",\n );\n const start = parseIsoTimestamp(point.bucketStart);\n const end = parseIsoTimestamp(point.bucketEnd);\n economyAssert(\n start >= window.from && end <= window.to,\n \"INVALID_TIME_WINDOW\",\n \"Admin Token trend bucket falls outside the declared result window\",\n );\n assertTrendBucketAlignment(start, end, result.metadata.granularity);\n assertTrendAggregate(point.aggregate);\n if (point.aggregate.visibility === \"suppressed\") {\n economyAssert(\n point.anomaly === undefined,\n \"INVALID_CONTRACT\",\n \"Suppressed Admin Token cohorts cannot include anomaly details\",\n );\n } else {\n economyAssert(\n point.anomaly !== undefined,\n \"INVALID_CONTRACT\",\n \"Reported Admin Token cohorts require an anomaly result\",\n );\n if (point.anomaly.status === \"unavailable\") {\n assertAdminTokenAnomalyUnavailable(point.anomaly);\n } else {\n assertAdminTokenAnomalyIndicator(\n point.anomaly,\n point.aggregate.signedAmount,\n );\n }\n }\n const key = `${point.bucketStart}\\u0000${point.activityType}`;\n economyAssert(\n !pointKeys.has(key) && (previousKey === undefined || previousKey < key),\n \"DUPLICATE_IDENTIFIER\",\n \"Admin Token trend points must be unique and stably ordered\",\n );\n pointKeys.add(key);\n previousKey = key;\n }\n}\n\n/**\n * Proves that a trend result retained the normalized window, granularity, and\n * activity-type selection of its request.\n */\nexport function assertAdminTokenTrendResultForRequest(\n result: AdminTokenTrendResultV1,\n request: AdminTokenTrendRequestV1,\n): void {\n assertAdminTokenTrendRequest(request);\n assertAdminTokenTrendResult(result);\n const requestedActivityTypes =\n request.activityTypes ?? [...ACTIVITY_TYPES];\n economyAssert(\n result.metadata.fromInclusive === request.window.fromInclusive\n && result.metadata.toExclusive === request.window.toExclusive\n && result.metadata.granularity === request.granularity\n && sameOptionalValues(\n result.metadata.activityTypes,\n requestedActivityTypes,\n ),\n \"INVALID_CONTRACT\",\n \"Admin Token trend result metadata does not match its normalized request\",\n );\n}\n","import {\n isWholeTokenAmount,\n parseTokenSubunits,\n serializeTokenSubunits,\n sumTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type AllocationId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { SourceLotSliceV1 } from \"./lots.js\";\n\nexport type AllocationStatus = \"active\" | \"closed\";\nexport type PeriodicLimitWindow = \"daily\" | \"weekly\" | \"monthly\";\n\nexport interface GameplayLimitsV1 {\n readonly perTransaction: TokenSubunitString;\n readonly periodic: TokenSubunitString;\n readonly periodicWindow: PeriodicLimitWindow;\n}\n\n/** Guardian-funded, child-visible reservation. This is not a gameplay ledger. */\nexport interface GameplayAllocationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly allocationId: AllocationId;\n readonly householdId: HouseholdId;\n readonly hostWalletId: WalletId;\n readonly childWalletId: WalletId;\n readonly childAccountId: AccountId;\n readonly status: AllocationStatus;\n readonly reservedAmount: TokenSubunitString;\n readonly remainingAmount: TokenSubunitString;\n readonly reclaimedAmount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly reclaimedSlices: readonly SourceLotSliceV1[];\n readonly limits: GameplayLimitsV1;\n readonly version: number;\n readonly createdAt: IsoTimestamp;\n readonly updatedAt: IsoTimestamp;\n}\n\nfunction assertWholePositive(amount: TokenSubunitString, label: string): bigint {\n const parsed = parseTokenSubunits(amount);\n economyAssert(parsed > 0n, \"INVALID_AMOUNT\", `${label} must be positive`);\n economyAssert(\n isWholeTokenAmount(parsed),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n `${label} must contain whole Tokens`,\n );\n return parsed;\n}\n\nfunction assertSlices(\n slices: readonly SourceLotSliceV1[],\n expectedAmount: bigint,\n label: string,\n): void {\n economyAssert(slices.length > 0, \"INVALID_CONTRACT\", `${label} are required`);\n const lotIds = new Set<string>();\n for (const slice of slices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n economyAssert(\n !lotIds.has(slice.lotId),\n \"DUPLICATE_IDENTIFIER\",\n `${label} must not repeat a lot`,\n );\n lotIds.add(slice.lotId);\n economyAssert(\n parseTokenSubunits(slice.amount) > 0n,\n \"INVALID_AMOUNT\",\n `${label} amounts must be positive`,\n );\n }\n economyAssert(\n sumTokenSubunits(slices.map((slice) => slice.amount)) === expectedAmount,\n \"INVALID_CONTRACT\",\n `${label} must sum to the command amount`,\n );\n}\n\n/** Validates allocation arithmetic and whole-Token reservation policy. */\nexport function assertGameplayAllocation(\n allocation: GameplayAllocationV1,\n): void {\n economyAssert(\n allocation.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported allocation contract version\",\n );\n assertEconomyIdentifier(allocation.allocationId, \"allocationId\");\n assertEconomyIdentifier(allocation.householdId, \"householdId\");\n assertEconomyIdentifier(allocation.hostWalletId, \"hostWalletId\");\n assertEconomyIdentifier(allocation.childWalletId, \"childWalletId\");\n assertEconomyIdentifier(allocation.childAccountId, \"childAccountId\");\n const createdAt = parseIsoTimestamp(allocation.createdAt);\n const updatedAt = parseIsoTimestamp(allocation.updatedAt);\n economyAssert(\n updatedAt >= createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Allocation update time cannot precede its creation time\",\n );\n economyAssert(\n allocation.status === \"active\" || allocation.status === \"closed\",\n \"INVALID_CONTRACT\",\n \"Allocation has an unsupported status\",\n );\n\n const reserved = parseTokenSubunits(allocation.reservedAmount);\n const remaining = parseTokenSubunits(allocation.remainingAmount);\n const reclaimed = parseTokenSubunits(allocation.reclaimedAmount);\n economyAssert(\n reserved > 0n &&\n remaining >= 0n &&\n reclaimed >= 0n &&\n isWholeTokenAmount(reserved) &&\n isWholeTokenAmount(remaining) &&\n isWholeTokenAmount(reclaimed),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Allocation reservations and reclaims must contain whole Tokens\",\n );\n economyAssert(\n remaining + reclaimed <= reserved,\n \"INVALID_CONTRACT\",\n \"Allocation remaining and reclaimed amounts exceed its reservation\",\n );\n\n const fundingByLot = new Map<string, bigint>();\n let funded = 0n;\n for (const slice of allocation.fundingSlices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n const amount = parseTokenSubunits(slice.amount);\n economyAssert(\n amount > 0n,\n \"INVALID_AMOUNT\",\n \"Allocation funding slices must be positive\",\n );\n funded += amount;\n fundingByLot.set(\n slice.lotId,\n (fundingByLot.get(slice.lotId) ?? 0n) + amount,\n );\n }\n economyAssert(\n funded === reserved,\n \"INVALID_CONTRACT\",\n \"Allocation funding provenance must equal its total reservation\",\n );\n\n const reclaimedByLot = new Map<string, bigint>();\n let reclaimedFromSlices = 0n;\n for (const slice of allocation.reclaimedSlices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n const amount = parseTokenSubunits(slice.amount);\n economyAssert(\n amount > 0n,\n \"INVALID_AMOUNT\",\n \"Allocation reclaim slices must be positive\",\n );\n reclaimedFromSlices += amount;\n reclaimedByLot.set(\n slice.lotId,\n (reclaimedByLot.get(slice.lotId) ?? 0n) + amount,\n );\n }\n economyAssert(\n reclaimedFromSlices === reclaimed,\n \"INVALID_CONTRACT\",\n \"Allocation reclaim provenance must equal its reclaimed amount\",\n );\n for (const [lotId, amount] of reclaimedByLot) {\n economyAssert(\n amount <= (fundingByLot.get(lotId) ?? 0n),\n \"SOURCE_LOT_RESTRICTED\",\n \"Reclaimed provenance cannot exceed allocation funding\",\n );\n }\n economyAssert(\n allocation.version >= 1 && Number.isSafeInteger(allocation.version),\n \"INVALID_CONTRACT\",\n \"Allocation version must be a positive safe integer\",\n );\n\n const perTransaction = parseTokenSubunits(allocation.limits.perTransaction);\n const periodic = parseTokenSubunits(allocation.limits.periodic);\n economyAssert(\n [\"daily\", \"weekly\", \"monthly\"].includes(allocation.limits.periodicWindow),\n \"INVALID_CONTRACT\",\n \"Gameplay limit has an unsupported period\",\n );\n economyAssert(\n perTransaction >= 0n &&\n periodic >= 0n &&\n isWholeTokenAmount(perTransaction) &&\n isWholeTokenAmount(periodic),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Gameplay limits must contain whole Tokens\",\n );\n economyAssert(\n perTransaction <= periodic || periodic === 0n,\n \"INVALID_CONTRACT\",\n \"Per-transaction limit cannot exceed an enabled periodic limit\",\n );\n}\n\nexport interface CreateGameplayAllocationInputV1 {\n readonly allocationId: AllocationId;\n readonly householdId: HouseholdId;\n readonly hostWalletId: WalletId;\n readonly childWalletId: WalletId;\n readonly childAccountId: AccountId;\n readonly amount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly limits: GameplayLimitsV1;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Creates a new whole-Token reservation from already-selected source lots. */\nexport function createGameplayAllocation(\n input: CreateGameplayAllocationInputV1,\n): GameplayAllocationV1 {\n const amount = assertWholePositive(input.amount, \"Allocation amount\");\n assertSlices(input.fundingSlices, amount, \"Allocation funding slices\");\n const allocation: GameplayAllocationV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n allocationId: input.allocationId,\n householdId: input.householdId,\n hostWalletId: input.hostWalletId,\n childWalletId: input.childWalletId,\n childAccountId: input.childAccountId,\n status: \"active\",\n reservedAmount: input.amount,\n remainingAmount: input.amount,\n reclaimedAmount: serializeTokenSubunits(0n),\n fundingSlices: input.fundingSlices,\n reclaimedSlices: [],\n limits: input.limits,\n version: 1,\n createdAt: input.occurredAt,\n updatedAt: input.occurredAt,\n };\n assertGameplayAllocation(allocation);\n return allocation;\n}\n\nexport interface BoostGameplayAllocationInputV1 {\n readonly amount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Returns the next immutable allocation state after a whole-Token boost. */\nexport function boostGameplayAllocation(\n allocation: GameplayAllocationV1,\n input: BoostGameplayAllocationInputV1,\n): GameplayAllocationV1 {\n assertGameplayAllocation(allocation);\n economyAssert(\n allocation.status === \"active\" && allocation.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Allocation is closed or its optimistic version is stale\",\n );\n const amount = assertWholePositive(input.amount, \"Boost amount\");\n assertSlices(input.fundingSlices, amount, \"Boost funding slices\");\n\n const next: GameplayAllocationV1 = {\n ...allocation,\n reservedAmount: serializeTokenSubunits(\n parseTokenSubunits(allocation.reservedAmount) + amount,\n ),\n remainingAmount: serializeTokenSubunits(\n parseTokenSubunits(allocation.remainingAmount) + amount,\n ),\n fundingSlices: [...allocation.fundingSlices, ...input.fundingSlices],\n version: allocation.version + 1,\n updatedAt: input.occurredAt,\n };\n assertGameplayAllocation(next);\n return next;\n}\n\nexport interface ReclaimGameplayAllocationInputV1 {\n readonly amount: TokenSubunitString;\n readonly sourceSlices: readonly SourceLotSliceV1[];\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Reclaims unused whole Tokens without changing spent history. */\nexport function reclaimGameplayAllocation(\n allocation: GameplayAllocationV1,\n input: ReclaimGameplayAllocationInputV1,\n): GameplayAllocationV1 {\n assertGameplayAllocation(allocation);\n economyAssert(\n allocation.status === \"active\" && allocation.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Allocation is closed or its optimistic version is stale\",\n );\n const amount = assertWholePositive(input.amount, \"Reclaim amount\");\n economyAssert(\n amount <= parseTokenSubunits(allocation.remainingAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Cannot reclaim more than the unused allocation\",\n );\n assertSlices(input.sourceSlices, amount, \"Reclaim source slices\");\n const fundedLotIds = new Set(\n allocation.fundingSlices.map((slice) => slice.lotId),\n );\n economyAssert(\n input.sourceSlices.every((slice) => fundedLotIds.has(slice.lotId)),\n \"SOURCE_LOT_RESTRICTED\",\n \"Reclaim slices must originate from the allocation\",\n );\n\n const remaining = parseTokenSubunits(allocation.remainingAmount) - amount;\n const next: GameplayAllocationV1 = {\n ...allocation,\n remainingAmount: serializeTokenSubunits(remaining),\n reclaimedAmount: serializeTokenSubunits(\n parseTokenSubunits(allocation.reclaimedAmount) + amount,\n ),\n reclaimedSlices: [...allocation.reclaimedSlices, ...input.sourceSlices],\n status: remaining === 0n ? \"closed\" : allocation.status,\n version: allocation.version + 1,\n updatedAt: input.occurredAt,\n };\n assertGameplayAllocation(next);\n return next;\n}\n","import { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type ProviderEventId,\n type TransactionId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { EconomyCommandType } from \"./ports/persistence.js\";\n\n/** Additive authoritative command types; legacy V1/V2 command unions stay unchanged. */\nexport type EconomyAuditedCommandTypeV1 =\n | EconomyCommandType\n | \"initialize-wallet\";\n\nexport type EconomyCommandSourceV1 =\n | \"browser\"\n | \"shopify\"\n | \"ayet\"\n | \"bitlabs\"\n | \"operator\"\n | \"system\";\n\nexport type EconomyCommandProcessingModeV1 = \"initial\" | \"replay\";\n\nexport type EconomyPrincipalTypeV1 =\n | \"account\"\n | \"delegated-child\"\n | \"service\"\n | \"operator\";\n\nexport type EconomyCausationKindV1 =\n | \"provider-event\"\n | \"economy-command\"\n | \"ledger-transaction\"\n | \"workflow-event\"\n | \"authority-commit\";\n\n/** One privacy-safe edge in an economy audit correlation graph. */\nexport interface EconomyCausationReferenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly kind: EconomyCausationKindV1;\n readonly causationId: string;\n}\n\nexport type EconomyHmacFingerprintDomainV1 =\n | \"economy.idempotency-key.v1\"\n | \"economy.provider-event-key.v1\"\n | \"economy.provider-object-key.v1\"\n | \"economy.provider-payload.v1\"\n | \"economy.provider-reconciliation.v1\";\n\nexport type EconomyHmacSha256DigestV1 = `hmac-sha256:${string}`;\n\n/**\n * A versioned, domain-separated HMAC fingerprint produced by an approved\n * infrastructure adapter. It is a correlation token, not reversible evidence.\n */\nexport interface EconomyHmacFingerprintV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly fingerprintVersion: \"1\";\n readonly algorithm: \"hmac-sha256\";\n readonly domain: EconomyHmacFingerprintDomainV1;\n readonly keyVersion: string;\n readonly digest: EconomyHmacSha256DigestV1;\n}\n\n/**\n * Hashes of sanitized authorization-decision manifests. The manifests must\n * contain no raw tokens, capability payloads, session IDs, or personal data.\n */\nexport interface EconomyAuthorizationEvidenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly capabilityEvidenceHash: string;\n readonly featureFlagEvidenceHash: string;\n readonly assuranceEvidenceHash: string;\n readonly authenticatedAt: IsoTimestamp;\n readonly authorizedAt: IsoTimestamp;\n}\n\n/**\n * Privacy-minimized command facts for the authoritative V3 boundary.\n *\n * This is deliberately standalone rather than extending\n * `EconomyCommandEnvelopeV1`: the published legacy envelope contains a raw\n * caller idempotency key, which must never enter new audit storage.\n */\nexport interface AuditedEconomyCommandEnvelopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandId: string;\n readonly commandType: EconomyAuditedCommandTypeV1;\n readonly commandSource: EconomyCommandSourceV1;\n readonly idempotencyFingerprint: EconomyHmacFingerprintV1;\n readonly actorAccountId: AccountId;\n readonly subjectAccountId: AccountId;\n readonly principalType: EconomyPrincipalTypeV1;\n readonly relationshipId?: string;\n readonly authorizationVersion?: number;\n readonly authorizationEvidence: EconomyAuthorizationEvidenceV1;\n readonly routeId: string;\n readonly buildId: string;\n readonly correlationId: string;\n readonly causation?: EconomyCausationReferenceV1;\n /**\n * SHA-256 of the canonical, already-sanitized semantic command payload.\n * Provider callback bytes use an HMAC fingerprint instead.\n */\n readonly payloadHash: string;\n readonly providerEvidenceManifestHash?: string;\n readonly acceptedAt: IsoTimestamp;\n readonly acceptedRegion: string;\n readonly writerFencingToken: string;\n}\n\nexport type EconomyAcquisitionProviderV1 = \"shopify\" | \"ayet\" | \"bitlabs\";\n\n/**\n * Privacy-minimized verified provider evidence. Every value derived from a raw\n * provider identifier or callback body is represented by a domain-separated\n * HMAC fingerprint. Signatures and payment data have no storage field.\n */\nexport interface EconomyProviderEvidenceHashV1 {\n readonly schemaVersion: EconomyContractVersion;\n /** Opaque internal identifier; never the provider's event identifier. */\n readonly providerEventId: ProviderEventId;\n readonly commandId: string;\n readonly provider: EconomyAcquisitionProviderV1;\n readonly providerObjectKeyFingerprint?: EconomyHmacFingerprintV1;\n readonly providerEventKeyFingerprint: EconomyHmacFingerprintV1;\n readonly eventType: string;\n readonly payloadFingerprint: EconomyHmacFingerprintV1;\n readonly reconciliationEvidenceFingerprint?: EconomyHmacFingerprintV1;\n readonly signatureScheme: string;\n readonly signatureVerifiedAt: IsoTimestamp;\n readonly providerOccurredAt?: IsoTimestamp;\n readonly receivedAt: IsoTimestamp;\n readonly operationalHandleBindingId?: string;\n}\n\nexport type EconomyOperationalHandlePurposeV1 =\n | \"reconciliation\"\n | \"refund\"\n | \"dispute\";\n\n/**\n * Ledger-side binding for a provider handle encrypted and retained by the\n * consuming site. The ciphertext, nonce, authentication tag, and key URI are\n * not package fields; only hashes and non-secret cryptographic metadata bind\n * the external sealed record.\n */\nexport interface EconomyEncryptedOperationalHandleBindingV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly handleBindingId: string;\n readonly commandId: string;\n readonly provider: EconomyAcquisitionProviderV1;\n readonly purpose: EconomyOperationalHandlePurposeV1;\n readonly cipherSuite: \"AES-256-GCM\";\n readonly keyVersion: string;\n readonly ciphertextContentHash: string;\n readonly encryptionContextHash: string;\n readonly createdAt: IsoTimestamp;\n}\n\n/** One canonical content reference inside a sanitized evidence manifest. */\nexport interface EconomyEvidenceRecordReferenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recordId: string;\n readonly contentHash: string;\n}\n\n/**\n * Sanitized manifest bound by an audited provider command. Its referenced\n * records contain HMAC fingerprints, never raw provider material.\n */\nexport interface EconomyProviderEvidenceManifestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly evidenceManifestId: string;\n readonly commandId: string;\n readonly provider: EconomyAcquisitionProviderV1;\n readonly evidenceReferences: readonly EconomyEvidenceRecordReferenceV1[];\n readonly operationalHandleReferences: readonly EconomyEvidenceRecordReferenceV1[];\n readonly createdAt: IsoTimestamp;\n}\n\n/** Privacy-safe acknowledgement returned after durable command acceptance. */\nexport interface EconomyAcceptedCommandReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly receiptId: string;\n readonly commandId: string;\n readonly correlationId: string;\n readonly commandEnvelopeHash: string;\n readonly acceptedAt: IsoTimestamp;\n}\n\nexport type EconomyCommandResultOutcomeV1 =\n | \"completed\"\n | \"failed\"\n | \"no-op\";\n\n/**\n * Immutable terminal receipt. A completed result binds one journal\n * transaction, a failed result binds one safe failure code, and a no-op binds\n * one safe reason proving that no economic transaction was required.\n */\nexport interface EconomyCommandResultReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly receiptId: string;\n readonly commandId: string;\n readonly correlationId: string;\n readonly acceptedReceiptId: string;\n readonly commandEnvelopeHash: string;\n readonly outcome: EconomyCommandResultOutcomeV1;\n readonly resultHash: string;\n readonly transactionId?: TransactionId;\n readonly transactionCanonicalHash?: string;\n readonly failureCode?: string;\n readonly noOpCode?: string;\n readonly recordedAt: IsoTimestamp;\n}\n\n/** Raw-key-free actor/subject namespace used by authoritative V3 replay. */\nexport interface EconomyAuditedIdempotencyScopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly idempotencyFingerprint: EconomyHmacFingerprintV1;\n readonly commandType: EconomyAuditedCommandTypeV1;\n readonly actorAccountId: AccountId;\n readonly subjectAccountId: AccountId;\n readonly principalType: EconomyPrincipalTypeV1;\n readonly relationshipId?: string;\n readonly authorizationVersion?: number;\n}\n\nexport type EconomyAuditedIdempotencyStateV1 =\n | \"accepted\"\n | EconomyCommandResultOutcomeV1;\n\n/**\n * Persisted V3 replay result. The adapter returns this record for an exact\n * canonical scope match; a fingerprint collision with different canonical\n * command bytes is a security conflict, never a replay.\n */\nexport interface EconomyAuditedIdempotencyResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandId: string;\n readonly commandEnvelopeHash: string;\n readonly acceptedReceiptId: string;\n readonly resultReceiptId?: string;\n readonly state: EconomyAuditedIdempotencyStateV1;\n readonly responseHash: string;\n readonly recordedAt: IsoTimestamp;\n}\n\nexport type EconomyCommandProcessingDispositionV1 =\n | {\n readonly mode: \"initial\";\n }\n | {\n readonly mode: \"replay\";\n readonly result: EconomyAuditedIdempotencyResultV1;\n };\n\nconst COMMAND_TYPES = new Set<EconomyAuditedCommandTypeV1>([\n \"credit-purchase\",\n \"credit-subscription\",\n \"credit-reward\",\n \"credit-event\",\n \"credit-competition\",\n \"allocate\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"release-hold\",\n \"refund\",\n \"chargeback\",\n \"reverse\",\n \"adjust\",\n \"initialize-wallet\",\n]);\n\nconst COMMAND_SOURCES = new Set<EconomyCommandSourceV1>([\n \"browser\",\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n \"operator\",\n \"system\",\n]);\n\nconst PRINCIPAL_TYPES = new Set<EconomyPrincipalTypeV1>([\n \"account\",\n \"delegated-child\",\n \"service\",\n \"operator\",\n]);\n\nconst PROVIDER_SOURCES = new Set<EconomyCommandSourceV1>([\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n]);\n\nconst CAUSATION_KINDS = new Set<EconomyCausationKindV1>([\n \"provider-event\",\n \"economy-command\",\n \"ledger-transaction\",\n \"workflow-event\",\n \"authority-commit\",\n]);\n\nconst PROVIDERS = new Set<EconomyAcquisitionProviderV1>([\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n]);\n\nconst FINGERPRINT_DOMAINS = new Set<EconomyHmacFingerprintDomainV1>([\n \"economy.idempotency-key.v1\",\n \"economy.provider-event-key.v1\",\n \"economy.provider-object-key.v1\",\n \"economy.provider-payload.v1\",\n \"economy.provider-reconciliation.v1\",\n]);\n\nconst SOURCE_COMMAND_TYPES: Readonly<\n Record<EconomyCommandSourceV1, ReadonlySet<EconomyAuditedCommandTypeV1>>\n> = {\n browser: new Set([\n \"allocate\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"release-hold\",\n \"initialize-wallet\",\n ]),\n shopify: new Set([\n \"credit-purchase\",\n \"hold\",\n \"release-hold\",\n \"refund\",\n \"chargeback\",\n \"reverse\",\n ]),\n ayet: new Set([\"credit-reward\", \"hold\", \"release-hold\", \"reverse\"]),\n bitlabs: new Set([\"credit-reward\", \"hold\", \"release-hold\", \"reverse\"]),\n operator: new Set([\"adjust\", \"reverse\", \"hold\", \"release-hold\"]),\n system: new Set([\n \"credit-event\",\n \"credit-competition\",\n \"hold\",\n \"release-hold\",\n \"reverse\",\n ]),\n};\n\nconst COMMAND_ENVELOPE_KEYS = new Set([\n \"schemaVersion\",\n \"commandId\",\n \"commandType\",\n \"commandSource\",\n \"idempotencyFingerprint\",\n \"actorAccountId\",\n \"subjectAccountId\",\n \"principalType\",\n \"relationshipId\",\n \"authorizationVersion\",\n \"authorizationEvidence\",\n \"routeId\",\n \"buildId\",\n \"correlationId\",\n \"causation\",\n \"payloadHash\",\n \"providerEvidenceManifestHash\",\n \"acceptedAt\",\n \"acceptedRegion\",\n \"writerFencingToken\",\n]);\n\nfunction assertExactKeys(\n value: object,\n allowedKeys: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowedKeys.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported or raw field`,\n );\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction assertSafeClassifier(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" &&\n /^[A-Za-z][A-Za-z0-9._:-]{0,95}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a bounded safe classifier`,\n );\n}\n\nfunction assertRelationshipContext(\n relationshipId: string | undefined,\n authorizationVersion: number | undefined,\n): void {\n if (relationshipId !== undefined) {\n assertEconomyIdentifier(relationshipId, \"relationshipId\");\n }\n if (authorizationVersion !== undefined) {\n economyAssert(\n Number.isSafeInteger(authorizationVersion) &&\n authorizationVersion >= 1,\n \"INVALID_CONTRACT\",\n \"Authorization version must be a positive safe integer\",\n );\n }\n economyAssert(\n (relationshipId === undefined) ===\n (authorizationVersion === undefined),\n \"INVALID_CONTRACT\",\n \"Relationship identity and authorization version must be supplied together\",\n );\n}\n\n/** Validates a domain-separated HMAC fingerprint and its expected domain. */\nexport function assertEconomyHmacFingerprint(\n fingerprint: EconomyHmacFingerprintV1,\n expectedDomain?: EconomyHmacFingerprintDomainV1,\n): void {\n assertExactKeys(\n fingerprint,\n new Set([\n \"schemaVersion\",\n \"fingerprintVersion\",\n \"algorithm\",\n \"domain\",\n \"keyVersion\",\n \"digest\",\n ]),\n \"Economy HMAC fingerprint\",\n );\n economyAssert(\n fingerprint.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n fingerprint.fingerprintVersion === \"1\" &&\n fingerprint.algorithm === \"hmac-sha256\" &&\n FINGERPRINT_DOMAINS.has(fingerprint.domain) &&\n (expectedDomain === undefined ||\n fingerprint.domain === expectedDomain),\n \"INVALID_CONTRACT\",\n \"Unsupported economy HMAC fingerprint contract or domain\",\n );\n assertEconomyIdentifier(fingerprint.keyVersion, \"fingerprint keyVersion\");\n economyAssert(\n /^hmac-sha256:[a-f0-9]{64}$/u.test(fingerprint.digest),\n \"INVALID_CONTRACT\",\n \"Economy HMAC fingerprint digest must be canonical\",\n );\n}\n\n/** Validates hashes of a sanitized, server-derived authorization decision. */\nexport function assertEconomyAuthorizationEvidence(\n evidence: EconomyAuthorizationEvidenceV1,\n): void {\n assertExactKeys(\n evidence,\n new Set([\n \"schemaVersion\",\n \"capabilityEvidenceHash\",\n \"featureFlagEvidenceHash\",\n \"assuranceEvidenceHash\",\n \"authenticatedAt\",\n \"authorizedAt\",\n ]),\n \"Economy authorization evidence\",\n );\n economyAssert(\n evidence.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported economy authorization-evidence version\",\n );\n assertCanonicalHash(\n evidence.capabilityEvidenceHash,\n \"Capability evidence hash\",\n );\n assertCanonicalHash(\n evidence.featureFlagEvidenceHash,\n \"Feature-flag evidence hash\",\n );\n assertCanonicalHash(\n evidence.assuranceEvidenceHash,\n \"Assurance evidence hash\",\n );\n const authenticatedAt = parseIsoTimestamp(evidence.authenticatedAt);\n economyAssert(\n parseIsoTimestamp(evidence.authorizedAt) >= authenticatedAt,\n \"INVALID_TIME_WINDOW\",\n \"Authorization cannot precede authentication\",\n );\n}\n\nfunction assertCausationReference(\n causation: EconomyCausationReferenceV1,\n): void {\n assertExactKeys(\n causation,\n new Set([\"schemaVersion\", \"kind\", \"causationId\"]),\n \"Economy causation reference\",\n );\n economyAssert(\n causation.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n CAUSATION_KINDS.has(causation.kind),\n \"INVALID_CONTRACT\",\n \"Economy causation reference is unsupported\",\n );\n assertEconomyIdentifier(causation.causationId, \"causationId\");\n}\n\nfunction assertCommandSourcePrincipal(\n envelope: AuditedEconomyCommandEnvelopeV1,\n): void {\n if (envelope.commandSource === \"browser\") {\n economyAssert(\n envelope.principalType === \"account\" ||\n envelope.principalType === \"delegated-child\",\n \"INVALID_CONTRACT\",\n \"Browser economy commands require an account principal\",\n );\n } else if (envelope.commandSource === \"operator\") {\n economyAssert(\n envelope.principalType === \"operator\",\n \"INVALID_CONTRACT\",\n \"Operator commands require an operator principal\",\n );\n } else {\n economyAssert(\n envelope.principalType === \"service\",\n \"INVALID_CONTRACT\",\n \"Provider and system commands require a service principal\",\n );\n }\n\n if (envelope.principalType === \"account\") {\n economyAssert(\n envelope.actorAccountId === envelope.subjectAccountId,\n \"INVALID_CONTRACT\",\n \"Direct account commands require the actor to be the subject\",\n );\n }\n if (envelope.principalType === \"delegated-child\") {\n economyAssert(\n envelope.actorAccountId !== envelope.subjectAccountId &&\n envelope.relationshipId !== undefined,\n \"INVALID_CONTRACT\",\n \"Delegated-child commands require a distinct actor and relationship\",\n );\n }\n if (envelope.commandType === \"initialize-wallet\") {\n economyAssert(\n envelope.commandSource === \"browser\" &&\n envelope.principalType === \"account\" &&\n envelope.actorAccountId === envelope.subjectAccountId &&\n envelope.relationshipId === undefined &&\n envelope.authorizationVersion === undefined,\n \"INVALID_CONTRACT\",\n \"Wallet initialization requires a direct self-account browser command\",\n );\n }\n}\n\n/** Validates a fingerprint-only, server-derived authoritative command. */\nexport function assertAuditedEconomyCommandEnvelope(\n envelope: AuditedEconomyCommandEnvelopeV1,\n): void {\n assertExactKeys(\n envelope,\n COMMAND_ENVELOPE_KEYS,\n \"Audited economy command envelope\",\n );\n economyAssert(\n envelope.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n COMMAND_TYPES.has(envelope.commandType) &&\n COMMAND_SOURCES.has(envelope.commandSource) &&\n PRINCIPAL_TYPES.has(envelope.principalType),\n \"INVALID_CONTRACT\",\n \"Unsupported audited economy command contract\",\n );\n economyAssert(\n SOURCE_COMMAND_TYPES[envelope.commandSource].has(envelope.commandType),\n \"INVALID_CONTRACT\",\n \"Economy command type is incompatible with its original source\",\n );\n assertEconomyIdentifier(envelope.commandId, \"commandId\");\n assertEconomyHmacFingerprint(\n envelope.idempotencyFingerprint,\n \"economy.idempotency-key.v1\",\n );\n assertEconomyIdentifier(envelope.actorAccountId, \"actorAccountId\");\n assertEconomyIdentifier(envelope.subjectAccountId, \"subjectAccountId\");\n assertRelationshipContext(\n envelope.relationshipId,\n envelope.authorizationVersion,\n );\n assertCommandSourcePrincipal(envelope);\n assertEconomyAuthorizationEvidence(envelope.authorizationEvidence);\n assertEconomyIdentifier(envelope.routeId, \"routeId\");\n assertEconomyIdentifier(envelope.buildId, \"buildId\");\n assertEconomyIdentifier(envelope.correlationId, \"correlationId\");\n if (envelope.causation !== undefined) {\n assertCausationReference(envelope.causation);\n economyAssert(\n envelope.causation.kind !== \"economy-command\" ||\n envelope.causation.causationId !== envelope.commandId,\n \"INVALID_CONTRACT\",\n \"An economy command cannot cause itself\",\n );\n }\n assertCanonicalHash(envelope.payloadHash, \"Command payload hash\");\n if (envelope.providerEvidenceManifestHash !== undefined) {\n assertCanonicalHash(\n envelope.providerEvidenceManifestHash,\n \"Provider evidence manifest hash\",\n );\n }\n economyAssert(\n PROVIDER_SOURCES.has(envelope.commandSource)\n ? envelope.providerEvidenceManifestHash !== undefined &&\n envelope.causation?.kind === \"provider-event\"\n : envelope.providerEvidenceManifestHash === undefined,\n \"INVALID_CONTRACT\",\n \"Provider evidence and provider-event causation must match the command source\",\n );\n const authorizedAt = parseIsoTimestamp(\n envelope.authorizationEvidence.authorizedAt,\n );\n economyAssert(\n parseIsoTimestamp(envelope.acceptedAt) >= authorizedAt,\n \"INVALID_TIME_WINDOW\",\n \"Command acceptance cannot precede authorization\",\n );\n assertEconomyIdentifier(envelope.acceptedRegion, \"acceptedRegion\");\n assertEconomyIdentifier(\n envelope.writerFencingToken,\n \"writerFencingToken\",\n );\n}\n\n/** Validates privacy-minimized provider evidence before immutable append. */\nexport function assertEconomyProviderEvidenceHash(\n evidence: EconomyProviderEvidenceHashV1,\n): void {\n assertExactKeys(\n evidence,\n new Set([\n \"schemaVersion\",\n \"providerEventId\",\n \"commandId\",\n \"provider\",\n \"providerObjectKeyFingerprint\",\n \"providerEventKeyFingerprint\",\n \"eventType\",\n \"payloadFingerprint\",\n \"reconciliationEvidenceFingerprint\",\n \"signatureScheme\",\n \"signatureVerifiedAt\",\n \"providerOccurredAt\",\n \"receivedAt\",\n \"operationalHandleBindingId\",\n ]),\n \"Economy provider evidence\",\n );\n economyAssert(\n evidence.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n PROVIDERS.has(evidence.provider),\n \"INVALID_CONTRACT\",\n \"Provider evidence contract or provider is unsupported\",\n );\n assertEconomyIdentifier(evidence.providerEventId, \"providerEventId\");\n assertEconomyIdentifier(evidence.commandId, \"commandId\");\n if (evidence.providerObjectKeyFingerprint !== undefined) {\n assertEconomyHmacFingerprint(\n evidence.providerObjectKeyFingerprint,\n \"economy.provider-object-key.v1\",\n );\n }\n assertEconomyHmacFingerprint(\n evidence.providerEventKeyFingerprint,\n \"economy.provider-event-key.v1\",\n );\n assertEconomyHmacFingerprint(\n evidence.payloadFingerprint,\n \"economy.provider-payload.v1\",\n );\n if (evidence.reconciliationEvidenceFingerprint !== undefined) {\n assertEconomyHmacFingerprint(\n evidence.reconciliationEvidenceFingerprint,\n \"economy.provider-reconciliation.v1\",\n );\n }\n assertSafeClassifier(evidence.eventType, \"Provider event type\");\n assertSafeClassifier(evidence.signatureScheme, \"Provider signature scheme\");\n const signatureVerifiedAt = parseIsoTimestamp(evidence.signatureVerifiedAt);\n const receivedAt = parseIsoTimestamp(evidence.receivedAt);\n if (evidence.providerOccurredAt !== undefined) {\n economyAssert(\n parseIsoTimestamp(evidence.providerOccurredAt) <= receivedAt,\n \"INVALID_TIME_WINDOW\",\n \"Provider occurrence cannot be after evidence receipt\",\n );\n }\n economyAssert(\n receivedAt >= signatureVerifiedAt,\n \"INVALID_TIME_WINDOW\",\n \"Provider evidence cannot be received before signature verification\",\n );\n if (evidence.operationalHandleBindingId !== undefined) {\n assertEconomyIdentifier(\n evidence.operationalHandleBindingId,\n \"operationalHandleBindingId\",\n );\n }\n}\n\n/** Validates a ledger binding for site-owned encrypted provider state. */\nexport function assertEconomyEncryptedOperationalHandleBinding(\n binding: EconomyEncryptedOperationalHandleBindingV1,\n): void {\n assertExactKeys(\n binding,\n new Set([\n \"schemaVersion\",\n \"handleBindingId\",\n \"commandId\",\n \"provider\",\n \"purpose\",\n \"cipherSuite\",\n \"keyVersion\",\n \"ciphertextContentHash\",\n \"encryptionContextHash\",\n \"createdAt\",\n ]),\n \"Encrypted operational-handle binding\",\n );\n economyAssert(\n binding.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n PROVIDERS.has(binding.provider) &&\n [\"reconciliation\", \"refund\", \"dispute\"].includes(binding.purpose) &&\n binding.cipherSuite === \"AES-256-GCM\",\n \"INVALID_CONTRACT\",\n \"Unsupported encrypted operational-handle binding\",\n );\n assertEconomyIdentifier(binding.handleBindingId, \"handleBindingId\");\n assertEconomyIdentifier(binding.commandId, \"commandId\");\n assertEconomyIdentifier(binding.keyVersion, \"keyVersion\");\n assertCanonicalHash(\n binding.ciphertextContentHash,\n \"Ciphertext content hash\",\n );\n assertCanonicalHash(\n binding.encryptionContextHash,\n \"Encryption-context hash\",\n );\n parseIsoTimestamp(binding.createdAt);\n}\n\nfunction assertEvidenceRecordReference(\n reference: EconomyEvidenceRecordReferenceV1,\n): void {\n assertExactKeys(\n reference,\n new Set([\"schemaVersion\", \"recordId\", \"contentHash\"]),\n \"Evidence record reference\",\n );\n economyAssert(\n reference.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported evidence-record reference\",\n );\n assertEconomyIdentifier(reference.recordId, \"evidence recordId\");\n assertCanonicalHash(reference.contentHash, \"Evidence content hash\");\n}\n\nfunction assertUniqueSortedReferences(\n references: readonly EconomyEvidenceRecordReferenceV1[],\n label: string,\n): void {\n economyAssert(\n references.length > 0,\n \"INVALID_CONTRACT\",\n `${label} must not be empty`,\n );\n let previousId: string | undefined;\n for (const reference of references) {\n assertEvidenceRecordReference(reference);\n economyAssert(\n previousId === undefined ||\n compareUnicodeCodeUnits(previousId, reference.recordId) < 0,\n \"INVALID_CONTRACT\",\n `${label} must have unique record IDs in canonical order`,\n );\n previousId = reference.recordId;\n }\n}\n\n/** Validates a canonical sanitized provider-evidence manifest. */\nexport function assertEconomyProviderEvidenceManifest(\n manifest: EconomyProviderEvidenceManifestV1,\n): void {\n assertExactKeys(\n manifest,\n new Set([\n \"schemaVersion\",\n \"evidenceManifestId\",\n \"commandId\",\n \"provider\",\n \"evidenceReferences\",\n \"operationalHandleReferences\",\n \"createdAt\",\n ]),\n \"Provider evidence manifest\",\n );\n economyAssert(\n manifest.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n PROVIDERS.has(manifest.provider),\n \"INVALID_CONTRACT\",\n \"Unsupported provider-evidence manifest\",\n );\n assertEconomyIdentifier(manifest.evidenceManifestId, \"evidenceManifestId\");\n assertEconomyIdentifier(manifest.commandId, \"commandId\");\n economyAssert(\n Array.isArray(manifest.evidenceReferences) &&\n Array.isArray(manifest.operationalHandleReferences),\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest references must be arrays\",\n );\n assertUniqueSortedReferences(\n manifest.evidenceReferences,\n \"Provider evidence references\",\n );\n let previousHandleId: string | undefined;\n for (const reference of manifest.operationalHandleReferences) {\n assertEvidenceRecordReference(reference);\n economyAssert(\n previousHandleId === undefined ||\n compareUnicodeCodeUnits(previousHandleId, reference.recordId) < 0,\n \"INVALID_CONTRACT\",\n \"Operational-handle references must have unique IDs in canonical order\",\n );\n previousHandleId = reference.recordId;\n }\n parseIsoTimestamp(manifest.createdAt);\n}\n\n/** Validates a client-safe durable-acceptance receipt. */\nexport function assertEconomyAcceptedCommandReceipt(\n receipt: EconomyAcceptedCommandReceiptV1,\n): void {\n assertExactKeys(\n receipt,\n new Set([\n \"schemaVersion\",\n \"receiptId\",\n \"commandId\",\n \"correlationId\",\n \"commandEnvelopeHash\",\n \"acceptedAt\",\n ]),\n \"Accepted-command receipt\",\n );\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported accepted-command receipt contract version\",\n );\n assertEconomyIdentifier(receipt.receiptId, \"receiptId\");\n assertEconomyIdentifier(receipt.commandId, \"commandId\");\n assertEconomyIdentifier(receipt.correlationId, \"correlationId\");\n assertCanonicalHash(receipt.commandEnvelopeHash, \"Command envelope hash\");\n parseIsoTimestamp(receipt.acceptedAt);\n}\n\n/** Validates the exclusive completed, failed, and no-op result shapes. */\nexport function assertEconomyCommandResultReceipt(\n receipt: EconomyCommandResultReceiptV1,\n): void {\n assertExactKeys(\n receipt,\n new Set([\n \"schemaVersion\",\n \"receiptId\",\n \"commandId\",\n \"correlationId\",\n \"acceptedReceiptId\",\n \"commandEnvelopeHash\",\n \"outcome\",\n \"resultHash\",\n \"transactionId\",\n \"transactionCanonicalHash\",\n \"failureCode\",\n \"noOpCode\",\n \"recordedAt\",\n ]),\n \"Command-result receipt\",\n );\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n [\"completed\", \"failed\", \"no-op\"].includes(receipt.outcome),\n \"INVALID_CONTRACT\",\n \"Unsupported command-result receipt contract or outcome\",\n );\n assertEconomyIdentifier(receipt.receiptId, \"receiptId\");\n assertEconomyIdentifier(receipt.commandId, \"commandId\");\n assertEconomyIdentifier(receipt.correlationId, \"correlationId\");\n assertEconomyIdentifier(receipt.acceptedReceiptId, \"acceptedReceiptId\");\n assertCanonicalHash(receipt.commandEnvelopeHash, \"Command envelope hash\");\n assertCanonicalHash(receipt.resultHash, \"Command result hash\");\n parseIsoTimestamp(receipt.recordedAt);\n\n if (receipt.outcome === \"completed\") {\n economyAssert(\n receipt.transactionId !== undefined &&\n receipt.transactionCanonicalHash !== undefined &&\n receipt.failureCode === undefined &&\n receipt.noOpCode === undefined,\n \"INVALID_CONTRACT\",\n \"Completed receipts require one transaction and no outcome code\",\n );\n assertEconomyIdentifier(receipt.transactionId, \"transactionId\");\n assertCanonicalHash(\n receipt.transactionCanonicalHash,\n \"Transaction canonical hash\",\n );\n } else if (receipt.outcome === \"failed\") {\n economyAssert(\n receipt.transactionId === undefined &&\n receipt.transactionCanonicalHash === undefined &&\n receipt.noOpCode === undefined &&\n typeof receipt.failureCode === \"string\" &&\n /^[A-Z][A-Z0-9_]{2,95}$/u.test(receipt.failureCode),\n \"INVALID_CONTRACT\",\n \"Failed receipts require only a bounded failure code\",\n );\n } else {\n economyAssert(\n receipt.transactionId === undefined &&\n receipt.transactionCanonicalHash === undefined &&\n receipt.failureCode === undefined &&\n typeof receipt.noOpCode === \"string\" &&\n /^[A-Z][A-Z0-9_]{2,95}$/u.test(receipt.noOpCode),\n \"INVALID_CONTRACT\",\n \"No-op receipts require only a bounded no-op code\",\n );\n }\n}\n\n/** Validates the raw-key-free idempotency namespace used by V3. */\nexport function assertEconomyAuditedIdempotencyScope(\n scope: EconomyAuditedIdempotencyScopeV1,\n): void {\n assertExactKeys(\n scope,\n new Set([\n \"schemaVersion\",\n \"idempotencyFingerprint\",\n \"commandType\",\n \"actorAccountId\",\n \"subjectAccountId\",\n \"principalType\",\n \"relationshipId\",\n \"authorizationVersion\",\n ]),\n \"Audited idempotency scope\",\n );\n economyAssert(\n scope.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n COMMAND_TYPES.has(scope.commandType) &&\n PRINCIPAL_TYPES.has(scope.principalType),\n \"INVALID_CONTRACT\",\n \"Unsupported audited idempotency scope\",\n );\n assertEconomyHmacFingerprint(\n scope.idempotencyFingerprint,\n \"economy.idempotency-key.v1\",\n );\n assertEconomyIdentifier(scope.actorAccountId, \"actorAccountId\");\n assertEconomyIdentifier(scope.subjectAccountId, \"subjectAccountId\");\n assertRelationshipContext(\n scope.relationshipId,\n scope.authorizationVersion,\n );\n}\n\n/** Validates an exact accepted or terminal V3 replay result. */\nexport function assertEconomyAuditedIdempotencyResult(\n result: EconomyAuditedIdempotencyResultV1,\n): void {\n assertExactKeys(\n result,\n new Set([\n \"schemaVersion\",\n \"commandId\",\n \"commandEnvelopeHash\",\n \"acceptedReceiptId\",\n \"resultReceiptId\",\n \"state\",\n \"responseHash\",\n \"recordedAt\",\n ]),\n \"Audited idempotency result\",\n );\n economyAssert(\n result.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n [\"accepted\", \"completed\", \"failed\", \"no-op\"].includes(result.state),\n \"INVALID_CONTRACT\",\n \"Unsupported audited idempotency result\",\n );\n assertEconomyIdentifier(result.commandId, \"commandId\");\n assertCanonicalHash(result.commandEnvelopeHash, \"Command envelope hash\");\n assertEconomyIdentifier(result.acceptedReceiptId, \"acceptedReceiptId\");\n economyAssert(\n (result.state === \"accepted\") ===\n (result.resultReceiptId === undefined),\n \"INVALID_CONTRACT\",\n \"Only terminal idempotency results require a result receipt\",\n );\n if (result.resultReceiptId !== undefined) {\n assertEconomyIdentifier(result.resultReceiptId, \"resultReceiptId\");\n }\n assertCanonicalHash(result.responseHash, \"Idempotency response hash\");\n parseIsoTimestamp(result.recordedAt);\n}\n\nfunction canonicalFingerprint(\n fingerprint: EconomyHmacFingerprintV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: fingerprint.schemaVersion,\n fingerprintVersion: fingerprint.fingerprintVersion,\n algorithm: fingerprint.algorithm,\n domain: fingerprint.domain,\n keyVersion: fingerprint.keyVersion,\n digest: fingerprint.digest,\n };\n}\n\nfunction canonicalAuthorizationEvidence(\n evidence: EconomyAuthorizationEvidenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: evidence.schemaVersion,\n capabilityEvidenceHash: evidence.capabilityEvidenceHash,\n featureFlagEvidenceHash: evidence.featureFlagEvidenceHash,\n assuranceEvidenceHash: evidence.assuranceEvidenceHash,\n authenticatedAt: evidence.authenticatedAt,\n authorizedAt: evidence.authorizedAt,\n };\n}\n\nfunction canonicalCausation(\n causation: EconomyCausationReferenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: causation.schemaVersion,\n kind: causation.kind,\n causationId: causation.causationId,\n };\n}\n\nfunction canonicalEvidenceReference(\n reference: EconomyEvidenceRecordReferenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: reference.schemaVersion,\n recordId: reference.recordId,\n contentHash: reference.contentHash,\n };\n}\n\n/**\n * Produces deterministic UTF-8 JSON for an audited-command hash adapter.\n * The legacy transaction canonical payload remains a separate stable format.\n */\nexport function canonicalAuditedEconomyCommandEnvelopePayload(\n envelope: AuditedEconomyCommandEnvelopeV1,\n): string {\n assertAuditedEconomyCommandEnvelope(envelope);\n return JSON.stringify({\n schemaVersion: envelope.schemaVersion,\n commandId: envelope.commandId,\n commandType: envelope.commandType,\n commandSource: envelope.commandSource,\n idempotencyFingerprint: canonicalFingerprint(\n envelope.idempotencyFingerprint,\n ),\n actorAccountId: envelope.actorAccountId,\n subjectAccountId: envelope.subjectAccountId,\n principalType: envelope.principalType,\n ...(envelope.relationshipId === undefined\n ? {}\n : { relationshipId: envelope.relationshipId }),\n ...(envelope.authorizationVersion === undefined\n ? {}\n : { authorizationVersion: envelope.authorizationVersion }),\n authorizationEvidence: canonicalAuthorizationEvidence(\n envelope.authorizationEvidence,\n ),\n routeId: envelope.routeId,\n buildId: envelope.buildId,\n correlationId: envelope.correlationId,\n ...(envelope.causation === undefined\n ? {}\n : { causation: canonicalCausation(envelope.causation) }),\n payloadHash: envelope.payloadHash,\n ...(envelope.providerEvidenceManifestHash === undefined\n ? {}\n : {\n providerEvidenceManifestHash:\n envelope.providerEvidenceManifestHash,\n }),\n acceptedAt: envelope.acceptedAt,\n acceptedRegion: envelope.acceptedRegion,\n writerFencingToken: envelope.writerFencingToken,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for privacy-minimized provider evidence. */\nexport function canonicalEconomyProviderEvidenceHashPayload(\n evidence: EconomyProviderEvidenceHashV1,\n): string {\n assertEconomyProviderEvidenceHash(evidence);\n return JSON.stringify({\n schemaVersion: evidence.schemaVersion,\n providerEventId: evidence.providerEventId,\n commandId: evidence.commandId,\n provider: evidence.provider,\n ...(evidence.providerObjectKeyFingerprint === undefined\n ? {}\n : {\n providerObjectKeyFingerprint: canonicalFingerprint(\n evidence.providerObjectKeyFingerprint,\n ),\n }),\n providerEventKeyFingerprint: canonicalFingerprint(\n evidence.providerEventKeyFingerprint,\n ),\n eventType: evidence.eventType,\n payloadFingerprint: canonicalFingerprint(evidence.payloadFingerprint),\n ...(evidence.reconciliationEvidenceFingerprint === undefined\n ? {}\n : {\n reconciliationEvidenceFingerprint: canonicalFingerprint(\n evidence.reconciliationEvidenceFingerprint,\n ),\n }),\n signatureScheme: evidence.signatureScheme,\n signatureVerifiedAt: evidence.signatureVerifiedAt,\n ...(evidence.providerOccurredAt === undefined\n ? {}\n : { providerOccurredAt: evidence.providerOccurredAt }),\n receivedAt: evidence.receivedAt,\n ...(evidence.operationalHandleBindingId === undefined\n ? {}\n : {\n operationalHandleBindingId:\n evidence.operationalHandleBindingId,\n }),\n });\n}\n\n/** Produces deterministic UTF-8 JSON for an encrypted-handle binding. */\nexport function canonicalEconomyEncryptedOperationalHandleBindingPayload(\n binding: EconomyEncryptedOperationalHandleBindingV1,\n): string {\n assertEconomyEncryptedOperationalHandleBinding(binding);\n return JSON.stringify({\n schemaVersion: binding.schemaVersion,\n handleBindingId: binding.handleBindingId,\n commandId: binding.commandId,\n provider: binding.provider,\n purpose: binding.purpose,\n cipherSuite: binding.cipherSuite,\n keyVersion: binding.keyVersion,\n ciphertextContentHash: binding.ciphertextContentHash,\n encryptionContextHash: binding.encryptionContextHash,\n createdAt: binding.createdAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for a sanitized evidence manifest. */\nexport function canonicalEconomyProviderEvidenceManifestPayload(\n manifest: EconomyProviderEvidenceManifestV1,\n): string {\n assertEconomyProviderEvidenceManifest(manifest);\n return JSON.stringify({\n schemaVersion: manifest.schemaVersion,\n evidenceManifestId: manifest.evidenceManifestId,\n commandId: manifest.commandId,\n provider: manifest.provider,\n evidenceReferences: manifest.evidenceReferences.map(\n canonicalEvidenceReference,\n ),\n operationalHandleReferences: manifest.operationalHandleReferences.map(\n canonicalEvidenceReference,\n ),\n createdAt: manifest.createdAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for a privacy-safe accepted receipt. */\nexport function canonicalEconomyAcceptedCommandReceiptPayload(\n receipt: EconomyAcceptedCommandReceiptV1,\n): string {\n assertEconomyAcceptedCommandReceipt(receipt);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n receiptId: receipt.receiptId,\n commandId: receipt.commandId,\n correlationId: receipt.correlationId,\n commandEnvelopeHash: receipt.commandEnvelopeHash,\n acceptedAt: receipt.acceptedAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for a terminal command receipt. */\nexport function canonicalEconomyCommandResultReceiptPayload(\n receipt: EconomyCommandResultReceiptV1,\n): string {\n assertEconomyCommandResultReceipt(receipt);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n receiptId: receipt.receiptId,\n commandId: receipt.commandId,\n correlationId: receipt.correlationId,\n acceptedReceiptId: receipt.acceptedReceiptId,\n commandEnvelopeHash: receipt.commandEnvelopeHash,\n outcome: receipt.outcome,\n resultHash: receipt.resultHash,\n ...(receipt.transactionId === undefined\n ? {}\n : { transactionId: receipt.transactionId }),\n ...(receipt.transactionCanonicalHash === undefined\n ? {}\n : { transactionCanonicalHash: receipt.transactionCanonicalHash }),\n ...(receipt.failureCode === undefined\n ? {}\n : { failureCode: receipt.failureCode }),\n ...(receipt.noOpCode === undefined\n ? {}\n : { noOpCode: receipt.noOpCode }),\n recordedAt: receipt.recordedAt,\n });\n}\n\n/**\n * Rejects a replay candidate unless every canonical accepted-command byte\n * matches. Processing mode is intentionally external to the envelope, so the\n * original command source remains unchanged on replay.\n */\nexport function assertExactAuditedEconomyCommandReplay(\n existing: AuditedEconomyCommandEnvelopeV1,\n candidate: AuditedEconomyCommandEnvelopeV1,\n): void {\n economyAssert(\n canonicalAuditedEconomyCommandEnvelopePayload(existing) ===\n canonicalAuditedEconomyCommandEnvelopePayload(candidate),\n \"DUPLICATE_IDENTIFIER\",\n \"Idempotency fingerprint collision does not match the canonical command\",\n );\n}\n","import { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { CanonicalPayloadHashFunctionV1 } from \"./integrity.js\";\n\n/** Application ceiling below Cosmos DB's 100-operation transactional limit. */\nexport const ECONOMY_AUTHORITY_MAX_BATCH_OPERATIONS = 80;\n\n/** Commit-manifest create plus authority-head conditional replacement. */\nexport const ECONOMY_AUTHORITY_COMMIT_OVERHEAD_OPERATIONS = 2;\n\n/** Maximum referenced record writes within one 80-operation authority batch. */\nexport const ECONOMY_AUTHORITY_MAX_RECORD_REFERENCES =\n ECONOMY_AUTHORITY_MAX_BATCH_OPERATIONS -\n ECONOMY_AUTHORITY_COMMIT_OVERHEAD_OPERATIONS;\n\n/** Application ceiling below Cosmos DB's 2 MiB transactional-batch limit. */\nexport const ECONOMY_AUTHORITY_MAX_BATCH_BYTES = 1_572_864;\n\n/** Validates adapter-measured transactional operation and byte counts. */\nexport function assertEconomyAuthorityBatchLimits(\n operationCount: number,\n serializedBytes: number,\n): void {\n economyAssert(\n Number.isSafeInteger(operationCount) &&\n operationCount >=\n ECONOMY_AUTHORITY_COMMIT_OVERHEAD_OPERATIONS + 1 &&\n operationCount <= ECONOMY_AUTHORITY_MAX_BATCH_OPERATIONS,\n \"INVALID_CONTRACT\",\n \"Authority batch operation count exceeds the application boundary\",\n );\n economyAssert(\n Number.isSafeInteger(serializedBytes) &&\n serializedBytes > 0 &&\n serializedBytes <= ECONOMY_AUTHORITY_MAX_BATCH_BYTES,\n \"INVALID_CONTRACT\",\n \"Authority batch serialized size exceeds the application boundary\",\n );\n}\n\nexport type EconomyAuthorityStateV1 =\n | \"open\"\n | \"acquisition-closed\"\n | \"closed\"\n | \"rebuilding\";\n\nexport type EconomyAuthorityCommitKindV1 =\n | \"genesis\"\n | \"first-party-command\"\n | \"provider-acceptance\"\n | \"provider-result\"\n | \"integrity-verification\"\n | \"state-transition\"\n | \"writer-fence-transition\"\n | \"reconstruction\";\n\nexport type EconomyAuthorityRecordKindV1 =\n | \"command-envelope\"\n | \"provider-evidence-manifest\"\n | \"provider-evidence\"\n | \"operational-handle-binding\"\n | \"workflow-event\"\n | \"accepted-receipt\"\n | \"result-receipt\"\n | \"journal-transaction\"\n | \"source-lot\"\n | \"source-lot-movement\"\n | \"gameplay-allocation\"\n | \"wallet\"\n | \"balance-projection\"\n | \"lifetime-projection\"\n | \"idempotency-result\"\n | \"outbox-event\"\n | \"work-item\"\n | \"dead-letter\"\n | \"integrity-receipt\"\n | \"integrity-anchor\";\n\nexport type EconomyAuthorityWriteKindV1 =\n | \"create\"\n | \"conditional-replace\";\n\n/**\n * Canonical reference to one record created or conditionally replaced by an\n * authority commit. Conditional replacements bind the previous content and a\n * hash of the adapter's optimistic-concurrency token; unconditional replacement\n * has no representation.\n */\nexport interface EconomyAuthorityRecordReferenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recordKind: EconomyAuthorityRecordKindV1;\n readonly recordId: string;\n readonly writeKind: EconomyAuthorityWriteKindV1;\n readonly contentHash: string;\n readonly previousContentHash?: string;\n readonly expectedConcurrencyTokenHash?: string;\n}\n\n/**\n * Immutable, hash-linked record of one authoritative atomic boundary.\n *\n * First-party commands carry acceptance and terminal effects in one manifest.\n * Provider commands use a provider-acceptance manifest followed by a\n * provider-result manifest after external reconciliation.\n */\nexport interface EconomyAuthorityCommitManifestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commitId: string;\n readonly authorityId: string;\n readonly sequence: string;\n readonly commitKind: EconomyAuthorityCommitKindV1;\n readonly previousCommitHash?: string;\n readonly commandId?: string;\n readonly correlationId?: string;\n readonly authorityStateBefore: EconomyAuthorityStateV1;\n readonly authorityStateAfter: EconomyAuthorityStateV1;\n readonly stateReasonCode?: string;\n readonly recoveryVerificationReceiptId?: string;\n readonly recoveryVerificationReceiptHash?: string;\n readonly dualApprovalEvidenceHash?: string;\n readonly writerRegion: string;\n readonly writerFencingToken: string;\n readonly recordReferences: readonly EconomyAuthorityRecordReferenceV1[];\n readonly committedAt: IsoTimestamp;\n}\n\n/** Compare-and-swap projection for the singleton authority head. */\nexport interface EconomyAuthorityHeadV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly authorityId: string;\n readonly version: string;\n readonly state: EconomyAuthorityStateV1;\n readonly lastCommitId?: string;\n readonly lastCommitHash?: string;\n readonly writerRegion: string;\n readonly writerFencingToken: string;\n readonly updatedAt: IsoTimestamp;\n}\n\n/** Manifest plus the canonical hash calculated by an approved adapter. */\nexport interface HashedEconomyAuthorityCommitManifestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly manifest: EconomyAuthorityCommitManifestV1;\n readonly canonicalHash: string;\n}\n\nexport type EconomyIntegrityVerificationStatusV1 = \"valid\" | \"invalid\";\n\nexport type EconomyIntegrityFailureCodeV1 =\n | \"authority-head-mismatch\"\n | \"commit-hash-mismatch\"\n | \"commit-link-mismatch\"\n | \"record-hash-mismatch\"\n | \"journal-head-mismatch\"\n | \"projection-mismatch\";\n\n/** Immutable, privacy-safe evidence of one bounded integrity verification. */\nexport interface EconomyIntegrityVerificationReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly verificationId: string;\n readonly authorityId: string;\n readonly status: EconomyIntegrityVerificationStatusV1;\n readonly checkedThroughSequence: string;\n readonly checkedCommits: string;\n readonly checkedRecords: string;\n readonly expectedAuthorityHeadHash: string;\n readonly observedAuthorityHeadHash: string;\n readonly expectedJournalHeadHash?: string;\n readonly observedJournalHeadHash?: string;\n readonly expectedProjectionSetHash?: string;\n readonly observedProjectionSetHash?: string;\n readonly anchorManifestHash?: string;\n readonly failureCode?: EconomyIntegrityFailureCodeV1;\n readonly firstInvalidCommitId?: string;\n readonly firstInvalidRecordId?: string;\n readonly verifiedAt: IsoTimestamp;\n}\n\n/**\n * Canonical hourly Merkle-root manifest. Signing and storage are deliberately\n * infrastructure responsibilities; this contract contains no private key,\n * signature, storage URI, or administrator-proof claim.\n */\nexport interface EconomyIntegrityAnchorManifestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly anchorId: string;\n readonly authorityId: string;\n readonly firstCommitSequence: string;\n readonly lastCommitSequence: string;\n readonly leafCount: string;\n readonly merkleRootHash: string;\n readonly authorityHeadHash: string;\n readonly producedAt: IsoTimestamp;\n}\n\nconst AUTHORITY_STATES = new Set<EconomyAuthorityStateV1>([\n \"open\",\n \"acquisition-closed\",\n \"closed\",\n \"rebuilding\",\n]);\n\nconst COMMIT_KINDS = new Set<EconomyAuthorityCommitKindV1>([\n \"genesis\",\n \"first-party-command\",\n \"provider-acceptance\",\n \"provider-result\",\n \"integrity-verification\",\n \"state-transition\",\n \"writer-fence-transition\",\n \"reconstruction\",\n]);\n\nconst RECORD_KINDS = new Set<EconomyAuthorityRecordKindV1>([\n \"command-envelope\",\n \"provider-evidence-manifest\",\n \"provider-evidence\",\n \"operational-handle-binding\",\n \"workflow-event\",\n \"accepted-receipt\",\n \"result-receipt\",\n \"journal-transaction\",\n \"source-lot\",\n \"source-lot-movement\",\n \"gameplay-allocation\",\n \"wallet\",\n \"balance-projection\",\n \"lifetime-projection\",\n \"idempotency-result\",\n \"outbox-event\",\n \"work-item\",\n \"dead-letter\",\n \"integrity-receipt\",\n \"integrity-anchor\",\n]);\n\nconst INTEGRITY_FAILURE_CODES = new Set<EconomyIntegrityFailureCodeV1>([\n \"authority-head-mismatch\",\n \"commit-hash-mismatch\",\n \"commit-link-mismatch\",\n \"record-hash-mismatch\",\n \"journal-head-mismatch\",\n \"projection-mismatch\",\n]);\n\nconst HEAD_KEYS = new Set([\n \"schemaVersion\",\n \"authorityId\",\n \"version\",\n \"state\",\n \"lastCommitId\",\n \"lastCommitHash\",\n \"writerRegion\",\n \"writerFencingToken\",\n \"updatedAt\",\n]);\n\nconst MANIFEST_KEYS = new Set([\n \"schemaVersion\",\n \"commitId\",\n \"authorityId\",\n \"sequence\",\n \"commitKind\",\n \"previousCommitHash\",\n \"commandId\",\n \"correlationId\",\n \"authorityStateBefore\",\n \"authorityStateAfter\",\n \"stateReasonCode\",\n \"recoveryVerificationReceiptId\",\n \"recoveryVerificationReceiptHash\",\n \"dualApprovalEvidenceHash\",\n \"writerRegion\",\n \"writerFencingToken\",\n \"recordReferences\",\n \"committedAt\",\n]);\n\nfunction assertExactKeys(\n value: object,\n allowedKeys: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowedKeys.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported field`,\n );\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction assertCanonicalUnsignedInteger(\n value: string,\n label: string,\n): void {\n economyAssert(\n typeof value === \"string\" && /^(?:0|[1-9][0-9]{0,38})$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical unsigned integer`,\n );\n}\n\nfunction assertSafeReasonCode(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^[A-Z][A-Z0-9_]{2,95}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a bounded uppercase reason code`,\n );\n}\n\nfunction referenceOrder(\n left: EconomyAuthorityRecordReferenceV1,\n right: EconomyAuthorityRecordReferenceV1,\n): number {\n const byKind = compareUnicodeCodeUnits(left.recordKind, right.recordKind);\n return byKind === 0\n ? compareUnicodeCodeUnits(left.recordId, right.recordId)\n : byKind;\n}\n\n/** Validates one create-only or optimistic conditional-replace reference. */\nexport function assertEconomyAuthorityRecordReference(\n reference: EconomyAuthorityRecordReferenceV1,\n): void {\n assertExactKeys(\n reference,\n new Set([\n \"schemaVersion\",\n \"recordKind\",\n \"recordId\",\n \"writeKind\",\n \"contentHash\",\n \"previousContentHash\",\n \"expectedConcurrencyTokenHash\",\n ]),\n \"Authority record reference\",\n );\n economyAssert(\n reference.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n RECORD_KINDS.has(reference.recordKind) &&\n [\"create\", \"conditional-replace\"].includes(reference.writeKind),\n \"INVALID_CONTRACT\",\n \"Unsupported authority record reference\",\n );\n assertEconomyIdentifier(reference.recordId, \"authority recordId\");\n assertCanonicalHash(reference.contentHash, \"Authority record content hash\");\n if (reference.writeKind === \"create\") {\n economyAssert(\n reference.previousContentHash === undefined &&\n reference.expectedConcurrencyTokenHash === undefined,\n \"INVALID_CONTRACT\",\n \"Create references cannot carry replacement concurrency evidence\",\n );\n } else {\n economyAssert(\n reference.previousContentHash !== undefined &&\n reference.expectedConcurrencyTokenHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Conditional replacements require prior content and concurrency hashes\",\n );\n assertCanonicalHash(\n reference.previousContentHash,\n \"Previous record content hash\",\n );\n assertCanonicalHash(\n reference.expectedConcurrencyTokenHash,\n \"Expected concurrency-token hash\",\n );\n }\n}\n\nfunction assertCanonicalRecordReferences(\n references: readonly EconomyAuthorityRecordReferenceV1[],\n): void {\n economyAssert(\n references.length > 0 &&\n references.length <= ECONOMY_AUTHORITY_MAX_RECORD_REFERENCES,\n \"INVALID_CONTRACT\",\n `Authority commits require between 1 and ${ECONOMY_AUTHORITY_MAX_RECORD_REFERENCES} record references`,\n );\n let previous: EconomyAuthorityRecordReferenceV1 | undefined;\n for (const reference of references) {\n assertEconomyAuthorityRecordReference(reference);\n economyAssert(\n previous === undefined || referenceOrder(previous, reference) < 0,\n \"INVALID_CONTRACT\",\n \"Authority record references must be unique and canonically ordered\",\n );\n previous = reference;\n }\n}\n\nfunction assertCommitCommandBinding(\n manifest: EconomyAuthorityCommitManifestV1,\n): void {\n const commandCommit = [\n \"first-party-command\",\n \"provider-acceptance\",\n \"provider-result\",\n ].includes(manifest.commitKind);\n economyAssert(\n commandCommit\n ? manifest.commandId !== undefined &&\n manifest.correlationId !== undefined\n : manifest.commandId === undefined &&\n manifest.correlationId === undefined,\n \"INVALID_CONTRACT\",\n \"Only command commits require command and correlation identifiers\",\n );\n if (manifest.commandId !== undefined) {\n assertEconomyIdentifier(manifest.commandId, \"commandId\");\n assertEconomyIdentifier(manifest.correlationId!, \"correlationId\");\n }\n}\n\nfunction assertStateTransitionEvidence(\n manifest: EconomyAuthorityCommitManifestV1,\n): void {\n const changesState =\n manifest.authorityStateBefore !== manifest.authorityStateAfter;\n economyAssert(\n (manifest.commitKind === \"state-transition\") === changesState,\n \"INVALID_CONTRACT\",\n \"Only state-transition commits may change authority state\",\n );\n if (manifest.commitKind === \"state-transition\") {\n economyAssert(\n manifest.stateReasonCode !== undefined,\n \"INVALID_CONTRACT\",\n \"Authority state transitions require a reason code\",\n );\n assertSafeReasonCode(\n manifest.stateReasonCode,\n \"Authority state-transition reason\",\n );\n const allowedTransition =\n (manifest.authorityStateBefore === \"open\" &&\n (manifest.authorityStateAfter === \"acquisition-closed\" ||\n manifest.authorityStateAfter === \"closed\")) ||\n (manifest.authorityStateBefore === \"acquisition-closed\" &&\n (manifest.authorityStateAfter === \"closed\" ||\n manifest.authorityStateAfter === \"open\")) ||\n (manifest.authorityStateBefore === \"closed\" &&\n manifest.authorityStateAfter === \"rebuilding\") ||\n (manifest.authorityStateBefore === \"rebuilding\" &&\n (manifest.authorityStateAfter === \"closed\" ||\n manifest.authorityStateAfter === \"open\"));\n economyAssert(\n allowedTransition,\n \"INVALID_CONTRACT\",\n \"Authority state transition is not permitted\",\n );\n if (\n manifest.authorityStateAfter === \"open\" &&\n manifest.authorityStateBefore !== \"open\"\n ) {\n economyAssert(\n (manifest.authorityStateBefore === \"rebuilding\" ||\n manifest.authorityStateBefore === \"acquisition-closed\") &&\n manifest.recoveryVerificationReceiptId !== undefined &&\n manifest.recoveryVerificationReceiptHash !== undefined &&\n manifest.dualApprovalEvidenceHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Reopening requires a recoverable state, fresh verification, and dual approval\",\n );\n assertEconomyIdentifier(\n manifest.recoveryVerificationReceiptId,\n \"recoveryVerificationReceiptId\",\n );\n assertCanonicalHash(\n manifest.recoveryVerificationReceiptHash,\n \"Recovery verification-receipt hash\",\n );\n assertCanonicalHash(\n manifest.dualApprovalEvidenceHash,\n \"Dual-approval evidence hash\",\n );\n } else {\n economyAssert(\n manifest.recoveryVerificationReceiptId === undefined &&\n manifest.recoveryVerificationReceiptHash === undefined &&\n manifest.dualApprovalEvidenceHash === undefined,\n \"INVALID_CONTRACT\",\n \"Recovery evidence is only valid when reopening from rebuilding\",\n );\n }\n } else if (manifest.commitKind === \"writer-fence-transition\") {\n economyAssert(\n manifest.stateReasonCode !== undefined &&\n manifest.recoveryVerificationReceiptId === undefined &&\n manifest.recoveryVerificationReceiptHash === undefined &&\n manifest.dualApprovalEvidenceHash === undefined,\n \"INVALID_CONTRACT\",\n \"Writer-fence transitions require only a reason code\",\n );\n assertSafeReasonCode(\n manifest.stateReasonCode,\n \"Writer-fence transition reason\",\n );\n } else {\n economyAssert(\n manifest.stateReasonCode === undefined &&\n manifest.recoveryVerificationReceiptId === undefined &&\n manifest.recoveryVerificationReceiptHash === undefined &&\n manifest.dualApprovalEvidenceHash === undefined,\n \"INVALID_CONTRACT\",\n \"Non-transition commits cannot carry transition evidence\",\n );\n }\n}\n\nfunction assertCommitAllowedInState(\n manifest: EconomyAuthorityCommitManifestV1,\n): void {\n const state = manifest.authorityStateBefore;\n if (\n manifest.commitKind === \"first-party-command\" ||\n manifest.commitKind === \"provider-acceptance\"\n ) {\n economyAssert(\n state === \"open\",\n \"INVALID_CONTRACT\",\n \"New commands and provider acceptance require an open authority\",\n );\n } else if (manifest.commitKind === \"provider-result\") {\n economyAssert(\n state === \"open\" || state === \"acquisition-closed\",\n \"INVALID_CONTRACT\",\n \"Provider results require an open or acquisition-closed authority\",\n );\n } else if (manifest.commitKind === \"reconstruction\") {\n economyAssert(\n state === \"rebuilding\",\n \"INVALID_CONTRACT\",\n \"Reconstruction commits require rebuilding state\",\n );\n }\n}\n\n/** Validates one immutable authority commit manifest. */\nexport function assertEconomyAuthorityCommitManifest(\n manifest: EconomyAuthorityCommitManifestV1,\n): void {\n assertExactKeys(manifest, MANIFEST_KEYS, \"Authority commit manifest\");\n economyAssert(\n manifest.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n COMMIT_KINDS.has(manifest.commitKind) &&\n AUTHORITY_STATES.has(manifest.authorityStateBefore) &&\n AUTHORITY_STATES.has(manifest.authorityStateAfter),\n \"INVALID_CONTRACT\",\n \"Unsupported authority commit manifest\",\n );\n assertEconomyIdentifier(manifest.commitId, \"commitId\");\n assertEconomyIdentifier(manifest.authorityId, \"authorityId\");\n assertCanonicalUnsignedInteger(manifest.sequence, \"Commit sequence\");\n economyAssert(\n manifest.sequence !== \"0\",\n \"INVALID_CONTRACT\",\n \"Authority commit sequence must be positive\",\n );\n if (manifest.previousCommitHash !== undefined) {\n assertCanonicalHash(\n manifest.previousCommitHash,\n \"Previous authority commit hash\",\n );\n }\n economyAssert(\n (manifest.sequence === \"1\") ===\n (manifest.previousCommitHash === undefined),\n \"INVALID_CONTRACT\",\n \"Only the first authority commit omits its previous hash\",\n );\n economyAssert(\n (manifest.commitKind === \"genesis\") === (manifest.sequence === \"1\"),\n \"INVALID_CONTRACT\",\n \"The first authority commit must be the unique genesis commit\",\n );\n economyAssert(\n Array.isArray(manifest.recordReferences),\n \"INVALID_CONTRACT\",\n \"Authority record references must be an array\",\n );\n assertCommitCommandBinding(manifest);\n assertStateTransitionEvidence(manifest);\n assertCommitAllowedInState(manifest);\n assertEconomyIdentifier(manifest.writerRegion, \"writerRegion\");\n assertEconomyIdentifier(\n manifest.writerFencingToken,\n \"writerFencingToken\",\n );\n assertCanonicalRecordReferences(manifest.recordReferences);\n parseIsoTimestamp(manifest.committedAt);\n}\n\n/** Validates an empty or populated singleton authority head. */\nexport function assertEconomyAuthorityHead(\n head: EconomyAuthorityHeadV1,\n): void {\n assertExactKeys(head, HEAD_KEYS, \"Economy authority head\");\n economyAssert(\n head.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n AUTHORITY_STATES.has(head.state),\n \"INVALID_CONTRACT\",\n \"Unsupported economy authority head\",\n );\n assertEconomyIdentifier(head.authorityId, \"authorityId\");\n assertCanonicalUnsignedInteger(head.version, \"Authority-head version\");\n const hasCommitId = head.lastCommitId !== undefined;\n const hasCommitHash = head.lastCommitHash !== undefined;\n economyAssert(\n hasCommitId === hasCommitHash &&\n (head.version !== \"0\") === hasCommitId,\n \"INVALID_CONTRACT\",\n \"Authority-head version and last-commit fields are inconsistent\",\n );\n if (head.lastCommitId !== undefined) {\n assertEconomyIdentifier(head.lastCommitId, \"lastCommitId\");\n assertCanonicalHash(head.lastCommitHash!, \"Last commit hash\");\n }\n assertEconomyIdentifier(head.writerRegion, \"writerRegion\");\n assertEconomyIdentifier(\n head.writerFencingToken,\n \"writerFencingToken\",\n );\n parseIsoTimestamp(head.updatedAt);\n}\n\n/**\n * Proves that a canonical manifest advances the locked singleton authority\n * head by exactly one sequence and returns the compare-and-swap replacement.\n */\nexport function advanceEconomyAuthorityHead(\n head: EconomyAuthorityHeadV1,\n manifest: EconomyAuthorityCommitManifestV1,\n manifestCanonicalHash: string,\n): EconomyAuthorityHeadV1 {\n assertEconomyAuthorityHead(head);\n assertEconomyAuthorityCommitManifest(manifest);\n assertCanonicalHash(manifestCanonicalHash, \"Authority manifest hash\");\n economyAssert(\n manifest.authorityId === head.authorityId &&\n BigInt(manifest.sequence) === BigInt(head.version) + 1n &&\n manifest.previousCommitHash === head.lastCommitHash &&\n manifest.authorityStateBefore === head.state,\n \"INVALID_CONTRACT\",\n \"Authority manifest does not extend the locked head\",\n );\n const fenceTransition = manifest.commitKind === \"writer-fence-transition\";\n economyAssert(\n fenceTransition\n ? manifest.writerRegion !== head.writerRegion ||\n manifest.writerFencingToken !== head.writerFencingToken\n : manifest.writerRegion === head.writerRegion &&\n manifest.writerFencingToken === head.writerFencingToken,\n \"INVALID_CONTRACT\",\n \"Authority writer identity may change only through a fence transition\",\n );\n economyAssert(\n parseIsoTimestamp(manifest.committedAt) >=\n parseIsoTimestamp(head.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Authority commit cannot precede the locked head\",\n );\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n authorityId: head.authorityId,\n version: manifest.sequence,\n state: manifest.authorityStateAfter,\n lastCommitId: manifest.commitId,\n lastCommitHash: manifestCanonicalHash,\n writerRegion: manifest.writerRegion,\n writerFencingToken: manifest.writerFencingToken,\n updatedAt: manifest.committedAt,\n };\n}\n\n/** Validates one append-only result from a bounded integrity check. */\nexport function assertEconomyIntegrityVerificationReceipt(\n receipt: EconomyIntegrityVerificationReceiptV1,\n): void {\n assertExactKeys(\n receipt,\n new Set([\n \"schemaVersion\",\n \"verificationId\",\n \"authorityId\",\n \"status\",\n \"checkedThroughSequence\",\n \"checkedCommits\",\n \"checkedRecords\",\n \"expectedAuthorityHeadHash\",\n \"observedAuthorityHeadHash\",\n \"expectedJournalHeadHash\",\n \"observedJournalHeadHash\",\n \"expectedProjectionSetHash\",\n \"observedProjectionSetHash\",\n \"anchorManifestHash\",\n \"failureCode\",\n \"firstInvalidCommitId\",\n \"firstInvalidRecordId\",\n \"verifiedAt\",\n ]),\n \"Integrity-verification receipt\",\n );\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n [\"valid\", \"invalid\"].includes(receipt.status),\n \"INVALID_CONTRACT\",\n \"Unsupported integrity-verification receipt\",\n );\n assertEconomyIdentifier(receipt.verificationId, \"verificationId\");\n assertEconomyIdentifier(receipt.authorityId, \"authorityId\");\n assertCanonicalUnsignedInteger(\n receipt.checkedThroughSequence,\n \"Checked-through sequence\",\n );\n assertCanonicalUnsignedInteger(receipt.checkedCommits, \"Checked commits\");\n assertCanonicalUnsignedInteger(receipt.checkedRecords, \"Checked records\");\n assertCanonicalHash(\n receipt.expectedAuthorityHeadHash,\n \"Expected authority-head hash\",\n );\n assertCanonicalHash(\n receipt.observedAuthorityHeadHash,\n \"Observed authority-head hash\",\n );\n const journalPair =\n receipt.expectedJournalHeadHash !== undefined ||\n receipt.observedJournalHeadHash !== undefined;\n economyAssert(\n !journalPair ||\n (receipt.expectedJournalHeadHash !== undefined &&\n receipt.observedJournalHeadHash !== undefined),\n \"INVALID_CONTRACT\",\n \"Journal integrity hashes must be supplied together\",\n );\n if (receipt.expectedJournalHeadHash !== undefined) {\n assertCanonicalHash(\n receipt.expectedJournalHeadHash,\n \"Expected journal-head hash\",\n );\n assertCanonicalHash(\n receipt.observedJournalHeadHash!,\n \"Observed journal-head hash\",\n );\n }\n const projectionPair =\n receipt.expectedProjectionSetHash !== undefined ||\n receipt.observedProjectionSetHash !== undefined;\n economyAssert(\n !projectionPair ||\n (receipt.expectedProjectionSetHash !== undefined &&\n receipt.observedProjectionSetHash !== undefined),\n \"INVALID_CONTRACT\",\n \"Projection integrity hashes must be supplied together\",\n );\n if (receipt.expectedProjectionSetHash !== undefined) {\n assertCanonicalHash(\n receipt.expectedProjectionSetHash,\n \"Expected projection-set hash\",\n );\n assertCanonicalHash(\n receipt.observedProjectionSetHash!,\n \"Observed projection-set hash\",\n );\n }\n if (receipt.anchorManifestHash !== undefined) {\n assertCanonicalHash(\n receipt.anchorManifestHash,\n \"Integrity anchor manifest hash\",\n );\n }\n if (receipt.firstInvalidCommitId !== undefined) {\n assertEconomyIdentifier(\n receipt.firstInvalidCommitId,\n \"firstInvalidCommitId\",\n );\n }\n if (receipt.firstInvalidRecordId !== undefined) {\n assertEconomyIdentifier(\n receipt.firstInvalidRecordId,\n \"firstInvalidRecordId\",\n );\n }\n if (receipt.status === \"valid\") {\n economyAssert(\n receipt.failureCode === undefined &&\n receipt.firstInvalidCommitId === undefined &&\n receipt.firstInvalidRecordId === undefined &&\n receipt.expectedAuthorityHeadHash ===\n receipt.observedAuthorityHeadHash &&\n (receipt.expectedJournalHeadHash === undefined ||\n receipt.expectedJournalHeadHash ===\n receipt.observedJournalHeadHash) &&\n (receipt.expectedProjectionSetHash === undefined ||\n receipt.expectedProjectionSetHash ===\n receipt.observedProjectionSetHash),\n \"INVALID_CONTRACT\",\n \"Valid integrity receipts cannot contain mismatches\",\n );\n } else {\n economyAssert(\n receipt.failureCode !== undefined &&\n INTEGRITY_FAILURE_CODES.has(receipt.failureCode),\n \"INVALID_CONTRACT\",\n \"Invalid integrity receipts require a safe failure code\",\n );\n if (receipt.failureCode === \"authority-head-mismatch\") {\n economyAssert(\n receipt.expectedAuthorityHeadHash !==\n receipt.observedAuthorityHeadHash,\n \"INVALID_CONTRACT\",\n \"Authority-head mismatch requires different head hashes\",\n );\n }\n if (receipt.failureCode === \"journal-head-mismatch\") {\n economyAssert(\n receipt.expectedJournalHeadHash !== undefined &&\n receipt.expectedJournalHeadHash !==\n receipt.observedJournalHeadHash,\n \"INVALID_CONTRACT\",\n \"Journal-head mismatch requires different journal hashes\",\n );\n }\n if (receipt.failureCode === \"projection-mismatch\") {\n economyAssert(\n receipt.expectedProjectionSetHash !== undefined &&\n receipt.expectedProjectionSetHash !==\n receipt.observedProjectionSetHash,\n \"INVALID_CONTRACT\",\n \"Projection mismatch requires different projection hashes\",\n );\n }\n if (\n receipt.failureCode === \"commit-hash-mismatch\" ||\n receipt.failureCode === \"commit-link-mismatch\"\n ) {\n economyAssert(\n receipt.firstInvalidCommitId !== undefined,\n \"INVALID_CONTRACT\",\n \"Commit integrity failures require the first invalid commit\",\n );\n }\n if (receipt.failureCode === \"record-hash-mismatch\") {\n economyAssert(\n receipt.firstInvalidRecordId !== undefined,\n \"INVALID_CONTRACT\",\n \"Record integrity failures require the first invalid record\",\n );\n }\n }\n parseIsoTimestamp(receipt.verifiedAt);\n}\n\n/** Validates one canonical hourly Merkle-root manifest. */\nexport function assertEconomyIntegrityAnchorManifest(\n manifest: EconomyIntegrityAnchorManifestV1,\n): void {\n assertExactKeys(\n manifest,\n new Set([\n \"schemaVersion\",\n \"anchorId\",\n \"authorityId\",\n \"firstCommitSequence\",\n \"lastCommitSequence\",\n \"leafCount\",\n \"merkleRootHash\",\n \"authorityHeadHash\",\n \"producedAt\",\n ]),\n \"Integrity anchor manifest\",\n );\n economyAssert(\n manifest.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported integrity anchor manifest\",\n );\n assertEconomyIdentifier(manifest.anchorId, \"anchorId\");\n assertEconomyIdentifier(manifest.authorityId, \"authorityId\");\n assertCanonicalUnsignedInteger(\n manifest.firstCommitSequence,\n \"First commit sequence\",\n );\n assertCanonicalUnsignedInteger(\n manifest.lastCommitSequence,\n \"Last commit sequence\",\n );\n assertCanonicalUnsignedInteger(manifest.leafCount, \"Merkle leaf count\");\n economyAssert(\n BigInt(manifest.firstCommitSequence) <=\n BigInt(manifest.lastCommitSequence) &&\n BigInt(manifest.leafCount) ===\n BigInt(manifest.lastCommitSequence) -\n BigInt(manifest.firstCommitSequence) +\n 1n,\n \"INVALID_CONTRACT\",\n \"Integrity anchor sequence range and leaf count are inconsistent\",\n );\n assertCanonicalHash(manifest.merkleRootHash, \"Merkle root hash\");\n assertCanonicalHash(manifest.authorityHeadHash, \"Authority-head hash\");\n parseIsoTimestamp(manifest.producedAt);\n}\n\nfunction canonicalAuthorityRecordReference(\n reference: EconomyAuthorityRecordReferenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: reference.schemaVersion,\n recordKind: reference.recordKind,\n recordId: reference.recordId,\n writeKind: reference.writeKind,\n contentHash: reference.contentHash,\n ...(reference.previousContentHash === undefined\n ? {}\n : { previousContentHash: reference.previousContentHash }),\n ...(reference.expectedConcurrencyTokenHash === undefined\n ? {}\n : {\n expectedConcurrencyTokenHash:\n reference.expectedConcurrencyTokenHash,\n }),\n };\n}\n\n/** Produces deterministic UTF-8 JSON for a singleton authority head. */\nexport function canonicalEconomyAuthorityHeadPayload(\n head: EconomyAuthorityHeadV1,\n): string {\n assertEconomyAuthorityHead(head);\n return JSON.stringify({\n schemaVersion: head.schemaVersion,\n authorityId: head.authorityId,\n version: head.version,\n state: head.state,\n ...(head.lastCommitId === undefined\n ? {}\n : { lastCommitId: head.lastCommitId }),\n ...(head.lastCommitHash === undefined\n ? {}\n : { lastCommitHash: head.lastCommitHash }),\n writerRegion: head.writerRegion,\n writerFencingToken: head.writerFencingToken,\n updatedAt: head.updatedAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for an authority commit manifest. */\nexport function canonicalEconomyAuthorityCommitManifestPayload(\n manifest: EconomyAuthorityCommitManifestV1,\n): string {\n assertEconomyAuthorityCommitManifest(manifest);\n return JSON.stringify({\n schemaVersion: manifest.schemaVersion,\n commitId: manifest.commitId,\n authorityId: manifest.authorityId,\n sequence: manifest.sequence,\n commitKind: manifest.commitKind,\n ...(manifest.previousCommitHash === undefined\n ? {}\n : { previousCommitHash: manifest.previousCommitHash }),\n ...(manifest.commandId === undefined\n ? {}\n : { commandId: manifest.commandId }),\n ...(manifest.correlationId === undefined\n ? {}\n : { correlationId: manifest.correlationId }),\n authorityStateBefore: manifest.authorityStateBefore,\n authorityStateAfter: manifest.authorityStateAfter,\n ...(manifest.stateReasonCode === undefined\n ? {}\n : { stateReasonCode: manifest.stateReasonCode }),\n ...(manifest.recoveryVerificationReceiptId === undefined\n ? {}\n : {\n recoveryVerificationReceiptId:\n manifest.recoveryVerificationReceiptId,\n }),\n ...(manifest.recoveryVerificationReceiptHash === undefined\n ? {}\n : {\n recoveryVerificationReceiptHash:\n manifest.recoveryVerificationReceiptHash,\n }),\n ...(manifest.dualApprovalEvidenceHash === undefined\n ? {}\n : {\n dualApprovalEvidenceHash:\n manifest.dualApprovalEvidenceHash,\n }),\n writerRegion: manifest.writerRegion,\n writerFencingToken: manifest.writerFencingToken,\n recordReferences: manifest.recordReferences.map(\n canonicalAuthorityRecordReference,\n ),\n committedAt: manifest.committedAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for an integrity-verification receipt. */\nexport function canonicalEconomyIntegrityVerificationReceiptPayload(\n receipt: EconomyIntegrityVerificationReceiptV1,\n): string {\n assertEconomyIntegrityVerificationReceipt(receipt);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n verificationId: receipt.verificationId,\n authorityId: receipt.authorityId,\n status: receipt.status,\n checkedThroughSequence: receipt.checkedThroughSequence,\n checkedCommits: receipt.checkedCommits,\n checkedRecords: receipt.checkedRecords,\n expectedAuthorityHeadHash: receipt.expectedAuthorityHeadHash,\n observedAuthorityHeadHash: receipt.observedAuthorityHeadHash,\n ...(receipt.expectedJournalHeadHash === undefined\n ? {}\n : { expectedJournalHeadHash: receipt.expectedJournalHeadHash }),\n ...(receipt.observedJournalHeadHash === undefined\n ? {}\n : { observedJournalHeadHash: receipt.observedJournalHeadHash }),\n ...(receipt.expectedProjectionSetHash === undefined\n ? {}\n : {\n expectedProjectionSetHash:\n receipt.expectedProjectionSetHash,\n }),\n ...(receipt.observedProjectionSetHash === undefined\n ? {}\n : {\n observedProjectionSetHash:\n receipt.observedProjectionSetHash,\n }),\n ...(receipt.anchorManifestHash === undefined\n ? {}\n : { anchorManifestHash: receipt.anchorManifestHash }),\n ...(receipt.failureCode === undefined\n ? {}\n : { failureCode: receipt.failureCode }),\n ...(receipt.firstInvalidCommitId === undefined\n ? {}\n : { firstInvalidCommitId: receipt.firstInvalidCommitId }),\n ...(receipt.firstInvalidRecordId === undefined\n ? {}\n : { firstInvalidRecordId: receipt.firstInvalidRecordId }),\n verifiedAt: receipt.verifiedAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for an hourly integrity anchor. */\nexport function canonicalEconomyIntegrityAnchorManifestPayload(\n manifest: EconomyIntegrityAnchorManifestV1,\n): string {\n assertEconomyIntegrityAnchorManifest(manifest);\n return JSON.stringify({\n schemaVersion: manifest.schemaVersion,\n anchorId: manifest.anchorId,\n authorityId: manifest.authorityId,\n firstCommitSequence: manifest.firstCommitSequence,\n lastCommitSequence: manifest.lastCommitSequence,\n leafCount: manifest.leafCount,\n merkleRootHash: manifest.merkleRootHash,\n authorityHeadHash: manifest.authorityHeadHash,\n producedAt: manifest.producedAt,\n });\n}\n\n/**\n * Proves that a reopening manifest binds a successful verification receipt.\n * The consuming service remains responsible for its maximum allowed age.\n */\nexport function assertEconomyAuthorityRecoveryEvidence(\n manifest: EconomyAuthorityCommitManifestV1,\n receipt: EconomyIntegrityVerificationReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertEconomyAuthorityCommitManifest(manifest);\n assertEconomyIntegrityVerificationReceipt(receipt);\n economyAssert(\n manifest.commitKind === \"state-transition\" &&\n manifest.authorityStateAfter === \"open\" &&\n receipt.status === \"valid\" &&\n receipt.authorityId === manifest.authorityId &&\n receipt.verificationId ===\n manifest.recoveryVerificationReceiptId &&\n BigInt(receipt.checkedThroughSequence) <\n BigInt(manifest.sequence) &&\n parseIsoTimestamp(receipt.verifiedAt) <=\n parseIsoTimestamp(manifest.committedAt),\n \"INVALID_CONTRACT\",\n \"Authority reopening is not bound to a prior successful verification\",\n );\n const receiptHash = hashCanonicalPayload(\n canonicalEconomyIntegrityVerificationReceiptPayload(receipt),\n );\n assertCanonicalHash(receiptHash, \"Recovery verification-receipt hash\");\n economyAssert(\n receiptHash === manifest.recoveryVerificationReceiptHash,\n \"INVALID_CONTRACT\",\n \"Recovery verification receipt does not match its manifest hash\",\n );\n}\n\n/**\n * Returns a copy in the canonical record-reference order expected by manifests.\n * Construction helpers may use this before validation; canonicalization itself\n * never silently reorders a malformed manifest.\n */\nexport function sortEconomyAuthorityRecordReferences(\n references: readonly EconomyAuthorityRecordReferenceV1[],\n): readonly EconomyAuthorityRecordReferenceV1[] {\n return [...references].sort(referenceOrder);\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n sumTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n sortStringRecord,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type LotId,\n type PostingId,\n type ProviderEventId,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { TokenSource } from \"./lots.js\";\n\nexport type ActivityType =\n | \"purchase\"\n | \"subscription\"\n | \"rewarded-ad\"\n | \"offerwall\"\n | \"allocation\"\n | \"boost\"\n | \"reclaim\"\n | \"spend\"\n | \"hold\"\n | \"refund\"\n | \"chargeback\"\n | \"adjustment\"\n | \"reversal\"\n | \"event\"\n | \"competition\";\n\nexport type ActivityStatus =\n | \"pending\"\n | \"held\"\n | \"settled\"\n | \"reversed\"\n | \"failed\";\n\n/**\n * States permitted on an immutable transaction accepted by the V2\n * persistence boundary. Pending and failed work belongs to the command\n * workflow, while a reversed presentation state is derived from an immutable\n * compensating transaction rather than written back to the original journal\n * row.\n */\nexport type EconomicJournalStatus = \"held\" | \"settled\";\n\n/** A journal transaction that has an immediate economic effect. */\nexport type EconomicJournalTransactionV1 = Omit<\n LedgerTransactionV1,\n \"status\"\n> & {\n readonly status: EconomicJournalStatus;\n};\n\nconst ACTIVITY_TYPES = new Set<ActivityType>([\n \"purchase\",\n \"subscription\",\n \"rewarded-ad\",\n \"offerwall\",\n \"allocation\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"refund\",\n \"chargeback\",\n \"adjustment\",\n \"reversal\",\n \"event\",\n \"competition\",\n]);\n\nconst ACTIVITY_STATUSES = new Set<ActivityStatus>([\n \"pending\",\n \"held\",\n \"settled\",\n \"reversed\",\n \"failed\",\n]);\n\nconst ACTIVITY_SOURCES = new Set<TokenSource>([\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n \"subscription\",\n \"event\",\n \"competition\",\n \"adjustment\",\n]);\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction hasControlCharacters(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || code === 127;\n });\n}\n\n/** One signed side of an immutable double-entry transaction. */\nexport interface LedgerPostingV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly postingId: PostingId;\n readonly transactionId: TransactionId;\n readonly accountId: AccountId;\n readonly walletId?: WalletId;\n readonly lotId?: LotId;\n readonly amount: TokenSubunitString;\n}\n\n/** Immutable transaction envelope. Posting amounts must sum to exactly zero. */\nexport interface LedgerTransactionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transactionId: TransactionId;\n readonly activityType: ActivityType;\n readonly status: ActivityStatus;\n readonly idempotencyKey: string;\n readonly providerEventId?: ProviderEventId;\n readonly reversesTransactionId?: TransactionId;\n readonly effectiveAt: IsoTimestamp;\n readonly recordedAt: IsoTimestamp;\n readonly previousCanonicalHash?: string;\n readonly canonicalHash?: string;\n readonly metadata: Readonly<Record<string, string>>;\n readonly postings: readonly LedgerPostingV1[];\n}\n\n/** Privacy-safe, display-oriented journal entry returned by an API adapter. */\nexport interface ActivityEntryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transactionId: TransactionId;\n readonly activityType: ActivityType;\n readonly status: ActivityStatus;\n readonly occurredAt: IsoTimestamp;\n readonly amount: TokenSubunitString;\n /** Stable source identity used for filtering and provenance presentation. */\n readonly source: TokenSource;\n readonly beneficiaryAccountId?: AccountId;\n readonly maskedReference?: string;\n readonly sourceLabel: string;\n}\n\n/** Validates one privacy-safe activity row returned by an HTTP adapter. */\nexport function assertActivityEntry(entry: ActivityEntryV1): void {\n economyAssert(\n entry.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported activity-entry contract version\",\n );\n assertEconomyIdentifier(entry.transactionId, \"transactionId\");\n economyAssert(\n ACTIVITY_TYPES.has(entry.activityType) &&\n ACTIVITY_STATUSES.has(entry.status) &&\n ACTIVITY_SOURCES.has(entry.source),\n \"INVALID_CONTRACT\",\n \"Activity type, status, or source is unsupported\",\n );\n parseIsoTimestamp(entry.occurredAt);\n economyAssert(\n parseTokenSubunits(entry.amount) !== 0n,\n \"INVALID_AMOUNT\",\n \"Activity entries cannot contain a zero amount\",\n );\n if (entry.beneficiaryAccountId !== undefined) {\n assertEconomyIdentifier(\n entry.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n }\n if (entry.maskedReference !== undefined) {\n economyAssert(\n typeof entry.maskedReference === \"string\" &&\n entry.maskedReference.length > 0 &&\n entry.maskedReference.length <= 128 &&\n !hasControlCharacters(entry.maskedReference),\n \"INVALID_CONTRACT\",\n \"Masked activity references must be bounded and safe for display\",\n );\n }\n economyAssert(\n typeof entry.sourceLabel === \"string\" &&\n entry.sourceLabel.trim().length > 0 &&\n entry.sourceLabel.length <= 128 &&\n !hasControlCharacters(entry.sourceLabel),\n \"INVALID_CONTRACT\",\n \"Activity source labels must be bounded and safe for display\",\n );\n}\n\n/** Proves the structural and arithmetic invariants of one transaction. */\nexport function assertBalancedTransaction(\n transaction: LedgerTransactionV1,\n): void {\n economyAssert(\n transaction.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported ledger contract version\",\n );\n assertEconomyIdentifier(transaction.transactionId, \"transactionId\");\n assertEconomyIdentifier(transaction.idempotencyKey, \"idempotencyKey\");\n economyAssert(\n ACTIVITY_TYPES.has(transaction.activityType) &&\n ACTIVITY_STATUSES.has(transaction.status),\n \"INVALID_CONTRACT\",\n \"Transaction activity type or status is unsupported\",\n );\n if (transaction.providerEventId !== undefined) {\n assertEconomyIdentifier(transaction.providerEventId, \"providerEventId\");\n }\n if (transaction.reversesTransactionId !== undefined) {\n assertEconomyIdentifier(\n transaction.reversesTransactionId,\n \"reversesTransactionId\",\n );\n }\n economyAssert(\n (transaction.activityType === \"reversal\") ===\n (transaction.reversesTransactionId !== undefined),\n \"INVALID_CONTRACT\",\n \"Reversal transactions must identify exactly one original transaction\",\n );\n const effectiveAt = parseIsoTimestamp(transaction.effectiveAt);\n const recordedAt = parseIsoTimestamp(transaction.recordedAt);\n economyAssert(\n recordedAt >= effectiveAt,\n \"INVALID_TIME_WINDOW\",\n \"Transaction recording time cannot precede its effective time\",\n );\n if (transaction.previousCanonicalHash !== undefined) {\n assertCanonicalHash(\n transaction.previousCanonicalHash,\n \"Previous canonical hash\",\n );\n }\n if (transaction.canonicalHash !== undefined) {\n assertCanonicalHash(transaction.canonicalHash, \"Canonical hash\");\n }\n const metadataEntries = Object.entries(transaction.metadata);\n economyAssert(\n metadataEntries.length <= 32 &&\n metadataEntries.every(\n ([key, value]) =>\n /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/u.test(key) &&\n value.length <= 512 &&\n !hasControlCharacters(value),\n ),\n \"INVALID_CONTRACT\",\n \"Transaction metadata must be bounded and free of control characters\",\n );\n economyAssert(\n transaction.postings.length >= 2,\n \"UNBALANCED_TRANSACTION\",\n \"A ledger transaction needs at least two postings\",\n );\n\n const postingIds = new Set<string>();\n for (const posting of transaction.postings) {\n economyAssert(\n posting.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported posting contract version\",\n );\n assertEconomyIdentifier(posting.postingId, \"postingId\");\n assertEconomyIdentifier(posting.accountId, \"accountId\");\n if (posting.walletId !== undefined) {\n assertEconomyIdentifier(posting.walletId, \"walletId\");\n }\n if (posting.lotId !== undefined) {\n assertEconomyIdentifier(posting.lotId, \"lotId\");\n }\n economyAssert(\n posting.transactionId === transaction.transactionId,\n \"INVALID_CONTRACT\",\n \"Posting transactionId must match its transaction\",\n );\n economyAssert(\n !postingIds.has(posting.postingId),\n \"DUPLICATE_IDENTIFIER\",\n \"Posting identifiers must be unique within a transaction\",\n );\n postingIds.add(posting.postingId);\n economyAssert(\n parseTokenSubunits(posting.amount) !== 0n,\n \"INVALID_AMOUNT\",\n \"Zero-value postings are not permitted\",\n );\n }\n\n economyAssert(\n sumTokenSubunits(transaction.postings.map((posting) => posting.amount)) ===\n 0n,\n \"UNBALANCED_TRANSACTION\",\n \"Ledger postings must sum to zero TokenSubunits\",\n );\n}\n\n/**\n * Narrows a balanced V1 transaction to the states accepted by the V2 journal.\n * This is additive: legacy V1 validators retain their existing status union.\n */\nexport function assertEconomicJournalTransaction(\n transaction: LedgerTransactionV1,\n): asserts transaction is EconomicJournalTransactionV1 {\n assertBalancedTransaction(transaction);\n economyAssert(\n transaction.status === \"held\" || transaction.status === \"settled\",\n \"INVALID_CONTRACT\",\n \"Pending, failed, and derived reversed activity cannot be journal transactions\",\n );\n}\n\n/**\n * Produces deterministic UTF-8 JSON for an approved SHA-256/HSM adapter.\n * Hashing itself deliberately remains outside this provider-neutral package.\n */\nexport function canonicalTransactionPayload(\n transaction: LedgerTransactionV1,\n): string {\n assertBalancedTransaction(transaction);\n const postings = [...transaction.postings]\n .sort((left, right) =>\n compareUnicodeCodeUnits(left.postingId, right.postingId),\n )\n .map((posting) => ({\n schemaVersion: posting.schemaVersion,\n postingId: posting.postingId,\n transactionId: posting.transactionId,\n accountId: posting.accountId,\n ...(posting.walletId === undefined ? {} : { walletId: posting.walletId }),\n ...(posting.lotId === undefined ? {} : { lotId: posting.lotId }),\n amount: posting.amount,\n }));\n\n return JSON.stringify({\n schemaVersion: transaction.schemaVersion,\n transactionId: transaction.transactionId,\n activityType: transaction.activityType,\n status: transaction.status,\n idempotencyKey: transaction.idempotencyKey,\n ...(transaction.providerEventId === undefined\n ? {}\n : { providerEventId: transaction.providerEventId }),\n ...(transaction.reversesTransactionId === undefined\n ? {}\n : { reversesTransactionId: transaction.reversesTransactionId }),\n effectiveAt: transaction.effectiveAt,\n recordedAt: transaction.recordedAt,\n ...(transaction.previousCanonicalHash === undefined\n ? {}\n : { previousCanonicalHash: transaction.previousCanonicalHash }),\n metadata: sortStringRecord(transaction.metadata),\n postings,\n });\n}\n\nexport interface ReversalInputV1 {\n readonly transactionId: TransactionId;\n readonly postingIds: readonly PostingId[];\n readonly idempotencyKey: string;\n readonly effectiveAt: IsoTimestamp;\n readonly recordedAt: IsoTimestamp;\n readonly metadata?: Readonly<Record<string, string>>;\n readonly previousCanonicalHash?: string;\n}\n\n/** Creates an immutable compensating transaction; it never edits the original. */\nexport function createReversalTransaction(\n original: LedgerTransactionV1,\n input: ReversalInputV1,\n): LedgerTransactionV1 {\n assertBalancedTransaction(original);\n economyAssert(\n original.reversesTransactionId === undefined,\n \"INVALID_CONTRACT\",\n \"A reversal cannot itself be reversed by this helper\",\n );\n economyAssert(\n input.postingIds.length === original.postings.length,\n \"INVALID_CONTRACT\",\n \"A reversal needs one new posting identifier per original posting\",\n );\n\n const postings = original.postings.map((posting, index) => {\n const postingId = input.postingIds[index];\n economyAssert(\n postingId !== undefined,\n \"INVALID_CONTRACT\",\n \"Missing reversal posting identifier\",\n );\n return {\n ...posting,\n postingId,\n transactionId: input.transactionId,\n amount: serializeTokenSubunits(-parseTokenSubunits(posting.amount)),\n } satisfies LedgerPostingV1;\n });\n\n const transaction: LedgerTransactionV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n transactionId: input.transactionId,\n activityType: \"reversal\",\n status: \"settled\",\n idempotencyKey: input.idempotencyKey,\n reversesTransactionId: original.transactionId,\n effectiveAt: input.effectiveAt,\n recordedAt: input.recordedAt,\n ...(input.previousCanonicalHash === undefined\n ? {}\n : { previousCanonicalHash: input.previousCanonicalHash }),\n metadata: input.metadata ?? {},\n postings,\n };\n assertBalancedTransaction(transaction);\n return transaction;\n}\n\n/** Rejects a second effective reversal for the same original transaction. */\nexport function assertReversalAvailable(\n originalTransactionId: TransactionId,\n existingTransactions: readonly LedgerTransactionV1[],\n): void {\n assertEconomyIdentifier(originalTransactionId, \"originalTransactionId\");\n economyAssert(\n !existingTransactions.some(\n (transaction) =>\n transaction.reversesTransactionId === originalTransactionId &&\n transaction.status !== \"failed\",\n ),\n \"REVERSAL_ALREADY_EXISTS\",\n \"The transaction already has an effective reversal\",\n );\n}\n","import {\n assertAuditedEconomyCommandEnvelope,\n assertEconomyAcceptedCommandReceipt,\n assertEconomyCommandResultReceipt,\n assertEconomyEncryptedOperationalHandleBinding,\n assertEconomyProviderEvidenceHash,\n assertEconomyProviderEvidenceManifest,\n canonicalAuditedEconomyCommandEnvelopePayload,\n canonicalEconomyAcceptedCommandReceiptPayload,\n canonicalEconomyCommandResultReceiptPayload,\n canonicalEconomyEncryptedOperationalHandleBindingPayload,\n canonicalEconomyProviderEvidenceHashPayload,\n canonicalEconomyProviderEvidenceManifestPayload,\n type AuditedEconomyCommandEnvelopeV1,\n type EconomyAcceptedCommandReceiptV1,\n type EconomyEncryptedOperationalHandleBindingV1,\n type EconomyProviderEvidenceHashV1,\n type EconomyProviderEvidenceManifestV1,\n type EconomyCommandResultReceiptV1,\n} from \"./audit.js\";\nimport {\n advanceEconomyAuthorityHead,\n assertEconomyAuthorityCommitManifest,\n assertEconomyAuthorityHead,\n canonicalEconomyAuthorityCommitManifestPayload,\n type EconomyAuthorityCommitManifestV1,\n type EconomyAuthorityHeadV1,\n type EconomyAuthorityRecordKindV1,\n type EconomyAuthorityRecordReferenceV1,\n type HashedEconomyAuthorityCommitManifestV1,\n} from \"./authority.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n type EconomyContractVersion,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { CanonicalPayloadHashFunctionV1 } from \"./integrity.js\";\nimport {\n assertEconomicJournalTransaction,\n canonicalTransactionPayload,\n type ActivityType,\n type EconomicJournalTransactionV1,\n} from \"./ledger.js\";\n\n/** Complete bounded record graph for one accepted authoritative command. */\nexport interface EconomyAuditGraphV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandEnvelope: AuditedEconomyCommandEnvelopeV1;\n readonly commandEnvelopeHash: string;\n readonly providerEvidenceManifest?: EconomyProviderEvidenceManifestV1;\n readonly providerEvidence: readonly EconomyProviderEvidenceHashV1[];\n readonly operationalHandleBindings: readonly EconomyEncryptedOperationalHandleBindingV1[];\n readonly acceptedReceipt: EconomyAcceptedCommandReceiptV1;\n readonly resultReceipt?: EconomyCommandResultReceiptV1;\n readonly transaction?: EconomicJournalTransactionV1 & {\n readonly canonicalHash: string;\n };\n readonly startAuthorityHead: EconomyAuthorityHeadV1;\n readonly commits: readonly HashedEconomyAuthorityCommitManifestV1[];\n readonly expectedAuthorityHead: EconomyAuthorityHeadV1;\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction hashCanonicalPayload(\n payload: string,\n hash: CanonicalPayloadHashFunctionV1,\n label: string,\n): string {\n const canonicalHash = hash(payload);\n assertCanonicalHash(canonicalHash, label);\n return canonicalHash;\n}\n\nfunction findReference(\n manifest: EconomyAuthorityCommitManifestV1,\n kind: EconomyAuthorityRecordKindV1,\n id: string,\n): EconomyAuthorityRecordReferenceV1 | undefined {\n return manifest.recordReferences.find(\n (reference) =>\n reference.recordKind === kind && reference.recordId === id,\n );\n}\n\nfunction assertCreatedReference(\n manifest: EconomyAuthorityCommitManifestV1,\n kind: EconomyAuthorityRecordKindV1,\n id: string,\n contentHash: string,\n): void {\n const reference = findReference(manifest, kind, id);\n economyAssert(\n reference !== undefined &&\n reference.writeKind === \"create\" &&\n reference.contentHash === contentHash,\n \"INVALID_CONTRACT\",\n `Authority commit does not bind the expected ${kind} record`,\n );\n}\n\nfunction assertProviderGraph(\n graph: EconomyAuditGraphV1,\n hash: CanonicalPayloadHashFunctionV1,\n acceptanceCommit: EconomyAuthorityCommitManifestV1,\n): void {\n const envelope = graph.commandEnvelope;\n const providerSource =\n envelope.commandSource === \"shopify\" ||\n envelope.commandSource === \"ayet\" ||\n envelope.commandSource === \"bitlabs\";\n\n if (!providerSource) {\n economyAssert(\n graph.providerEvidenceManifest === undefined &&\n graph.providerEvidence.length === 0 &&\n graph.operationalHandleBindings.length === 0,\n \"INVALID_CONTRACT\",\n \"First-party command graphs cannot carry provider evidence\",\n );\n return;\n }\n\n const manifest = graph.providerEvidenceManifest;\n economyAssert(\n manifest !== undefined &&\n manifest.commandId === envelope.commandId &&\n manifest.provider === envelope.commandSource &&\n graph.providerEvidence.length > 0,\n \"INVALID_CONTRACT\",\n \"Provider command graph is missing its matching evidence manifest\",\n );\n assertEconomyProviderEvidenceManifest(manifest);\n economyAssert(\n Date.parse(manifest.createdAt) <= Date.parse(envelope.acceptedAt),\n \"INVALID_TIME_WINDOW\",\n \"Provider evidence manifest cannot be created after command acceptance\",\n );\n const manifestHash = hashCanonicalPayload(\n canonicalEconomyProviderEvidenceManifestPayload(manifest),\n hash,\n \"Provider evidence manifest hash\",\n );\n economyAssert(\n envelope.providerEvidenceManifestHash === manifestHash,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest does not match the command envelope\",\n );\n assertCreatedReference(\n acceptanceCommit,\n \"provider-evidence-manifest\",\n manifest.evidenceManifestId,\n manifestHash,\n );\n\n const evidenceById = new Map<string, EconomyProviderEvidenceHashV1>();\n for (const evidence of graph.providerEvidence) {\n assertEconomyProviderEvidenceHash(evidence);\n economyAssert(\n evidence.commandId === envelope.commandId &&\n evidence.provider === envelope.commandSource &&\n !evidenceById.has(evidence.providerEventId),\n \"INVALID_CONTRACT\",\n \"Provider evidence has a mismatched or duplicate graph identity\",\n );\n evidenceById.set(evidence.providerEventId, evidence);\n economyAssert(\n Date.parse(evidence.receivedAt) <= Date.parse(manifest.createdAt),\n \"INVALID_TIME_WINDOW\",\n \"Provider evidence must be received before its manifest is created\",\n );\n }\n economyAssert(\n envelope.causation?.kind === \"provider-event\" &&\n evidenceById.has(envelope.causation.causationId),\n \"INVALID_CONTRACT\",\n \"Provider command causation must reference included provider evidence\",\n );\n economyAssert(\n manifest.evidenceReferences.length === evidenceById.size,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest does not cover the exact evidence set\",\n );\n for (const reference of manifest.evidenceReferences) {\n const evidence = evidenceById.get(reference.recordId);\n economyAssert(\n evidence !== undefined,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest references an absent record\",\n );\n const contentHash = hashCanonicalPayload(\n canonicalEconomyProviderEvidenceHashPayload(evidence),\n hash,\n \"Provider evidence content hash\",\n );\n economyAssert(\n reference.contentHash === contentHash,\n \"INVALID_CONTRACT\",\n \"Provider evidence content hash does not match its manifest\",\n );\n assertCreatedReference(\n acceptanceCommit,\n \"provider-evidence\",\n evidence.providerEventId,\n contentHash,\n );\n }\n\n const handlesById = new Map<\n string,\n EconomyEncryptedOperationalHandleBindingV1\n >();\n for (const binding of graph.operationalHandleBindings) {\n assertEconomyEncryptedOperationalHandleBinding(binding);\n economyAssert(\n binding.commandId === envelope.commandId &&\n binding.provider === envelope.commandSource &&\n !handlesById.has(binding.handleBindingId),\n \"INVALID_CONTRACT\",\n \"Operational handle has a mismatched or duplicate graph identity\",\n );\n handlesById.set(binding.handleBindingId, binding);\n economyAssert(\n Date.parse(binding.createdAt) <= Date.parse(manifest.createdAt),\n \"INVALID_TIME_WINDOW\",\n \"Encrypted handle binding cannot postdate its evidence manifest\",\n );\n }\n economyAssert(\n manifest.operationalHandleReferences.length === handlesById.size,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest does not cover the exact handle set\",\n );\n for (const reference of manifest.operationalHandleReferences) {\n const binding = handlesById.get(reference.recordId);\n economyAssert(\n binding !== undefined,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest references an absent handle binding\",\n );\n const contentHash = hashCanonicalPayload(\n canonicalEconomyEncryptedOperationalHandleBindingPayload(binding),\n hash,\n \"Operational-handle binding hash\",\n );\n economyAssert(\n reference.contentHash === contentHash,\n \"INVALID_CONTRACT\",\n \"Operational-handle binding does not match its evidence manifest\",\n );\n assertCreatedReference(\n acceptanceCommit,\n \"operational-handle-binding\",\n binding.handleBindingId,\n contentHash,\n );\n }\n for (const evidence of graph.providerEvidence) {\n economyAssert(\n evidence.operationalHandleBindingId === undefined ||\n handlesById.has(evidence.operationalHandleBindingId),\n \"INVALID_CONTRACT\",\n \"Provider evidence references an absent encrypted handle binding\",\n );\n }\n}\n\nfunction expectedTransactionActivityTypes(\n envelope: AuditedEconomyCommandEnvelopeV1,\n): ReadonlySet<ActivityType> {\n if (envelope.commandType === \"credit-purchase\") {\n return new Set([\"purchase\"]);\n }\n if (envelope.commandType === \"credit-subscription\") {\n return new Set([\"subscription\"]);\n }\n if (envelope.commandType === \"credit-reward\") {\n return new Set([\n envelope.commandSource === \"ayet\" ? \"rewarded-ad\" : \"offerwall\",\n ]);\n }\n if (envelope.commandType === \"credit-event\") {\n return new Set([\"event\"]);\n }\n if (envelope.commandType === \"credit-competition\") {\n return new Set([\"competition\"]);\n }\n if (envelope.commandType === \"allocate\") {\n return new Set([\"allocation\"]);\n }\n if (envelope.commandType === \"boost\") {\n return new Set([\"boost\"]);\n }\n if (envelope.commandType === \"reclaim\") {\n return new Set([\"reclaim\"]);\n }\n if (envelope.commandType === \"spend\") {\n return new Set([\"spend\"]);\n }\n if (envelope.commandType === \"hold\") {\n return new Set([\"hold\"]);\n }\n if (\n envelope.commandType === \"release-hold\" ||\n envelope.commandType === \"reverse\"\n ) {\n return new Set([\"reversal\"]);\n }\n if (envelope.commandType === \"refund\") {\n return new Set([\"refund\"]);\n }\n if (envelope.commandType === \"chargeback\") {\n return new Set([\"chargeback\"]);\n }\n return new Set([\"adjustment\"]);\n}\n\nfunction assertReceiptGraph(\n graph: EconomyAuditGraphV1,\n commandEnvelopeHash: string,\n hash: CanonicalPayloadHashFunctionV1,\n acceptanceCommit: EconomyAuthorityCommitManifestV1,\n resultCommit: EconomyAuthorityCommitManifestV1 | undefined,\n): void {\n const envelope = graph.commandEnvelope;\n const accepted = graph.acceptedReceipt;\n assertEconomyAcceptedCommandReceipt(accepted);\n economyAssert(\n accepted.commandId === envelope.commandId &&\n accepted.correlationId === envelope.correlationId &&\n accepted.commandEnvelopeHash === commandEnvelopeHash &&\n accepted.acceptedAt === envelope.acceptedAt,\n \"INVALID_CONTRACT\",\n \"Accepted receipt is not bound to the canonical command envelope\",\n );\n const acceptedHash = hashCanonicalPayload(\n canonicalEconomyAcceptedCommandReceiptPayload(accepted),\n hash,\n \"Accepted receipt hash\",\n );\n assertCreatedReference(\n acceptanceCommit,\n \"accepted-receipt\",\n accepted.receiptId,\n acceptedHash,\n );\n\n const providerSource =\n envelope.commandSource === \"shopify\" ||\n envelope.commandSource === \"ayet\" ||\n envelope.commandSource === \"bitlabs\";\n if (graph.resultReceipt === undefined) {\n economyAssert(\n providerSource &&\n graph.transaction === undefined &&\n resultCommit === undefined,\n \"INVALID_CONTRACT\",\n \"Only a provider workflow may be durably accepted without a result\",\n );\n return;\n }\n\n const result = graph.resultReceipt;\n assertEconomyCommandResultReceipt(result);\n economyAssert(\n result.commandId === envelope.commandId &&\n result.correlationId === envelope.correlationId &&\n result.acceptedReceiptId === accepted.receiptId &&\n result.commandEnvelopeHash === commandEnvelopeHash &&\n Date.parse(result.recordedAt) >= Date.parse(accepted.acceptedAt) &&\n resultCommit !== undefined,\n \"INVALID_CONTRACT\",\n \"Result receipt is not bound to its accepted command\",\n );\n const resultHash = hashCanonicalPayload(\n canonicalEconomyCommandResultReceiptPayload(result),\n hash,\n \"Command-result receipt hash\",\n );\n assertCreatedReference(\n resultCommit,\n \"result-receipt\",\n result.receiptId,\n resultHash,\n );\n\n if (envelope.commandType === \"initialize-wallet\") {\n economyAssert(\n result.outcome === \"no-op\" &&\n (result.noOpCode === \"WALLET_INITIALIZED\" ||\n result.noOpCode === \"WALLET_ALREADY_INITIALIZED\"),\n \"INVALID_CONTRACT\",\n \"Wallet initialization must terminate without an economic transaction\",\n );\n }\n\n if (result.outcome !== \"completed\") {\n economyAssert(\n graph.transaction === undefined,\n \"INVALID_CONTRACT\",\n \"Failed and no-op results cannot carry a journal transaction\",\n );\n return;\n }\n\n const transaction = graph.transaction;\n economyAssert(\n transaction !== undefined,\n \"INVALID_CONTRACT\",\n \"Completed command graph is missing its journal transaction\",\n );\n assertEconomicJournalTransaction(transaction);\n const calculatedTransactionHash = hashCanonicalPayload(\n canonicalTransactionPayload(transaction),\n hash,\n \"Journal transaction hash\",\n );\n economyAssert(\n transaction.canonicalHash === calculatedTransactionHash &&\n result.transactionId === transaction.transactionId &&\n result.transactionCanonicalHash === transaction.canonicalHash &&\n transaction.idempotencyKey ===\n envelope.idempotencyFingerprint.digest &&\n expectedTransactionActivityTypes(envelope).has(\n transaction.activityType,\n ),\n \"INVALID_CONTRACT\",\n \"Completed result, transaction semantics, and idempotency fingerprint do not match\",\n );\n if (providerSource) {\n economyAssert(\n transaction.providerEventId === envelope.causation?.causationId &&\n graph.providerEvidence.some(\n (evidence) =>\n evidence.providerEventId === transaction.providerEventId,\n ),\n \"INVALID_CONTRACT\",\n \"Transaction provider event must be an internal included evidence ID\",\n );\n } else {\n economyAssert(\n transaction.providerEventId === undefined,\n \"INVALID_CONTRACT\",\n \"First-party transactions cannot carry provider event identities\",\n );\n }\n assertCreatedReference(\n resultCommit,\n \"journal-transaction\",\n transaction.transactionId,\n transaction.canonicalHash,\n );\n}\n\nfunction assertAuthorityCommits(\n graph: EconomyAuditGraphV1,\n hash: CanonicalPayloadHashFunctionV1,\n): {\n readonly acceptanceCommit: EconomyAuthorityCommitManifestV1;\n readonly resultCommit?: EconomyAuthorityCommitManifestV1;\n} {\n assertEconomyAuthorityHead(graph.startAuthorityHead);\n assertEconomyAuthorityHead(graph.expectedAuthorityHead);\n economyAssert(\n Array.isArray(graph.commits) &&\n graph.commits.length >= 1 &&\n graph.commits.length <= 2,\n \"INVALID_CONTRACT\",\n \"A command audit graph requires one or two authority commits\",\n );\n\n let observedHead = graph.startAuthorityHead;\n for (const commit of graph.commits) {\n economyAssert(\n commit.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported hashed authority commit\",\n );\n assertEconomyAuthorityCommitManifest(commit.manifest);\n assertCanonicalHash(commit.canonicalHash, \"Authority commit hash\");\n economyAssert(\n commit.manifest.commandId === graph.commandEnvelope.commandId &&\n commit.manifest.correlationId ===\n graph.commandEnvelope.correlationId &&\n hashCanonicalPayload(\n canonicalEconomyAuthorityCommitManifestPayload(commit.manifest),\n hash,\n \"Calculated authority commit hash\",\n ) === commit.canonicalHash,\n \"INVALID_CONTRACT\",\n \"Authority commit hash or command binding is invalid\",\n );\n observedHead = advanceEconomyAuthorityHead(\n observedHead,\n commit.manifest,\n commit.canonicalHash,\n );\n }\n economyAssert(\n observedHead.schemaVersion ===\n graph.expectedAuthorityHead.schemaVersion &&\n observedHead.authorityId ===\n graph.expectedAuthorityHead.authorityId &&\n observedHead.version === graph.expectedAuthorityHead.version &&\n observedHead.state === graph.expectedAuthorityHead.state &&\n observedHead.lastCommitId ===\n graph.expectedAuthorityHead.lastCommitId &&\n observedHead.lastCommitHash ===\n graph.expectedAuthorityHead.lastCommitHash &&\n observedHead.writerRegion ===\n graph.expectedAuthorityHead.writerRegion &&\n observedHead.writerFencingToken ===\n graph.expectedAuthorityHead.writerFencingToken &&\n observedHead.updatedAt === graph.expectedAuthorityHead.updatedAt,\n \"INVALID_CONTRACT\",\n \"Authority commits do not reconstruct the expected authority head\",\n );\n\n const providerSource =\n graph.commandEnvelope.commandSource === \"shopify\" ||\n graph.commandEnvelope.commandSource === \"ayet\" ||\n graph.commandEnvelope.commandSource === \"bitlabs\";\n const acceptanceKind = providerSource\n ? \"provider-acceptance\"\n : \"first-party-command\";\n const acceptanceCommit = graph.commits.find(\n (commit) => commit.manifest.commitKind === acceptanceKind,\n )?.manifest;\n economyAssert(\n acceptanceCommit !== undefined,\n \"INVALID_CONTRACT\",\n \"Command graph is missing its authority acceptance boundary\",\n );\n const resultCommit = providerSource\n ? graph.commits.find(\n (commit) => commit.manifest.commitKind === \"provider-result\",\n )?.manifest\n : acceptanceCommit;\n economyAssert(\n providerSource ||\n (graph.commits.length === 1 &&\n graph.resultReceipt !== undefined),\n \"INVALID_CONTRACT\",\n \"First-party acceptance and result must share one authority commit\",\n );\n economyAssert(\n !providerSource ||\n (graph.resultReceipt === undefined) === (resultCommit === undefined),\n \"INVALID_CONTRACT\",\n \"Provider result receipt and second authority boundary must agree\",\n );\n return {\n acceptanceCommit,\n ...(resultCommit === undefined ? {} : { resultCommit }),\n };\n}\n\n/**\n * Validates every actor/subject, evidence, receipt, transaction, record, and\n * authority-chain edge for one bounded command graph.\n *\n * The callback must hash exact canonical UTF-8 bytes using approved SHA-256.\n * Raw provider data and idempotency keys are neither accepted nor reconstructed.\n */\nexport function assertEconomyAuditGraph(\n graph: EconomyAuditGraphV1,\n hash: CanonicalPayloadHashFunctionV1,\n): void {\n economyAssert(\n graph.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported economy audit graph\",\n );\n assertAuditedEconomyCommandEnvelope(graph.commandEnvelope);\n const commandEnvelopeHash = hashCanonicalPayload(\n canonicalAuditedEconomyCommandEnvelopePayload(graph.commandEnvelope),\n hash,\n \"Command envelope hash\",\n );\n economyAssert(\n graph.commandEnvelopeHash === commandEnvelopeHash,\n \"INVALID_CONTRACT\",\n \"Command envelope hash does not match canonical bytes\",\n );\n const { acceptanceCommit, resultCommit } = assertAuthorityCommits(\n graph,\n hash,\n );\n assertCreatedReference(\n acceptanceCommit,\n \"command-envelope\",\n graph.commandEnvelope.commandId,\n commandEnvelopeHash,\n );\n assertProviderGraph(graph, hash, acceptanceCommit);\n assertReceiptGraph(\n graph,\n commandEnvelopeHash,\n hash,\n acceptanceCommit,\n resultCommit,\n );\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LotId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport const PRE_UTILITY_BACKER_COHORT = \"pre_utility_backer_v1\" as const;\n\nexport interface EarlyBackerWindowV1 {\n readonly publicTokensLaunchAt: IsoTimestamp;\n readonly firstPublicSpendLiveAt?: IsoTimestamp;\n}\n\n/** Paid-lot facts required to recalculate retained early-backer basis. */\nexport interface PaidLotRetentionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly lotId: LotId;\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly purchaseId: string;\n readonly catalogVersion: string;\n readonly purchasedAt: IsoTimestamp;\n readonly settledAt: IsoTimestamp;\n readonly creditedAt: IsoTimestamp;\n readonly retainedAmount: TokenSubunitString;\n}\n\nexport interface EarlyBackerEvaluationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly cohortKey: typeof PRE_UTILITY_BACKER_COHORT;\n readonly status: \"not-qualified\" | \"provisional\";\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly netRetainedAmount: TokenSubunitString;\n readonly contributingLotIds: readonly LotId[];\n readonly evaluatedAt: IsoTimestamp;\n}\n\nexport const EARLY_BACKER_SETTLEMENT_POLICY_V2 =\n \"settlement-window-v2\" as const;\n\n/**\n * Additive evaluation result using settlement as the sole qualification event.\n * Purchase and credit times remain provenance/order facts.\n */\nexport interface EarlyBackerEvaluationV2 {\n readonly schemaVersion: EconomyContractVersion;\n readonly policyVersion: typeof EARLY_BACKER_SETTLEMENT_POLICY_V2;\n readonly qualificationEvent: \"settled-at\";\n readonly cohortKey: typeof PRE_UTILITY_BACKER_COHORT;\n readonly status: \"not-qualified\" | \"provisional\";\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly netRetainedAmount: TokenSubunitString;\n readonly contributingLotIds: readonly LotId[];\n readonly evaluatedAt: IsoTimestamp;\n}\n\nfunction isWithinWindow(\n timestamp: IsoTimestamp,\n launch: number,\n cutoff: number | undefined,\n): boolean {\n const value = parseIsoTimestamp(timestamp);\n return value >= launch && (cutoff === undefined || value < cutoff);\n}\n\n/**\n * Recalculates provisional cohort basis from retained paid lots. It promises no\n * future reward and deliberately has no permanent entitled state.\n */\nexport function evaluateEarlyBacker(\n payerAccountId: AccountId,\n receivingHouseholdId: HouseholdId,\n paidLots: readonly PaidLotRetentionV1[],\n window: EarlyBackerWindowV1,\n evaluatedAt: IsoTimestamp,\n): EarlyBackerEvaluationV1 {\n assertEconomyIdentifier(payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(receivingHouseholdId, \"receivingHouseholdId\");\n const launch = parseIsoTimestamp(window.publicTokensLaunchAt);\n const cutoff =\n window.firstPublicSpendLiveAt === undefined\n ? undefined\n : parseIsoTimestamp(window.firstPublicSpendLiveAt);\n economyAssert(\n cutoff === undefined || cutoff > launch,\n \"INVALID_TIME_WINDOW\",\n \"First public spend must occur after public Token launch\",\n );\n parseIsoTimestamp(evaluatedAt);\n\n let retained = 0n;\n const contributingLotIds: LotId[] = [];\n const seenLotIds = new Set<string>();\n for (const lot of paidLots) {\n economyAssert(\n lot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot retention contract version\",\n );\n assertEconomyIdentifier(lot.lotId, \"lotId\");\n economyAssert(\n !seenLotIds.has(lot.lotId),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot retention input must not repeat a source lot\",\n );\n seenLotIds.add(lot.lotId);\n assertEconomyIdentifier(lot.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(lot.receivingHouseholdId, \"receivingHouseholdId\");\n assertEconomyIdentifier(lot.purchaseId, \"purchaseId\");\n assertEconomyIdentifier(lot.catalogVersion, \"catalogVersion\");\n const purchasedAt = parseIsoTimestamp(lot.purchasedAt);\n const settledAt = parseIsoTimestamp(lot.settledAt);\n const creditedAt = parseIsoTimestamp(lot.creditedAt);\n economyAssert(\n purchasedAt <= settledAt && settledAt <= creditedAt,\n \"INVALID_TIME_WINDOW\",\n \"Paid-lot timestamps must follow purchase, settlement, then credit order\",\n );\n if (\n lot.payerAccountId !== payerAccountId ||\n lot.receivingHouseholdId !== receivingHouseholdId\n ) {\n continue;\n }\n const inWindow =\n isWithinWindow(lot.purchasedAt, launch, cutoff) &&\n isWithinWindow(lot.settledAt, launch, cutoff) &&\n isWithinWindow(lot.creditedAt, launch, cutoff);\n const amount = parseTokenSubunits(lot.retainedAmount);\n economyAssert(\n amount >= 0n,\n \"INVALID_AMOUNT\",\n \"Retained paid-lot basis cannot be negative\",\n );\n if (inWindow && amount > 0n) {\n retained += amount;\n contributingLotIds.push(lot.lotId);\n }\n }\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n cohortKey: PRE_UTILITY_BACKER_COHORT,\n status: retained > 0n ? \"provisional\" : \"not-qualified\",\n payerAccountId,\n receivingHouseholdId,\n netRetainedAmount: serializeTokenSubunits(retained),\n contributingLotIds: contributingLotIds.sort((left, right) =>\n left.localeCompare(right),\n ),\n evaluatedAt,\n };\n}\n\n/**\n * Evaluates the approved settlement-window policy. The caller owns environment\n * and rollout classification: `publicTokensLaunchAt` and\n * `firstPublicSpendLiveAt` must be derived from the entire public cohort, so\n * staff, test, and closed-beta availability cannot open or close this window.\n * The caller must also exclude non-production/test lots before evaluation.\n */\nexport function evaluateEarlyBackerBySettlementV2(\n payerAccountId: AccountId,\n receivingHouseholdId: HouseholdId,\n paidLots: readonly PaidLotRetentionV1[],\n window: EarlyBackerWindowV1,\n evaluatedAt: IsoTimestamp,\n): EarlyBackerEvaluationV2 {\n assertEconomyIdentifier(payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(receivingHouseholdId, \"receivingHouseholdId\");\n const launch = parseIsoTimestamp(window.publicTokensLaunchAt);\n const cutoff =\n window.firstPublicSpendLiveAt === undefined\n ? undefined\n : parseIsoTimestamp(window.firstPublicSpendLiveAt);\n economyAssert(\n cutoff === undefined || cutoff > launch,\n \"INVALID_TIME_WINDOW\",\n \"First public spend must occur after public Token launch\",\n );\n const evaluationTime = parseIsoTimestamp(evaluatedAt);\n\n let retained = 0n;\n const contributingLotIds: LotId[] = [];\n const seenLotIds = new Set<string>();\n for (const lot of paidLots) {\n economyAssert(\n lot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot retention contract version\",\n );\n assertEconomyIdentifier(lot.lotId, \"lotId\");\n economyAssert(\n !seenLotIds.has(lot.lotId),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot retention input must not repeat a source lot\",\n );\n seenLotIds.add(lot.lotId);\n assertEconomyIdentifier(lot.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(lot.receivingHouseholdId, \"receivingHouseholdId\");\n assertEconomyIdentifier(lot.purchaseId, \"purchaseId\");\n assertEconomyIdentifier(lot.catalogVersion, \"catalogVersion\");\n const purchasedAt = parseIsoTimestamp(lot.purchasedAt);\n const settledAt = parseIsoTimestamp(lot.settledAt);\n const creditedAt = parseIsoTimestamp(lot.creditedAt);\n economyAssert(\n purchasedAt <= settledAt && settledAt <= creditedAt,\n \"INVALID_TIME_WINDOW\",\n \"Paid-lot timestamps must follow purchase, settlement, then credit order\",\n );\n const amount = parseTokenSubunits(lot.retainedAmount);\n economyAssert(\n amount >= 0n,\n \"INVALID_AMOUNT\",\n \"Retained paid-lot basis cannot be negative\",\n );\n if (\n lot.payerAccountId === payerAccountId &&\n lot.receivingHouseholdId === receivingHouseholdId &&\n settledAt >= launch &&\n (cutoff === undefined || settledAt < cutoff) &&\n settledAt <= evaluationTime &&\n amount > 0n\n ) {\n retained += amount;\n contributingLotIds.push(lot.lotId);\n }\n }\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n policyVersion: EARLY_BACKER_SETTLEMENT_POLICY_V2,\n qualificationEvent: \"settled-at\",\n cohortKey: PRE_UTILITY_BACKER_COHORT,\n status: retained > 0n ? \"provisional\" : \"not-qualified\",\n payerAccountId,\n receivingHouseholdId,\n netRetainedAmount: serializeTokenSubunits(retained),\n contributingLotIds: contributingLotIds.sort((left, right) =>\n left.localeCompare(right),\n ),\n evaluatedAt,\n };\n}\n","import {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n} from \"./contracts.js\";\nimport { EconomyError, economyAssert } from \"./errors.js\";\nimport {\n assertEconomicJournalTransaction,\n canonicalTransactionPayload,\n type EconomicJournalTransactionV1,\n} from \"./ledger.js\";\n\nexport type JournalChainId = string;\n\n/** Locked head of one canonical transaction hash chain. */\nexport interface JournalChainHeadV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly chainId: JournalChainId;\n readonly version: number;\n readonly lastTransactionId?: TransactionId;\n readonly canonicalHash?: string;\n readonly updatedAt: IsoTimestamp;\n}\n\n/** An effective economic transaction carrying its approved canonical hash. */\nexport type ChainedEconomicJournalTransactionV1 =\n EconomicJournalTransactionV1 & {\n readonly canonicalHash: string;\n };\n\nexport type JournalChainVerificationFailureCodeV1 =\n | \"duplicate-transaction\"\n | \"invalid-transaction\"\n | \"previous-hash-mismatch\"\n | \"canonical-hash-mismatch\"\n | \"end-head-mismatch\";\n\n/** Deterministic result of verifying one ordered canonical-chain segment. */\nexport interface JournalChainVerificationResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly valid: boolean;\n readonly checkedTransactions: number;\n readonly observedHead: JournalChainHeadV1;\n readonly failureCode?: JournalChainVerificationFailureCodeV1;\n readonly firstInvalidTransactionId?: TransactionId;\n}\n\n/** Approved infrastructure adapter that hashes exact canonical UTF-8 bytes. */\nexport type CanonicalPayloadHashFunctionV1 = (payload: string) => string;\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\n/** Validates an empty or populated journal-chain head. */\nexport function assertJournalChainHead(head: JournalChainHeadV1): void {\n economyAssert(\n head.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported journal-chain-head contract version\",\n );\n assertEconomyIdentifier(head.chainId, \"chainId\");\n economyAssert(\n Number.isSafeInteger(head.version) && head.version >= 0,\n \"INVALID_CONTRACT\",\n \"Journal-chain-head version must be a non-negative safe integer\",\n );\n parseIsoTimestamp(head.updatedAt);\n const hasTransaction = head.lastTransactionId !== undefined;\n const hasHash = head.canonicalHash !== undefined;\n economyAssert(\n hasTransaction === hasHash && (head.version > 0) === hasTransaction,\n \"INVALID_CONTRACT\",\n \"Journal-chain head identity, hash, and version must describe the same state\",\n );\n if (head.lastTransactionId !== undefined) {\n assertEconomyIdentifier(head.lastTransactionId, \"lastTransactionId\");\n }\n if (head.canonicalHash !== undefined) {\n assertCanonicalHash(head.canonicalHash, \"Journal-chain-head hash\");\n }\n}\n\n/**\n * Proves that a hashed transaction extends the locked head and returns the\n * exact next head. The persistence adapter must compare-and-swap the old\n * version inside the same serializable transaction that appends the journal.\n */\nexport function advanceJournalChainHead(\n head: JournalChainHeadV1,\n transaction: ChainedEconomicJournalTransactionV1,\n): JournalChainHeadV1 {\n assertJournalChainHead(head);\n assertEconomicJournalTransaction(transaction);\n assertCanonicalHash(transaction.canonicalHash, \"Transaction hash\");\n economyAssert(\n transaction.previousCanonicalHash === head.canonicalHash,\n \"INVALID_CONTRACT\",\n \"Transaction previous hash must match the locked journal-chain head\",\n );\n economyAssert(\n transaction.canonicalHash !== head.canonicalHash,\n \"DUPLICATE_TRANSACTION\",\n \"Transaction hash must advance the journal chain\",\n );\n const recordedAt = parseIsoTimestamp(transaction.recordedAt);\n economyAssert(\n recordedAt >= parseIsoTimestamp(head.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Journal-chain update cannot precede its locked head\",\n );\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n chainId: head.chainId,\n version: head.version + 1,\n lastTransactionId: transaction.transactionId,\n canonicalHash: transaction.canonicalHash,\n updatedAt: transaction.recordedAt,\n };\n}\n\nfunction invalidVerification(\n checkedTransactions: number,\n observedHead: JournalChainHeadV1,\n failureCode: JournalChainVerificationFailureCodeV1,\n firstInvalidTransactionId?: TransactionId,\n): JournalChainVerificationResultV1 {\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n valid: false,\n checkedTransactions,\n observedHead,\n failureCode,\n ...(firstInvalidTransactionId === undefined\n ? {}\n : { firstInvalidTransactionId }),\n };\n}\n\nfunction safeTransactionId(value: string): TransactionId | undefined {\n try {\n assertEconomyIdentifier(value, \"transactionId\");\n return value;\n } catch (error) {\n if (error instanceof EconomyError) {\n return undefined;\n }\n throw error;\n }\n}\n\n/**\n * Recomputes an ordered journal segment without implementing cryptography.\n *\n * The caller supplies an approved SHA-256 adapter. Malformed transactions are\n * reported as integrity failures, while an invalid hash-adapter result is a\n * contract error and fails closed.\n */\nexport function verifyJournalChainSegment(\n startHead: JournalChainHeadV1,\n transactions: readonly ChainedEconomicJournalTransactionV1[],\n expectedEndHead: JournalChainHeadV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): JournalChainVerificationResultV1 {\n assertJournalChainHead(startHead);\n assertJournalChainHead(expectedEndHead);\n economyAssert(\n startHead.chainId === expectedEndHead.chainId,\n \"INVALID_CONTRACT\",\n \"Journal verification heads must belong to the same chain\",\n );\n\n let observedHead = startHead;\n let checkedTransactions = 0;\n const transactionIds = new Set<string>();\n\n for (const transaction of transactions) {\n let canonicalPayload: string;\n try {\n assertEconomicJournalTransaction(transaction);\n canonicalPayload = canonicalTransactionPayload(transaction);\n } catch (error) {\n if (error instanceof EconomyError) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"invalid-transaction\",\n safeTransactionId(transaction.transactionId),\n );\n }\n throw error;\n }\n\n if (transactionIds.has(transaction.transactionId)) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"duplicate-transaction\",\n transaction.transactionId,\n );\n }\n transactionIds.add(transaction.transactionId);\n\n if (transaction.previousCanonicalHash !== observedHead.canonicalHash) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"previous-hash-mismatch\",\n transaction.transactionId,\n );\n }\n\n const calculatedHash = hashCanonicalPayload(canonicalPayload);\n assertCanonicalHash(calculatedHash, \"Calculated transaction hash\");\n if (calculatedHash !== transaction.canonicalHash) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"canonical-hash-mismatch\",\n transaction.transactionId,\n );\n }\n\n try {\n observedHead = advanceJournalChainHead(observedHead, transaction);\n } catch (error) {\n if (error instanceof EconomyError) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"invalid-transaction\",\n safeTransactionId(transaction.transactionId),\n );\n }\n throw error;\n }\n checkedTransactions += 1;\n }\n\n if (\n observedHead.chainId !== expectedEndHead.chainId ||\n observedHead.version !== expectedEndHead.version ||\n observedHead.lastTransactionId !== expectedEndHead.lastTransactionId ||\n observedHead.canonicalHash !== expectedEndHead.canonicalHash ||\n observedHead.updatedAt !== expectedEndHead.updatedAt\n ) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"end-head-mismatch\",\n );\n }\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n valid: true,\n checkedTransactions,\n observedHead,\n };\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LotId,\n type ProviderEventId,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { EconomyError, economyAssert } from \"./errors.js\";\n\nexport type TokenSource =\n | \"shopify\"\n | \"ayet\"\n | \"bitlabs\"\n | \"subscription\"\n | \"event\"\n | \"competition\"\n | \"adjustment\";\n\nexport type LotTransferPolicy =\n | \"household-allocatable\"\n | \"same-user-only\"\n | \"non-transferable\";\n\nexport type LotRefundState =\n | \"none\"\n | \"partial\"\n | \"refunded\"\n | \"disputed\"\n | \"chargeback-lost\";\n\nexport interface SourceLotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly lotId: LotId;\n readonly walletId: WalletId;\n readonly beneficiaryAccountId: AccountId;\n readonly householdId?: HouseholdId;\n readonly payerAccountId?: AccountId;\n readonly source: TokenSource;\n readonly providerEventId?: ProviderEventId;\n readonly rateVersion: string;\n readonly settlementEvidenceHash: string;\n readonly transferPolicy: LotTransferPolicy;\n readonly refundState: LotRefundState;\n readonly originalAmount: TokenSubunitString;\n readonly remainingAmount: TokenSubunitString;\n readonly heldAmount: TokenSubunitString;\n readonly reversedAmount: TokenSubunitString;\n readonly settledAt: IsoTimestamp;\n readonly creditedAt: IsoTimestamp;\n readonly cohortKey?: string;\n}\n\nexport type LotUseOperation = \"allocate\" | \"spend\" | \"reclaim\" | \"refund\";\n\nexport interface LotUseContextV1 {\n readonly operation: LotUseOperation;\n readonly beneficiaryAccountId: AccountId;\n readonly householdId?: HouseholdId;\n}\n\nexport interface SourceLotSliceV1 {\n readonly lotId: LotId;\n readonly amount: TokenSubunitString;\n}\n\n/** Versioned mutable projection around immutable V1 source-lot provenance. */\nexport interface VersionedSourceLotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly lot: SourceLotV1;\n readonly version: number;\n readonly updatedAt: IsoTimestamp;\n}\n\nexport type SourceLotMovementType =\n | \"allocate\"\n | \"boost\"\n | \"reclaim\"\n | \"spend\"\n | \"hold\"\n | \"release-hold\"\n | \"refund\"\n | \"chargeback\"\n | \"reversal\";\n\n/**\n * Immutable movement applied to one source-lot projection by compare-and-swap.\n * Signed deltas are authoritative; `resultingRefundState` is part of the same\n * atomic version transition.\n */\nexport interface SourceLotMovementV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly movementId: string;\n readonly transactionId: TransactionId;\n readonly lotId: LotId;\n readonly movementType: SourceLotMovementType;\n readonly remainingDelta: TokenSubunitString;\n readonly heldDelta: TokenSubunitString;\n readonly reversedDelta: TokenSubunitString;\n readonly expectedVersion: number;\n readonly resultingVersion: number;\n readonly expectedRefundState: LotRefundState;\n readonly resultingRefundState: LotRefundState;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Validates source-lot arithmetic, evidence, and immutable provenance fields. */\nexport function assertSourceLot(lot: SourceLotV1): void {\n economyAssert(\n lot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported source-lot contract version\",\n );\n assertEconomyIdentifier(lot.lotId, \"lotId\");\n assertEconomyIdentifier(lot.walletId, \"walletId\");\n assertEconomyIdentifier(lot.beneficiaryAccountId, \"beneficiaryAccountId\");\n if (lot.householdId !== undefined) {\n assertEconomyIdentifier(lot.householdId, \"householdId\");\n }\n if (lot.payerAccountId !== undefined) {\n assertEconomyIdentifier(lot.payerAccountId, \"payerAccountId\");\n }\n if (lot.providerEventId !== undefined) {\n assertEconomyIdentifier(lot.providerEventId, \"providerEventId\");\n }\n assertEconomyIdentifier(lot.rateVersion, \"rateVersion\");\n economyAssert(\n [\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n \"subscription\",\n \"event\",\n \"competition\",\n \"adjustment\",\n ].includes(lot.source),\n \"INVALID_CONTRACT\",\n \"Source lot has an unsupported source\",\n );\n economyAssert(\n [\"household-allocatable\", \"same-user-only\", \"non-transferable\"].includes(\n lot.transferPolicy,\n ),\n \"INVALID_CONTRACT\",\n \"Source lot has an unsupported transfer policy\",\n );\n economyAssert(\n [\"none\", \"partial\", \"refunded\", \"disputed\", \"chargeback-lost\"].includes(\n lot.refundState,\n ),\n \"INVALID_CONTRACT\",\n \"Source lot has an unsupported refund state\",\n );\n if (lot.source === \"ayet\" || lot.source === \"bitlabs\") {\n economyAssert(\n lot.transferPolicy === \"same-user-only\" &&\n lot.providerEventId !== undefined,\n \"SOURCE_LOT_RESTRICTED\",\n \"Reward-provider lots must remain with the earning account\",\n );\n }\n if (lot.source === \"shopify\") {\n economyAssert(\n lot.transferPolicy === \"household-allocatable\" &&\n lot.householdId !== undefined &&\n lot.payerAccountId !== undefined,\n \"INVALID_CONTRACT\",\n \"Shopify lots must retain payer and receiving-household provenance\",\n );\n }\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(lot.settlementEvidenceHash),\n \"INVALID_CONTRACT\",\n \"Settlement evidence must be a sanitized SHA-256 reference\",\n );\n const settledAt = parseIsoTimestamp(lot.settledAt);\n const creditedAt = parseIsoTimestamp(lot.creditedAt);\n economyAssert(\n creditedAt >= settledAt,\n \"INVALID_TIME_WINDOW\",\n \"Source-lot credit time cannot precede settlement\",\n );\n if (lot.cohortKey !== undefined) {\n assertEconomyIdentifier(lot.cohortKey, \"cohortKey\");\n }\n\n const original = parseTokenSubunits(lot.originalAmount);\n const remaining = parseTokenSubunits(lot.remainingAmount);\n const held = parseTokenSubunits(lot.heldAmount);\n const reversed = parseTokenSubunits(lot.reversedAmount);\n economyAssert(\n original > 0n && remaining >= 0n && held >= 0n && reversed >= 0n,\n \"INVALID_AMOUNT\",\n \"Source-lot amounts must be non-negative and original must be positive\",\n );\n economyAssert(\n remaining <= original && held <= remaining && reversed <= original,\n \"INVALID_CONTRACT\",\n \"Source-lot amount components exceed the original or remaining amount\",\n );\n economyAssert(\n remaining + reversed <= original,\n \"INVALID_CONTRACT\",\n \"Remaining and reversed source-lot amounts exceed the original\",\n );\n}\n\n/** Validates the optimistic projection wrapper used by V2 persistence. */\nexport function assertVersionedSourceLot(\n snapshot: VersionedSourceLotV1,\n): void {\n economyAssert(\n snapshot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported versioned source-lot contract version\",\n );\n assertSourceLot(snapshot.lot);\n economyAssert(\n Number.isSafeInteger(snapshot.version) && snapshot.version >= 1,\n \"INVALID_CONTRACT\",\n \"Source-lot version must be a positive safe integer\",\n );\n economyAssert(\n parseIsoTimestamp(snapshot.updatedAt) >=\n parseIsoTimestamp(snapshot.lot.creditedAt),\n \"INVALID_TIME_WINDOW\",\n \"Source-lot update time cannot precede its credit\",\n );\n}\n\n/** Creates the only state accepted by the V2 append-source-lot operation. */\nexport function createInitialSourceLotSnapshot(\n lot: SourceLotV1,\n): VersionedSourceLotV1 {\n assertSourceLot(lot);\n economyAssert(\n lot.refundState === \"none\" &&\n lot.originalAmount === lot.remainingAmount &&\n parseTokenSubunits(lot.heldAmount) === 0n &&\n parseTokenSubunits(lot.reversedAmount) === 0n,\n \"INVALID_CONTRACT\",\n \"A new source lot must start fully remaining, clear, and unreversed\",\n );\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n lot,\n version: 1,\n updatedAt: lot.creditedAt,\n };\n}\n\nfunction assertRefundState(value: LotRefundState): void {\n economyAssert(\n [\n \"none\",\n \"partial\",\n \"refunded\",\n \"disputed\",\n \"chargeback-lost\",\n ].includes(value),\n \"INVALID_CONTRACT\",\n \"Source-lot movement has an unsupported refund state\",\n );\n}\n\n/** Validates movement shape and operation-specific delta direction. */\nexport function assertSourceLotMovement(\n movement: SourceLotMovementV1,\n): void {\n economyAssert(\n movement.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported source-lot-movement contract version\",\n );\n assertEconomyIdentifier(movement.movementId, \"movementId\");\n assertEconomyIdentifier(movement.transactionId, \"transactionId\");\n assertEconomyIdentifier(movement.lotId, \"lotId\");\n economyAssert(\n [\n \"allocate\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"release-hold\",\n \"refund\",\n \"chargeback\",\n \"reversal\",\n ].includes(movement.movementType),\n \"INVALID_CONTRACT\",\n \"Source-lot movement has an unsupported type\",\n );\n const remaining = parseTokenSubunits(movement.remainingDelta);\n const held = parseTokenSubunits(movement.heldDelta);\n const reversed = parseTokenSubunits(movement.reversedDelta);\n economyAssert(\n remaining !== 0n || held !== 0n || reversed !== 0n,\n \"INVALID_AMOUNT\",\n \"Source-lot movement must change at least one amount\",\n );\n economyAssert(\n Number.isSafeInteger(movement.expectedVersion) &&\n movement.expectedVersion >= 1 &&\n movement.resultingVersion === movement.expectedVersion + 1,\n \"INVALID_CONTRACT\",\n \"Source-lot movement must advance its optimistic version exactly once\",\n );\n assertRefundState(movement.expectedRefundState);\n assertRefundState(movement.resultingRefundState);\n parseIsoTimestamp(movement.occurredAt);\n\n if (\n movement.movementType === \"allocate\" ||\n movement.movementType === \"boost\" ||\n movement.movementType === \"spend\"\n ) {\n economyAssert(\n remaining < 0n &&\n held === 0n &&\n reversed === 0n &&\n movement.resultingRefundState === movement.expectedRefundState,\n \"INVALID_CONTRACT\",\n \"Allocation, boost, and spend movements only consume remaining lot value\",\n );\n } else if (movement.movementType === \"reclaim\") {\n economyAssert(\n remaining > 0n &&\n held === 0n &&\n reversed === 0n &&\n movement.resultingRefundState === movement.expectedRefundState,\n \"INVALID_CONTRACT\",\n \"Reclaim movements only restore remaining lot value\",\n );\n } else if (movement.movementType === \"hold\") {\n economyAssert(\n remaining === 0n &&\n held > 0n &&\n reversed === 0n &&\n movement.resultingRefundState === \"disputed\",\n \"INVALID_CONTRACT\",\n \"Hold movements must enter disputed state and increase held value\",\n );\n } else if (movement.movementType === \"release-hold\") {\n economyAssert(\n remaining === 0n &&\n held < 0n &&\n reversed === 0n &&\n movement.expectedRefundState === \"disputed\" &&\n movement.resultingRefundState !== \"disputed\" &&\n movement.resultingRefundState !== \"refunded\" &&\n movement.resultingRefundState !== \"chargeback-lost\",\n \"INVALID_CONTRACT\",\n \"Released holds must leave disputed state without reversing value\",\n );\n } else {\n economyAssert(\n remaining < 0n &&\n reversed === -remaining &&\n held <= 0n &&\n (movement.resultingRefundState === \"partial\" ||\n movement.resultingRefundState === \"refunded\" ||\n movement.resultingRefundState === \"chargeback-lost\"),\n \"INVALID_CONTRACT\",\n \"Refund, chargeback, and reversal movements must compensate remaining value exactly\",\n );\n if (movement.movementType === \"chargeback\") {\n economyAssert(\n movement.resultingRefundState === \"chargeback-lost\",\n \"INVALID_CONTRACT\",\n \"Chargeback movements must enter chargeback-lost state\",\n );\n } else {\n economyAssert(\n movement.resultingRefundState !== \"chargeback-lost\",\n \"INVALID_CONTRACT\",\n \"Only a chargeback movement may enter chargeback-lost state\",\n );\n }\n }\n}\n\n/**\n * Applies one immutable movement to a locked source-lot snapshot. Persistence\n * must append the movement and compare-and-swap this result atomically.\n */\nexport function applySourceLotMovement(\n snapshot: VersionedSourceLotV1,\n movement: SourceLotMovementV1,\n): VersionedSourceLotV1 {\n assertVersionedSourceLot(snapshot);\n assertSourceLotMovement(movement);\n economyAssert(\n movement.lotId === snapshot.lot.lotId &&\n movement.expectedVersion === snapshot.version &&\n movement.expectedRefundState === snapshot.lot.refundState,\n \"INVALID_CONTRACT\",\n \"Source-lot movement does not match the locked lot version and refund state\",\n );\n economyAssert(\n parseIsoTimestamp(movement.occurredAt) >=\n parseIsoTimestamp(snapshot.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Source-lot movement cannot precede its current projection\",\n );\n\n const lot: SourceLotV1 = {\n ...snapshot.lot,\n remainingAmount: serializeTokenSubunits(\n parseTokenSubunits(snapshot.lot.remainingAmount) +\n parseTokenSubunits(movement.remainingDelta),\n ),\n heldAmount: serializeTokenSubunits(\n parseTokenSubunits(snapshot.lot.heldAmount) +\n parseTokenSubunits(movement.heldDelta),\n ),\n reversedAmount: serializeTokenSubunits(\n parseTokenSubunits(snapshot.lot.reversedAmount) +\n parseTokenSubunits(movement.reversedDelta),\n ),\n refundState: movement.resultingRefundState,\n };\n assertSourceLot(lot);\n\n const remaining = parseTokenSubunits(lot.remainingAmount);\n const held = parseTokenSubunits(lot.heldAmount);\n const reversed = parseTokenSubunits(lot.reversedAmount);\n const original = parseTokenSubunits(lot.originalAmount);\n if (lot.refundState === \"none\") {\n economyAssert(\n reversed === 0n && held === 0n,\n \"INVALID_CONTRACT\",\n \"A clear lot cannot retain held or reversed value\",\n );\n } else if (lot.refundState === \"partial\") {\n economyAssert(\n reversed > 0n && remaining > 0n && held === 0n,\n \"INVALID_CONTRACT\",\n \"A partial refund requires retained/reversed value and no active hold\",\n );\n } else if (lot.refundState === \"disputed\") {\n economyAssert(\n held > 0n,\n \"INVALID_CONTRACT\",\n \"A disputed lot must hold affected value\",\n );\n } else {\n economyAssert(\n remaining === 0n && held === 0n && reversed === original,\n \"INVALID_CONTRACT\",\n \"Final refund and lost-chargeback states must reverse the full lot\",\n );\n }\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n lot,\n version: movement.resultingVersion,\n updatedAt: movement.occurredAt,\n };\n}\n\n/** Returns unheld, unconsumed TokenSubunits in a source lot. */\nexport function availableSourceLotAmount(lot: SourceLotV1): bigint {\n assertSourceLot(lot);\n return (\n parseTokenSubunits(lot.remainingAmount) - parseTokenSubunits(lot.heldAmount)\n );\n}\n\n/** Evaluates provider/source restrictions without trusting a browser claim. */\nexport function canUseSourceLot(\n lot: SourceLotV1,\n context: LotUseContextV1,\n): boolean {\n if (context.operation === \"refund\") {\n return true;\n }\n\n if (context.operation === \"allocate\" || context.operation === \"reclaim\") {\n return (\n lot.transferPolicy === \"household-allocatable\" &&\n lot.householdId !== undefined &&\n lot.householdId === context.householdId\n );\n }\n\n if (lot.transferPolicy === \"household-allocatable\") {\n return (\n lot.householdId !== undefined && lot.householdId === context.householdId\n );\n }\n\n return lot.beneficiaryAccountId === context.beneficiaryAccountId;\n}\n\n/**\n * Selects eligible lots deterministically in credited-time/lot-id order.\n * The returned slices are a proposal; persistence must consume them atomically.\n */\nexport function selectSourceLots(\n lots: readonly SourceLotV1[],\n requestedAmount: TokenSubunitString,\n context: LotUseContextV1,\n): readonly SourceLotSliceV1[] {\n const requested = parseTokenSubunits(requestedAmount);\n economyAssert(\n requested > 0n,\n \"INVALID_AMOUNT\",\n \"Requested source-lot amount must be positive\",\n );\n assertEconomyIdentifier(context.beneficiaryAccountId, \"beneficiaryAccountId\");\n\n const ordered = [...lots].sort((left, right) => {\n const timeDifference =\n parseIsoTimestamp(left.creditedAt) - parseIsoTimestamp(right.creditedAt);\n return timeDifference === 0\n ? left.lotId.localeCompare(right.lotId)\n : timeDifference;\n });\n\n let allAvailable = 0n;\n let remaining = requested;\n const slices: SourceLotSliceV1[] = [];\n\n for (const lot of ordered) {\n const available = availableSourceLotAmount(lot);\n allAvailable += available;\n if (available === 0n || !canUseSourceLot(lot, context)) {\n continue;\n }\n const selected = available < remaining ? available : remaining;\n slices.push({ lotId: lot.lotId, amount: serializeTokenSubunits(selected) });\n remaining -= selected;\n if (remaining === 0n) {\n return slices;\n }\n }\n\n if (allAvailable >= requested) {\n throw new EconomyError(\n \"SOURCE_LOT_RESTRICTED\",\n \"Available source lots do not permit this operation\",\n );\n }\n throw new EconomyError(\n \"INSUFFICIENT_ELIGIBLE_LOTS\",\n \"Insufficient eligible source-lot balance\",\n );\n}\n","import {\n isWholeTokenAmount,\n parseTokenSubunits,\n serializeTokenSubunits,\n sumTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LearningEntitlementId,\n type LearningModuleVersionId,\n type ModuleAllowanceId,\n type ModuleSpendHoldId,\n type ModuleSpendQuoteId,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { SourceLotSliceV1 } from \"./lots.js\";\n\nexport const MODULE_ALLOWANCE_PURPOSE =\n \"junior-coder-module-entitlement\" as const;\n\nexport type ModuleAllowanceStatusV1 = \"active\" | \"closed\";\n\n/** Guardian-funded value that can only purchase modules for one child. */\nexport interface ModuleAllowanceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly purpose: typeof MODULE_ALLOWANCE_PURPOSE;\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly hostWalletId: WalletId;\n readonly allowanceWalletId: WalletId;\n readonly childAccountId: AccountId;\n readonly status: ModuleAllowanceStatusV1;\n readonly allocatedAmount: TokenSubunitString;\n readonly availableAmount: TokenSubunitString;\n readonly heldAmount: TokenSubunitString;\n readonly spentAmount: TokenSubunitString;\n readonly reclaimedAmount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly reclaimedSlices: readonly SourceLotSliceV1[];\n readonly version: number;\n readonly createdAt: IsoTimestamp;\n readonly updatedAt: IsoTimestamp;\n}\n\nexport interface CreateModuleAllowanceInputV1 {\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly hostWalletId: WalletId;\n readonly allowanceWalletId: WalletId;\n readonly childAccountId: AccountId;\n readonly amount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface FundModuleAllowanceInputV1 {\n readonly amount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface ReclaimModuleAllowanceInputV1 {\n readonly amount: TokenSubunitString;\n readonly sourceSlices: readonly SourceLotSliceV1[];\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface CloseModuleAllowanceInputV1 {\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Immutable Guardian-approved module price and requirements evidence. */\nexport interface ModuleSpendQuoteV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly quoteId: ModuleSpendQuoteId;\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly guardianAccountId: AccountId;\n readonly childAccountId: AccountId;\n readonly moduleVersionId: LearningModuleVersionId;\n readonly catalogVersion: string;\n readonly amount: TokenSubunitString;\n readonly requirementsManifestVersion: string;\n readonly requirementsManifestHash: string;\n readonly requirementsAcknowledgedAt: IsoTimestamp;\n readonly issuedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n}\n\nexport type CreateModuleSpendQuoteInputV1 = Omit<\n ModuleSpendQuoteV1,\n \"schemaVersion\"\n>;\n\nexport type ModuleSpendHoldStatusV1 = \"held\" | \"settled\" | \"released\";\n\n/** Versioned projection for one quote-bound allowance hold. */\nexport interface ModuleSpendHoldV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly holdId: ModuleSpendHoldId;\n readonly quoteId: ModuleSpendQuoteId;\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly guardianAccountId: AccountId;\n readonly childAccountId: AccountId;\n readonly moduleVersionId: LearningModuleVersionId;\n readonly amount: TokenSubunitString;\n readonly requirementsManifestVersion: string;\n readonly requirementsManifestHash: string;\n readonly sourceSlices: readonly SourceLotSliceV1[];\n readonly status: ModuleSpendHoldStatusV1;\n readonly holdIdempotencyKey: string;\n readonly settlementIdempotencyKey?: string;\n readonly releaseIdempotencyKey?: string;\n readonly entitlementId?: LearningEntitlementId;\n readonly settlementTransactionId?: TransactionId;\n readonly releaseTransactionId?: TransactionId;\n readonly version: number;\n readonly createdAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n readonly updatedAt: IsoTimestamp;\n}\n\nexport interface CreateModuleSpendHoldInputV1 {\n readonly holdId: ModuleSpendHoldId;\n readonly idempotencyKey: string;\n readonly sourceSlices: readonly SourceLotSliceV1[];\n readonly expectedAllowanceVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface SettleModuleSpendHoldInputV1 {\n readonly entitlementId: LearningEntitlementId;\n readonly settlementTransactionId: TransactionId;\n readonly idempotencyKey: string;\n readonly expectedAllowanceVersion: number;\n readonly expectedHoldVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface ReleaseModuleSpendHoldInputV1 {\n readonly releaseTransactionId: TransactionId;\n readonly idempotencyKey: string;\n readonly expectedAllowanceVersion: number;\n readonly expectedHoldVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface ModuleSpendTransitionResultV1 {\n readonly allowance: ModuleAllowanceV1;\n readonly hold: ModuleSpendHoldV1;\n}\n\n/** Durable economic receipt for an activated learning entitlement. */\nexport interface ModulePurchaseReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly receiptId: string;\n readonly quoteId: ModuleSpendQuoteId;\n readonly holdId: ModuleSpendHoldId;\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly guardianAccountId: AccountId;\n readonly childAccountId: AccountId;\n readonly moduleVersionId: LearningModuleVersionId;\n readonly entitlementId: LearningEntitlementId;\n readonly amount: TokenSubunitString;\n readonly requirementsManifestVersion: string;\n readonly requirementsManifestHash: string;\n readonly settlementTransactionId: TransactionId;\n readonly issuedAt: IsoTimestamp;\n}\n\nexport interface CreateModulePurchaseReceiptInputV1 {\n readonly receiptId: string;\n readonly issuedAt: IsoTimestamp;\n}\n\nexport type ModulePurchaseFinancialStateV1 =\n | \"missing\"\n | \"held\"\n | \"settled\"\n | \"released\";\nexport type ModulePurchaseEntitlementStateV1 =\n | \"missing\"\n | \"pending\"\n | \"active\"\n | \"cancelled\";\n\n/** Privacy-minimized observation used by an authoritative reconciler. */\nexport interface ModulePurchaseReconciliationObservationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly quoteId: ModuleSpendQuoteId;\n readonly holdId: ModuleSpendHoldId;\n readonly childAccountId: AccountId;\n readonly moduleVersionId: LearningModuleVersionId;\n readonly financialState: ModulePurchaseFinancialStateV1;\n readonly entitlementState: ModulePurchaseEntitlementStateV1;\n readonly receiptPresent: boolean;\n readonly observedAt: IsoTimestamp;\n}\n\nexport type ModulePurchaseReconciliationActionV1 =\n | \"none\"\n | \"resume-settlement\"\n | \"release-hold\"\n | \"activate-entitlement\"\n | \"issue-receipt\"\n | \"cancel-pending-entitlement\"\n | \"manual-review\";\n\nexport interface ModulePurchaseReconciliationResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly action: ModulePurchaseReconciliationActionV1;\n readonly blocking: boolean;\n readonly consistent: boolean;\n readonly reasonCode: string;\n}\n\nfunction assertWholePositive(amount: TokenSubunitString, label: string): bigint {\n const parsed = parseTokenSubunits(amount);\n economyAssert(parsed > 0n, \"INVALID_AMOUNT\", `${label} must be positive`);\n economyAssert(\n isWholeTokenAmount(parsed),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n `${label} must contain whole Tokens`,\n );\n return parsed;\n}\n\nfunction assertPositiveSlices(\n slices: readonly SourceLotSliceV1[],\n expectedAmount: bigint,\n label: string,\n): void {\n economyAssert(slices.length > 0, \"INVALID_CONTRACT\", `${label} are required`);\n const lotIds = new Set<string>();\n for (const slice of slices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n economyAssert(\n !lotIds.has(slice.lotId),\n \"DUPLICATE_IDENTIFIER\",\n `${label} must not repeat a lot`,\n );\n lotIds.add(slice.lotId);\n economyAssert(\n parseTokenSubunits(slice.amount) > 0n,\n \"INVALID_AMOUNT\",\n `${label} amounts must be positive`,\n );\n }\n economyAssert(\n sumTokenSubunits(slices.map((slice) => slice.amount)) === expectedAmount,\n \"INVALID_CONTRACT\",\n `${label} must sum to the operation amount`,\n );\n}\n\nfunction sumSlicesByLot(\n slices: readonly SourceLotSliceV1[],\n): ReadonlyMap<string, bigint> {\n const totals = new Map<string, bigint>();\n for (const slice of slices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n const amount = parseTokenSubunits(slice.amount);\n economyAssert(amount > 0n, \"INVALID_AMOUNT\", \"Lot slices must be positive\");\n totals.set(slice.lotId, (totals.get(slice.lotId) ?? 0n) + amount);\n }\n return totals;\n}\n\nfunction assertSha256Reference(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction assertUpdatedAt(\n current: IsoTimestamp,\n occurredAt: IsoTimestamp,\n label: string,\n): void {\n economyAssert(\n parseIsoTimestamp(occurredAt) >= parseIsoTimestamp(current),\n \"INVALID_TIME_WINDOW\",\n `${label} cannot precede the current state`,\n );\n}\n\n/** Validates exact arithmetic and source-lot provenance for an allowance. */\nexport function assertModuleAllowance(allowance: ModuleAllowanceV1): void {\n economyAssert(\n allowance.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n allowance.purpose === MODULE_ALLOWANCE_PURPOSE,\n \"INVALID_CONTRACT\",\n \"Unsupported Module Allowance contract\",\n );\n assertEconomyIdentifier(allowance.allowanceId, \"allowanceId\");\n assertEconomyIdentifier(allowance.householdId, \"householdId\");\n assertEconomyIdentifier(allowance.hostWalletId, \"hostWalletId\");\n assertEconomyIdentifier(allowance.allowanceWalletId, \"allowanceWalletId\");\n assertEconomyIdentifier(allowance.childAccountId, \"childAccountId\");\n economyAssert(\n allowance.hostWalletId !== allowance.allowanceWalletId,\n \"INVALID_CONTRACT\",\n \"Host and Module Allowance wallets must be distinct\",\n );\n economyAssert(\n allowance.status === \"active\" || allowance.status === \"closed\",\n \"INVALID_CONTRACT\",\n \"Module Allowance status is unsupported\",\n );\n const createdAt = parseIsoTimestamp(allowance.createdAt);\n const updatedAt = parseIsoTimestamp(allowance.updatedAt);\n economyAssert(\n updatedAt >= createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Module Allowance update cannot precede creation\",\n );\n economyAssert(\n Number.isSafeInteger(allowance.version) && allowance.version >= 1,\n \"INVALID_CONTRACT\",\n \"Module Allowance version must be a positive safe integer\",\n );\n\n const allocated = parseTokenSubunits(allowance.allocatedAmount);\n const available = parseTokenSubunits(allowance.availableAmount);\n const held = parseTokenSubunits(allowance.heldAmount);\n const spent = parseTokenSubunits(allowance.spentAmount);\n const reclaimed = parseTokenSubunits(allowance.reclaimedAmount);\n economyAssert(\n allocated > 0n &&\n [allocated, available, held, spent, reclaimed].every(\n (amount) => amount >= 0n && isWholeTokenAmount(amount),\n ),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Module Allowance amounts must be non-negative whole Tokens\",\n );\n economyAssert(\n allocated === available + held + spent + reclaimed,\n \"INVALID_CONTRACT\",\n \"Module Allowance buckets must equal its lifetime allocation\",\n );\n economyAssert(\n allowance.status !== \"closed\" || (available === 0n && held === 0n),\n \"INVALID_CONTRACT\",\n \"A closed Module Allowance cannot retain available or held value\",\n );\n\n const fundedByLot = sumSlicesByLot(allowance.fundingSlices);\n const reclaimedByLot = sumSlicesByLot(allowance.reclaimedSlices);\n economyAssert(\n sumTokenSubunits(allowance.fundingSlices.map((slice) => slice.amount)) ===\n allocated,\n \"INVALID_CONTRACT\",\n \"Module Allowance funding provenance must equal allocated value\",\n );\n economyAssert(\n sumTokenSubunits(allowance.reclaimedSlices.map((slice) => slice.amount)) ===\n reclaimed,\n \"INVALID_CONTRACT\",\n \"Module Allowance reclaim provenance must equal reclaimed value\",\n );\n for (const [lotId, amount] of reclaimedByLot) {\n economyAssert(\n amount <= (fundedByLot.get(lotId) ?? 0n),\n \"SOURCE_LOT_RESTRICTED\",\n \"Reclaimed provenance cannot exceed Module Allowance funding\",\n );\n }\n}\n\n/** Creates a child-specific Module Allowance from locked source-lot slices. */\nexport function createModuleAllowance(\n input: CreateModuleAllowanceInputV1,\n): ModuleAllowanceV1 {\n const amount = assertWholePositive(input.amount, \"Module Allowance amount\");\n assertPositiveSlices(input.fundingSlices, amount, \"Funding slices\");\n const allowance: ModuleAllowanceV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n purpose: MODULE_ALLOWANCE_PURPOSE,\n allowanceId: input.allowanceId,\n householdId: input.householdId,\n hostWalletId: input.hostWalletId,\n allowanceWalletId: input.allowanceWalletId,\n childAccountId: input.childAccountId,\n status: \"active\",\n allocatedAmount: input.amount,\n availableAmount: input.amount,\n heldAmount: serializeTokenSubunits(0n),\n spentAmount: serializeTokenSubunits(0n),\n reclaimedAmount: serializeTokenSubunits(0n),\n fundingSlices: input.fundingSlices,\n reclaimedSlices: [],\n version: 1,\n createdAt: input.occurredAt,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(allowance);\n return allowance;\n}\n\n/** Adds Guardian-selected source-lot value without replacing prior history. */\nexport function fundModuleAllowance(\n allowance: ModuleAllowanceV1,\n input: FundModuleAllowanceInputV1,\n): ModuleAllowanceV1 {\n assertModuleAllowance(allowance);\n economyAssert(\n allowance.status === \"active\" && allowance.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Module Allowance is closed or its optimistic version is stale\",\n );\n assertUpdatedAt(allowance.updatedAt, input.occurredAt, \"Funding time\");\n const amount = assertWholePositive(input.amount, \"Module Allowance funding\");\n assertPositiveSlices(input.fundingSlices, amount, \"Funding slices\");\n const next: ModuleAllowanceV1 = {\n ...allowance,\n allocatedAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.allocatedAmount) + amount,\n ),\n availableAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.availableAmount) + amount,\n ),\n fundingSlices: [...allowance.fundingSlices, ...input.fundingSlices],\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(next);\n return next;\n}\n\n/** Returns unused value to its source lots without changing spent history. */\nexport function reclaimModuleAllowance(\n allowance: ModuleAllowanceV1,\n input: ReclaimModuleAllowanceInputV1,\n): ModuleAllowanceV1 {\n assertModuleAllowance(allowance);\n economyAssert(\n allowance.status === \"active\" && allowance.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Module Allowance is closed or its optimistic version is stale\",\n );\n assertUpdatedAt(allowance.updatedAt, input.occurredAt, \"Reclaim time\");\n const amount = assertWholePositive(input.amount, \"Module Allowance reclaim\");\n economyAssert(\n amount <= parseTokenSubunits(allowance.availableAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Cannot reclaim held, spent, or unavailable Module Allowance value\",\n );\n assertPositiveSlices(input.sourceSlices, amount, \"Reclaim slices\");\n const fundedLotIds = new Set(\n allowance.fundingSlices.map((slice) => slice.lotId),\n );\n economyAssert(\n input.sourceSlices.every((slice) => fundedLotIds.has(slice.lotId)),\n \"SOURCE_LOT_RESTRICTED\",\n \"Reclaim slices must originate from the Module Allowance\",\n );\n const next: ModuleAllowanceV1 = {\n ...allowance,\n availableAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.availableAmount) - amount,\n ),\n reclaimedAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.reclaimedAmount) + amount,\n ),\n reclaimedSlices: [...allowance.reclaimedSlices, ...input.sourceSlices],\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(next);\n return next;\n}\n\n/** Closes an empty allowance; funding later requires a new allowance. */\nexport function closeModuleAllowance(\n allowance: ModuleAllowanceV1,\n input: CloseModuleAllowanceInputV1,\n): ModuleAllowanceV1 {\n assertModuleAllowance(allowance);\n economyAssert(\n allowance.status === \"active\" && allowance.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Module Allowance is closed or its optimistic version is stale\",\n );\n assertUpdatedAt(allowance.updatedAt, input.occurredAt, \"Closure time\");\n economyAssert(\n parseTokenSubunits(allowance.availableAmount) === 0n &&\n parseTokenSubunits(allowance.heldAmount) === 0n,\n \"INVALID_CONTRACT\",\n \"Available value must be reclaimed and holds resolved before closure\",\n );\n const next: ModuleAllowanceV1 = {\n ...allowance,\n status: \"closed\",\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(next);\n return next;\n}\n\n/** Validates immutable price, Guardian acknowledgement, and manifest evidence. */\nexport function assertModuleSpendQuote(quote: ModuleSpendQuoteV1): void {\n economyAssert(\n quote.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported module-spend quote contract version\",\n );\n assertEconomyIdentifier(quote.quoteId, \"quoteId\");\n assertEconomyIdentifier(quote.allowanceId, \"allowanceId\");\n assertEconomyIdentifier(quote.householdId, \"householdId\");\n assertEconomyIdentifier(quote.guardianAccountId, \"guardianAccountId\");\n assertEconomyIdentifier(quote.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(quote.moduleVersionId, \"moduleVersionId\");\n assertEconomyIdentifier(quote.catalogVersion, \"catalogVersion\");\n assertEconomyIdentifier(\n quote.requirementsManifestVersion,\n \"requirementsManifestVersion\",\n );\n assertSha256Reference(\n quote.requirementsManifestHash,\n \"Requirements manifest hash\",\n );\n assertWholePositive(quote.amount, \"Module price\");\n const acknowledgedAt = parseIsoTimestamp(quote.requirementsAcknowledgedAt);\n const issuedAt = parseIsoTimestamp(quote.issuedAt);\n const expiresAt = parseIsoTimestamp(quote.expiresAt);\n economyAssert(\n acknowledgedAt <= issuedAt && expiresAt > issuedAt,\n \"INVALID_TIME_WINDOW\",\n \"Requirements must be acknowledged before a bounded quote is issued\",\n );\n}\n\n/** Creates immutable quote evidence from server-derived catalog facts. */\nexport function createModuleSpendQuote(\n input: CreateModuleSpendQuoteInputV1,\n): ModuleSpendQuoteV1 {\n const quote: ModuleSpendQuoteV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n ...input,\n };\n assertModuleSpendQuote(quote);\n return quote;\n}\n\n/** Validates one quote-bound hold lifecycle projection. */\nexport function assertModuleSpendHold(hold: ModuleSpendHoldV1): void {\n economyAssert(\n hold.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported module-spend hold contract version\",\n );\n assertEconomyIdentifier(hold.holdId, \"holdId\");\n assertEconomyIdentifier(hold.quoteId, \"quoteId\");\n assertEconomyIdentifier(hold.allowanceId, \"allowanceId\");\n assertEconomyIdentifier(hold.householdId, \"householdId\");\n assertEconomyIdentifier(hold.guardianAccountId, \"guardianAccountId\");\n assertEconomyIdentifier(hold.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(hold.moduleVersionId, \"moduleVersionId\");\n assertEconomyIdentifier(\n hold.requirementsManifestVersion,\n \"requirementsManifestVersion\",\n );\n assertSha256Reference(\n hold.requirementsManifestHash,\n \"Requirements manifest hash\",\n );\n assertEconomyIdentifier(hold.holdIdempotencyKey, \"holdIdempotencyKey\");\n const amount = assertWholePositive(hold.amount, \"Module hold amount\");\n assertPositiveSlices(hold.sourceSlices, amount, \"Hold source slices\");\n economyAssert(\n [\"held\", \"settled\", \"released\"].includes(hold.status),\n \"INVALID_CONTRACT\",\n \"Module hold status is unsupported\",\n );\n economyAssert(\n Number.isSafeInteger(hold.version) && hold.version >= 1,\n \"INVALID_CONTRACT\",\n \"Module hold version must be a positive safe integer\",\n );\n const createdAt = parseIsoTimestamp(hold.createdAt);\n const expiresAt = parseIsoTimestamp(hold.expiresAt);\n const updatedAt = parseIsoTimestamp(hold.updatedAt);\n economyAssert(\n expiresAt > createdAt && updatedAt >= createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Module hold requires a bounded lifetime and ordered updates\",\n );\n\n if (hold.status === \"held\") {\n economyAssert(\n hold.entitlementId === undefined &&\n hold.settlementTransactionId === undefined &&\n hold.releaseTransactionId === undefined &&\n hold.settlementIdempotencyKey === undefined &&\n hold.releaseIdempotencyKey === undefined,\n \"INVALID_CONTRACT\",\n \"An unsettled hold cannot claim an entitlement or final transaction\",\n );\n } else if (hold.status === \"settled\") {\n economyAssert(\n hold.entitlementId !== undefined &&\n hold.settlementTransactionId !== undefined &&\n hold.settlementIdempotencyKey !== undefined &&\n hold.releaseTransactionId === undefined &&\n hold.releaseIdempotencyKey === undefined,\n \"INVALID_CONTRACT\",\n \"A settled hold requires entitlement and transaction evidence\",\n );\n assertEconomyIdentifier(hold.entitlementId, \"entitlementId\");\n assertEconomyIdentifier(\n hold.settlementTransactionId,\n \"settlementTransactionId\",\n );\n assertEconomyIdentifier(\n hold.settlementIdempotencyKey,\n \"settlementIdempotencyKey\",\n );\n } else {\n economyAssert(\n hold.entitlementId === undefined &&\n hold.settlementTransactionId === undefined &&\n hold.settlementIdempotencyKey === undefined &&\n hold.releaseTransactionId !== undefined &&\n hold.releaseIdempotencyKey !== undefined,\n \"INVALID_CONTRACT\",\n \"A released hold requires release evidence only\",\n );\n assertEconomyIdentifier(hold.releaseTransactionId, \"releaseTransactionId\");\n assertEconomyIdentifier(hold.releaseIdempotencyKey, \"releaseIdempotencyKey\");\n }\n}\n\nfunction assertAllowanceMatchesQuote(\n allowance: ModuleAllowanceV1,\n quote: ModuleSpendQuoteV1,\n): void {\n economyAssert(\n allowance.status === \"active\" &&\n allowance.allowanceId === quote.allowanceId &&\n allowance.householdId === quote.householdId &&\n allowance.childAccountId === quote.childAccountId,\n \"INVALID_CONTRACT\",\n \"Module quote does not belong to this active child allowance\",\n );\n}\n\nfunction assertAllowanceMatchesHold(\n allowance: ModuleAllowanceV1,\n hold: ModuleSpendHoldV1,\n): void {\n economyAssert(\n allowance.status === \"active\" &&\n allowance.allowanceId === hold.allowanceId &&\n allowance.householdId === hold.householdId &&\n allowance.childAccountId === hold.childAccountId,\n \"INVALID_CONTRACT\",\n \"Module hold does not belong to this active child allowance\",\n );\n}\n\n/** Moves quoted value from available to held after all bindings are checked. */\nexport function createModuleSpendHold(\n allowance: ModuleAllowanceV1,\n quote: ModuleSpendQuoteV1,\n input: CreateModuleSpendHoldInputV1,\n): ModuleSpendTransitionResultV1 {\n assertModuleAllowance(allowance);\n assertModuleSpendQuote(quote);\n assertAllowanceMatchesQuote(allowance, quote);\n economyAssert(\n allowance.version === input.expectedAllowanceVersion,\n \"INVALID_CONTRACT\",\n \"Module Allowance optimistic version is stale\",\n );\n const occurredAt = parseIsoTimestamp(input.occurredAt);\n economyAssert(\n occurredAt >= parseIsoTimestamp(allowance.updatedAt) &&\n occurredAt >= parseIsoTimestamp(quote.issuedAt) &&\n occurredAt < parseIsoTimestamp(quote.expiresAt),\n \"INVALID_TIME_WINDOW\",\n \"Module quote is not valid at hold time\",\n );\n const amount = parseTokenSubunits(quote.amount);\n economyAssert(\n amount <= parseTokenSubunits(allowance.availableAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Module Allowance has insufficient available value\",\n );\n assertEconomyIdentifier(input.holdId, \"holdId\");\n assertEconomyIdentifier(input.idempotencyKey, \"idempotencyKey\");\n assertPositiveSlices(input.sourceSlices, amount, \"Hold source slices\");\n const fundedLotIds = new Set(\n allowance.fundingSlices.map((slice) => slice.lotId),\n );\n economyAssert(\n input.sourceSlices.every((slice) => fundedLotIds.has(slice.lotId)),\n \"SOURCE_LOT_RESTRICTED\",\n \"Hold slices must originate from the Module Allowance\",\n );\n\n const nextAllowance: ModuleAllowanceV1 = {\n ...allowance,\n availableAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.availableAmount) - amount,\n ),\n heldAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.heldAmount) + amount,\n ),\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n const hold: ModuleSpendHoldV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n holdId: input.holdId,\n quoteId: quote.quoteId,\n allowanceId: quote.allowanceId,\n householdId: quote.householdId,\n guardianAccountId: quote.guardianAccountId,\n childAccountId: quote.childAccountId,\n moduleVersionId: quote.moduleVersionId,\n amount: quote.amount,\n requirementsManifestVersion: quote.requirementsManifestVersion,\n requirementsManifestHash: quote.requirementsManifestHash,\n sourceSlices: input.sourceSlices,\n status: \"held\",\n holdIdempotencyKey: input.idempotencyKey,\n version: 1,\n createdAt: input.occurredAt,\n expiresAt: quote.expiresAt,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(nextAllowance);\n assertModuleSpendHold(hold);\n return { allowance: nextAllowance, hold };\n}\n\n/** Settles a hold only when the pending learning entitlement is identified. */\nexport function settleModuleSpendHold(\n allowance: ModuleAllowanceV1,\n hold: ModuleSpendHoldV1,\n input: SettleModuleSpendHoldInputV1,\n): ModuleSpendTransitionResultV1 {\n assertModuleAllowance(allowance);\n assertModuleSpendHold(hold);\n assertAllowanceMatchesHold(allowance, hold);\n economyAssert(\n hold.status === \"held\" &&\n allowance.version === input.expectedAllowanceVersion &&\n hold.version === input.expectedHoldVersion,\n \"INVALID_CONTRACT\",\n \"Module hold is final or an optimistic version is stale\",\n );\n assertEconomyIdentifier(input.entitlementId, \"entitlementId\");\n assertEconomyIdentifier(\n input.settlementTransactionId,\n \"settlementTransactionId\",\n );\n assertEconomyIdentifier(input.idempotencyKey, \"idempotencyKey\");\n const occurredAt = parseIsoTimestamp(input.occurredAt);\n economyAssert(\n occurredAt >= parseIsoTimestamp(allowance.updatedAt) &&\n occurredAt >= parseIsoTimestamp(hold.updatedAt) &&\n occurredAt < parseIsoTimestamp(hold.expiresAt),\n \"INVALID_TIME_WINDOW\",\n \"Module hold cannot settle outside its valid lifetime\",\n );\n const amount = parseTokenSubunits(hold.amount);\n economyAssert(\n amount <= parseTokenSubunits(allowance.heldAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Module Allowance does not contain the quoted held value\",\n );\n const nextAllowance: ModuleAllowanceV1 = {\n ...allowance,\n heldAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.heldAmount) - amount,\n ),\n spentAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.spentAmount) + amount,\n ),\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n const nextHold: ModuleSpendHoldV1 = {\n ...hold,\n status: \"settled\",\n settlementIdempotencyKey: input.idempotencyKey,\n entitlementId: input.entitlementId,\n settlementTransactionId: input.settlementTransactionId,\n version: hold.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(nextAllowance);\n assertModuleSpendHold(nextHold);\n return { allowance: nextAllowance, hold: nextHold };\n}\n\n/** Releases failed or expired held value back to the same allowance. */\nexport function releaseModuleSpendHold(\n allowance: ModuleAllowanceV1,\n hold: ModuleSpendHoldV1,\n input: ReleaseModuleSpendHoldInputV1,\n): ModuleSpendTransitionResultV1 {\n assertModuleAllowance(allowance);\n assertModuleSpendHold(hold);\n assertAllowanceMatchesHold(allowance, hold);\n economyAssert(\n hold.status === \"held\" &&\n allowance.version === input.expectedAllowanceVersion &&\n hold.version === input.expectedHoldVersion,\n \"INVALID_CONTRACT\",\n \"Module hold is final or an optimistic version is stale\",\n );\n assertEconomyIdentifier(input.releaseTransactionId, \"releaseTransactionId\");\n assertEconomyIdentifier(input.idempotencyKey, \"idempotencyKey\");\n const occurredAt = parseIsoTimestamp(input.occurredAt);\n economyAssert(\n occurredAt >= parseIsoTimestamp(allowance.updatedAt) &&\n occurredAt >= parseIsoTimestamp(hold.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Module hold release cannot precede its current state\",\n );\n const amount = parseTokenSubunits(hold.amount);\n economyAssert(\n amount <= parseTokenSubunits(allowance.heldAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Module Allowance does not contain the quoted held value\",\n );\n const nextAllowance: ModuleAllowanceV1 = {\n ...allowance,\n availableAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.availableAmount) + amount,\n ),\n heldAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.heldAmount) - amount,\n ),\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n const nextHold: ModuleSpendHoldV1 = {\n ...hold,\n status: \"released\",\n releaseIdempotencyKey: input.idempotencyKey,\n releaseTransactionId: input.releaseTransactionId,\n version: hold.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(nextAllowance);\n assertModuleSpendHold(nextHold);\n return { allowance: nextAllowance, hold: nextHold };\n}\n\n/** Validates a durable receipt against settled economic evidence. */\nexport function assertModulePurchaseReceipt(\n receipt: ModulePurchaseReceiptV1,\n): void {\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported module-purchase receipt contract version\",\n );\n assertEconomyIdentifier(receipt.receiptId, \"receiptId\");\n assertEconomyIdentifier(receipt.quoteId, \"quoteId\");\n assertEconomyIdentifier(receipt.holdId, \"holdId\");\n assertEconomyIdentifier(receipt.allowanceId, \"allowanceId\");\n assertEconomyIdentifier(receipt.householdId, \"householdId\");\n assertEconomyIdentifier(receipt.guardianAccountId, \"guardianAccountId\");\n assertEconomyIdentifier(receipt.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(receipt.moduleVersionId, \"moduleVersionId\");\n assertEconomyIdentifier(receipt.entitlementId, \"entitlementId\");\n assertEconomyIdentifier(\n receipt.requirementsManifestVersion,\n \"requirementsManifestVersion\",\n );\n assertSha256Reference(\n receipt.requirementsManifestHash,\n \"Requirements manifest hash\",\n );\n assertEconomyIdentifier(\n receipt.settlementTransactionId,\n \"settlementTransactionId\",\n );\n assertWholePositive(receipt.amount, \"Receipt amount\");\n parseIsoTimestamp(receipt.issuedAt);\n}\n\n/** Creates a receipt only when quote and settled hold evidence match exactly. */\nexport function createModulePurchaseReceipt(\n quote: ModuleSpendQuoteV1,\n hold: ModuleSpendHoldV1,\n input: CreateModulePurchaseReceiptInputV1,\n): ModulePurchaseReceiptV1 {\n assertModuleSpendQuote(quote);\n assertModuleSpendHold(hold);\n economyAssert(\n hold.status === \"settled\" &&\n hold.quoteId === quote.quoteId &&\n hold.allowanceId === quote.allowanceId &&\n hold.householdId === quote.householdId &&\n hold.guardianAccountId === quote.guardianAccountId &&\n hold.childAccountId === quote.childAccountId &&\n hold.moduleVersionId === quote.moduleVersionId &&\n hold.amount === quote.amount &&\n hold.requirementsManifestVersion === quote.requirementsManifestVersion &&\n hold.requirementsManifestHash === quote.requirementsManifestHash,\n \"INVALID_CONTRACT\",\n \"Receipt quote and settled hold evidence do not match\",\n );\n economyAssert(\n parseIsoTimestamp(input.issuedAt) >= parseIsoTimestamp(hold.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Receipt cannot precede settlement\",\n );\n const receipt: ModulePurchaseReceiptV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n receiptId: input.receiptId,\n quoteId: quote.quoteId,\n holdId: hold.holdId,\n allowanceId: quote.allowanceId,\n householdId: quote.householdId,\n guardianAccountId: quote.guardianAccountId,\n childAccountId: quote.childAccountId,\n moduleVersionId: quote.moduleVersionId,\n entitlementId: hold.entitlementId!,\n amount: quote.amount,\n requirementsManifestVersion: quote.requirementsManifestVersion,\n requirementsManifestHash: quote.requirementsManifestHash,\n settlementTransactionId: hold.settlementTransactionId!,\n issuedAt: input.issuedAt,\n };\n assertModulePurchaseReceipt(receipt);\n return receipt;\n}\n\n/** Validates privacy-minimized cross-service reconciliation evidence. */\nexport function assertModulePurchaseReconciliationObservation(\n observation: ModulePurchaseReconciliationObservationV1,\n): void {\n economyAssert(\n observation.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported module-purchase reconciliation contract version\",\n );\n assertEconomyIdentifier(observation.quoteId, \"quoteId\");\n assertEconomyIdentifier(observation.holdId, \"holdId\");\n assertEconomyIdentifier(observation.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(observation.moduleVersionId, \"moduleVersionId\");\n economyAssert(\n [\"missing\", \"held\", \"settled\", \"released\"].includes(\n observation.financialState,\n ),\n \"INVALID_CONTRACT\",\n \"Reconciliation financial state is unsupported\",\n );\n economyAssert(\n [\"missing\", \"pending\", \"active\", \"cancelled\"].includes(\n observation.entitlementState,\n ),\n \"INVALID_CONTRACT\",\n \"Reconciliation entitlement state is unsupported\",\n );\n economyAssert(\n typeof observation.receiptPresent === \"boolean\",\n \"INVALID_CONTRACT\",\n \"Receipt presence must be Boolean\",\n );\n parseIsoTimestamp(observation.observedAt);\n}\n\nfunction reconciliationResult(\n action: ModulePurchaseReconciliationActionV1,\n reasonCode: string,\n blocking = false,\n consistent = false,\n): ModulePurchaseReconciliationResultV1 {\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n action,\n blocking,\n consistent,\n reasonCode,\n };\n}\n\n/**\n * Returns one forward-safe action. Callers must reload and lock authoritative\n * state before carrying it out; `manual-review` never authorizes a mutation.\n */\nexport function reconcileModulePurchase(\n observation: ModulePurchaseReconciliationObservationV1,\n): ModulePurchaseReconciliationResultV1 {\n assertModulePurchaseReconciliationObservation(observation);\n const { financialState, entitlementState, receiptPresent } = observation;\n\n if (receiptPresent && !(financialState === \"settled\" && entitlementState === \"active\")) {\n return reconciliationResult(\n \"manual-review\",\n \"receipt-conflicts-with-authoritative-state\",\n true,\n );\n }\n if (financialState === \"settled\" && entitlementState === \"active\") {\n return receiptPresent\n ? reconciliationResult(\"none\", \"purchase-consistent\", false, true)\n : reconciliationResult(\"issue-receipt\", \"settled-active-receipt-missing\");\n }\n if (financialState === \"held\" && entitlementState === \"pending\") {\n return reconciliationResult(\"resume-settlement\", \"held-pending\");\n }\n if (\n financialState === \"held\" &&\n (entitlementState === \"missing\" || entitlementState === \"cancelled\")\n ) {\n return reconciliationResult(\"release-hold\", \"held-without-usable-entitlement\");\n }\n if (financialState === \"settled\" && entitlementState === \"pending\") {\n return reconciliationResult(\"activate-entitlement\", \"settled-pending\");\n }\n if (\n (financialState === \"missing\" || financialState === \"released\") &&\n entitlementState === \"pending\"\n ) {\n return reconciliationResult(\n \"cancel-pending-entitlement\",\n \"pending-without-settlement-path\",\n );\n }\n if (\n (financialState === \"missing\" || financialState === \"released\") &&\n (entitlementState === \"missing\" || entitlementState === \"cancelled\")\n ) {\n return reconciliationResult(\"none\", \"no-active-purchase\", false, true);\n }\n return reconciliationResult(\n \"manual-review\",\n financialState === \"settled\"\n ? \"settled-debit-without-entitlement\"\n : \"active-entitlement-without-settled-debit\",\n true,\n );\n}\n","import { parseTokenSubunits, type TokenSubunitString } from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type AdjustmentStatus =\n | \"draft\"\n | \"pending-approval\"\n | \"approved\"\n | \"rejected\"\n | \"executed\"\n | \"expired\";\n\n/** Dual-control request; the resulting change is always a ledger transaction. */\nexport interface AdjustmentRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly adjustmentId: string;\n readonly walletId: WalletId;\n readonly amount: TokenSubunitString;\n readonly reason: string;\n readonly ticketReference: string;\n readonly status: AdjustmentStatus;\n readonly initiatedByAccountId: AccountId;\n readonly initiatedAt: IsoTimestamp;\n readonly approvedByAccountId?: AccountId;\n readonly approvedAt?: IsoTimestamp;\n readonly resultingTransactionId?: TransactionId;\n}\n\n/** Proves that production adjustment approval was performed by another actor. */\nexport function assertDistinctAdjustmentApproval(\n request: AdjustmentRequestV1,\n): void {\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported adjustment contract version\",\n );\n assertEconomyIdentifier(request.adjustmentId, \"adjustmentId\");\n assertEconomyIdentifier(request.walletId, \"walletId\");\n assertEconomyIdentifier(request.initiatedByAccountId, \"initiatedByAccountId\");\n economyAssert(\n parseTokenSubunits(request.amount) !== 0n,\n \"INVALID_AMOUNT\",\n \"Adjustment amount cannot be zero\",\n );\n economyAssert(\n request.reason.trim().length > 0 && request.reason.length <= 512,\n \"INVALID_CONTRACT\",\n \"Adjustment reason is required and must be bounded\",\n );\n assertEconomyIdentifier(request.ticketReference, \"ticketReference\");\n const initiatedAt = parseIsoTimestamp(request.initiatedAt);\n economyAssert(\n request.approvedByAccountId !== undefined &&\n request.approvedByAccountId !== request.initiatedByAccountId,\n \"INVALID_CONTRACT\",\n \"Adjustment approval requires a distinct authorized operator\",\n );\n assertEconomyIdentifier(request.approvedByAccountId, \"approvedByAccountId\");\n economyAssert(\n request.approvedAt !== undefined &&\n parseIsoTimestamp(request.approvedAt) >= initiatedAt,\n \"INVALID_TIME_WINDOW\",\n \"Adjustment approval time must follow initiation\",\n );\n economyAssert(\n request.status === \"approved\" || request.status === \"executed\",\n \"INVALID_CONTRACT\",\n \"Only approved adjustments satisfy dual-control approval\",\n );\n if (request.resultingTransactionId !== undefined) {\n assertEconomyIdentifier(\n request.resultingTransactionId,\n \"resultingTransactionId\",\n );\n }\n}\n","import { parseTokenSubunits, type TokenSubunitString } from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type LotId,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { LotTransferPolicy } from \"./lots.js\";\n\nexport type OperatorAdjustmentOperationV1 = \"credit\" | \"reverse-credit\";\n\nexport type OperatorAdjustmentTargetComponentV1 =\n | \"personal\"\n | \"household-treasury\";\n\nexport type OperatorAdjustmentRefundPolicyV1 = \"not-refundable\";\n\nexport type OperatorAdjustmentDecisionKindV1 = \"approve\" | \"reject\";\n\nexport type OperatorAdjustmentProposalStatusV1 = \"pending-approval\";\n\nexport type OperatorAdjustmentFailureCodeV1 =\n | \"ADJUSTMENT_DISABLED\"\n | \"ADJUSTMENT_OWNER_REQUIRED\"\n | \"ADJUSTMENT_CAPABILITY_DENIED\"\n | \"ADJUSTMENT_STEP_UP_REQUIRED\"\n | \"ADJUSTMENT_TARGET_UNAVAILABLE\"\n | \"ADJUSTMENT_SELF_APPROVAL\"\n | \"ADJUSTMENT_EXPIRED\"\n | \"ADJUSTMENT_PREVIEW_MISMATCH\"\n | \"ADJUSTMENT_ALREADY_DECIDED\"\n | \"ADJUSTMENT_ALREADY_EXECUTED\"\n | \"ADJUSTMENT_NOT_APPROVED\"\n | \"ADJUSTMENT_REVERSAL_UNAVAILABLE\";\n\n/**\n * Immutable server-prepared value plan shown to both adjustment operators.\n *\n * Callers may request an account and component, but only a trusted adapter may\n * resolve the wallet, ledger accounts and deterministic source lot recorded\n * here. Browser or MCP supplied wallet and ledger identifiers are never input\n * authority.\n */\nexport interface OperatorAdjustmentPreviewV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly previewId: string;\n readonly adjustmentId: string;\n readonly operation: OperatorAdjustmentOperationV1;\n readonly targetAccountId: AccountId;\n readonly targetComponent: OperatorAdjustmentTargetComponentV1;\n readonly targetWalletId: WalletId;\n readonly targetLedgerAccountId: AccountId;\n readonly offsetLedgerAccountId: AccountId;\n readonly sourceLotId: LotId;\n /** Positive magnitude. Reversals carry direction in `operation`. */\n readonly amount: TokenSubunitString;\n readonly reasonCode: string;\n /** SHA-256 of an adapter-owned, bounded ticket reference. */\n readonly ticketReferenceHash: string;\n readonly transferPolicy: LotTransferPolicy;\n readonly refundPolicy: OperatorAdjustmentRefundPolicyV1;\n readonly originalSourceLotId?: LotId;\n readonly originalTransactionId?: TransactionId;\n readonly preparedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n}\n\n/** Immutable first-operator proposal bound to the exact prepared preview. */\nexport interface OperatorAdjustmentProposalV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly proposalId: string;\n readonly adjustmentId: string;\n readonly previewHash: string;\n readonly status: OperatorAdjustmentProposalStatusV1;\n readonly proposedByAccountId: AccountId;\n readonly proposedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n}\n\n/** Immutable second-operator decision bound to the exact preview hash. */\nexport interface OperatorAdjustmentDecisionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly decisionId: string;\n readonly adjustmentId: string;\n readonly proposalId: string;\n readonly proposalHash: string;\n readonly previewHash: string;\n readonly decision: OperatorAdjustmentDecisionKindV1;\n readonly proposedByAccountId: AccountId;\n readonly decidedByAccountId: AccountId;\n readonly proposedAt: IsoTimestamp;\n readonly decidedAt: IsoTimestamp;\n}\n\n/** Immutable result edge linking an approved plan to its ledger transaction. */\nexport interface OperatorAdjustmentExecutionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly executionId: string;\n readonly adjustmentId: string;\n readonly previewHash: string;\n readonly proposalHash: string;\n readonly decisionHash: string;\n readonly sourceLotId: LotId;\n readonly transactionId: TransactionId;\n readonly resultReceiptId: string;\n readonly executedAt: IsoTimestamp;\n}\n\nconst PREVIEW_KEYS = new Set([\n \"schemaVersion\",\n \"previewId\",\n \"adjustmentId\",\n \"operation\",\n \"targetAccountId\",\n \"targetComponent\",\n \"targetWalletId\",\n \"targetLedgerAccountId\",\n \"offsetLedgerAccountId\",\n \"sourceLotId\",\n \"amount\",\n \"reasonCode\",\n \"ticketReferenceHash\",\n \"transferPolicy\",\n \"refundPolicy\",\n \"originalSourceLotId\",\n \"originalTransactionId\",\n \"preparedAt\",\n \"expiresAt\",\n]);\nconst DECISION_KEYS = new Set([\n \"schemaVersion\",\n \"decisionId\",\n \"adjustmentId\",\n \"proposalId\",\n \"proposalHash\",\n \"previewHash\",\n \"decision\",\n \"proposedByAccountId\",\n \"decidedByAccountId\",\n \"proposedAt\",\n \"decidedAt\",\n]);\nconst PROPOSAL_KEYS = new Set([\n \"schemaVersion\",\n \"proposalId\",\n \"adjustmentId\",\n \"previewHash\",\n \"status\",\n \"proposedByAccountId\",\n \"proposedAt\",\n \"expiresAt\",\n]);\nconst EXECUTION_KEYS = new Set([\n \"schemaVersion\",\n \"executionId\",\n \"adjustmentId\",\n \"previewHash\",\n \"proposalHash\",\n \"decisionHash\",\n \"sourceLotId\",\n \"transactionId\",\n \"resultReceiptId\",\n \"executedAt\",\n]);\nconst OPERATIONS = new Set<OperatorAdjustmentOperationV1>([\n \"credit\",\n \"reverse-credit\",\n]);\nconst TARGET_COMPONENTS = new Set<OperatorAdjustmentTargetComponentV1>([\n \"personal\",\n \"household-treasury\",\n]);\nconst TRANSFER_POLICIES = new Set<LotTransferPolicy>([\n \"household-allocatable\",\n \"same-user-only\",\n \"non-transferable\",\n]);\nconst DECISIONS = new Set<OperatorAdjustmentDecisionKindV1>([\n \"approve\",\n \"reject\",\n]);\n\nfunction assertExactKeys(\n value: object,\n allowed: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowed.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported field`,\n );\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction assertReasonCode(reasonCode: string): void {\n economyAssert(\n /^[A-Z][A-Z0-9_]{2,95}$/u.test(reasonCode),\n \"INVALID_CONTRACT\",\n \"Adjustment reasonCode must be a bounded uppercase identifier\",\n );\n}\n\n/** Validates one exact, positive and privacy-minimized operator value plan. */\nexport function assertOperatorAdjustmentPreview(\n preview: OperatorAdjustmentPreviewV1,\n): void {\n assertExactKeys(preview, PREVIEW_KEYS, \"Operator adjustment preview\");\n economyAssert(\n preview.schemaVersion === ECONOMY_CONTRACT_VERSION\n && OPERATIONS.has(preview.operation)\n && TARGET_COMPONENTS.has(preview.targetComponent)\n && TRANSFER_POLICIES.has(preview.transferPolicy)\n && preview.refundPolicy === \"not-refundable\",\n \"INVALID_CONTRACT\",\n \"Unsupported operator adjustment preview\",\n );\n assertEconomyIdentifier(preview.previewId, \"previewId\");\n assertEconomyIdentifier(preview.adjustmentId, \"adjustmentId\");\n assertEconomyIdentifier(preview.targetAccountId, \"targetAccountId\");\n assertEconomyIdentifier(preview.targetWalletId, \"targetWalletId\");\n assertEconomyIdentifier(\n preview.targetLedgerAccountId,\n \"targetLedgerAccountId\",\n );\n assertEconomyIdentifier(\n preview.offsetLedgerAccountId,\n \"offsetLedgerAccountId\",\n );\n assertEconomyIdentifier(preview.sourceLotId, \"sourceLotId\");\n economyAssert(\n parseTokenSubunits(preview.amount) > 0n,\n \"INVALID_AMOUNT\",\n \"Operator adjustment amount must be positive\",\n );\n assertReasonCode(preview.reasonCode);\n assertCanonicalHash(preview.ticketReferenceHash, \"ticketReferenceHash\");\n const preparedAt = parseIsoTimestamp(preview.preparedAt);\n const expiresAt = parseIsoTimestamp(preview.expiresAt);\n economyAssert(\n expiresAt > preparedAt,\n \"INVALID_TIME_WINDOW\",\n \"Operator adjustment preview must expire after preparation\",\n );\n\n if (preview.operation === \"credit\") {\n economyAssert(\n preview.originalSourceLotId === undefined\n && preview.originalTransactionId === undefined,\n \"INVALID_CONTRACT\",\n \"A credit preview cannot bind an original transaction\",\n );\n return;\n }\n\n economyAssert(\n preview.originalSourceLotId !== undefined\n && preview.originalTransactionId !== undefined,\n \"INVALID_CONTRACT\",\n \"A reversal preview must bind the original lot and transaction\",\n );\n assertEconomyIdentifier(preview.originalSourceLotId, \"originalSourceLotId\");\n assertEconomyIdentifier(\n preview.originalTransactionId,\n \"originalTransactionId\",\n );\n}\n\n/** Canonical preview bytes for an approved SHA-256 adapter. */\nexport function canonicalOperatorAdjustmentPreviewPayload(\n preview: OperatorAdjustmentPreviewV1,\n): string {\n assertOperatorAdjustmentPreview(preview);\n return JSON.stringify({\n schemaVersion: preview.schemaVersion,\n previewId: preview.previewId,\n adjustmentId: preview.adjustmentId,\n operation: preview.operation,\n targetAccountId: preview.targetAccountId,\n targetComponent: preview.targetComponent,\n targetWalletId: preview.targetWalletId,\n targetLedgerAccountId: preview.targetLedgerAccountId,\n offsetLedgerAccountId: preview.offsetLedgerAccountId,\n sourceLotId: preview.sourceLotId,\n amount: preview.amount,\n reasonCode: preview.reasonCode,\n ticketReferenceHash: preview.ticketReferenceHash,\n transferPolicy: preview.transferPolicy,\n refundPolicy: preview.refundPolicy,\n ...(preview.originalSourceLotId === undefined\n ? {}\n : { originalSourceLotId: preview.originalSourceLotId }),\n ...(preview.originalTransactionId === undefined\n ? {}\n : { originalTransactionId: preview.originalTransactionId }),\n preparedAt: preview.preparedAt,\n expiresAt: preview.expiresAt,\n });\n}\n\n/** Validates a pending proposal against the exact server-prepared preview. */\nexport function assertOperatorAdjustmentProposal(\n proposal: OperatorAdjustmentProposalV1,\n preview: OperatorAdjustmentPreviewV1,\n expectedPreviewHash: string,\n): void {\n assertOperatorAdjustmentPreview(preview);\n assertCanonicalHash(expectedPreviewHash, \"expectedPreviewHash\");\n assertExactKeys(proposal, PROPOSAL_KEYS, \"Operator adjustment proposal\");\n economyAssert(\n proposal.schemaVersion === ECONOMY_CONTRACT_VERSION\n && proposal.status === \"pending-approval\",\n \"INVALID_CONTRACT\",\n \"Unsupported operator adjustment proposal\",\n );\n assertEconomyIdentifier(proposal.proposalId, \"proposalId\");\n assertEconomyIdentifier(proposal.adjustmentId, \"adjustmentId\");\n assertCanonicalHash(proposal.previewHash, \"previewHash\");\n assertEconomyIdentifier(\n proposal.proposedByAccountId,\n \"proposedByAccountId\",\n );\n economyAssert(\n proposal.adjustmentId === preview.adjustmentId\n && proposal.previewHash === expectedPreviewHash,\n \"ADJUSTMENT_PREVIEW_MISMATCH\",\n \"Operator adjustment proposal does not match its preview\",\n );\n const proposedAt = parseIsoTimestamp(proposal.proposedAt);\n const expiresAt = parseIsoTimestamp(proposal.expiresAt);\n economyAssert(\n proposedAt >= parseIsoTimestamp(preview.preparedAt)\n && expiresAt === parseIsoTimestamp(preview.expiresAt)\n && expiresAt > proposedAt,\n \"INVALID_TIME_WINDOW\",\n \"Operator adjustment proposal times are inconsistent\",\n );\n}\n\n/** Canonical proposal bytes for the immutable pending-approval fact. */\nexport function canonicalOperatorAdjustmentProposalPayload(\n proposal: OperatorAdjustmentProposalV1,\n): string {\n assertExactKeys(proposal, PROPOSAL_KEYS, \"Operator adjustment proposal\");\n return JSON.stringify({\n schemaVersion: proposal.schemaVersion,\n proposalId: proposal.proposalId,\n adjustmentId: proposal.adjustmentId,\n previewHash: proposal.previewHash,\n status: proposal.status,\n proposedByAccountId: proposal.proposedByAccountId,\n proposedAt: proposal.proposedAt,\n expiresAt: proposal.expiresAt,\n });\n}\n\n/** Validates a distinct-operator decision against its immutable preview. */\nexport function assertOperatorAdjustmentDecision(\n decision: OperatorAdjustmentDecisionV1,\n proposal: OperatorAdjustmentProposalV1,\n preview: OperatorAdjustmentPreviewV1,\n expectedPreviewHash: string,\n expectedProposalHash: string,\n): void {\n assertOperatorAdjustmentProposal(proposal, preview, expectedPreviewHash);\n assertCanonicalHash(expectedProposalHash, \"expectedProposalHash\");\n assertExactKeys(decision, DECISION_KEYS, \"Operator adjustment decision\");\n economyAssert(\n decision.schemaVersion === ECONOMY_CONTRACT_VERSION\n && DECISIONS.has(decision.decision),\n \"INVALID_CONTRACT\",\n \"Unsupported operator adjustment decision\",\n );\n assertEconomyIdentifier(decision.decisionId, \"decisionId\");\n assertEconomyIdentifier(decision.adjustmentId, \"adjustmentId\");\n assertEconomyIdentifier(decision.proposalId, \"proposalId\");\n assertCanonicalHash(decision.proposalHash, \"proposalHash\");\n assertCanonicalHash(decision.previewHash, \"previewHash\");\n assertEconomyIdentifier(\n decision.proposedByAccountId,\n \"proposedByAccountId\",\n );\n assertEconomyIdentifier(\n decision.decidedByAccountId,\n \"decidedByAccountId\",\n );\n economyAssert(\n decision.proposedByAccountId !== decision.decidedByAccountId,\n \"ADJUSTMENT_SELF_APPROVAL\",\n \"Operator adjustment approval requires a distinct operator\",\n );\n economyAssert(\n decision.adjustmentId === preview.adjustmentId\n && decision.proposalId === proposal.proposalId\n && decision.proposalHash === expectedProposalHash\n && decision.previewHash === expectedPreviewHash,\n \"ADJUSTMENT_PREVIEW_MISMATCH\",\n \"Operator adjustment decision does not match its preview\",\n );\n const proposedAt = parseIsoTimestamp(decision.proposedAt);\n const decidedAt = parseIsoTimestamp(decision.decidedAt);\n economyAssert(\n decision.proposedByAccountId === proposal.proposedByAccountId\n && proposedAt === parseIsoTimestamp(proposal.proposedAt)\n && decidedAt >= proposedAt,\n \"INVALID_TIME_WINDOW\",\n \"Operator adjustment decision times are inconsistent\",\n );\n economyAssert(\n decidedAt <= parseIsoTimestamp(preview.expiresAt),\n \"ADJUSTMENT_EXPIRED\",\n \"Operator adjustment preview has expired\",\n );\n}\n\n/** Canonical decision bytes for approval evidence and execution binding. */\nexport function canonicalOperatorAdjustmentDecisionPayload(\n decision: OperatorAdjustmentDecisionV1,\n): string {\n assertExactKeys(decision, DECISION_KEYS, \"Operator adjustment decision\");\n return JSON.stringify({\n schemaVersion: decision.schemaVersion,\n decisionId: decision.decisionId,\n adjustmentId: decision.adjustmentId,\n proposalId: decision.proposalId,\n proposalHash: decision.proposalHash,\n previewHash: decision.previewHash,\n decision: decision.decision,\n proposedByAccountId: decision.proposedByAccountId,\n decidedByAccountId: decision.decidedByAccountId,\n proposedAt: decision.proposedAt,\n decidedAt: decision.decidedAt,\n });\n}\n\n/** Validates the immutable ledger-result edge for one approved adjustment. */\nexport function assertOperatorAdjustmentExecution(\n execution: OperatorAdjustmentExecutionV1,\n preview: OperatorAdjustmentPreviewV1,\n proposal: OperatorAdjustmentProposalV1,\n decision: OperatorAdjustmentDecisionV1,\n expectedPreviewHash: string,\n expectedProposalHash: string,\n expectedDecisionHash: string,\n): void {\n assertOperatorAdjustmentDecision(\n decision,\n proposal,\n preview,\n expectedPreviewHash,\n expectedProposalHash,\n );\n assertCanonicalHash(expectedDecisionHash, \"expectedDecisionHash\");\n assertExactKeys(execution, EXECUTION_KEYS, \"Operator adjustment execution\");\n economyAssert(\n execution.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported operator adjustment execution\",\n );\n assertEconomyIdentifier(execution.executionId, \"executionId\");\n assertEconomyIdentifier(execution.adjustmentId, \"adjustmentId\");\n assertCanonicalHash(execution.previewHash, \"previewHash\");\n assertCanonicalHash(execution.proposalHash, \"proposalHash\");\n assertCanonicalHash(execution.decisionHash, \"decisionHash\");\n assertEconomyIdentifier(execution.sourceLotId, \"sourceLotId\");\n assertEconomyIdentifier(execution.transactionId, \"transactionId\");\n assertEconomyIdentifier(execution.resultReceiptId, \"resultReceiptId\");\n economyAssert(\n decision.decision === \"approve\",\n \"ADJUSTMENT_NOT_APPROVED\",\n \"Only an approved adjustment may execute\",\n );\n economyAssert(\n execution.adjustmentId === preview.adjustmentId\n && execution.previewHash === expectedPreviewHash\n && execution.proposalHash === expectedProposalHash\n && execution.decisionHash === expectedDecisionHash\n && execution.sourceLotId === preview.sourceLotId,\n \"ADJUSTMENT_PREVIEW_MISMATCH\",\n \"Operator adjustment execution does not match its approval plan\",\n );\n economyAssert(\n parseIsoTimestamp(execution.executedAt)\n >= parseIsoTimestamp(decision.decidedAt),\n \"INVALID_TIME_WINDOW\",\n \"Operator adjustment execution predates its decision\",\n );\n}\n\n/** Canonical execution bytes for authority and audit-graph records. */\nexport function canonicalOperatorAdjustmentExecutionPayload(\n execution: OperatorAdjustmentExecutionV1,\n): string {\n assertExactKeys(execution, EXECUTION_KEYS, \"Operator adjustment execution\");\n return JSON.stringify({\n schemaVersion: execution.schemaVersion,\n executionId: execution.executionId,\n adjustmentId: execution.adjustmentId,\n previewHash: execution.previewHash,\n proposalHash: execution.proposalHash,\n decisionHash: execution.decisionHash,\n sourceLotId: execution.sourceLotId,\n transactionId: execution.transactionId,\n resultReceiptId: execution.resultReceiptId,\n executedAt: execution.executedAt,\n });\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LotId,\n} from \"./contracts.js\";\nimport type { PaidLotRetentionV1 } from \"./early-backers.js\";\nimport { economyAssert } from \"./errors.js\";\nimport { assertSourceLot, type SourceLotV1 } from \"./lots.js\";\n\nexport type PaidLotLifecycleStatusV1 =\n | \"clear\"\n | \"partially-reversed\"\n | \"disputed\"\n | \"fully-reversed\"\n | \"chargeback-lost\";\n\nexport type PaidLotLifecycleEventTypeV1 =\n | \"refund\"\n | \"dispute-hold\"\n | \"dispute-won\"\n | \"dispute-lost\"\n | \"chargeback\"\n | \"reversal\";\n\n/** Paid-purchase facts not already carried by the source lot. */\nexport interface PaidLotPurchaseProvenanceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly purchaseId: string;\n readonly catalogVersion: string;\n readonly purchasedAt: IsoTimestamp;\n}\n\n/** Provider-neutral refund/dispute evidence for a paid source lot. */\nexport interface PaidLotLifecycleEventV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly eventId: string;\n readonly lotId: LotId;\n readonly eventType: PaidLotLifecycleEventTypeV1;\n readonly amount: TokenSubunitString;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface PaidLotLifecycleReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly event: PaidLotLifecycleEventV1;\n}\n\n/**\n * Retained paid-lot projection. Immutable purchase/original facts plus every\n * receipt are sufficient to rebuild all derived amounts in occurrence order.\n */\nexport interface PaidLotLifecycleV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly lotId: LotId;\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly purchaseId: string;\n readonly catalogVersion: string;\n readonly purchasedAt: IsoTimestamp;\n readonly settledAt: IsoTimestamp;\n readonly creditedAt: IsoTimestamp;\n readonly originalAmount: TokenSubunitString;\n readonly retainedAmount: TokenSubunitString;\n readonly heldAmount: TokenSubunitString;\n readonly reversedAmount: TokenSubunitString;\n readonly refundedAmount: TokenSubunitString;\n readonly chargebackAmount: TokenSubunitString;\n readonly oneTimeReversalAmount: TokenSubunitString;\n readonly status: PaidLotLifecycleStatusV1;\n readonly version: number;\n readonly receipts: readonly PaidLotLifecycleReceiptV1[];\n readonly effectiveEventIds: readonly string[];\n}\n\n/** Exact signed projection deltas produced when one receipt is appended. */\nexport interface PaidLotLifecycleArithmeticV1 {\n readonly retainedDelta: TokenSubunitString;\n readonly heldDelta: TokenSubunitString;\n readonly reversedDelta: TokenSubunitString;\n readonly refundedDelta: TokenSubunitString;\n readonly chargebackDelta: TokenSubunitString;\n readonly oneTimeReversalDelta: TokenSubunitString;\n}\n\nexport interface PaidLotLifecycleMutationResultV1 {\n readonly lifecycle: PaidLotLifecycleV1;\n /** False only for an exact event-ID replay already recorded. */\n readonly applied: boolean;\n readonly stateChanged: boolean;\n readonly arithmetic: PaidLotLifecycleArithmeticV1;\n}\n\ninterface PaidLotImmutableFacts {\n readonly schemaVersion: EconomyContractVersion;\n readonly lotId: LotId;\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly purchaseId: string;\n readonly catalogVersion: string;\n readonly purchasedAt: IsoTimestamp;\n readonly settledAt: IsoTimestamp;\n readonly creditedAt: IsoTimestamp;\n readonly originalAmount: TokenSubunitString;\n}\n\ninterface PaidLotProjection {\n readonly retained: bigint;\n readonly held: bigint;\n readonly reversed: bigint;\n readonly refunded: bigint;\n readonly chargeback: bigint;\n readonly oneTimeReversal: bigint;\n readonly status: PaidLotLifecycleStatusV1;\n readonly effectiveEventIds: readonly string[];\n}\n\nconst ZERO_ARITHMETIC: PaidLotLifecycleArithmeticV1 = Object.freeze({\n retainedDelta: serializeTokenSubunits(0n),\n heldDelta: serializeTokenSubunits(0n),\n reversedDelta: serializeTokenSubunits(0n),\n refundedDelta: serializeTokenSubunits(0n),\n chargebackDelta: serializeTokenSubunits(0n),\n oneTimeReversalDelta: serializeTokenSubunits(0n),\n});\n\nconst EVENT_TYPES: readonly PaidLotLifecycleEventTypeV1[] = [\n \"refund\",\n \"dispute-hold\",\n \"dispute-won\",\n \"dispute-lost\",\n \"chargeback\",\n \"reversal\",\n];\n\nconst EVENT_PRECEDENCE: Readonly<Record<PaidLotLifecycleEventTypeV1, number>> = {\n \"dispute-hold\": 0,\n \"dispute-won\": 1,\n \"dispute-lost\": 1,\n refund: 2,\n chargeback: 3,\n reversal: 4,\n};\n\n/** Validates the paid purchase facts paired with a source lot. */\nexport function assertPaidLotPurchaseProvenance(\n provenance: PaidLotPurchaseProvenanceV1,\n): void {\n economyAssert(\n provenance.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot provenance contract version\",\n );\n assertEconomyIdentifier(provenance.purchaseId, \"purchaseId\");\n assertEconomyIdentifier(provenance.catalogVersion, \"catalogVersion\");\n parseIsoTimestamp(provenance.purchasedAt);\n}\n\n/** Validates one provider-neutral paid-lot lifecycle event. */\nexport function assertPaidLotLifecycleEvent(\n event: PaidLotLifecycleEventV1,\n): void {\n economyAssert(\n event.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot lifecycle event contract version\",\n );\n assertEconomyIdentifier(event.eventId, \"eventId\");\n assertEconomyIdentifier(event.lotId, \"lotId\");\n economyAssert(\n EVENT_TYPES.includes(event.eventType),\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle event type is unsupported\",\n );\n economyAssert(\n parseTokenSubunits(event.amount) > 0n,\n \"INVALID_AMOUNT\",\n \"Paid-lot lifecycle event amount must be positive\",\n );\n parseIsoTimestamp(event.occurredAt);\n}\n\nfunction sameEvent(\n left: PaidLotLifecycleEventV1,\n right: PaidLotLifecycleEventV1,\n): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.eventId === right.eventId &&\n left.lotId === right.lotId &&\n left.eventType === right.eventType &&\n left.amount === right.amount &&\n left.occurredAt === right.occurredAt\n );\n}\n\nfunction compareEvents(\n left: PaidLotLifecycleEventV1,\n right: PaidLotLifecycleEventV1,\n): number {\n const timeDifference =\n parseIsoTimestamp(left.occurredAt) - parseIsoTimestamp(right.occurredAt);\n if (timeDifference !== 0) {\n return timeDifference;\n }\n const precedenceDifference =\n EVENT_PRECEDENCE[left.eventType] - EVENT_PRECEDENCE[right.eventType];\n return precedenceDifference === 0\n ? compareUnicodeCodeUnits(left.eventId, right.eventId)\n : precedenceDifference;\n}\n\nfunction deriveStatus(\n retained: bigint,\n held: bigint,\n reversed: bigint,\n chargeback: bigint,\n): PaidLotLifecycleStatusV1 {\n if (held > 0n) {\n return \"disputed\";\n }\n if (chargeback > 0n) {\n return \"chargeback-lost\";\n }\n if (retained === 0n) {\n return \"fully-reversed\";\n }\n return reversed > 0n ? \"partially-reversed\" : \"clear\";\n}\n\nfunction immutableFactsFromLifecycle(\n lifecycle: PaidLotLifecycleV1,\n): PaidLotImmutableFacts {\n return {\n schemaVersion: lifecycle.schemaVersion,\n lotId: lifecycle.lotId,\n payerAccountId: lifecycle.payerAccountId,\n receivingHouseholdId: lifecycle.receivingHouseholdId,\n purchaseId: lifecycle.purchaseId,\n catalogVersion: lifecycle.catalogVersion,\n purchasedAt: lifecycle.purchasedAt,\n settledAt: lifecycle.settledAt,\n creditedAt: lifecycle.creditedAt,\n originalAmount: lifecycle.originalAmount,\n };\n}\n\nfunction assertImmutableFacts(facts: PaidLotImmutableFacts): void {\n economyAssert(\n facts.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot lifecycle contract version\",\n );\n assertEconomyIdentifier(facts.lotId, \"lotId\");\n assertEconomyIdentifier(facts.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(\n facts.receivingHouseholdId,\n \"receivingHouseholdId\",\n );\n assertEconomyIdentifier(facts.purchaseId, \"purchaseId\");\n assertEconomyIdentifier(facts.catalogVersion, \"catalogVersion\");\n const purchasedAt = parseIsoTimestamp(facts.purchasedAt);\n const settledAt = parseIsoTimestamp(facts.settledAt);\n const creditedAt = parseIsoTimestamp(facts.creditedAt);\n economyAssert(\n purchasedAt <= settledAt && settledAt <= creditedAt,\n \"INVALID_TIME_WINDOW\",\n \"Paid-lot timestamps must follow purchase, settlement, then credit order\",\n );\n economyAssert(\n parseTokenSubunits(facts.originalAmount) > 0n,\n \"INVALID_AMOUNT\",\n \"Paid-lot original amount must be positive\",\n );\n}\n\nfunction projectPaidLot(\n facts: PaidLotImmutableFacts,\n receipts: readonly PaidLotLifecycleReceiptV1[],\n): PaidLotProjection {\n assertImmutableFacts(facts);\n const eventIds = new Set<string>();\n let reversalReceipts = 0;\n for (const receipt of receipts) {\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot receipt contract version\",\n );\n assertPaidLotLifecycleEvent(receipt.event);\n economyAssert(\n receipt.event.lotId === facts.lotId &&\n !eventIds.has(receipt.event.eventId),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot receipts must be unique and belong to the lifecycle lot\",\n );\n eventIds.add(receipt.event.eventId);\n if (receipt.event.eventType === \"reversal\") {\n reversalReceipts += 1;\n }\n }\n economyAssert(\n reversalReceipts <= 1,\n \"REVERSAL_ALREADY_EXISTS\",\n \"Paid-lot lifecycle permits only one distinct reversal event\",\n );\n\n let retained = parseTokenSubunits(facts.originalAmount);\n let held = 0n;\n let reversed = 0n;\n let refunded = 0n;\n let chargeback = 0n;\n let oneTimeReversal = 0n;\n const effectiveEventIds: string[] = [];\n for (const receipt of [...receipts].sort((left, right) =>\n compareEvents(left.event, right.event),\n )) {\n const event = receipt.event;\n economyAssert(\n parseIsoTimestamp(event.occurredAt) >=\n parseIsoTimestamp(facts.creditedAt),\n \"INVALID_TIME_WINDOW\",\n \"Paid-lot lifecycle event cannot precede credit\",\n );\n const amount = parseTokenSubunits(event.amount);\n if (event.eventType === \"dispute-hold\") {\n economyAssert(\n amount <= retained - held,\n \"INSUFFICIENT_ELIGIBLE_LOTS\",\n \"Dispute hold exceeds unheld retained paid-lot basis\",\n );\n held += amount;\n } else if (event.eventType === \"dispute-won\") {\n economyAssert(\n amount <= held,\n \"INVALID_AMOUNT\",\n \"Dispute-win release exceeds held paid-lot basis\",\n );\n held -= amount;\n } else if (event.eventType === \"dispute-lost\") {\n economyAssert(\n amount <= held,\n \"INVALID_AMOUNT\",\n \"Dispute-loss amount exceeds held paid-lot basis\",\n );\n held -= amount;\n retained -= amount;\n reversed += amount;\n chargeback += amount;\n } else {\n economyAssert(\n amount <= retained - held,\n \"INSUFFICIENT_ELIGIBLE_LOTS\",\n \"Paid-lot reversal exceeds unheld retained basis\",\n );\n if (event.eventType === \"reversal\") {\n oneTimeReversal += amount;\n } else if (event.eventType === \"refund\") {\n refunded += amount;\n } else {\n chargeback += amount;\n }\n retained -= amount;\n reversed += amount;\n }\n effectiveEventIds.push(event.eventId);\n }\n\n return {\n retained,\n held,\n reversed,\n refunded,\n chargeback,\n oneTimeReversal,\n status: deriveStatus(retained, held, reversed, chargeback),\n effectiveEventIds,\n };\n}\n\nfunction projectionMatchesLifecycle(\n projection: PaidLotProjection,\n lifecycle: PaidLotLifecycleV1,\n): boolean {\n return (\n serializeTokenSubunits(projection.retained) === lifecycle.retainedAmount &&\n serializeTokenSubunits(projection.held) === lifecycle.heldAmount &&\n serializeTokenSubunits(projection.reversed) === lifecycle.reversedAmount &&\n serializeTokenSubunits(projection.refunded) === lifecycle.refundedAmount &&\n serializeTokenSubunits(projection.chargeback) ===\n lifecycle.chargebackAmount &&\n serializeTokenSubunits(projection.oneTimeReversal) ===\n lifecycle.oneTimeReversalAmount &&\n projection.status === lifecycle.status &&\n projection.effectiveEventIds.length ===\n lifecycle.effectiveEventIds.length &&\n projection.effectiveEventIds.every(\n (eventId, index) => eventId === lifecycle.effectiveEventIds[index],\n )\n );\n}\n\n/** Validates and deterministically rebuilds retained paid-lot arithmetic. */\nexport function assertPaidLotLifecycle(\n lifecycle: PaidLotLifecycleV1,\n): void {\n economyAssert(\n Number.isSafeInteger(lifecycle.version) &&\n lifecycle.version === lifecycle.receipts.length + 1,\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle version must match its receipt count\",\n );\n const projection = projectPaidLot(\n immutableFactsFromLifecycle(lifecycle),\n lifecycle.receipts,\n );\n economyAssert(\n projectionMatchesLifecycle(projection, lifecycle),\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle does not match its immutable event rebuild\",\n );\n}\n\n/** Creates the retained projection for one newly credited paid source lot. */\nexport function createPaidLotLifecycle(\n lot: SourceLotV1,\n provenance: PaidLotPurchaseProvenanceV1,\n): PaidLotLifecycleV1 {\n assertSourceLot(lot);\n assertPaidLotPurchaseProvenance(provenance);\n economyAssert(\n lot.payerAccountId !== undefined && lot.householdId !== undefined,\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle requires payer and receiving-household provenance\",\n );\n economyAssert(\n lot.refundState === \"none\" &&\n parseTokenSubunits(lot.heldAmount) === 0n &&\n parseTokenSubunits(lot.reversedAmount) === 0n,\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle must be created before any refund or dispute movement\",\n );\n economyAssert(\n parseIsoTimestamp(provenance.purchasedAt) <=\n parseIsoTimestamp(lot.settledAt),\n \"INVALID_TIME_WINDOW\",\n \"Paid purchase time cannot follow settlement\",\n );\n const facts: PaidLotImmutableFacts = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n lotId: lot.lotId,\n payerAccountId: lot.payerAccountId,\n receivingHouseholdId: lot.householdId,\n purchaseId: provenance.purchaseId,\n catalogVersion: provenance.catalogVersion,\n purchasedAt: provenance.purchasedAt,\n settledAt: lot.settledAt,\n creditedAt: lot.creditedAt,\n originalAmount: lot.originalAmount,\n };\n const projection = projectPaidLot(facts, []);\n const lifecycle: PaidLotLifecycleV1 = {\n ...facts,\n retainedAmount: serializeTokenSubunits(projection.retained),\n heldAmount: serializeTokenSubunits(projection.held),\n reversedAmount: serializeTokenSubunits(projection.reversed),\n refundedAmount: serializeTokenSubunits(projection.refunded),\n chargebackAmount: serializeTokenSubunits(projection.chargeback),\n oneTimeReversalAmount: serializeTokenSubunits(\n projection.oneTimeReversal,\n ),\n status: projection.status,\n version: 1,\n receipts: [],\n effectiveEventIds: [],\n };\n assertPaidLotLifecycle(lifecycle);\n return lifecycle;\n}\n\n/**\n * Appends one event then rebuilds every receipt in authoritative occurrence\n * order. Exact retries succeed before stale-version validation.\n */\nexport function applyPaidLotLifecycleEvent(\n lifecycle: PaidLotLifecycleV1,\n event: PaidLotLifecycleEventV1,\n expectedVersion: number,\n): PaidLotLifecycleMutationResultV1 {\n assertPaidLotLifecycle(lifecycle);\n assertPaidLotLifecycleEvent(event);\n economyAssert(\n event.lotId === lifecycle.lotId,\n \"INVALID_CONTRACT\",\n \"Paid-lot event belongs to another source lot\",\n );\n const replay = lifecycle.receipts.find(\n (receipt) => receipt.event.eventId === event.eventId,\n );\n if (replay !== undefined) {\n economyAssert(\n sameEvent(replay.event, event),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot event ID was reused with different facts\",\n );\n return {\n lifecycle,\n applied: false,\n stateChanged: false,\n arithmetic: ZERO_ARITHMETIC,\n };\n }\n economyAssert(\n expectedVersion === lifecycle.version,\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle event has a stale expected version\",\n );\n\n const receipts: readonly PaidLotLifecycleReceiptV1[] = [\n ...lifecycle.receipts,\n { schemaVersion: ECONOMY_CONTRACT_VERSION, event },\n ];\n const projection = projectPaidLot(\n immutableFactsFromLifecycle(lifecycle),\n receipts,\n );\n const before = {\n retained: parseTokenSubunits(lifecycle.retainedAmount),\n held: parseTokenSubunits(lifecycle.heldAmount),\n reversed: parseTokenSubunits(lifecycle.reversedAmount),\n refunded: parseTokenSubunits(lifecycle.refundedAmount),\n chargeback: parseTokenSubunits(lifecycle.chargebackAmount),\n oneTimeReversal: parseTokenSubunits(lifecycle.oneTimeReversalAmount),\n };\n const next: PaidLotLifecycleV1 = {\n ...lifecycle,\n retainedAmount: serializeTokenSubunits(projection.retained),\n heldAmount: serializeTokenSubunits(projection.held),\n reversedAmount: serializeTokenSubunits(projection.reversed),\n refundedAmount: serializeTokenSubunits(projection.refunded),\n chargebackAmount: serializeTokenSubunits(projection.chargeback),\n oneTimeReversalAmount: serializeTokenSubunits(\n projection.oneTimeReversal,\n ),\n status: projection.status,\n version: lifecycle.version + 1,\n receipts,\n effectiveEventIds: projection.effectiveEventIds,\n };\n assertPaidLotLifecycle(next);\n const arithmetic: PaidLotLifecycleArithmeticV1 = {\n retainedDelta: serializeTokenSubunits(\n projection.retained - before.retained,\n ),\n heldDelta: serializeTokenSubunits(projection.held - before.held),\n reversedDelta: serializeTokenSubunits(\n projection.reversed - before.reversed,\n ),\n refundedDelta: serializeTokenSubunits(\n projection.refunded - before.refunded,\n ),\n chargebackDelta: serializeTokenSubunits(\n projection.chargeback - before.chargeback,\n ),\n oneTimeReversalDelta: serializeTokenSubunits(\n projection.oneTimeReversal - before.oneTimeReversal,\n ),\n };\n return {\n lifecycle: next,\n applied: true,\n stateChanged: Object.values(arithmetic).some((delta) => delta !== \"0\"),\n arithmetic,\n };\n}\n\n/** Reduces unordered/retried lifecycle evidence in canonical event order. */\nexport function reducePaidLotLifecycleEvents(\n initial: PaidLotLifecycleV1,\n events: readonly PaidLotLifecycleEventV1[],\n): PaidLotLifecycleV1 {\n assertPaidLotLifecycle(initial);\n const unique = new Map<string, PaidLotLifecycleEventV1>();\n for (const event of events) {\n assertPaidLotLifecycleEvent(event);\n const existing = unique.get(event.eventId);\n if (existing !== undefined) {\n economyAssert(\n sameEvent(existing, event),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot event ID was reused with different facts\",\n );\n } else {\n unique.set(event.eventId, event);\n }\n }\n let lifecycle = initial;\n for (const event of [...unique.values()].sort(compareEvents)) {\n lifecycle = applyPaidLotLifecycleEvent(\n lifecycle,\n event,\n lifecycle.version,\n ).lifecycle;\n }\n return lifecycle;\n}\n\n/** Creates the exact retained-basis input used by early-backer evaluators. */\nexport function createEarlyBackerRetentionFromPaidLot(\n lifecycle: PaidLotLifecycleV1,\n): PaidLotRetentionV1 {\n assertPaidLotLifecycle(lifecycle);\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n lotId: lifecycle.lotId,\n payerAccountId: lifecycle.payerAccountId,\n receivingHouseholdId: lifecycle.receivingHouseholdId,\n purchaseId: lifecycle.purchaseId,\n catalogVersion: lifecycle.catalogVersion,\n purchasedAt: lifecycle.purchasedAt,\n settledAt: lifecycle.settledAt,\n creditedAt: lifecycle.creditedAt,\n retainedAmount: lifecycle.retainedAmount,\n };\n}\n","import type { TokenSubunitString } from \"../amount.js\";\nimport type { GameplayAllocationV1 } from \"../allocations.js\";\nimport type {\n AuditedEconomyCommandEnvelopeV1,\n EconomyAuditedIdempotencyResultV1,\n EconomyAuditedIdempotencyScopeV1,\n EconomyAcceptedCommandReceiptV1,\n EconomyCommandResultReceiptV1,\n EconomyEncryptedOperationalHandleBindingV1,\n EconomyProviderEvidenceHashV1,\n EconomyProviderEvidenceManifestV1,\n EconomyHmacSha256DigestV1,\n} from \"../audit.js\";\nimport type {\n EconomyAuthorityCommitManifestV1,\n EconomyAuthorityHeadV1,\n EconomyIntegrityAnchorManifestV1,\n EconomyIntegrityVerificationReceiptV1,\n} from \"../authority.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type AllocationId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LotId,\n type TransactionId,\n type WalletId,\n} from \"../contracts.js\";\nimport { economyAssert } from \"../errors.js\";\nimport type {\n ChainedEconomicJournalTransactionV1,\n JournalChainHeadV1,\n} from \"../integrity.js\";\nimport type { LedgerTransactionV1 } from \"../ledger.js\";\nimport type {\n SourceLotMovementV1,\n SourceLotV1,\n VersionedSourceLotV1,\n} from \"../lots.js\";\nimport type {\n BalanceProjection,\n BalanceProjectionSnapshotV1,\n WalletBalanceDeltaV1,\n WalletBalanceProjectionV1,\n WalletLifetimeDeltaV1,\n} from \"../projection.js\";\nimport type {\n WalletOwnerReferenceV1,\n WalletV1,\n} from \"../wallets.js\";\n\nexport type EconomyCommandType =\n | \"credit-purchase\"\n | \"credit-subscription\"\n | \"credit-reward\"\n | \"credit-event\"\n | \"credit-competition\"\n | \"allocate\"\n | \"boost\"\n | \"reclaim\"\n | \"spend\"\n | \"hold\"\n | \"release-hold\"\n | \"refund\"\n | \"chargeback\"\n | \"reverse\"\n | \"adjust\";\n\nexport interface EconomyCommandEnvelopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandId: string;\n readonly commandType: EconomyCommandType;\n readonly idempotencyKey: string;\n readonly actorAccountId: AccountId;\n readonly subjectAccountId: AccountId;\n readonly relationshipId?: string;\n readonly authorizationVersion?: number;\n readonly payloadHash: string;\n readonly acceptedAt: IsoTimestamp;\n readonly acceptedRegion: string;\n readonly writerFencingToken: string;\n}\n\nexport type EconomyCommandWorkflowStateV1 =\n | \"accepted\"\n | \"processing\"\n | \"failed\"\n | \"completed\";\n\n/** Immutable workflow evidence; it is never an economic journal transaction. */\nexport interface EconomyCommandWorkflowEventV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly workflowEventId: string;\n readonly commandId: string;\n readonly state: EconomyCommandWorkflowStateV1;\n /** Stable non-sensitive classifier; detailed failure data stays operational. */\n readonly failureCode?: string;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface EconomyOutboxEventV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly eventId: string;\n readonly transactionId: TransactionId;\n readonly eventType: string;\n readonly payloadHash: string;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface PersistedIdempotencyResultV1 {\n readonly transactionId: TransactionId;\n readonly responseHash: string;\n readonly recordedAt: IsoTimestamp;\n}\n\n/** Exact actor/subject/operation namespace for a caller-owned idempotency key. */\nexport interface EconomyIdempotencyScopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly idempotencyKey: string;\n readonly commandType: EconomyCommandType;\n readonly actorAccountId: AccountId;\n readonly subjectAccountId: AccountId;\n}\n\n/** V2 replay evidence bound to one accepted command and exact scope. */\nexport interface ScopedPersistedIdempotencyResultV1\n extends PersistedIdempotencyResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandId: string;\n}\n\n/** Validates replay evidence before it is returned across a command boundary. */\nexport function assertScopedPersistedIdempotencyResult(\n result: ScopedPersistedIdempotencyResultV1,\n): void {\n economyAssert(\n result.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported scoped idempotency-result contract version\",\n );\n assertEconomyIdentifier(result.commandId, \"commandId\");\n assertEconomyIdentifier(result.transactionId, \"transactionId\");\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(result.responseHash),\n \"INVALID_CONTRACT\",\n \"Idempotency response hash must be a canonical SHA-256 reference\",\n );\n parseIsoTimestamp(result.recordedAt);\n}\n\nconst ECONOMY_COMMAND_TYPES = new Set<EconomyCommandType>([\n \"credit-purchase\",\n \"credit-subscription\",\n \"credit-reward\",\n \"credit-event\",\n \"credit-competition\",\n \"allocate\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"release-hold\",\n \"refund\",\n \"chargeback\",\n \"reverse\",\n \"adjust\",\n]);\n\n/** Validates the namespace that prevents cross-principal replay collisions. */\nexport function assertEconomyIdempotencyScope(\n scope: EconomyIdempotencyScopeV1,\n): void {\n economyAssert(\n scope.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n ECONOMY_COMMAND_TYPES.has(scope.commandType),\n \"INVALID_CONTRACT\",\n \"Unsupported economy idempotency scope\",\n );\n assertEconomyIdentifier(scope.idempotencyKey, \"idempotencyKey\");\n assertEconomyIdentifier(scope.actorAccountId, \"actorAccountId\");\n assertEconomyIdentifier(scope.subjectAccountId, \"subjectAccountId\");\n}\n\n/** Validates minimized accepted-command evidence before durable append. */\nexport function assertEconomyCommandEnvelope(\n envelope: EconomyCommandEnvelopeV1,\n): void {\n economyAssert(\n envelope.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported economy-command-envelope contract version\",\n );\n assertEconomyIdentifier(envelope.commandId, \"commandId\");\n economyAssert(\n ECONOMY_COMMAND_TYPES.has(envelope.commandType),\n \"INVALID_CONTRACT\",\n \"Economy command has an unsupported type\",\n );\n assertEconomyIdentifier(envelope.idempotencyKey, \"idempotencyKey\");\n assertEconomyIdentifier(envelope.actorAccountId, \"actorAccountId\");\n assertEconomyIdentifier(envelope.subjectAccountId, \"subjectAccountId\");\n if (envelope.relationshipId !== undefined) {\n assertEconomyIdentifier(envelope.relationshipId, \"relationshipId\");\n }\n if (envelope.authorizationVersion !== undefined) {\n economyAssert(\n Number.isSafeInteger(envelope.authorizationVersion) &&\n envelope.authorizationVersion >= 1,\n \"INVALID_CONTRACT\",\n \"Command authorization version must be a positive safe integer\",\n );\n }\n economyAssert(\n (envelope.relationshipId === undefined) ===\n (envelope.authorizationVersion === undefined),\n \"INVALID_CONTRACT\",\n \"Relationship identity and authorization version must be supplied together\",\n );\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(envelope.payloadHash),\n \"INVALID_CONTRACT\",\n \"Command payload hash must be a canonical SHA-256 reference\",\n );\n parseIsoTimestamp(envelope.acceptedAt);\n assertEconomyIdentifier(envelope.acceptedRegion, \"acceptedRegion\");\n assertEconomyIdentifier(\n envelope.writerFencingToken,\n \"writerFencingToken\",\n );\n}\n\n/** Validates one immutable command-workflow state event. */\nexport function assertEconomyCommandWorkflowEvent(\n event: EconomyCommandWorkflowEventV1,\n): void {\n economyAssert(\n event.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported command-workflow-event contract version\",\n );\n assertEconomyIdentifier(event.workflowEventId, \"workflowEventId\");\n assertEconomyIdentifier(event.commandId, \"commandId\");\n economyAssert(\n [\"accepted\", \"processing\", \"failed\", \"completed\"].includes(event.state),\n \"INVALID_CONTRACT\",\n \"Command workflow has an unsupported state\",\n );\n economyAssert(\n (event.state === \"failed\") === (event.failureCode !== undefined),\n \"INVALID_CONTRACT\",\n \"Only failed command workflows require a failure code\",\n );\n if (event.failureCode !== undefined) {\n assertEconomyIdentifier(event.failureCode, \"failureCode\");\n }\n parseIsoTimestamp(event.occurredAt);\n}\n\n/** Operations available only inside one serializable database transaction. */\nexport interface EconomyUnitOfWork {\n getWalletForUpdate(walletId: WalletId): Promise<WalletV1 | null>;\n listSpendableLotsForUpdate(walletId: WalletId): Promise<readonly SourceLotV1[]>;\n findLotForUpdate(lotId: LotId): Promise<SourceLotV1 | null>;\n findIdempotencyResult(\n idempotencyKey: string,\n ): Promise<PersistedIdempotencyResultV1 | null>;\n appendTransaction(transaction: LedgerTransactionV1): Promise<void>;\n appendSourceLot(lot: SourceLotV1): Promise<void>;\n updateSourceLotProjection(\n lotId: LotId,\n remainingAmount: TokenSubunitString,\n heldAmount: TokenSubunitString,\n reversedAmount: TokenSubunitString,\n ): Promise<void>;\n saveBalanceProjection(\n projection: BalanceProjection,\n transactionId: TransactionId,\n ): Promise<void>;\n saveIdempotencyResult(\n idempotencyKey: string,\n result: PersistedIdempotencyResultV1,\n ): Promise<void>;\n appendOutboxEvent(event: EconomyOutboxEventV1): Promise<void>;\n}\n\n/** Adapter boundary for serializable, ACID economy mutations. */\nexport interface EconomyPersistencePort {\n runSerializable<T>(\n operation: (unitOfWork: EconomyUnitOfWork) => Promise<T>,\n ): Promise<T>;\n getWallet(walletId: WalletId): Promise<WalletV1 | null>;\n getBalanceProjection(walletId: WalletId): Promise<BalanceProjectionSnapshotV1 | null>;\n getTransaction(transactionId: TransactionId): Promise<LedgerTransactionV1 | null>;\n rebuildProjection(): Promise<BalanceProjection>;\n}\n\n/**\n * V2 mutation surface. Unlike `EconomyUnitOfWork`, it has no absolute balance\n * overwrite: journal, source-lot movement, allocation state, balance/lifetime\n * deltas, idempotency, chain head, and outbox are committed atomically.\n */\nexport interface EconomyUnitOfWorkV2 {\n getWalletForOwnerForUpdate(\n walletId: WalletId,\n owner: WalletOwnerReferenceV1,\n ): Promise<WalletV1 | null>;\n listSpendableLotsForUpdate(\n walletId: WalletId,\n ): Promise<readonly VersionedSourceLotV1[]>;\n findLotForUpdate(lotId: LotId): Promise<VersionedSourceLotV1 | null>;\n getGameplayAllocationForUpdate(\n allocationId: AllocationId,\n householdId: HouseholdId,\n childAccountId: AccountId,\n ): Promise<GameplayAllocationV1 | null>;\n findIdempotencyResult(\n scope: EconomyIdempotencyScopeV1,\n ): Promise<ScopedPersistedIdempotencyResultV1 | null>;\n /** Locks and rejects any stale/non-active regional writer lease. */\n lockActiveWriterFence(\n acceptedRegion: string,\n writerFencingToken: string,\n ): Promise<void>;\n lockJournalChainHead(chainId: string): Promise<JournalChainHeadV1>;\n\n appendCommandEnvelope(envelope: EconomyCommandEnvelopeV1): Promise<void>;\n appendCommandWorkflowEvent(\n event: EconomyCommandWorkflowEventV1,\n ): Promise<void>;\n appendTransaction(\n transaction: ChainedEconomicJournalTransactionV1,\n ): Promise<void>;\n /** Appends `createInitialSourceLotSnapshot()` output; later changes are movements. */\n appendSourceLot(snapshot: VersionedSourceLotV1): Promise<void>;\n /** Appends movement evidence and applies its lot CAS as one operation. */\n applySourceLotMovement(movement: SourceLotMovementV1): Promise<void>;\n appendGameplayAllocation(allocation: GameplayAllocationV1): Promise<void>;\n /**\n * Compares `expectedVersion`, requires `allocation.version` to be exactly the\n * next value, and never overwrites a stale row.\n */\n saveGameplayAllocation(\n allocation: GameplayAllocationV1,\n expectedVersion: number,\n ): Promise<void>;\n /**\n * Atomically adds deltas, verifies them against the appended postings and\n * account bindings, and records transaction-scoped application keys.\n */\n applyWalletBalanceDeltas(\n transactionId: TransactionId,\n deltas: readonly WalletBalanceDeltaV1[],\n ): Promise<void>;\n /**\n * Atomically increments monotonic lifetime counters after verifying the\n * deltas against the appended transaction's deterministic classification.\n */\n applyWalletLifetimeDeltas(\n transactionId: TransactionId,\n deltas: readonly WalletLifetimeDeltaV1[],\n ): Promise<void>;\n saveIdempotencyResult(\n scope: EconomyIdempotencyScopeV1,\n result: ScopedPersistedIdempotencyResultV1,\n ): Promise<void>;\n appendOutboxEvent(event: EconomyOutboxEventV1): Promise<void>;\n /** Compare-and-swaps the full locked head, including its canonical hash. */\n advanceJournalChainHead(\n expected: JournalChainHeadV1,\n next: JournalChainHeadV1,\n ): Promise<void>;\n}\n\n/**\n * Additive authoritative persistence boundary for new consumers. V1 remains\n * exported for compatibility but must not be adapted by delegating its\n * absolute `saveBalanceProjection` operation to this interface.\n */\nexport interface EconomyPersistencePortV2 {\n runSerializable<T>(\n operation: (unitOfWork: EconomyUnitOfWorkV2) => Promise<T>,\n ): Promise<T>;\n getWallet(walletId: WalletId): Promise<WalletV1 | null>;\n listWalletsByOwner(\n owner: WalletOwnerReferenceV1,\n ): Promise<readonly WalletV1[]>;\n getGameplayAllocation(\n allocationId: AllocationId,\n householdId: HouseholdId,\n childAccountId: AccountId,\n ): Promise<GameplayAllocationV1 | null>;\n getCommandEnvelope(\n commandId: string,\n ): Promise<EconomyCommandEnvelopeV1 | null>;\n getTransaction(\n transactionId: TransactionId,\n ): Promise<ChainedEconomicJournalTransactionV1 | null>;\n rebuildWalletBalanceProjections(): Promise<\n readonly WalletBalanceProjectionV1[]\n >;\n}\n\n/**\n * V3 journal transaction whose legacy canonical `idempotencyKey` slot carries\n * the HMAC digest, never the raw HTTP Idempotency-Key. The wire field remains\n * unchanged so published transaction canonical bytes stay compatible.\n */\nexport type AuditedChainedEconomicJournalTransactionV1 = Omit<\n ChainedEconomicJournalTransactionV1,\n \"idempotencyKey\"\n> & {\n readonly idempotencyKey: EconomyHmacSha256DigestV1;\n};\n\n/**\n * Additive audit-capable mutation surface.\n *\n * First-party commands append acceptance, economic result, projections,\n * idempotency result, outbox, authority manifest, and authority-head CAS in one\n * serializable unit. Provider workflows use one unit for verified durable\n * acceptance and a second unit for the reconciled economic result.\n */\nexport type EconomyUnitOfWorkV3 = Omit<\n EconomyUnitOfWorkV2,\n | \"appendCommandEnvelope\"\n | \"findIdempotencyResult\"\n | \"saveIdempotencyResult\"\n | \"appendTransaction\"\n> & {\n findAuditedIdempotencyResult(\n scope: EconomyAuditedIdempotencyScopeV1,\n ): Promise<EconomyAuditedIdempotencyResultV1 | null>;\n lockAuthorityHead(authorityId: string): Promise<EconomyAuthorityHeadV1>;\n appendCommandEnvelope(\n envelope: AuditedEconomyCommandEnvelopeV1,\n ): Promise<void>;\n appendProviderEvidenceManifest(\n manifest: EconomyProviderEvidenceManifestV1,\n ): Promise<void>;\n appendProviderEvidence(\n evidence: EconomyProviderEvidenceHashV1,\n ): Promise<void>;\n appendEncryptedOperationalHandleBinding(\n binding: EconomyEncryptedOperationalHandleBindingV1,\n ): Promise<void>;\n appendAcceptedCommandReceipt(\n receipt: EconomyAcceptedCommandReceiptV1,\n ): Promise<void>;\n appendCommandResultReceipt(\n receipt: EconomyCommandResultReceiptV1,\n ): Promise<void>;\n appendTransaction(\n transaction: AuditedChainedEconomicJournalTransactionV1,\n ): Promise<void>;\n saveAuditedIdempotencyResult(\n scope: EconomyAuditedIdempotencyScopeV1,\n result: EconomyAuditedIdempotencyResultV1,\n ): Promise<void>;\n appendAuthorityCommitManifest(\n manifest: EconomyAuthorityCommitManifestV1,\n ): Promise<void>;\n advanceAuthorityHead(\n expected: EconomyAuthorityHeadV1,\n next: EconomyAuthorityHeadV1,\n ): Promise<void>;\n appendIntegrityVerificationReceipt(\n receipt: EconomyIntegrityVerificationReceiptV1,\n ): Promise<void>;\n appendIntegrityAnchorManifest(\n manifest: EconomyIntegrityAnchorManifestV1,\n ): Promise<void>;\n};\n\n/**\n * V3 preserves every V2 economic primitive while making the audit records\n * mandatory capabilities of an authoritative adapter. V1 and V2 remain\n * exported unchanged for existing consumers.\n */\nexport type EconomyPersistencePortV3 = Omit<\n EconomyPersistencePortV2,\n \"runSerializable\" | \"getCommandEnvelope\" | \"getTransaction\"\n> & {\n runSerializable<T>(\n operation: (unitOfWork: EconomyUnitOfWorkV3) => Promise<T>,\n ): Promise<T>;\n getCommandEnvelope(\n commandId: string,\n ): Promise<AuditedEconomyCommandEnvelopeV1 | null>;\n getTransaction(\n transactionId: TransactionId,\n ): Promise<AuditedChainedEconomicJournalTransactionV1 | null>;\n getAcceptedCommandReceipt(\n commandId: string,\n ): Promise<EconomyAcceptedCommandReceiptV1 | null>;\n getCommandResultReceipt(\n commandId: string,\n ): Promise<EconomyCommandResultReceiptV1 | null>;\n listProviderEvidence(\n commandId: string,\n ): Promise<readonly EconomyProviderEvidenceHashV1[]>;\n getProviderEvidenceManifest(\n commandId: string,\n ): Promise<EconomyProviderEvidenceManifestV1 | null>;\n listEncryptedOperationalHandleBindings(\n commandId: string,\n ): Promise<readonly EconomyEncryptedOperationalHandleBindingV1[]>;\n getAuthorityHead(authorityId: string): Promise<EconomyAuthorityHeadV1 | null>;\n getAuthorityCommitManifest(\n commitId: string,\n ): Promise<EconomyAuthorityCommitManifestV1 | null>;\n getIntegrityVerificationReceipt(\n verificationId: string,\n ): Promise<EconomyIntegrityVerificationReceiptV1 | null>;\n getIntegrityAnchorManifest(\n anchorId: string,\n ): Promise<EconomyIntegrityAnchorManifestV1 | null>;\n};\n\nexport interface EconomyClockPort {\n now(): IsoTimestamp;\n}\n\nexport interface EconomyIdPort {\n nextId(namespace: string): string;\n}\n","import {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type WalletId,\n} from \"./contracts.js\";\nimport {\n parseTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type WalletKind =\n | \"household-treasury\"\n | \"personal\"\n | \"gameplay-allocation\"\n | \"hold\"\n | \"purchase-clearing\"\n | \"provider-clearing\"\n | \"system\";\n\nexport type WalletStatus = \"active\" | \"restricted\" | \"closed\";\nexport type WalletOwnerType = \"account\" | \"household\" | \"system\";\n\n/** Exact owner identity used by persistence lookups and IDOR-safe locking. */\nexport interface WalletOwnerReferenceV1 {\n readonly ownerType: WalletOwnerType;\n readonly ownerId: AccountId | HouseholdId | \"system\";\n}\n\n/** Versioned authoritative wallet descriptor. */\nexport interface WalletV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly accountId: AccountId;\n readonly kind: WalletKind;\n readonly ownerType: WalletOwnerType;\n readonly ownerId: AccountId | HouseholdId | \"system\";\n readonly householdId?: HouseholdId;\n readonly status: WalletStatus;\n readonly version: number;\n readonly createdAt: IsoTimestamp;\n readonly closedAt?: IsoTimestamp;\n}\n\n/** Server-computed wallet totals. Clients must never derive authority from it. */\nexport interface WalletBalanceSummaryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly available: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly rewardProgress: TokenSubunitString;\n readonly version: number;\n readonly asOf: IsoTimestamp;\n}\n\n/** Lifetime aggregates used by the Token profile. */\nexport interface WalletLifetimeTotalsV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly bought: TokenSubunitString;\n readonly earned: TokenSubunitString;\n readonly allocated: TokenSubunitString;\n readonly reclaimed: TokenSubunitString;\n readonly spent: TokenSubunitString;\n readonly reversed: TokenSubunitString;\n}\n\n/** Validates an exact wallet owner without accepting a browser-derived role. */\nexport function assertWalletOwnerReference(\n owner: WalletOwnerReferenceV1,\n): void {\n economyAssert(\n [\"account\", \"household\", \"system\"].includes(owner.ownerType),\n \"INVALID_CONTRACT\",\n \"Wallet owner reference has an unsupported type\",\n );\n if (owner.ownerType === \"system\") {\n economyAssert(\n owner.ownerId === \"system\",\n \"INVALID_CONTRACT\",\n \"System wallet lookups must use the system owner\",\n );\n } else {\n assertEconomyIdentifier(owner.ownerId, \"ownerId\");\n economyAssert(\n owner.ownerId !== \"system\",\n \"INVALID_CONTRACT\",\n \"Account and household wallets cannot use the system owner\",\n );\n }\n}\n\n/** Validates wallet ownership, lifecycle, and optimistic-version facts. */\nexport function assertWallet(wallet: WalletV1): void {\n economyAssert(\n wallet.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet contract version\",\n );\n assertEconomyIdentifier(wallet.walletId, \"walletId\");\n assertEconomyIdentifier(wallet.accountId, \"accountId\");\n economyAssert(\n [\n \"household-treasury\",\n \"personal\",\n \"gameplay-allocation\",\n \"hold\",\n \"purchase-clearing\",\n \"provider-clearing\",\n \"system\",\n ].includes(wallet.kind),\n \"INVALID_CONTRACT\",\n \"Wallet has an unsupported kind\",\n );\n economyAssert(\n [\"account\", \"household\", \"system\"].includes(wallet.ownerType),\n \"INVALID_CONTRACT\",\n \"Wallet has an unsupported owner type\",\n );\n economyAssert(\n [\"active\", \"restricted\", \"closed\"].includes(wallet.status),\n \"INVALID_CONTRACT\",\n \"Wallet has an unsupported status\",\n );\n if (wallet.ownerType === \"system\") {\n economyAssert(\n wallet.ownerId === \"system\",\n \"INVALID_CONTRACT\",\n \"System wallets must be owned by the system\",\n );\n } else {\n assertEconomyIdentifier(wallet.ownerId, \"ownerId\");\n }\n if (wallet.householdId !== undefined) {\n assertEconomyIdentifier(wallet.householdId, \"householdId\");\n }\n if (wallet.ownerType === \"household\") {\n economyAssert(\n wallet.householdId === wallet.ownerId,\n \"INVALID_CONTRACT\",\n \"Household wallets must identify the same household owner\",\n );\n }\n if (wallet.kind === \"household-treasury\") {\n economyAssert(\n wallet.ownerType === \"household\" && wallet.householdId !== undefined,\n \"INVALID_CONTRACT\",\n \"Household treasuries must be owned by their household\",\n );\n }\n if (wallet.kind === \"personal\" || wallet.kind === \"gameplay-allocation\") {\n economyAssert(\n wallet.ownerType === \"account\",\n \"INVALID_CONTRACT\",\n \"Personal and gameplay-allocation wallets must be account-owned\",\n );\n }\n if (wallet.kind === \"gameplay-allocation\") {\n economyAssert(\n wallet.householdId !== undefined,\n \"INVALID_CONTRACT\",\n \"Gameplay-allocation wallets must retain household provenance\",\n );\n }\n if (\n wallet.kind === \"purchase-clearing\" ||\n wallet.kind === \"provider-clearing\" ||\n wallet.kind === \"system\"\n ) {\n economyAssert(\n wallet.ownerType === \"system\" && wallet.householdId === undefined,\n \"INVALID_CONTRACT\",\n \"Clearing and system wallets must be system-owned\",\n );\n }\n economyAssert(\n Number.isSafeInteger(wallet.version) && wallet.version >= 1,\n \"INVALID_CONTRACT\",\n \"Wallet version must be a positive safe integer\",\n );\n const createdAt = parseIsoTimestamp(wallet.createdAt);\n if (wallet.closedAt !== undefined) {\n economyAssert(\n parseIsoTimestamp(wallet.closedAt) >= createdAt &&\n wallet.status === \"closed\",\n \"INVALID_TIME_WINDOW\",\n \"Only closed wallets may have a valid closure time\",\n );\n } else {\n economyAssert(\n wallet.status !== \"closed\",\n \"INVALID_CONTRACT\",\n \"Closed wallets require a closure time\",\n );\n }\n}\n\n/** Validates non-negative server-computed wallet balance categories. */\nexport function assertWalletBalanceSummary(\n summary: WalletBalanceSummaryV1,\n): void {\n economyAssert(\n summary.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet summary contract version\",\n );\n assertEconomyIdentifier(summary.walletId, \"walletId\");\n for (const amount of [\n summary.available,\n summary.reserved,\n summary.held,\n summary.rewardProgress,\n ]) {\n economyAssert(\n parseTokenSubunits(amount) >= 0n,\n \"INVALID_AMOUNT\",\n \"Wallet summary categories cannot be negative\",\n );\n }\n economyAssert(\n Number.isSafeInteger(summary.version) && summary.version >= 1,\n \"INVALID_CONTRACT\",\n \"Wallet summary version must be a positive safe integer\",\n );\n parseIsoTimestamp(summary.asOf);\n}\n\n/** Validates non-negative lifetime aggregates exposed by the profile API. */\nexport function assertWalletLifetimeTotals(\n totals: WalletLifetimeTotalsV1,\n): void {\n economyAssert(\n totals.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet lifetime-total contract version\",\n );\n for (const amount of [\n totals.bought,\n totals.earned,\n totals.allocated,\n totals.reclaimed,\n totals.spent,\n totals.reversed,\n ]) {\n economyAssert(\n parseTokenSubunits(amount) >= 0n,\n \"INVALID_AMOUNT\",\n \"Wallet lifetime totals cannot be negative\",\n );\n }\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport {\n assertBalancedTransaction,\n assertEconomicJournalTransaction,\n type ActivityType,\n type EconomicJournalTransactionV1,\n type LedgerTransactionV1,\n} from \"./ledger.js\";\nimport {\n assertWalletBalanceSummary,\n assertWalletLifetimeTotals,\n type WalletBalanceSummaryV1,\n type WalletLifetimeTotalsV1,\n} from \"./wallets.js\";\n\nexport type BalanceProjection = Readonly<Record<AccountId, TokenSubunitString>>;\n\nexport interface BalanceProjectionSnapshotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly balances: BalanceProjection;\n readonly lastTransactionId?: TransactionId;\n readonly rebuiltAt: IsoTimestamp;\n}\n\nexport type WalletProjectionBucket = \"spendable\" | \"reserved\" | \"held\";\n\n/** Exclusive stored buckets for one wallet; reward progress is derived. */\nexport interface WalletBalanceProjectionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly spendable: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly version: number;\n readonly lastTransactionId?: TransactionId;\n readonly asOf: IsoTimestamp;\n}\n\n/** One atomic add operation against all exclusive buckets of a wallet. */\nexport interface WalletBalanceDeltaV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly spendableDelta: TokenSubunitString;\n readonly reservedDelta: TokenSubunitString;\n readonly heldDelta: TokenSubunitString;\n}\n\n/** Authoritative mapping from a ledger account to one wallet bucket. */\nexport interface WalletPostingAccountBindingV1 {\n readonly accountId: AccountId;\n readonly walletId: WalletId;\n readonly bucket: WalletProjectionBucket;\n}\n\nexport type WalletLifetimeBucket =\n | \"bought\"\n | \"earned\"\n | \"allocated\"\n | \"reclaimed\"\n | \"spent\"\n | \"reversed\";\n\n/** Positive monotonic contribution to one wallet lifetime counter. */\nexport interface WalletLifetimeDeltaV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly bucket: WalletLifetimeBucket;\n readonly amount: TokenSubunitString;\n}\n\n/** Validates one exclusive-bucket projection. */\nexport function assertWalletBalanceProjection(\n projection: WalletBalanceProjectionV1,\n): void {\n economyAssert(\n projection.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-balance-projection contract version\",\n );\n assertEconomyIdentifier(projection.walletId, \"walletId\");\n for (const amount of [\n projection.spendable,\n projection.reserved,\n projection.held,\n ]) {\n economyAssert(\n parseTokenSubunits(amount) >= 0n,\n \"NEGATIVE_PROJECTION\",\n \"Wallet projection buckets cannot be negative\",\n );\n }\n economyAssert(\n Number.isSafeInteger(projection.version) && projection.version >= 1,\n \"INVALID_CONTRACT\",\n \"Wallet projection version must be a positive safe integer\",\n );\n if (projection.lastTransactionId !== undefined) {\n assertEconomyIdentifier(\n projection.lastTransactionId,\n \"lastTransactionId\",\n );\n }\n parseIsoTimestamp(projection.asOf);\n}\n\n/** Validates one non-zero atomic wallet delta. */\nexport function assertWalletBalanceDelta(delta: WalletBalanceDeltaV1): void {\n economyAssert(\n delta.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-balance-delta contract version\",\n );\n assertEconomyIdentifier(delta.walletId, \"walletId\");\n const values = [\n parseTokenSubunits(delta.spendableDelta),\n parseTokenSubunits(delta.reservedDelta),\n parseTokenSubunits(delta.heldDelta),\n ];\n economyAssert(\n values.some((value) => value !== 0n),\n \"INVALID_AMOUNT\",\n \"Wallet balance delta must change at least one bucket\",\n );\n}\n\n/** Rejects duplicate wallet updates before one atomic persistence call. */\nexport function assertWalletBalanceDeltaBatch(\n transactionId: TransactionId,\n deltas: readonly WalletBalanceDeltaV1[],\n): void {\n assertEconomyIdentifier(transactionId, \"transactionId\");\n economyAssert(\n deltas.length > 0,\n \"INVALID_CONTRACT\",\n \"An economic transaction must update at least one wallet projection\",\n );\n const walletIds = new Set<string>();\n for (const delta of deltas) {\n assertWalletBalanceDelta(delta);\n economyAssert(\n !walletIds.has(delta.walletId),\n \"DUPLICATE_IDENTIFIER\",\n \"A balance-delta batch must update each wallet once\",\n );\n walletIds.add(delta.walletId);\n }\n}\n\n/** Applies an atomic add locally for deterministic tests and rebuilds. */\nexport function applyWalletBalanceDelta(\n projection: WalletBalanceProjectionV1,\n delta: WalletBalanceDeltaV1,\n transactionId: TransactionId,\n asOf: IsoTimestamp,\n): WalletBalanceProjectionV1 {\n assertWalletBalanceProjection(projection);\n assertWalletBalanceDelta(delta);\n assertEconomyIdentifier(transactionId, \"transactionId\");\n economyAssert(\n projection.walletId === delta.walletId,\n \"INVALID_CONTRACT\",\n \"Wallet balance delta must target its projection wallet\",\n );\n economyAssert(\n parseIsoTimestamp(asOf) >= parseIsoTimestamp(projection.asOf),\n \"INVALID_TIME_WINDOW\",\n \"Wallet balance update cannot precede its projection\",\n );\n const next: WalletBalanceProjectionV1 = {\n ...projection,\n spendable: serializeTokenSubunits(\n parseTokenSubunits(projection.spendable) +\n parseTokenSubunits(delta.spendableDelta),\n ),\n reserved: serializeTokenSubunits(\n parseTokenSubunits(projection.reserved) +\n parseTokenSubunits(delta.reservedDelta),\n ),\n held: serializeTokenSubunits(\n parseTokenSubunits(projection.held) +\n parseTokenSubunits(delta.heldDelta),\n ),\n version: projection.version + 1,\n lastTransactionId: transactionId,\n asOf,\n };\n assertWalletBalanceProjection(next);\n return next;\n}\n\n/**\n * Converts exclusive storage buckets to the legacy display DTO. Available is\n * independently usable whole Tokens in this wallet; rewardProgress is this\n * wallet's sub-Token remainder and is never netted with another wallet.\n */\nexport function createWalletBalanceSummary(\n projection: WalletBalanceProjectionV1,\n): WalletBalanceSummaryV1 {\n assertWalletBalanceProjection(projection);\n const spendable = parseTokenSubunits(projection.spendable);\n const rewardProgress = spendable % 1_000n;\n const summary: WalletBalanceSummaryV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId: projection.walletId,\n available: serializeTokenSubunits(spendable - rewardProgress),\n reserved: projection.reserved,\n held: projection.held,\n rewardProgress: serializeTokenSubunits(rewardProgress),\n version: projection.version,\n asOf: projection.asOf,\n };\n assertDeterministicWalletBalanceSummary(summary);\n return summary;\n}\n\n/** Enforces the stronger per-wallet semantics required by V1 query adapters. */\nexport function assertDeterministicWalletBalanceSummary(\n summary: WalletBalanceSummaryV1,\n): void {\n assertWalletBalanceSummary(summary);\n economyAssert(\n parseTokenSubunits(summary.available) % 1_000n === 0n &&\n parseTokenSubunits(summary.rewardProgress) < 1_000n,\n \"INVALID_CONTRACT\",\n \"Per-wallet availability must be whole Tokens with sub-Token progress below one Token\",\n );\n}\n\n/**\n * Derives a single delta per wallet from wallet-linked postings and an\n * authoritative account-to-bucket mapping. Unlinked system postings are not\n * wallet projections.\n */\nexport function deriveWalletBalanceDeltas(\n transaction: EconomicJournalTransactionV1,\n bindings: readonly WalletPostingAccountBindingV1[],\n): readonly WalletBalanceDeltaV1[] {\n assertEconomicJournalTransaction(transaction);\n const byAccount = new Map<AccountId, WalletPostingAccountBindingV1>();\n for (const binding of bindings) {\n assertEconomyIdentifier(binding.accountId, \"accountId\");\n assertEconomyIdentifier(binding.walletId, \"walletId\");\n economyAssert(\n [\"spendable\", \"reserved\", \"held\"].includes(binding.bucket),\n \"INVALID_CONTRACT\",\n \"Wallet account binding has an unsupported bucket\",\n );\n economyAssert(\n !byAccount.has(binding.accountId),\n \"DUPLICATE_IDENTIFIER\",\n \"A ledger account may bind to only one wallet bucket\",\n );\n byAccount.set(binding.accountId, binding);\n }\n\n const byWallet = new Map<WalletId, [bigint, bigint, bigint]>();\n for (const posting of transaction.postings) {\n if (posting.walletId === undefined) {\n continue;\n }\n const binding = byAccount.get(posting.accountId);\n economyAssert(\n binding !== undefined && binding.walletId === posting.walletId,\n \"INVALID_CONTRACT\",\n \"Every wallet-linked posting must match an authoritative account binding\",\n );\n const values = byWallet.get(binding.walletId) ?? [0n, 0n, 0n];\n const amount = parseTokenSubunits(posting.amount);\n if (binding.bucket === \"spendable\") {\n values[0] += amount;\n } else if (binding.bucket === \"reserved\") {\n values[1] += amount;\n } else {\n values[2] += amount;\n }\n byWallet.set(binding.walletId, values);\n }\n\n const deltas = [...byWallet.entries()]\n .map(([walletId, values]) => ({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n spendableDelta: serializeTokenSubunits(values[0]),\n reservedDelta: serializeTokenSubunits(values[1]),\n heldDelta: serializeTokenSubunits(values[2]),\n }))\n .filter(\n (delta) =>\n delta.spendableDelta !== \"0\" ||\n delta.reservedDelta !== \"0\" ||\n delta.heldDelta !== \"0\",\n )\n .sort((left, right) => left.walletId.localeCompare(right.walletId));\n assertWalletBalanceDeltaBatch(transaction.transactionId, deltas);\n return deltas;\n}\n\nconst EARNED_ACTIVITY_TYPES = new Set<ActivityType>([\n \"rewarded-ad\",\n \"offerwall\",\n \"event\",\n \"competition\",\n]);\n\n/**\n * Rebuilds monotonic gross lifetime contributions from a settled transaction.\n * Earlier bought/earned counters are never reduced by a later compensating\n * transaction; removals accrue separately in `reversed`.\n */\nexport function deriveWalletLifetimeDeltas(\n transaction: EconomicJournalTransactionV1,\n): readonly WalletLifetimeDeltaV1[] {\n assertEconomicJournalTransaction(transaction);\n if (transaction.status !== \"settled\") {\n return [];\n }\n const netByWallet = new Map<WalletId, bigint>();\n for (const posting of transaction.postings) {\n if (posting.walletId !== undefined) {\n netByWallet.set(\n posting.walletId,\n (netByWallet.get(posting.walletId) ?? 0n) +\n parseTokenSubunits(posting.amount),\n );\n }\n }\n\n const deltas: WalletLifetimeDeltaV1[] = [];\n for (const [walletId, net] of [...netByWallet.entries()].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n let bucket: WalletLifetimeBucket | undefined;\n let amount = 0n;\n if (\n net > 0n &&\n (transaction.activityType === \"purchase\" ||\n transaction.activityType === \"subscription\")\n ) {\n bucket = \"bought\";\n amount = net;\n } else if (net > 0n && EARNED_ACTIVITY_TYPES.has(transaction.activityType)) {\n bucket = \"earned\";\n amount = net;\n } else if (\n net < 0n &&\n (transaction.activityType === \"allocation\" ||\n transaction.activityType === \"boost\")\n ) {\n bucket = \"allocated\";\n amount = -net;\n } else if (net > 0n && transaction.activityType === \"reclaim\") {\n bucket = \"reclaimed\";\n amount = net;\n } else if (net < 0n && transaction.activityType === \"spend\") {\n bucket = \"spent\";\n amount = -net;\n } else if (\n net < 0n &&\n (transaction.activityType === \"refund\" ||\n transaction.activityType === \"chargeback\" ||\n transaction.activityType === \"reversal\")\n ) {\n bucket = \"reversed\";\n amount = -net;\n }\n if (bucket !== undefined) {\n deltas.push({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n bucket,\n amount: serializeTokenSubunits(amount),\n });\n }\n }\n return deltas;\n}\n\n/** Applies positive lifetime deltas for one wallet without rewriting history. */\nexport function applyWalletLifetimeDeltas(\n current: WalletLifetimeTotalsV1,\n walletId: WalletId,\n deltas: readonly WalletLifetimeDeltaV1[],\n): WalletLifetimeTotalsV1 {\n assertWalletLifetimeTotals(current);\n assertEconomyIdentifier(walletId, \"walletId\");\n const next: Record<WalletLifetimeBucket, bigint> = {\n bought: parseTokenSubunits(current.bought),\n earned: parseTokenSubunits(current.earned),\n allocated: parseTokenSubunits(current.allocated),\n reclaimed: parseTokenSubunits(current.reclaimed),\n spent: parseTokenSubunits(current.spent),\n reversed: parseTokenSubunits(current.reversed),\n };\n for (const delta of deltas) {\n economyAssert(\n delta.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n delta.walletId === walletId &&\n [\n \"bought\",\n \"earned\",\n \"allocated\",\n \"reclaimed\",\n \"spent\",\n \"reversed\",\n ].includes(delta.bucket),\n \"INVALID_CONTRACT\",\n \"Lifetime delta must target the requested wallet and a known bucket\",\n );\n const amount = parseTokenSubunits(delta.amount);\n economyAssert(\n amount > 0n,\n \"INVALID_AMOUNT\",\n \"Lifetime deltas must be positive\",\n );\n next[delta.bucket] += amount;\n }\n const totals: WalletLifetimeTotalsV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n bought: serializeTokenSubunits(next.bought),\n earned: serializeTokenSubunits(next.earned),\n allocated: serializeTokenSubunits(next.allocated),\n reclaimed: serializeTokenSubunits(next.reclaimed),\n spent: serializeTokenSubunits(next.spent),\n reversed: serializeTokenSubunits(next.reversed),\n };\n assertWalletLifetimeTotals(totals);\n return totals;\n}\n\n/** Applies one balanced transaction without mutating the existing projection. */\nexport function applyTransactionToProjection(\n current: BalanceProjection,\n transaction: LedgerTransactionV1,\n): BalanceProjection {\n assertBalancedTransaction(transaction);\n const next: Record<AccountId, TokenSubunitString> = { ...current };\n for (const posting of transaction.postings) {\n const prior = parseTokenSubunits(next[posting.accountId] ?? \"0\");\n next[posting.accountId] = serializeTokenSubunits(\n prior + parseTokenSubunits(posting.amount),\n );\n }\n return next;\n}\n\n/**\n * Rebuilds balances deterministically and rejects duplicate economic envelopes.\n */\nexport function rebuildBalanceProjection(\n transactions: readonly LedgerTransactionV1[],\n): BalanceProjection {\n let projection: BalanceProjection = {};\n const transactionIds = new Set<string>();\n const idempotencyKeys = new Set<string>();\n const providerEvents = new Set<string>();\n\n for (const transaction of transactions) {\n economyAssert(\n !transactionIds.has(transaction.transactionId),\n \"DUPLICATE_TRANSACTION\",\n \"Transaction identifiers must be unique\",\n );\n economyAssert(\n !idempotencyKeys.has(transaction.idempotencyKey),\n \"DUPLICATE_TRANSACTION\",\n \"Idempotency keys must be unique\",\n );\n if (transaction.providerEventId !== undefined) {\n economyAssert(\n !providerEvents.has(transaction.providerEventId),\n \"DUPLICATE_TRANSACTION\",\n \"Provider event identifiers must be unique\",\n );\n providerEvents.add(transaction.providerEventId);\n }\n transactionIds.add(transaction.transactionId);\n idempotencyKeys.add(transaction.idempotencyKey);\n projection = applyTransactionToProjection(projection, transaction);\n }\n\n return projection;\n}\n\n/** Enforces non-negative balances only for spendable/reservable accounts. */\nexport function assertNonNegativeAccounts(\n projection: BalanceProjection,\n protectedAccountIds: readonly AccountId[],\n): void {\n for (const accountId of protectedAccountIds) {\n economyAssert(\n parseTokenSubunits(projection[accountId] ?? \"0\") >= 0n,\n \"NEGATIVE_PROJECTION\",\n \"A protected economy account would become negative\",\n );\n }\n}\n\n/** Creates a versioned snapshot after a deterministic rebuild. */\nexport function createProjectionSnapshot(\n transactions: readonly LedgerTransactionV1[],\n rebuiltAt: IsoTimestamp,\n): BalanceProjectionSnapshotV1 {\n parseIsoTimestamp(rebuiltAt);\n const last = transactions.at(-1);\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n balances: rebuildBalanceProjection(transactions),\n ...(last === undefined ? {} : { lastTransactionId: last.transactionId }),\n rebuiltAt,\n };\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"../amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n type WalletId,\n} from \"../contracts.js\";\nimport { economyAssert } from \"../errors.js\";\nimport type { ActivityType } from \"../ledger.js\";\nimport type { TokenSource } from \"../lots.js\";\nimport { assertDeterministicWalletBalanceSummary } from \"../projection.js\";\nimport {\n assertWalletLifetimeTotals,\n type WalletBalanceSummaryV1,\n type WalletLifetimeTotalsV1,\n} from \"../wallets.js\";\n\nexport type WalletPortfolioComponentRole =\n | \"household-treasury\"\n | \"personal\"\n | \"gameplay-allocation\"\n | \"hold\";\n\n/** One server-authorized component of a portfolio read. */\nexport interface WalletPortfolioComponentScopeV1 {\n readonly walletId: WalletId;\n readonly role: WalletPortfolioComponentRole;\n readonly beneficiaryAccountId?: AccountId;\n}\n\n/**\n * Explicit portfolio scope assembled after authorization. It prevents a host's\n * household treasury and same-user-only personal wallet from being silently\n * represented as one wallet.\n */\nexport interface WalletPortfolioReadScopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly portfolioId: string;\n readonly subjectAccountId: AccountId;\n readonly components: readonly WalletPortfolioComponentScopeV1[];\n}\n\nexport interface WalletBalanceTotalsV1 {\n readonly available: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly rewardProgress: TokenSubunitString;\n}\n\nexport interface WalletPortfolioBalanceComponentV1\n extends WalletPortfolioComponentScopeV1 {\n readonly summary: WalletBalanceSummaryV1;\n}\n\nexport interface WalletPortfolioSummaryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly portfolioId: string;\n readonly subjectAccountId: AccountId;\n readonly components: readonly WalletPortfolioBalanceComponentV1[];\n /**\n * Exact column sums for display only. Progress is intentionally not promoted\n * across wallets because their source/transfer policies may differ.\n */\n readonly totals: WalletBalanceTotalsV1;\n readonly asOf: IsoTimestamp;\n}\n\n/** Self-identifying lifetime read for one wallet. */\nexport interface WalletLifetimeSnapshotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly totals: WalletLifetimeTotalsV1;\n readonly version: number;\n readonly asOf: IsoTimestamp;\n}\n\nexport interface WalletPortfolioLifetimeComponentV1\n extends WalletPortfolioComponentScopeV1 {\n readonly snapshot: WalletLifetimeSnapshotV1;\n}\n\nexport interface WalletPortfolioLifetimeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly portfolioId: string;\n readonly subjectAccountId: AccountId;\n readonly components: readonly WalletPortfolioLifetimeComponentV1[];\n readonly totals: WalletLifetimeTotalsV1;\n readonly asOf: IsoTimestamp;\n}\n\nexport type EconomicActivityStatusV1 = \"held\" | \"settled\" | \"reversed\";\nexport type WorkflowActivityStatusV1 = \"pending\" | \"failed\";\nexport type WalletActivityStatusV1 =\n | EconomicActivityStatusV1\n | WorkflowActivityStatusV1;\n\ninterface WalletActivityBaseV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly activityId: string;\n /** Component wallet whose signed display amount this row represents. */\n readonly walletId: WalletId;\n readonly activityType: ActivityType;\n readonly occurredAt: IsoTimestamp;\n readonly amount: TokenSubunitString;\n readonly source: TokenSource;\n readonly beneficiaryAccountId?: AccountId;\n readonly maskedReference?: string;\n readonly sourceLabel: string;\n}\n\n/** Economically effective or read-model-derived reversal activity. */\nexport interface EconomicWalletActivityEntryV1 extends WalletActivityBaseV1 {\n readonly entryKind: \"economic\";\n readonly transactionId: TransactionId;\n readonly status: EconomicActivityStatusV1;\n}\n\n/**\n * Non-economic accepted/failed work. Its amount is display context only and is\n * excluded from balances and lifetime aggregates.\n */\nexport interface WorkflowWalletActivityEntryV1 extends WalletActivityBaseV1 {\n readonly entryKind: \"workflow\";\n readonly commandId: string;\n readonly status: WorkflowActivityStatusV1;\n}\n\nexport type WalletActivityEntryV1 =\n | EconomicWalletActivityEntryV1\n | WorkflowWalletActivityEntryV1;\n\nexport interface WalletActivityFilterV1 {\n readonly activityTypes?: readonly ActivityType[];\n readonly statuses?: readonly WalletActivityStatusV1[];\n readonly sources?: readonly TokenSource[];\n readonly beneficiaryAccountId?: AccountId;\n readonly fromInclusive?: IsoTimestamp;\n readonly toExclusive?: IsoTimestamp;\n}\n\nexport interface WalletActivityPageRequestV1 {\n readonly limit: number;\n readonly cursor?: string;\n readonly filter?: WalletActivityFilterV1;\n}\n\nexport interface WalletActivityPageV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly entries: readonly WalletActivityEntryV1[];\n readonly hasMore: boolean;\n readonly nextCursor?: string;\n}\n\nconst ACTIVITY_TYPES = new Set<ActivityType>([\n \"purchase\",\n \"subscription\",\n \"rewarded-ad\",\n \"offerwall\",\n \"allocation\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"refund\",\n \"chargeback\",\n \"adjustment\",\n \"reversal\",\n \"event\",\n \"competition\",\n]);\nconst ACTIVITY_STATUSES = new Set<WalletActivityStatusV1>([\n \"pending\",\n \"held\",\n \"settled\",\n \"reversed\",\n \"failed\",\n]);\nconst ACTIVITY_SOURCES = new Set<TokenSource>([\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n \"subscription\",\n \"event\",\n \"competition\",\n \"adjustment\",\n]);\nconst PORTFOLIO_ROLES = new Set<WalletPortfolioComponentRole>([\n \"household-treasury\",\n \"personal\",\n \"gameplay-allocation\",\n \"hold\",\n]);\n\nfunction hasControlCharacters(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || code === 127;\n });\n}\n\nfunction assertSafeDisplayString(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" &&\n value.trim().length > 0 &&\n value.length <= 128 &&\n !hasControlCharacters(value),\n \"INVALID_CONTRACT\",\n `${label} must be bounded and safe for display`,\n );\n}\n\nfunction assertOpaqueCursor(value: string): void {\n economyAssert(\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= 512 &&\n !hasControlCharacters(value),\n \"INVALID_CONTRACT\",\n \"Activity cursor must be a bounded opaque value\",\n );\n}\n\nfunction assertUniqueValues<T extends string>(\n values: readonly T[],\n allowed: ReadonlySet<T>,\n label: string,\n): void {\n const unique = new Set(values);\n economyAssert(\n values.length > 0 &&\n values.length === unique.size &&\n values.every((value) => allowed.has(value)),\n \"INVALID_CONTRACT\",\n `${label} must contain unique supported values`,\n );\n}\n\n/** Validates a server-created, bounded portfolio scope. */\nexport function assertWalletPortfolioReadScope(\n scope: WalletPortfolioReadScopeV1,\n): void {\n economyAssert(\n scope.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-portfolio scope contract version\",\n );\n assertEconomyIdentifier(scope.portfolioId, \"portfolioId\");\n assertEconomyIdentifier(scope.subjectAccountId, \"subjectAccountId\");\n economyAssert(\n scope.components.length > 0 && scope.components.length <= 100,\n \"INVALID_CONTRACT\",\n \"Wallet portfolio must contain between one and 100 components\",\n );\n const walletIds = new Set<string>();\n for (const component of scope.components) {\n assertEconomyIdentifier(component.walletId, \"walletId\");\n economyAssert(\n PORTFOLIO_ROLES.has(component.role),\n \"INVALID_CONTRACT\",\n \"Wallet portfolio component has an unsupported role\",\n );\n economyAssert(\n !walletIds.has(component.walletId),\n \"DUPLICATE_IDENTIFIER\",\n \"Wallet portfolio cannot repeat a wallet\",\n );\n walletIds.add(component.walletId);\n if (component.beneficiaryAccountId !== undefined) {\n assertEconomyIdentifier(\n component.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n }\n economyAssert(\n component.role !== \"gameplay-allocation\" ||\n component.beneficiaryAccountId !== undefined,\n \"INVALID_CONTRACT\",\n \"Gameplay-allocation portfolio components require a beneficiary\",\n );\n }\n}\n\n/** Validates a self-identifying wallet lifetime read. */\nexport function assertWalletLifetimeSnapshot(\n snapshot: WalletLifetimeSnapshotV1,\n): void {\n economyAssert(\n snapshot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-lifetime-snapshot contract version\",\n );\n assertEconomyIdentifier(snapshot.walletId, \"walletId\");\n assertWalletLifetimeTotals(snapshot.totals);\n economyAssert(\n Number.isSafeInteger(snapshot.version) && snapshot.version >= 1,\n \"INVALID_CONTRACT\",\n \"Wallet lifetime version must be a positive safe integer\",\n );\n parseIsoTimestamp(snapshot.asOf);\n}\n\nfunction assertPortfolioComponentMatch(\n expected: WalletPortfolioComponentScopeV1,\n actual: WalletPortfolioComponentScopeV1,\n): void {\n economyAssert(\n expected.walletId === actual.walletId &&\n expected.role === actual.role &&\n expected.beneficiaryAccountId === actual.beneficiaryAccountId,\n \"INVALID_CONTRACT\",\n \"Portfolio result component does not match its authorized read scope\",\n );\n}\n\n/**\n * Constructs a portfolio balance without merging wallet identities or\n * promoting sub-Token progress across policy boundaries.\n */\nexport function createWalletPortfolioSummary(\n scope: WalletPortfolioReadScopeV1,\n components: readonly WalletPortfolioBalanceComponentV1[],\n asOf: IsoTimestamp,\n): WalletPortfolioSummaryV1 {\n assertWalletPortfolioReadScope(scope);\n parseIsoTimestamp(asOf);\n economyAssert(\n components.length === scope.components.length,\n \"INVALID_CONTRACT\",\n \"Portfolio balance must include every authorized component exactly once\",\n );\n const byWallet = new Map(components.map((item) => [item.walletId, item]));\n economyAssert(\n byWallet.size === components.length,\n \"DUPLICATE_IDENTIFIER\",\n \"Portfolio balance cannot repeat a wallet\",\n );\n\n const ordered = scope.components.map((expected) => {\n const actual = byWallet.get(expected.walletId);\n economyAssert(\n actual !== undefined,\n \"INVALID_CONTRACT\",\n \"Portfolio balance is missing an authorized wallet\",\n );\n assertPortfolioComponentMatch(expected, actual);\n assertDeterministicWalletBalanceSummary(actual.summary);\n economyAssert(\n actual.summary.walletId === actual.walletId &&\n actual.summary.asOf === asOf,\n \"INVALID_CONTRACT\",\n \"Portfolio component summary must identify its wallet and shared snapshot time\",\n );\n return actual;\n });\n\n const totals: WalletBalanceTotalsV1 = {\n available: serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.summary.available),\n 0n,\n ),\n ),\n reserved: serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.summary.reserved),\n 0n,\n ),\n ),\n held: serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.summary.held),\n 0n,\n ),\n ),\n rewardProgress: serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.summary.rewardProgress),\n 0n,\n ),\n ),\n };\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n portfolioId: scope.portfolioId,\n subjectAccountId: scope.subjectAccountId,\n components: ordered,\n totals,\n asOf,\n };\n}\n\n/** Validates a portfolio balance read independently of its producing adapter. */\nexport function assertWalletPortfolioSummary(\n summary: WalletPortfolioSummaryV1,\n): void {\n const scope: WalletPortfolioReadScopeV1 = {\n schemaVersion: summary.schemaVersion,\n portfolioId: summary.portfolioId,\n subjectAccountId: summary.subjectAccountId,\n components: summary.components.map(\n ({ walletId, role, beneficiaryAccountId }) => ({\n walletId,\n role,\n ...(beneficiaryAccountId === undefined\n ? {}\n : { beneficiaryAccountId }),\n }),\n ),\n };\n const rebuilt = createWalletPortfolioSummary(\n scope,\n summary.components,\n summary.asOf,\n );\n for (const field of [\n \"available\",\n \"reserved\",\n \"held\",\n \"rewardProgress\",\n ] as const) {\n economyAssert(\n summary.totals[field] === rebuilt.totals[field],\n \"INVALID_CONTRACT\",\n \"Portfolio balance totals must equal their component column sums\",\n );\n }\n}\n\n/** Builds monotonic lifetime totals while retaining per-wallet components. */\nexport function createWalletPortfolioLifetime(\n scope: WalletPortfolioReadScopeV1,\n components: readonly WalletPortfolioLifetimeComponentV1[],\n asOf: IsoTimestamp,\n): WalletPortfolioLifetimeV1 {\n assertWalletPortfolioReadScope(scope);\n parseIsoTimestamp(asOf);\n economyAssert(\n components.length === scope.components.length,\n \"INVALID_CONTRACT\",\n \"Portfolio lifetime must include every authorized component exactly once\",\n );\n const byWallet = new Map(components.map((item) => [item.walletId, item]));\n economyAssert(\n byWallet.size === components.length,\n \"DUPLICATE_IDENTIFIER\",\n \"Portfolio lifetime cannot repeat a wallet\",\n );\n const ordered = scope.components.map((expected) => {\n const actual = byWallet.get(expected.walletId);\n economyAssert(\n actual !== undefined,\n \"INVALID_CONTRACT\",\n \"Portfolio lifetime is missing an authorized wallet\",\n );\n assertPortfolioComponentMatch(expected, actual);\n assertWalletLifetimeSnapshot(actual.snapshot);\n economyAssert(\n actual.snapshot.walletId === actual.walletId &&\n actual.snapshot.asOf === asOf,\n \"INVALID_CONTRACT\",\n \"Portfolio lifetime component must identify its wallet and shared snapshot time\",\n );\n return actual;\n });\n const sumField = (\n field: Exclude<keyof WalletLifetimeTotalsV1, \"schemaVersion\">,\n ): TokenSubunitString =>\n serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.snapshot.totals[field]),\n 0n,\n ),\n );\n const totals: WalletLifetimeTotalsV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n bought: sumField(\"bought\"),\n earned: sumField(\"earned\"),\n allocated: sumField(\"allocated\"),\n reclaimed: sumField(\"reclaimed\"),\n spent: sumField(\"spent\"),\n reversed: sumField(\"reversed\"),\n };\n assertWalletLifetimeTotals(totals);\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n portfolioId: scope.portfolioId,\n subjectAccountId: scope.subjectAccountId,\n components: ordered,\n totals,\n asOf,\n };\n}\n\n/** Validates a portfolio lifetime read independently of its producing adapter. */\nexport function assertWalletPortfolioLifetime(\n lifetime: WalletPortfolioLifetimeV1,\n): void {\n const scope: WalletPortfolioReadScopeV1 = {\n schemaVersion: lifetime.schemaVersion,\n portfolioId: lifetime.portfolioId,\n subjectAccountId: lifetime.subjectAccountId,\n components: lifetime.components.map(\n ({ walletId, role, beneficiaryAccountId }) => ({\n walletId,\n role,\n ...(beneficiaryAccountId === undefined\n ? {}\n : { beneficiaryAccountId }),\n }),\n ),\n };\n const rebuilt = createWalletPortfolioLifetime(\n scope,\n lifetime.components,\n lifetime.asOf,\n );\n for (const field of [\n \"bought\",\n \"earned\",\n \"allocated\",\n \"reclaimed\",\n \"spent\",\n \"reversed\",\n ] as const) {\n economyAssert(\n lifetime.totals[field] === rebuilt.totals[field],\n \"INVALID_CONTRACT\",\n \"Portfolio lifetime totals must equal their component column sums\",\n );\n }\n}\n\n/** Validates the economic/workflow activity discriminant and safe display data. */\nexport function assertWalletActivityEntry(\n entry: WalletActivityEntryV1,\n): void {\n economyAssert(\n entry.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-activity contract version\",\n );\n assertEconomyIdentifier(entry.activityId, \"activityId\");\n assertEconomyIdentifier(entry.walletId, \"walletId\");\n economyAssert(\n ACTIVITY_TYPES.has(entry.activityType) &&\n ACTIVITY_STATUSES.has(entry.status) &&\n ACTIVITY_SOURCES.has(entry.source),\n \"INVALID_CONTRACT\",\n \"Wallet activity type, status, or source is unsupported\",\n );\n parseIsoTimestamp(entry.occurredAt);\n economyAssert(\n parseTokenSubunits(entry.amount) !== 0n,\n \"INVALID_AMOUNT\",\n \"Wallet activity amount cannot be zero\",\n );\n if (entry.beneficiaryAccountId !== undefined) {\n assertEconomyIdentifier(\n entry.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n }\n if (entry.maskedReference !== undefined) {\n assertSafeDisplayString(entry.maskedReference, \"Masked reference\");\n }\n assertSafeDisplayString(entry.sourceLabel, \"Source label\");\n economyAssert(\n entry.entryKind === \"economic\" || entry.entryKind === \"workflow\",\n \"INVALID_CONTRACT\",\n \"Wallet activity has an unsupported entry kind\",\n );\n if (entry.entryKind === \"economic\") {\n assertEconomyIdentifier(entry.transactionId, \"transactionId\");\n economyAssert(\n entry.status === \"held\" ||\n entry.status === \"settled\" ||\n entry.status === \"reversed\",\n \"INVALID_CONTRACT\",\n \"Economic activity cannot use a workflow status\",\n );\n } else {\n assertEconomyIdentifier(entry.commandId, \"commandId\");\n economyAssert(\n entry.status === \"pending\" || entry.status === \"failed\",\n \"INVALID_CONTRACT\",\n \"Workflow activity cannot use an economic status\",\n );\n }\n}\n\n/** Validates bounded filters and opaque cursor input. */\nexport function assertWalletActivityPageRequest(\n request: WalletActivityPageRequestV1,\n): void {\n economyAssert(\n Number.isSafeInteger(request.limit) &&\n request.limit >= 1 &&\n request.limit <= 100,\n \"INVALID_CONTRACT\",\n \"Activity page limit must be between one and 100\",\n );\n if (request.cursor !== undefined) {\n assertOpaqueCursor(request.cursor);\n }\n const filter = request.filter;\n if (filter === undefined) {\n return;\n }\n if (filter.activityTypes !== undefined) {\n assertUniqueValues(filter.activityTypes, ACTIVITY_TYPES, \"Activity types\");\n }\n if (filter.statuses !== undefined) {\n assertUniqueValues(filter.statuses, ACTIVITY_STATUSES, \"Activity statuses\");\n }\n if (filter.sources !== undefined) {\n assertUniqueValues(filter.sources, ACTIVITY_SOURCES, \"Activity sources\");\n }\n if (filter.beneficiaryAccountId !== undefined) {\n assertEconomyIdentifier(\n filter.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n }\n const from =\n filter.fromInclusive === undefined\n ? undefined\n : parseIsoTimestamp(filter.fromInclusive);\n const to =\n filter.toExclusive === undefined\n ? undefined\n : parseIsoTimestamp(filter.toExclusive);\n economyAssert(\n from === undefined || to === undefined || from < to,\n \"INVALID_TIME_WINDOW\",\n \"Activity filter start must precede its exclusive end\",\n );\n}\n\n/**\n * Validates stable descending `(occurredAt, activityId)` page order and cursor\n * presence. Cursors remain opaque to this provider-neutral package.\n */\nexport function assertWalletActivityPage(page: WalletActivityPageV1): void {\n economyAssert(\n page.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n typeof page.hasMore === \"boolean\",\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-activity-page contract\",\n );\n economyAssert(\n page.hasMore === (page.nextCursor !== undefined),\n \"INVALID_CONTRACT\",\n \"Activity page cursor must be present exactly when more rows exist\",\n );\n economyAssert(\n page.entries.length <= 100 && (!page.hasMore || page.entries.length > 0),\n \"INVALID_CONTRACT\",\n \"Activity pages are bounded and cannot advertise more rows from an empty page\",\n );\n if (page.nextCursor !== undefined) {\n assertOpaqueCursor(page.nextCursor);\n }\n const activityIds = new Set<string>();\n let previous: WalletActivityEntryV1 | undefined;\n for (const entry of page.entries) {\n assertWalletActivityEntry(entry);\n economyAssert(\n !activityIds.has(entry.activityId),\n \"DUPLICATE_IDENTIFIER\",\n \"Activity page cannot repeat an activity ID\",\n );\n activityIds.add(entry.activityId);\n if (previous !== undefined) {\n const previousTime = parseIsoTimestamp(previous.occurredAt);\n const currentTime = parseIsoTimestamp(entry.occurredAt);\n economyAssert(\n previousTime > currentTime ||\n (previousTime === currentTime &&\n previous.activityId.localeCompare(entry.activityId) > 0),\n \"INVALID_CONTRACT\",\n \"Activity page must use stable descending time and ID order\",\n );\n }\n previous = entry;\n }\n}\n\n/** Prevents an activity cursor/result from expanding an authorized portfolio. */\nexport function assertWalletActivityPageForPortfolio(\n page: WalletActivityPageV1,\n scope: WalletPortfolioReadScopeV1,\n): void {\n assertWalletActivityPage(page);\n assertWalletPortfolioReadScope(scope);\n const walletIds = new Set(scope.components.map((item) => item.walletId));\n economyAssert(\n page.entries.every((entry) => walletIds.has(entry.walletId)),\n \"INVALID_CONTRACT\",\n \"Portfolio activity contains a wallet outside its authorized read scope\",\n );\n}\n\n/** Read-only adapter boundary; authorization must precede scope construction. */\nexport interface EconomyQueryPortV1 {\n getWalletSummary(walletId: WalletId): Promise<WalletBalanceSummaryV1 | null>;\n getWalletLifetime(\n walletId: WalletId,\n ): Promise<WalletLifetimeSnapshotV1 | null>;\n listWalletActivity(\n walletId: WalletId,\n request: WalletActivityPageRequestV1,\n ): Promise<WalletActivityPageV1>;\n getPortfolioSummary(\n scope: WalletPortfolioReadScopeV1,\n ): Promise<WalletPortfolioSummaryV1>;\n getPortfolioLifetime(\n scope: WalletPortfolioReadScopeV1,\n ): Promise<WalletPortfolioLifetimeV1>;\n listPortfolioActivity(\n scope: WalletPortfolioReadScopeV1,\n request: WalletActivityPageRequestV1,\n ): Promise<WalletActivityPageV1>;\n}\n","import {\n assertPurchaseLimitPolicy,\n type PurchaseLimitPolicyV1,\n} from \"./acquisition.js\";\nimport { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { EconomyError, economyAssert } from \"./errors.js\";\n\ndeclare const gbpMinorUnitStringBrand: unique symbol;\n\n/** Canonical non-negative GBP minor-unit string used by cap contracts. */\nexport type GbpMinorUnitString = string & {\n readonly [gbpMinorUnitStringBrand]: \"GbpMinorUnitString\";\n};\n\nconst MAX_SIGNED_BIGINT = 2n ** 63n - 1n;\nconst CANONICAL_NON_NEGATIVE_INTEGER = /^(?:0|[1-9][0-9]*)$/u;\n\n/** Parses exact GBP minor units without floating point or coercion. */\nexport function parseGbpMinorUnits(value: string): bigint {\n economyAssert(\n typeof value === \"string\" && CANONICAL_NON_NEGATIVE_INTEGER.test(value),\n \"INVALID_AMOUNT\",\n \"GBP minor units must be a canonical non-negative integer string\",\n );\n try {\n const amount = BigInt(value);\n economyAssert(\n amount <= MAX_SIGNED_BIGINT,\n \"AMOUNT_OUT_OF_RANGE\",\n \"GBP minor units are outside the signed 64-bit range\",\n );\n return amount;\n } catch (error) {\n if (error instanceof EconomyError) {\n throw error;\n }\n throw new EconomyError(\"INVALID_AMOUNT\", \"GBP minor units are invalid\");\n }\n}\n\n/** Serializes exact GBP minor units using the canonical wire representation. */\nexport function serializeGbpMinorUnits(amount: bigint): GbpMinorUnitString {\n economyAssert(\n amount >= 0n && amount <= MAX_SIGNED_BIGINT,\n \"AMOUNT_OUT_OF_RANGE\",\n \"GBP minor units are outside the signed 64-bit range\",\n );\n return amount.toString(10) as GbpMinorUnitString;\n}\n\nexport type PurchaseCapScopeTypeV1 = \"payer\" | \"household\";\nexport type PurchaseCapReservationStatusV1 =\n | \"reserved\"\n | \"settled\"\n | \"released\"\n | \"expired\";\nexport type PurchaseCapReservationTransitionTypeV1 =\n | \"settle\"\n | \"release\"\n | \"expire\";\n\nexport interface PurchaseCapReservationTransitionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transitionId: string;\n readonly reservationId: string;\n readonly transitionType: PurchaseCapReservationTransitionTypeV1;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Append-only cap evidence; effectiveness is rebuilt from occurrence order. */\nexport interface PurchaseCapReservationTransitionReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transition: PurchaseCapReservationTransitionV1;\n}\n\n/** One purchase amount mirrored into payer and household cap aggregates. */\nexport interface PurchaseCapReservationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly reservationId: string;\n readonly payerAccountId: AccountId;\n readonly householdId: HouseholdId;\n readonly priceMinorUnits: GbpMinorUnitString;\n readonly status: PurchaseCapReservationStatusV1;\n readonly reservedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n /** Derived winning transition; every delivery remains in `transitionReceipts`. */\n readonly finalTransitionId?: string;\n readonly finalizedAt?: IsoTimestamp;\n readonly transitionReceipts: readonly PurchaseCapReservationTransitionReceiptV1[];\n}\n\n/** Optimistic aggregate for exactly one payer or household rolling ceiling. */\nexport interface RollingPurchaseCapStateV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly scopeType: PurchaseCapScopeTypeV1;\n readonly scopeId: string;\n readonly version: number;\n readonly reservations: readonly PurchaseCapReservationV1[];\n}\n\nexport interface ReservePurchaseCapsCommandV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly reservationId: string;\n readonly payerAccountId: AccountId;\n readonly householdId: HouseholdId;\n readonly priceMinorUnits: GbpMinorUnitString;\n readonly reservedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n readonly expectedPayerVersion: number;\n readonly expectedHouseholdVersion: number;\n}\n\nexport interface PurchaseCapMutationResultV1 {\n readonly payerState: RollingPurchaseCapStateV1;\n readonly householdState: RollingPurchaseCapStateV1;\n readonly reservation: PurchaseCapReservationV1;\n /** True when a reservation or transition receipt was newly recorded. */\n readonly applied: boolean;\n readonly stateChanged: boolean;\n readonly payerUsageMinorUnits: GbpMinorUnitString;\n readonly householdUsageMinorUnits: GbpMinorUnitString;\n}\n\ninterface ReservationBinding {\n readonly schemaVersion: EconomyContractVersion;\n readonly reservationId: string;\n readonly payerAccountId: AccountId;\n readonly householdId: HouseholdId;\n readonly priceMinorUnits: GbpMinorUnitString;\n readonly reservedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n}\n\nconst RESERVATION_STATUSES: readonly PurchaseCapReservationStatusV1[] = [\n \"reserved\",\n \"settled\",\n \"released\",\n \"expired\",\n];\n\nconst TRANSITION_PRECEDENCE: Readonly<\n Record<PurchaseCapReservationTransitionTypeV1, number>\n> = {\n settle: 0,\n release: 1,\n expire: 2,\n};\n\n/** Validates one rolling-cap transition envelope. */\nexport function assertPurchaseCapReservationTransition(\n transition: PurchaseCapReservationTransitionV1,\n): void {\n economyAssert(\n transition.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-cap transition contract version\",\n );\n assertEconomyIdentifier(transition.transitionId, \"transitionId\");\n assertEconomyIdentifier(transition.reservationId, \"reservationId\");\n economyAssert(\n [\"settle\", \"release\", \"expire\"].includes(transition.transitionType),\n \"INVALID_CONTRACT\",\n \"Purchase-cap transition type is unsupported\",\n );\n parseIsoTimestamp(transition.occurredAt);\n}\n\nfunction sameTransition(\n left: PurchaseCapReservationTransitionV1,\n right: PurchaseCapReservationTransitionV1,\n): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.transitionId === right.transitionId &&\n left.reservationId === right.reservationId &&\n left.transitionType === right.transitionType &&\n left.occurredAt === right.occurredAt\n );\n}\n\nfunction compareTransitions(\n left: PurchaseCapReservationTransitionV1,\n right: PurchaseCapReservationTransitionV1,\n): number {\n const timeDifference =\n parseIsoTimestamp(left.occurredAt) - parseIsoTimestamp(right.occurredAt);\n if (timeDifference !== 0) {\n return timeDifference;\n }\n const precedenceDifference =\n TRANSITION_PRECEDENCE[left.transitionType] -\n TRANSITION_PRECEDENCE[right.transitionType];\n return precedenceDifference === 0\n ? compareUnicodeCodeUnits(left.transitionId, right.transitionId)\n : precedenceDifference;\n}\n\nfunction assertBinding(binding: ReservationBinding): void {\n economyAssert(\n binding.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-cap reservation contract version\",\n );\n assertEconomyIdentifier(binding.reservationId, \"reservationId\");\n assertEconomyIdentifier(binding.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(binding.householdId, \"householdId\");\n economyAssert(\n parseGbpMinorUnits(binding.priceMinorUnits) > 0n,\n \"INVALID_AMOUNT\",\n \"Purchase-cap reservation amount must be positive\",\n );\n economyAssert(\n parseIsoTimestamp(binding.expiresAt) >\n parseIsoTimestamp(binding.reservedAt),\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap reservation expiry must follow its creation\",\n );\n}\n\nfunction bindingFromReservation(\n reservation: PurchaseCapReservationV1,\n): ReservationBinding {\n return {\n schemaVersion: reservation.schemaVersion,\n reservationId: reservation.reservationId,\n payerAccountId: reservation.payerAccountId,\n householdId: reservation.householdId,\n priceMinorUnits: reservation.priceMinorUnits,\n reservedAt: reservation.reservedAt,\n expiresAt: reservation.expiresAt,\n };\n}\n\nfunction projectReservation(\n binding: ReservationBinding,\n receipts: readonly PurchaseCapReservationTransitionReceiptV1[],\n): PurchaseCapReservationV1 {\n assertBinding(binding);\n const reservedAt = parseIsoTimestamp(binding.reservedAt);\n const expiresAt = parseIsoTimestamp(binding.expiresAt);\n const transitionIds = new Set<string>();\n for (const receipt of receipts) {\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-cap transition receipt version\",\n );\n assertPurchaseCapReservationTransition(receipt.transition);\n economyAssert(\n receipt.transition.reservationId === binding.reservationId &&\n !transitionIds.has(receipt.transition.transitionId),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap receipts must be unique and belong to the reservation\",\n );\n transitionIds.add(receipt.transition.transitionId);\n }\n\n let status: PurchaseCapReservationStatusV1 = \"reserved\";\n let finalTransitionId: string | undefined;\n let finalizedAt: IsoTimestamp | undefined;\n for (const receipt of [...receipts].sort((left, right) =>\n compareTransitions(left.transition, right.transition),\n )) {\n const transition = receipt.transition;\n const occurredAt = parseIsoTimestamp(transition.occurredAt);\n economyAssert(\n occurredAt >= reservedAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap transition cannot precede reservation\",\n );\n if (transition.transitionType === \"settle\") {\n economyAssert(\n occurredAt < expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap settlement must use payment time before expiry\",\n );\n } else if (transition.transitionType === \"release\") {\n economyAssert(\n occurredAt < expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap release must precede reservation expiry\",\n );\n } else {\n economyAssert(\n occurredAt >= expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap reservation cannot expire before its deadline\",\n );\n }\n if (status === \"reserved\") {\n status =\n transition.transitionType === \"settle\"\n ? \"settled\"\n : transition.transitionType === \"release\"\n ? \"released\"\n : \"expired\";\n finalTransitionId = transition.transitionId;\n finalizedAt = transition.occurredAt;\n }\n }\n\n return {\n ...binding,\n status,\n ...(finalTransitionId === undefined\n ? {}\n : { finalTransitionId, finalizedAt: finalizedAt! }),\n transitionReceipts: receipts,\n };\n}\n\nfunction sameReservationFacts(\n left: PurchaseCapReservationV1,\n right: PurchaseCapReservationV1,\n): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.reservationId === right.reservationId &&\n left.payerAccountId === right.payerAccountId &&\n left.householdId === right.householdId &&\n left.priceMinorUnits === right.priceMinorUnits &&\n left.status === right.status &&\n left.reservedAt === right.reservedAt &&\n left.expiresAt === right.expiresAt &&\n left.finalTransitionId === right.finalTransitionId &&\n left.finalizedAt === right.finalizedAt &&\n left.transitionReceipts.length === right.transitionReceipts.length &&\n left.transitionReceipts.every((receipt, index) => {\n const other = right.transitionReceipts[index];\n return (\n other !== undefined &&\n receipt.schemaVersion === other.schemaVersion &&\n sameTransition(receipt.transition, other.transition)\n );\n })\n );\n}\n\nfunction sameReservationBinding(\n reservation: PurchaseCapReservationV1,\n proposed: PurchaseCapReservationV1,\n): boolean {\n return (\n reservation.schemaVersion === proposed.schemaVersion &&\n reservation.reservationId === proposed.reservationId &&\n reservation.payerAccountId === proposed.payerAccountId &&\n reservation.householdId === proposed.householdId &&\n reservation.priceMinorUnits === proposed.priceMinorUnits &&\n reservation.reservedAt === proposed.reservedAt &&\n reservation.expiresAt === proposed.expiresAt\n );\n}\n\n/** Validates one mirrored rolling-cap reservation and its complete rebuild. */\nexport function assertPurchaseCapReservation(\n reservation: PurchaseCapReservationV1,\n): void {\n economyAssert(\n RESERVATION_STATUSES.includes(reservation.status),\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation status is unsupported\",\n );\n const projected = projectReservation(\n bindingFromReservation(reservation),\n reservation.transitionReceipts,\n );\n economyAssert(\n sameReservationFacts(projected, reservation),\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation does not match its immutable event rebuild\",\n );\n}\n\n/** Validates one payer or household rolling-cap aggregate. */\nexport function assertRollingPurchaseCapState(\n state: RollingPurchaseCapStateV1,\n): void {\n economyAssert(\n state.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported rolling purchase-cap contract version\",\n );\n economyAssert(\n state.scopeType === \"payer\" || state.scopeType === \"household\",\n \"INVALID_CONTRACT\",\n \"Purchase-cap scope type is unsupported\",\n );\n assertEconomyIdentifier(state.scopeId, \"scopeId\");\n const reservationIds = new Set<string>();\n const transitionIds = new Set<string>();\n let receiptCount = 0;\n for (const reservation of state.reservations) {\n assertPurchaseCapReservation(reservation);\n economyAssert(\n !reservationIds.has(reservation.reservationId),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap state cannot repeat a reservation\",\n );\n reservationIds.add(reservation.reservationId);\n economyAssert(\n state.scopeType === \"payer\"\n ? reservation.payerAccountId === state.scopeId\n : reservation.householdId === state.scopeId,\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation belongs to another aggregate scope\",\n );\n for (const receipt of reservation.transitionReceipts) {\n economyAssert(\n !transitionIds.has(receipt.transition.transitionId),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap state cannot repeat a transition ID\",\n );\n transitionIds.add(receipt.transition.transitionId);\n receiptCount += 1;\n }\n }\n economyAssert(\n Number.isSafeInteger(state.version) &&\n state.version === 1 + state.reservations.length + receiptCount,\n \"INVALID_CONTRACT\",\n \"Purchase-cap state version must match reservation and receipt counts\",\n );\n}\n\nfunction assertAggregatePair(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n payerAccountId: AccountId,\n householdId: HouseholdId,\n): void {\n assertRollingPurchaseCapState(payerState);\n assertRollingPurchaseCapState(householdState);\n economyAssert(\n payerState.scopeType === \"payer\" &&\n payerState.scopeId === payerAccountId &&\n householdState.scopeType === \"household\" &&\n householdState.scopeId === householdId,\n \"INVALID_CONTRACT\",\n \"Purchase-cap aggregate pair does not match payer and household\",\n );\n}\n\nfunction findMirroredReservation(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n reservationId: string,\n): PurchaseCapReservationV1 | undefined {\n const payerReservation = payerState.reservations.find(\n (reservation) => reservation.reservationId === reservationId,\n );\n const householdReservation = householdState.reservations.find(\n (reservation) => reservation.reservationId === reservationId,\n );\n economyAssert(\n (payerReservation === undefined) === (householdReservation === undefined),\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation must exist in both aggregate scopes atomically\",\n );\n if (payerReservation === undefined || householdReservation === undefined) {\n return undefined;\n }\n economyAssert(\n sameReservationFacts(payerReservation, householdReservation),\n \"INVALID_CONTRACT\",\n \"Payer and household purchase-cap reservations have diverged\",\n );\n return payerReservation;\n}\n\nfunction windowStart(checkedAt: number, rollingDays: number): number {\n return checkedAt - rollingDays * 24 * 60 * 60 * 1_000;\n}\n\n/** Returns the exact cap usage at one point in time. */\nexport function calculateRollingPurchaseCapUsage(\n state: RollingPurchaseCapStateV1,\n checkedAt: IsoTimestamp,\n policy: PurchaseLimitPolicyV1,\n): GbpMinorUnitString {\n assertRollingPurchaseCapState(state);\n assertPurchaseLimitPolicy(policy);\n const checkedAtValue = parseIsoTimestamp(checkedAt);\n const start = windowStart(checkedAtValue, policy.rollingDays);\n let total = 0n;\n for (const reservation of state.reservations) {\n if (\n reservation.status === \"reserved\" &&\n parseIsoTimestamp(reservation.reservedAt) <= checkedAtValue &&\n checkedAtValue < parseIsoTimestamp(reservation.expiresAt)\n ) {\n total += parseGbpMinorUnits(reservation.priceMinorUnits);\n } else if (\n reservation.status === \"settled\" &&\n reservation.finalizedAt !== undefined\n ) {\n const settledAt = parseIsoTimestamp(reservation.finalizedAt);\n if (settledAt >= start && settledAt <= checkedAtValue) {\n total += parseGbpMinorUnits(reservation.priceMinorUnits);\n }\n }\n economyAssert(\n total <= MAX_SIGNED_BIGINT,\n \"AMOUNT_OUT_OF_RANGE\",\n \"Rolling purchase-cap usage exceeds signed 64-bit range\",\n );\n }\n return serializeGbpMinorUnits(total);\n}\n\n/** Creates an empty compare-and-swap aggregate for one cap scope. */\nexport function createRollingPurchaseCapState(\n scopeType: PurchaseCapScopeTypeV1,\n scopeId: string,\n): RollingPurchaseCapStateV1 {\n economyAssert(\n scopeType === \"payer\" || scopeType === \"household\",\n \"INVALID_CONTRACT\",\n \"Purchase-cap scope type is unsupported\",\n );\n assertEconomyIdentifier(scopeId, \"scopeId\");\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n scopeType,\n scopeId,\n version: 1,\n reservations: [],\n };\n}\n\nfunction sortedWithReservation(\n state: RollingPurchaseCapStateV1,\n reservation: PurchaseCapReservationV1,\n): readonly PurchaseCapReservationV1[] {\n return [...state.reservations, reservation].sort((left, right) =>\n compareUnicodeCodeUnits(left.reservationId, right.reservationId),\n );\n}\n\nfunction resultWithUsage(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n reservation: PurchaseCapReservationV1,\n applied: boolean,\n stateChanged: boolean,\n checkedAt: IsoTimestamp,\n policy: PurchaseLimitPolicyV1,\n): PurchaseCapMutationResultV1 {\n return {\n payerState,\n householdState,\n reservation,\n applied,\n stateChanged,\n payerUsageMinorUnits: calculateRollingPurchaseCapUsage(\n payerState,\n checkedAt,\n policy,\n ),\n householdUsageMinorUnits: calculateRollingPurchaseCapUsage(\n householdState,\n checkedAt,\n policy,\n ),\n };\n}\n\n/**\n * Atomically reserves the same amount in payer and household aggregates.\n * Adapters must compare-and-swap both returned versions in one transaction.\n */\nexport function reserveRollingPurchaseCaps(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n command: ReservePurchaseCapsCommandV1,\n policy: PurchaseLimitPolicyV1,\n): PurchaseCapMutationResultV1 {\n economyAssert(\n command.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-cap reservation command version\",\n );\n const binding: ReservationBinding = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n reservationId: command.reservationId,\n payerAccountId: command.payerAccountId,\n householdId: command.householdId,\n priceMinorUnits: command.priceMinorUnits,\n reservedAt: command.reservedAt,\n expiresAt: command.expiresAt,\n };\n assertBinding(binding);\n assertAggregatePair(\n payerState,\n householdState,\n command.payerAccountId,\n command.householdId,\n );\n assertPurchaseLimitPolicy(policy);\n const proposed = projectReservation(binding, []);\n const replay = findMirroredReservation(\n payerState,\n householdState,\n command.reservationId,\n );\n if (replay !== undefined) {\n economyAssert(\n sameReservationBinding(replay, proposed),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap reservation ID was reused with different facts\",\n );\n return resultWithUsage(\n payerState,\n householdState,\n replay,\n false,\n false,\n replay.finalizedAt ?? command.reservedAt,\n policy,\n );\n }\n\n economyAssert(\n command.expectedPayerVersion === payerState.version &&\n command.expectedHouseholdVersion === householdState.version,\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation has a stale aggregate version\",\n );\n const amount = parseGbpMinorUnits(command.priceMinorUnits);\n economyAssert(\n amount <= parseGbpMinorUnits(policy.maxOrderPriceMinorUnits),\n \"INSUFFICIENT_BALANCE\",\n \"Purchase amount exceeds the per-order ceiling\",\n );\n const payerUsage = parseGbpMinorUnits(\n calculateRollingPurchaseCapUsage(payerState, command.reservedAt, policy),\n );\n const householdUsage = parseGbpMinorUnits(\n calculateRollingPurchaseCapUsage(\n householdState,\n command.reservedAt,\n policy,\n ),\n );\n economyAssert(\n payerUsage + amount <=\n parseGbpMinorUnits(policy.rollingPayerPriceMinorUnits),\n \"INSUFFICIENT_BALANCE\",\n \"Purchase amount exceeds the rolling payer ceiling\",\n );\n economyAssert(\n householdUsage + amount <=\n parseGbpMinorUnits(policy.rollingHouseholdPriceMinorUnits),\n \"INSUFFICIENT_BALANCE\",\n \"Purchase amount exceeds the rolling household ceiling\",\n );\n\n const nextPayer: RollingPurchaseCapStateV1 = {\n ...payerState,\n version: payerState.version + 1,\n reservations: sortedWithReservation(payerState, proposed),\n };\n const nextHousehold: RollingPurchaseCapStateV1 = {\n ...householdState,\n version: householdState.version + 1,\n reservations: sortedWithReservation(householdState, proposed),\n };\n return resultWithUsage(\n nextPayer,\n nextHousehold,\n proposed,\n true,\n true,\n command.reservedAt,\n policy,\n );\n}\n\nfunction replaceReservation(\n state: RollingPurchaseCapStateV1,\n replacement: PurchaseCapReservationV1,\n): RollingPurchaseCapStateV1 {\n return {\n ...state,\n version: state.version + 1,\n reservations: state.reservations.map((reservation) =>\n reservation.reservationId === replacement.reservationId\n ? replacement\n : reservation,\n ),\n };\n}\n\nfunction findTransitionById(\n state: RollingPurchaseCapStateV1,\n transitionId: string,\n): {\n readonly reservationId: string;\n readonly transition: PurchaseCapReservationTransitionV1;\n} | undefined {\n for (const reservation of state.reservations) {\n const receipt = reservation.transitionReceipts.find(\n (candidate) => candidate.transition.transitionId === transitionId,\n );\n if (receipt !== undefined) {\n return { reservationId: reservation.reservationId, transition: receipt.transition };\n }\n }\n return undefined;\n}\n\n/**\n * Appends a settle/release/expiry receipt and rebuilds authoritative order. A\n * late-delivered pre-expiry settlement corrects a stored expiry while retaining\n * both receipts. Payer and household versions still advance atomically.\n */\nexport function transitionRollingPurchaseCapReservation(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n transition: PurchaseCapReservationTransitionV1,\n expectedPayerVersion: number,\n expectedHouseholdVersion: number,\n policy: PurchaseLimitPolicyV1,\n): PurchaseCapMutationResultV1 {\n assertPurchaseCapReservationTransition(transition);\n assertRollingPurchaseCapState(payerState);\n assertRollingPurchaseCapState(householdState);\n const current = findMirroredReservation(\n payerState,\n householdState,\n transition.reservationId,\n );\n economyAssert(\n current !== undefined,\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation does not exist in both aggregate scopes\",\n );\n assertAggregatePair(\n payerState,\n householdState,\n current.payerAccountId,\n current.householdId,\n );\n assertPurchaseLimitPolicy(policy);\n\n const payerExisting = findTransitionById(\n payerState,\n transition.transitionId,\n );\n const householdExisting = findTransitionById(\n householdState,\n transition.transitionId,\n );\n economyAssert(\n (payerExisting === undefined) === (householdExisting === undefined),\n \"INVALID_CONTRACT\",\n \"Purchase-cap transition must exist in both scopes atomically\",\n );\n if (payerExisting !== undefined && householdExisting !== undefined) {\n economyAssert(\n payerExisting.reservationId === transition.reservationId &&\n householdExisting.reservationId === transition.reservationId &&\n sameTransition(payerExisting.transition, transition) &&\n sameTransition(householdExisting.transition, transition),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap transition ID was reused with different facts\",\n );\n return resultWithUsage(\n payerState,\n householdState,\n current,\n false,\n false,\n transition.occurredAt,\n policy,\n );\n }\n economyAssert(\n expectedPayerVersion === payerState.version &&\n expectedHouseholdVersion === householdState.version,\n \"INVALID_CONTRACT\",\n \"Purchase-cap transition has a stale aggregate version\",\n );\n\n const replacement = projectReservation(bindingFromReservation(current), [\n ...current.transitionReceipts,\n { schemaVersion: ECONOMY_CONTRACT_VERSION, transition },\n ]);\n const stateChanged =\n replacement.status !== current.status ||\n replacement.finalTransitionId !== current.finalTransitionId ||\n replacement.finalizedAt !== current.finalizedAt;\n const nextPayer = replaceReservation(payerState, replacement);\n const nextHousehold = replaceReservation(householdState, replacement);\n return resultWithUsage(\n nextPayer,\n nextHousehold,\n replacement,\n true,\n stateChanged,\n transition.occurredAt,\n policy,\n );\n}\n","import type { PurchaseIntentV1, TokenPackV1 } from \"./acquisition.js\";\nimport { assertPurchaseIntentBinding } from \"./acquisition.js\";\nimport { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type PurchaseIntentTransitionTypeV1 =\n | \"checkout-bound\"\n | \"payment-observed\"\n | \"credit-recorded\"\n | \"expire\"\n | \"cancel\"\n | \"dispute-opened\"\n | \"dispute-won\"\n | \"dispute-lost\";\n\nexport type PurchaseIntentDisputeDispositionV1 =\n | \"none\"\n | \"open\"\n | \"won\"\n | \"lost\";\n\n/** Provider-neutral evidence for one requested purchase-intent transition. */\nexport interface PurchaseIntentTransitionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transitionId: string;\n readonly intentId: string;\n readonly transitionType: PurchaseIntentTransitionTypeV1;\n readonly occurredAt: IsoTimestamp;\n /** Sanitized binding; raw provider checkout references are adapter concerns. */\n readonly providerCheckoutReferenceHash?: string;\n}\n\n/** Append-only receipt. Whether it is effective is a rebuildable projection. */\nexport interface PurchaseIntentTransitionReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transition: PurchaseIntentTransitionV1;\n}\n\n/**\n * Versioned lifecycle projection. `initialIntent` never changes; every delivery\n * is rebuilt from its append-only receipts in authoritative occurrence order.\n */\nexport interface PurchaseIntentLifecycleV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly initialIntent: PurchaseIntentV1;\n readonly intent: PurchaseIntentV1;\n readonly version: number;\n readonly creditRecorded: boolean;\n readonly disputeDisposition: PurchaseIntentDisputeDispositionV1;\n readonly receipts: readonly PurchaseIntentTransitionReceiptV1[];\n readonly effectiveTransitionIds: readonly string[];\n}\n\n/** Stable instruction identity for the one permitted purchase credit. */\nexport interface PurchaseCreditInstructionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly intentId: string;\n readonly transitionId: string;\n readonly idempotencyKey: string;\n}\n\nexport interface PurchaseIntentTransitionResultV1 {\n readonly lifecycle: PurchaseIntentLifecycleV1;\n /** False only for an exact transition-ID replay already in `receipts`. */\n readonly recorded: boolean;\n readonly stateChanged: boolean;\n readonly creditInstruction?: PurchaseCreditInstructionV1;\n}\n\nexport interface PurchaseIntentReductionV1 {\n readonly lifecycle: PurchaseIntentLifecycleV1;\n readonly creditInstructions: readonly PurchaseCreditInstructionV1[];\n}\n\ninterface PurchaseIntentProjection {\n readonly intent: PurchaseIntentV1;\n readonly disputeDisposition: PurchaseIntentDisputeDispositionV1;\n readonly effectiveTransitionIds: readonly string[];\n readonly creditTransitionId?: string;\n}\n\nconst TRANSITION_TYPES: readonly PurchaseIntentTransitionTypeV1[] = [\n \"checkout-bound\",\n \"payment-observed\",\n \"credit-recorded\",\n \"expire\",\n \"cancel\",\n \"dispute-opened\",\n \"dispute-won\",\n \"dispute-lost\",\n];\n\nconst TRANSITION_PRECEDENCE: Readonly<\n Record<PurchaseIntentTransitionTypeV1, number>\n> = {\n \"checkout-bound\": 0,\n \"payment-observed\": 1,\n \"credit-recorded\": 2,\n \"dispute-opened\": 3,\n \"dispute-won\": 4,\n \"dispute-lost\": 4,\n cancel: 5,\n expire: 6,\n};\n\nfunction assertCheckoutHash(value: string): void {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n \"Checkout references must be stored as sanitized SHA-256 hashes\",\n );\n}\n\n/** Validates one provider-neutral purchase-intent transition envelope. */\nexport function assertPurchaseIntentTransition(\n transition: PurchaseIntentTransitionV1,\n): void {\n economyAssert(\n transition.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-intent transition contract version\",\n );\n assertEconomyIdentifier(transition.transitionId, \"transitionId\");\n assertEconomyIdentifier(transition.intentId, \"intentId\");\n economyAssert(\n TRANSITION_TYPES.includes(transition.transitionType),\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition type is unsupported\",\n );\n parseIsoTimestamp(transition.occurredAt);\n if (transition.providerCheckoutReferenceHash !== undefined) {\n assertCheckoutHash(transition.providerCheckoutReferenceHash);\n }\n const requiresCheckoutHash =\n transition.transitionType === \"checkout-bound\" ||\n transition.transitionType === \"payment-observed\";\n economyAssert(\n requiresCheckoutHash ===\n (transition.providerCheckoutReferenceHash !== undefined),\n \"INVALID_CONTRACT\",\n \"Only checkout and payment transitions must carry a checkout binding\",\n );\n}\n\nfunction sameTransition(\n left: PurchaseIntentTransitionV1,\n right: PurchaseIntentTransitionV1,\n): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.transitionId === right.transitionId &&\n left.intentId === right.intentId &&\n left.transitionType === right.transitionType &&\n left.occurredAt === right.occurredAt &&\n left.providerCheckoutReferenceHash ===\n right.providerCheckoutReferenceHash\n );\n}\n\nfunction sameIntent(left: PurchaseIntentV1, right: PurchaseIntentV1): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.intentId === right.intentId &&\n left.payerAccountId === right.payerAccountId &&\n left.receivingHouseholdId === right.receivingHouseholdId &&\n left.receivingWalletId === right.receivingWalletId &&\n left.packId === right.packId &&\n left.catalogVersion === right.catalogVersion &&\n left.expectedCurrency === right.expectedCurrency &&\n left.expectedPriceMinorUnits === right.expectedPriceMinorUnits &&\n left.grantAmount === right.grantAmount &&\n left.status === right.status &&\n left.createdAt === right.createdAt &&\n left.expiresAt === right.expiresAt &&\n left.providerCheckoutReferenceHash ===\n right.providerCheckoutReferenceHash\n );\n}\n\nfunction compareTransitions(\n left: PurchaseIntentTransitionV1,\n right: PurchaseIntentTransitionV1,\n): number {\n const timeDifference =\n parseIsoTimestamp(left.occurredAt) - parseIsoTimestamp(right.occurredAt);\n if (timeDifference !== 0) {\n return timeDifference;\n }\n const precedenceDifference =\n TRANSITION_PRECEDENCE[left.transitionType] -\n TRANSITION_PRECEDENCE[right.transitionType];\n return precedenceDifference === 0\n ? compareUnicodeCodeUnits(left.transitionId, right.transitionId)\n : precedenceDifference;\n}\n\nfunction assertMatchingCheckoutBinding(\n intent: PurchaseIntentV1,\n checkoutHash: string,\n): void {\n economyAssert(\n intent.providerCheckoutReferenceHash === undefined ||\n intent.providerCheckoutReferenceHash === checkoutHash,\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition conflicts with its checkout binding\",\n );\n}\n\nfunction projectPurchaseIntent(\n initialIntent: PurchaseIntentV1,\n transitions: readonly PurchaseIntentTransitionV1[],\n pack: TokenPackV1,\n): PurchaseIntentProjection {\n assertPurchaseIntentBinding(initialIntent, pack);\n economyAssert(\n initialIntent.status === \"created\" &&\n initialIntent.providerCheckoutReferenceHash === undefined,\n \"INVALID_CONTRACT\",\n \"Purchase-intent lifecycle requires immutable created intent facts\",\n );\n const createdAt = parseIsoTimestamp(initialIntent.createdAt);\n const expiresAt = parseIsoTimestamp(initialIntent.expiresAt);\n let intent = initialIntent;\n let disputeDisposition: PurchaseIntentDisputeDispositionV1 = \"none\";\n let creditTransitionId: string | undefined;\n const effectiveTransitionIds: string[] = [];\n\n for (const transition of [...transitions].sort(compareTransitions)) {\n assertPurchaseIntentTransition(transition);\n economyAssert(\n transition.intentId === initialIntent.intentId,\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition belongs to another intent\",\n );\n const eventTime = parseIsoTimestamp(transition.occurredAt);\n economyAssert(\n eventTime >= createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-intent transition cannot precede intent creation\",\n );\n let effective = false;\n\n if (transition.transitionType === \"checkout-bound\") {\n const checkoutHash = transition.providerCheckoutReferenceHash!;\n assertMatchingCheckoutBinding(intent, checkoutHash);\n if (intent.status === \"created\") {\n economyAssert(\n eventTime < expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Checkout cannot be bound after purchase-intent expiry\",\n );\n intent = {\n ...intent,\n status: \"checkout-created\",\n providerCheckoutReferenceHash: checkoutHash,\n };\n effective = true;\n } else {\n economyAssert(\n ![\"expired\", \"cancelled\"].includes(intent.status),\n \"INVALID_CONTRACT\",\n \"A terminal purchase intent cannot bind a checkout\",\n );\n }\n } else if (transition.transitionType === \"payment-observed\") {\n const checkoutHash = transition.providerCheckoutReferenceHash!;\n assertMatchingCheckoutBinding(intent, checkoutHash);\n economyAssert(\n eventTime < expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Authoritative payment time must precede purchase-intent expiry\",\n );\n if (intent.status === \"created\") {\n intent = {\n ...intent,\n status: \"paid-unreconciled\",\n providerCheckoutReferenceHash: checkoutHash,\n };\n effective = true;\n } else if (intent.status === \"checkout-created\") {\n intent = { ...intent, status: \"paid-unreconciled\" };\n effective = true;\n } else {\n economyAssert(\n ![\"expired\", \"cancelled\"].includes(intent.status),\n \"INVALID_CONTRACT\",\n \"A terminal purchase intent cannot observe payment\",\n );\n }\n } else if (transition.transitionType === \"credit-recorded\") {\n if (intent.status === \"paid-unreconciled\") {\n intent = { ...intent, status: \"credited\" };\n disputeDisposition = \"none\";\n creditTransitionId = transition.transitionId;\n effective = true;\n } else {\n economyAssert(\n intent.status === \"credited\" || intent.status === \"disputed\",\n \"INVALID_CONTRACT\",\n \"Purchase intent cannot be credited before authoritative payment\",\n );\n }\n } else if (transition.transitionType === \"dispute-opened\") {\n if (intent.status === \"credited\" && disputeDisposition === \"none\") {\n intent = { ...intent, status: \"disputed\" };\n disputeDisposition = \"open\";\n effective = true;\n } else {\n economyAssert(\n intent.status === \"disputed\" && disputeDisposition === \"open\",\n \"INVALID_CONTRACT\",\n \"Dispute can open only once after purchase credit\",\n );\n }\n } else if (transition.transitionType === \"dispute-won\") {\n if (intent.status === \"disputed\" && disputeDisposition === \"open\") {\n intent = { ...intent, status: \"credited\" };\n disputeDisposition = \"won\";\n effective = true;\n } else {\n economyAssert(\n intent.status === \"credited\" && disputeDisposition === \"won\",\n \"INVALID_CONTRACT\",\n \"Dispute-win transition requires one open dispute\",\n );\n }\n } else if (transition.transitionType === \"dispute-lost\") {\n if (intent.status === \"disputed\" && disputeDisposition === \"open\") {\n disputeDisposition = \"lost\";\n effective = true;\n } else {\n economyAssert(\n intent.status === \"disputed\" && disputeDisposition === \"lost\",\n \"INVALID_CONTRACT\",\n \"Dispute-loss transition requires one open dispute\",\n );\n }\n } else if (transition.transitionType === \"cancel\") {\n if (intent.status === \"created\" || intent.status === \"checkout-created\") {\n intent = { ...intent, status: \"cancelled\" };\n effective = true;\n }\n } else {\n economyAssert(\n eventTime >= expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Expiry transition cannot precede purchase-intent expiry\",\n );\n if (intent.status === \"created\" || intent.status === \"checkout-created\") {\n intent = { ...intent, status: \"expired\" };\n effective = true;\n }\n }\n\n if (effective) {\n effectiveTransitionIds.push(transition.transitionId);\n }\n }\n\n return {\n intent,\n disputeDisposition,\n effectiveTransitionIds,\n ...(creditTransitionId === undefined ? {} : { creditTransitionId }),\n };\n}\n\n/** Validates and deterministically rebuilds a lifecycle projection. */\nexport function assertPurchaseIntentLifecycle(\n lifecycle: PurchaseIntentLifecycleV1,\n pack: TokenPackV1,\n): void {\n economyAssert(\n lifecycle.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-intent lifecycle contract version\",\n );\n economyAssert(\n Number.isSafeInteger(lifecycle.version) &&\n lifecycle.version === lifecycle.receipts.length + 1,\n \"INVALID_CONTRACT\",\n \"Purchase-intent lifecycle version must match its receipt count\",\n );\n const transitionIds = new Set<string>();\n for (const receipt of lifecycle.receipts) {\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Purchase-intent receipt is invalid\",\n );\n assertPurchaseIntentTransition(receipt.transition);\n economyAssert(\n receipt.transition.intentId === lifecycle.initialIntent.intentId &&\n !transitionIds.has(receipt.transition.transitionId),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-intent receipts must be unique and belong to the intent\",\n );\n transitionIds.add(receipt.transition.transitionId);\n }\n const projection = projectPurchaseIntent(\n lifecycle.initialIntent,\n lifecycle.receipts.map((receipt) => receipt.transition),\n pack,\n );\n economyAssert(\n sameIntent(projection.intent, lifecycle.intent) &&\n lifecycle.creditRecorded ===\n (projection.intent.status === \"credited\" ||\n projection.intent.status === \"disputed\") &&\n lifecycle.disputeDisposition === projection.disputeDisposition &&\n lifecycle.effectiveTransitionIds.length ===\n projection.effectiveTransitionIds.length &&\n lifecycle.effectiveTransitionIds.every(\n (transitionId, index) =>\n transitionId === projection.effectiveTransitionIds[index],\n ),\n \"INVALID_CONTRACT\",\n \"Purchase-intent lifecycle does not match its immutable event rebuild\",\n );\n}\n\n/** Creates a lifecycle from immutable, server-created purchase-intent facts. */\nexport function createPurchaseIntentLifecycle(\n initialIntent: PurchaseIntentV1,\n pack: TokenPackV1,\n): PurchaseIntentLifecycleV1 {\n const projection = projectPurchaseIntent(initialIntent, [], pack);\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n initialIntent,\n intent: projection.intent,\n version: 1,\n creditRecorded: false,\n disputeDisposition: projection.disputeDisposition,\n receipts: [],\n effectiveTransitionIds: [],\n };\n}\n\nfunction sameProjection(\n lifecycle: PurchaseIntentLifecycleV1,\n projection: PurchaseIntentProjection,\n): boolean {\n return (\n sameIntent(lifecycle.intent, projection.intent) &&\n lifecycle.disputeDisposition === projection.disputeDisposition &&\n lifecycle.effectiveTransitionIds.length ===\n projection.effectiveTransitionIds.length &&\n lifecycle.effectiveTransitionIds.every(\n (transitionId, index) =>\n transitionId === projection.effectiveTransitionIds[index],\n )\n );\n}\n\n/**\n * Appends one event and rebuilds all receipts by authoritative occurrence time.\n * A late pre-expiry payment can therefore correct a stored expiry without\n * deleting the expiry receipt. Exact retries succeed before version checking.\n */\nexport function applyPurchaseIntentTransition(\n lifecycle: PurchaseIntentLifecycleV1,\n transition: PurchaseIntentTransitionV1,\n expectedVersion: number,\n pack: TokenPackV1,\n): PurchaseIntentTransitionResultV1 {\n assertPurchaseIntentLifecycle(lifecycle, pack);\n assertPurchaseIntentTransition(transition);\n economyAssert(\n transition.intentId === lifecycle.initialIntent.intentId,\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition belongs to another intent\",\n );\n const replay = lifecycle.receipts.find(\n (receipt) => receipt.transition.transitionId === transition.transitionId,\n );\n if (replay !== undefined) {\n economyAssert(\n sameTransition(replay.transition, transition),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-intent transition ID was reused with different facts\",\n );\n return { lifecycle, recorded: false, stateChanged: false };\n }\n economyAssert(\n expectedVersion === lifecycle.version,\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition has a stale expected version\",\n );\n\n const receipts: readonly PurchaseIntentTransitionReceiptV1[] = [\n ...lifecycle.receipts,\n { schemaVersion: ECONOMY_CONTRACT_VERSION, transition },\n ];\n const projection = projectPurchaseIntent(\n lifecycle.initialIntent,\n receipts.map((receipt) => receipt.transition),\n pack,\n );\n const stateChanged = !sameProjection(lifecycle, projection);\n const nextLifecycle: PurchaseIntentLifecycleV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n initialIntent: lifecycle.initialIntent,\n intent: projection.intent,\n version: lifecycle.version + 1,\n creditRecorded:\n projection.intent.status === \"credited\" ||\n projection.intent.status === \"disputed\",\n disputeDisposition: projection.disputeDisposition,\n receipts,\n effectiveTransitionIds: projection.effectiveTransitionIds,\n };\n assertPurchaseIntentLifecycle(nextLifecycle, pack);\n\n const producesCredit =\n projection.creditTransitionId === transition.transitionId &&\n !lifecycle.creditRecorded &&\n nextLifecycle.creditRecorded;\n const creditInstruction: PurchaseCreditInstructionV1 | undefined =\n producesCredit\n ? {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n intentId: nextLifecycle.intent.intentId,\n transitionId: transition.transitionId,\n idempotencyKey: nextLifecycle.intent.intentId,\n }\n : undefined;\n return {\n lifecycle: nextLifecycle,\n recorded: true,\n stateChanged,\n ...(creditInstruction === undefined ? {} : { creditInstruction }),\n };\n}\n\n/**\n * Reduces an unordered delivery batch in canonical event-time/type/ID order.\n * Exact duplicate IDs collapse; conflicting duplicate facts are rejected.\n */\nexport function reducePurchaseIntentTransitions(\n initialIntent: PurchaseIntentV1,\n transitions: readonly PurchaseIntentTransitionV1[],\n pack: TokenPackV1,\n): PurchaseIntentReductionV1 {\n const unique = new Map<string, PurchaseIntentTransitionV1>();\n for (const transition of transitions) {\n assertPurchaseIntentTransition(transition);\n const existing = unique.get(transition.transitionId);\n if (existing !== undefined) {\n economyAssert(\n sameTransition(existing, transition),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-intent transition ID was reused with different facts\",\n );\n } else {\n unique.set(transition.transitionId, transition);\n }\n }\n\n let lifecycle = createPurchaseIntentLifecycle(initialIntent, pack);\n const creditInstructions: PurchaseCreditInstructionV1[] = [];\n for (const transition of [...unique.values()].sort(compareTransitions)) {\n const result = applyPurchaseIntentTransition(\n lifecycle,\n transition,\n lifecycle.version,\n pack,\n );\n lifecycle = result.lifecycle;\n if (result.creditInstruction !== undefined) {\n creditInstructions.push(result.creditInstruction);\n }\n }\n economyAssert(\n creditInstructions.length <= 1,\n \"DUPLICATE_TRANSACTION\",\n \"Purchase-intent reduction produced more than one credit\",\n );\n return { lifecycle, creditInstructions };\n}\n","import {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport {\n isWholeTokenAmount,\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type RecurrenceInterval = \"daily\" | \"weekly\" | \"monthly\";\n\n/** Provider-neutral subscription contract. Site policy controls enablement. */\nexport interface TokenSubscriptionPlanV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly planId: string;\n readonly catalogVersion: string;\n readonly interval: RecurrenceInterval;\n readonly priceMinorUnits: string;\n readonly currency: \"GBP\";\n readonly grantAmount: TokenSubunitString;\n readonly enabled: boolean;\n readonly effectiveFrom: IsoTimestamp;\n}\n\n/** Future convenience plan contract; disabled until public spend is live. */\nexport const BASELINE_MONTHLY_SUBSCRIPTION_PLAN: TokenSubscriptionPlanV1 =\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n planId: \"monthly-10-100-v1\",\n catalogVersion: \"gbp-subscriptions-v1\",\n interval: \"monthly\",\n priceMinorUnits: \"1000\",\n currency: \"GBP\",\n grantAmount: serializeTokenSubunits(100_000n),\n enabled: false,\n effectiveFrom: \"2026-07-15T00:00:00.000Z\",\n });\n\n/** Validates future provider-neutral recurrence without enabling it. */\nexport function assertTokenSubscriptionPlan(\n plan: TokenSubscriptionPlanV1,\n): void {\n economyAssert(\n plan.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported subscription-plan contract version\",\n );\n assertEconomyIdentifier(plan.planId, \"planId\");\n assertEconomyIdentifier(plan.catalogVersion, \"catalogVersion\");\n economyAssert(\n [\"daily\", \"weekly\", \"monthly\"].includes(plan.interval) &&\n plan.currency === \"GBP\" &&\n typeof plan.enabled === \"boolean\",\n \"INVALID_CONTRACT\",\n \"Subscription recurrence, currency, or enabled state is invalid\",\n );\n economyAssert(\n /^(?:0|[1-9][0-9]*)$/u.test(plan.priceMinorUnits) &&\n BigInt(plan.priceMinorUnits) > 0n,\n \"INVALID_AMOUNT\",\n \"Subscription price must be a positive integer minor-unit string\",\n );\n const grantAmount = parseTokenSubunits(plan.grantAmount);\n economyAssert(\n grantAmount > 0n && isWholeTokenAmount(grantAmount),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Subscription grants must contain whole Tokens\",\n );\n parseIsoTimestamp(plan.effectiveFrom);\n}\n","import { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { ActivityType } from \"./ledger.js\";\nimport { parseTokenSubunits, type TokenSubunitString } from \"./amount.js\";\nimport {\n assertEconomyHmacFingerprint,\n type EconomyCommandResultOutcomeV1,\n type EconomyHmacFingerprintV1,\n} from \"./audit.js\";\nimport {\n assertEconomyIntegrityAnchorManifest,\n canonicalEconomyIntegrityAnchorManifestPayload,\n type EconomyIntegrityAnchorManifestV1,\n} from \"./authority.js\";\nimport type { CanonicalPayloadHashFunctionV1 } from \"./integrity.js\";\n\nexport const ECONOMY_RECOVERY_PROTOCOL_VERSION = \"1\" as const;\nexport type EconomyRecoveryProtocolVersion =\n typeof ECONOMY_RECOVERY_PROTOCOL_VERSION;\n\nexport type EconomyRecoveryRecordKindV1 =\n | \"acceptance\"\n | \"committed-result\";\n\nexport type EconomyRecoveryDirectionV1 = \"credit\" | \"debit\";\n\nexport type EconomyEvidenceSignatureAlgorithmV1 =\n | \"ed25519\"\n | \"ecdsa-p256-sha256\"\n | \"rsa-pss-sha256\";\n\n/** Public, non-secret metadata selected before detached signing. */\nexport interface EconomyEvidenceSignatureMetadataV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly signatureVersion: \"1\";\n readonly algorithm: EconomyEvidenceSignatureAlgorithmV1;\n readonly keyId: string;\n readonly signedAt: IsoTimestamp;\n}\n\n/** Public metadata plus the final detached signature value. */\nexport interface EconomyEvidenceSignatureV1\n extends EconomyEvidenceSignatureMetadataV1 {\n readonly value: string;\n}\n\n/** Deterministic signing request safe to pass to an external key adapter. */\nexport interface EconomyPreparedEvidenceSignatureV1 {\n readonly contentAddressedId: string;\n readonly canonicalPayload: string;\n}\n\n/**\n * Encrypted reconstruction bytes stored outside the live authority.\n *\n * The plaintext must contain only the already-approved, privacy-minimized\n * authority records. Raw provider callbacks, signatures, payment data,\n * idempotency keys, email addresses, and exact birth data are forbidden.\n */\nexport interface EconomySealedRecoveryPayloadV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly payloadVersion: \"1\";\n readonly cipherSuite: \"AES-256-GCM\";\n readonly encoding: \"base64url\";\n readonly keyVersion: string;\n readonly nonce: string;\n readonly ciphertext: string;\n readonly authenticationTag: string;\n readonly plaintextContentHash: string;\n readonly encryptionContextHash: string;\n}\n\n/** Content-addressed body written identically to every evidence region. */\nexport interface EconomyRecoveryAcceptanceBodyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recoveryVersion: EconomyRecoveryProtocolVersion;\n readonly recordType: \"economy-recovery-acceptance\";\n readonly authorityId: string;\n readonly commandId: string;\n readonly correlationId: string;\n readonly idempotencyFingerprint: EconomyHmacFingerprintV1;\n readonly commandEnvelopeHash: string;\n readonly acceptedReceiptId: string;\n readonly acceptedReceiptHash: string;\n readonly sealedPayload: EconomySealedRecoveryPayloadV1;\n readonly preparedAt: IsoTimestamp;\n readonly acceptedAt: IsoTimestamp;\n}\n\n/**\n * Provider-neutral durable acceptance. The ID is SHA-256-addressed from the\n * canonical body and therefore remains identical in all evidence regions.\n */\nexport interface EconomyRecoveryAcceptanceEnvelopeV1\n extends EconomyRecoveryAcceptanceBodyV1 {\n readonly acceptanceEnvelopeId: string;\n}\n\n/** Content-addressed result body written after the authority commit. */\nexport interface EconomyRecoveryCommittedResultBodyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recoveryVersion: EconomyRecoveryProtocolVersion;\n readonly recordType: \"economy-recovery-committed-result\";\n readonly authorityId: string;\n readonly commandId: string;\n readonly correlationId: string;\n readonly acceptanceEnvelopeId: string;\n readonly acceptanceEnvelopeHash: string;\n readonly resultReceiptId: string;\n readonly resultReceiptHash: string;\n readonly outcome: EconomyCommandResultOutcomeV1;\n readonly authorityCommitId: string;\n readonly authorityCommitHash: string;\n readonly authoritySequence: string;\n readonly authorityHeadHashAfter: string;\n readonly transactionId?: TransactionId;\n readonly transactionCanonicalHash?: string;\n readonly sealedPayload: EconomySealedRecoveryPayloadV1;\n readonly committedAt: IsoTimestamp;\n}\n\n/**\n * Immutable reconstruction result for one command. Failed and no-op commands\n * are retained as facts but cannot carry transaction identity or value.\n */\nexport interface EconomyRecoveryCommittedResultV1\n extends EconomyRecoveryCommittedResultBodyV1 {\n readonly committedResultId: string;\n}\n\n/** Region-specific body proving one recovery record was durably retained. */\nexport interface EconomyRegionalEvidenceReceiptBodyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recoveryVersion: EconomyRecoveryProtocolVersion;\n readonly recordType: \"economy-regional-evidence-receipt\";\n readonly journalId: string;\n readonly region: string;\n readonly sequence: string;\n readonly previousReceiptHash?: string;\n readonly authorityId: string;\n readonly commandId: string;\n readonly recoveryRecordKind: EconomyRecoveryRecordKindV1;\n readonly recoveryRecordId: string;\n readonly recoveryRecordContentHash: string;\n readonly storedAt: IsoTimestamp;\n readonly retentionUntil: IsoTimestamp;\n}\n\n/**\n * Signed, content-addressed evidence-region acknowledgement.\n *\n * Its ID addresses the unsigned storage fact. Its detached signature covers\n * that ID, the exact canonical body, and the public signature metadata.\n */\nexport interface EconomyRegionalEvidenceReceiptV1\n extends EconomyRegionalEvidenceReceiptBodyV1 {\n readonly evidenceReceiptId: string;\n readonly signature: EconomyEvidenceSignatureV1;\n}\n\n/** One sibling in a duplicate-last, binary SHA-256 Merkle proof. */\nexport interface EconomyMerkleProofStepV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly side: \"left\" | \"right\";\n readonly hash: string;\n}\n\n/** Portable proof that an authority commit is covered by an hourly anchor. */\nexport interface EconomyMerkleInclusionProofV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly proofVersion: \"1\";\n readonly algorithm: \"duplicate-last-sha256-v1\";\n readonly anchorId: string;\n readonly anchorManifestHash: string;\n readonly leafHash: string;\n readonly leafIndex: string;\n readonly leafCount: string;\n readonly siblings: readonly EconomyMerkleProofStepV1[];\n}\n\n/** Privacy-safe link from a customer receipt to one regional evidence fact. */\nexport interface EconomyPortableEvidenceReferenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly region: string;\n readonly evidenceReceiptId: string;\n readonly evidenceReceiptHash: string;\n}\n\n/** Content-addressed customer-facing receipt body. */\nexport interface EconomyPortableCustomerReceiptBodyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recoveryVersion: EconomyRecoveryProtocolVersion;\n readonly recordType: \"economy-portable-customer-receipt\";\n readonly authorityId: string;\n readonly commandId: string;\n readonly activityType: ActivityType;\n readonly direction: EconomyRecoveryDirectionV1;\n readonly tokenAmount: TokenSubunitString;\n readonly transactionId: TransactionId;\n readonly transactionCanonicalHash: string;\n readonly resultReceiptId: string;\n readonly resultReceiptHash: string;\n readonly committedResultId: string;\n readonly committedResultContentHash: string;\n readonly authorityCommitId: string;\n readonly authorityCommitHash: string;\n readonly authoritySequence: string;\n readonly regionalEvidence: readonly EconomyPortableEvidenceReferenceV1[];\n readonly merkleInclusionProof?: EconomyMerkleInclusionProofV1;\n readonly tokenTermsVersion: string;\n readonly cashRedemptionAllowed: false;\n readonly committedAt: IsoTimestamp;\n readonly issuedAt: IsoTimestamp;\n}\n\n/**\n * Downloadable signed receipt containing no payer, household, provider,\n * payment, email, session, or exact-age data.\n */\nexport interface EconomyPortableCustomerReceiptV1\n extends EconomyPortableCustomerReceiptBodyV1 {\n readonly portableReceiptId: string;\n readonly signature: EconomyEvidenceSignatureV1;\n}\n\n/** Infrastructure-supplied signature verifier; this package owns no keys. */\nexport interface EconomyEvidenceSignatureVerificationInputV1 {\n readonly algorithm: EconomyEvidenceSignatureAlgorithmV1;\n readonly keyId: string;\n readonly signedAt: IsoTimestamp;\n readonly signature: string;\n readonly canonicalPayload: string;\n}\n\nexport type EconomyEvidenceSignatureVerifierV1 = (\n input: EconomyEvidenceSignatureVerificationInputV1,\n) => boolean;\n\nconst CANONICAL_HASH = /^sha256:[a-f0-9]{64}$/u;\nconst BASE64URL = /^[A-Za-z0-9_-]+$/u;\nconst UNSIGNED_INTEGER = /^(?:0|[1-9][0-9]{0,38})$/u;\nconst SIGNATURE_ALGORITHMS =\n new Set<EconomyEvidenceSignatureAlgorithmV1>([\n \"ed25519\",\n \"ecdsa-p256-sha256\",\n \"rsa-pss-sha256\",\n ]);\nconst RESULT_OUTCOMES = new Set<EconomyCommandResultOutcomeV1>([\n \"completed\",\n \"failed\",\n \"no-op\",\n]);\nconst ACTIVITY_TYPES = new Set<ActivityType>([\n \"purchase\",\n \"subscription\",\n \"rewarded-ad\",\n \"offerwall\",\n \"allocation\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"refund\",\n \"chargeback\",\n \"adjustment\",\n \"reversal\",\n \"event\",\n \"competition\",\n]);\n\nconst ACCEPTANCE_BODY_KEYS = new Set([\n \"schemaVersion\",\n \"recoveryVersion\",\n \"recordType\",\n \"authorityId\",\n \"commandId\",\n \"correlationId\",\n \"idempotencyFingerprint\",\n \"commandEnvelopeHash\",\n \"acceptedReceiptId\",\n \"acceptedReceiptHash\",\n \"sealedPayload\",\n \"preparedAt\",\n \"acceptedAt\",\n]);\nconst ACCEPTANCE_KEYS = new Set([\n \"acceptanceEnvelopeId\",\n ...ACCEPTANCE_BODY_KEYS,\n]);\nconst COMMITTED_RESULT_BODY_KEYS = new Set([\n \"schemaVersion\",\n \"recoveryVersion\",\n \"recordType\",\n \"authorityId\",\n \"commandId\",\n \"correlationId\",\n \"acceptanceEnvelopeId\",\n \"acceptanceEnvelopeHash\",\n \"resultReceiptId\",\n \"resultReceiptHash\",\n \"outcome\",\n \"authorityCommitId\",\n \"authorityCommitHash\",\n \"authoritySequence\",\n \"authorityHeadHashAfter\",\n \"transactionId\",\n \"transactionCanonicalHash\",\n \"sealedPayload\",\n \"committedAt\",\n]);\nconst COMMITTED_RESULT_KEYS = new Set([\n \"committedResultId\",\n ...COMMITTED_RESULT_BODY_KEYS,\n]);\nconst REGIONAL_BODY_KEYS = new Set([\n \"schemaVersion\",\n \"recoveryVersion\",\n \"recordType\",\n \"journalId\",\n \"region\",\n \"sequence\",\n \"previousReceiptHash\",\n \"authorityId\",\n \"commandId\",\n \"recoveryRecordKind\",\n \"recoveryRecordId\",\n \"recoveryRecordContentHash\",\n \"storedAt\",\n \"retentionUntil\",\n]);\nconst REGIONAL_KEYS = new Set([\n \"evidenceReceiptId\",\n \"signature\",\n ...REGIONAL_BODY_KEYS,\n]);\nconst PORTABLE_BODY_KEYS = new Set([\n \"schemaVersion\",\n \"recoveryVersion\",\n \"recordType\",\n \"authorityId\",\n \"commandId\",\n \"activityType\",\n \"direction\",\n \"tokenAmount\",\n \"transactionId\",\n \"transactionCanonicalHash\",\n \"resultReceiptId\",\n \"resultReceiptHash\",\n \"committedResultId\",\n \"committedResultContentHash\",\n \"authorityCommitId\",\n \"authorityCommitHash\",\n \"authoritySequence\",\n \"regionalEvidence\",\n \"merkleInclusionProof\",\n \"tokenTermsVersion\",\n \"cashRedemptionAllowed\",\n \"committedAt\",\n \"issuedAt\",\n]);\nconst PORTABLE_KEYS = new Set([\n \"portableReceiptId\",\n \"signature\",\n ...PORTABLE_BODY_KEYS,\n]);\n\nfunction assertExactKeys(\n value: object,\n allowedKeys: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowedKeys.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported field`,\n );\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && CANONICAL_HASH.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction canonicalHash(\n payload: string,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n label: string,\n): string {\n const value = hashCanonicalPayload(payload);\n assertCanonicalHash(value, label);\n return value;\n}\n\nfunction assertUnsignedInteger(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && UNSIGNED_INTEGER.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical unsigned integer`,\n );\n}\n\nfunction assertRecoveryVersion(\n schemaVersion: EconomyContractVersion,\n recoveryVersion: EconomyRecoveryProtocolVersion,\n recordType: string,\n expectedRecordType: string,\n label: string,\n): void {\n economyAssert(\n schemaVersion === ECONOMY_CONTRACT_VERSION &&\n recoveryVersion === ECONOMY_RECOVERY_PROTOCOL_VERSION &&\n recordType === expectedRecordType,\n \"INVALID_CONTRACT\",\n `Unsupported ${label} contract version`,\n );\n}\n\nfunction assertBase64url(\n value: string,\n label: string,\n minimumLength: number,\n maximumLength: number,\n): void {\n economyAssert(\n typeof value === \"string\" &&\n value.length >= minimumLength &&\n value.length <= maximumLength &&\n BASE64URL.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be bounded unpadded base64url`,\n );\n}\n\nfunction canonicalFingerprint(\n fingerprint: EconomyHmacFingerprintV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: fingerprint.schemaVersion,\n fingerprintVersion: fingerprint.fingerprintVersion,\n algorithm: fingerprint.algorithm,\n domain: fingerprint.domain,\n keyVersion: fingerprint.keyVersion,\n digest: fingerprint.digest,\n };\n}\n\nfunction canonicalSealedPayload(\n payload: EconomySealedRecoveryPayloadV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: payload.schemaVersion,\n payloadVersion: payload.payloadVersion,\n cipherSuite: payload.cipherSuite,\n encoding: payload.encoding,\n keyVersion: payload.keyVersion,\n nonce: payload.nonce,\n ciphertext: payload.ciphertext,\n authenticationTag: payload.authenticationTag,\n plaintextContentHash: payload.plaintextContentHash,\n encryptionContextHash: payload.encryptionContextHash,\n };\n}\n\nfunction canonicalSignature(\n signature: EconomyEvidenceSignatureV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: signature.schemaVersion,\n signatureVersion: signature.signatureVersion,\n algorithm: signature.algorithm,\n keyId: signature.keyId,\n signedAt: signature.signedAt,\n value: signature.value,\n };\n}\n\nfunction canonicalSignatureMetadata(\n signature: EconomyEvidenceSignatureMetadataV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: signature.schemaVersion,\n signatureVersion: signature.signatureVersion,\n algorithm: signature.algorithm,\n keyId: signature.keyId,\n signedAt: signature.signedAt,\n };\n}\n\n/** Validates a bounded AES-GCM envelope without implementing cryptography. */\nexport function assertEconomySealedRecoveryPayload(\n payload: EconomySealedRecoveryPayloadV1,\n): void {\n assertExactKeys(\n payload,\n new Set([\n \"schemaVersion\",\n \"payloadVersion\",\n \"cipherSuite\",\n \"encoding\",\n \"keyVersion\",\n \"nonce\",\n \"ciphertext\",\n \"authenticationTag\",\n \"plaintextContentHash\",\n \"encryptionContextHash\",\n ]),\n \"Sealed recovery payload\",\n );\n economyAssert(\n payload.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n payload.payloadVersion === \"1\" &&\n payload.cipherSuite === \"AES-256-GCM\" &&\n payload.encoding === \"base64url\",\n \"INVALID_CONTRACT\",\n \"Unsupported sealed recovery-payload contract\",\n );\n assertEconomyIdentifier(payload.keyVersion, \"recovery keyVersion\");\n assertBase64url(payload.nonce, \"Recovery nonce\", 16, 16);\n assertBase64url(payload.ciphertext, \"Recovery ciphertext\", 1, 1_500_000);\n assertBase64url(\n payload.authenticationTag,\n \"Recovery authentication tag\",\n 22,\n 22,\n );\n assertCanonicalHash(\n payload.plaintextContentHash,\n \"Recovery plaintext-content hash\",\n );\n assertCanonicalHash(\n payload.encryptionContextHash,\n \"Recovery encryption-context hash\",\n );\n}\n\nfunction assertAcceptanceBody(\n body: EconomyRecoveryAcceptanceBodyV1,\n): void {\n assertExactKeys(\n body,\n \"acceptanceEnvelopeId\" in body\n ? ACCEPTANCE_KEYS\n : ACCEPTANCE_BODY_KEYS,\n \"Recovery acceptance body\",\n );\n assertRecoveryVersion(\n body.schemaVersion,\n body.recoveryVersion,\n body.recordType,\n \"economy-recovery-acceptance\",\n \"recovery acceptance\",\n );\n assertEconomyIdentifier(body.authorityId, \"authorityId\");\n assertEconomyIdentifier(body.commandId, \"commandId\");\n assertEconomyIdentifier(body.correlationId, \"correlationId\");\n assertEconomyHmacFingerprint(\n body.idempotencyFingerprint,\n \"economy.idempotency-key.v1\",\n );\n assertCanonicalHash(body.commandEnvelopeHash, \"Command-envelope hash\");\n assertEconomyIdentifier(body.acceptedReceiptId, \"acceptedReceiptId\");\n assertCanonicalHash(body.acceptedReceiptHash, \"Accepted-receipt hash\");\n assertEconomySealedRecoveryPayload(body.sealedPayload);\n const preparedAt = parseIsoTimestamp(body.preparedAt);\n const acceptedAt = parseIsoTimestamp(body.acceptedAt);\n economyAssert(\n preparedAt <= acceptedAt,\n \"INVALID_TIME_WINDOW\",\n \"Recovery acceptance cannot precede preparation\",\n );\n}\n\n/** Canonical body bytes used to derive an acceptance-envelope ID. */\nexport function canonicalEconomyRecoveryAcceptanceBodyPayload(\n body: EconomyRecoveryAcceptanceBodyV1,\n): string {\n assertAcceptanceBody(body);\n return JSON.stringify({\n schemaVersion: body.schemaVersion,\n recoveryVersion: body.recoveryVersion,\n recordType: body.recordType,\n authorityId: body.authorityId,\n commandId: body.commandId,\n correlationId: body.correlationId,\n idempotencyFingerprint: canonicalFingerprint(\n body.idempotencyFingerprint,\n ),\n commandEnvelopeHash: body.commandEnvelopeHash,\n acceptedReceiptId: body.acceptedReceiptId,\n acceptedReceiptHash: body.acceptedReceiptHash,\n sealedPayload: canonicalSealedPayload(body.sealedPayload),\n preparedAt: body.preparedAt,\n acceptedAt: body.acceptedAt,\n });\n}\n\nfunction deriveContentAddressedId(\n prefix: string,\n canonicalBodyPayload: string,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n return `${prefix}:${canonicalHash(\n canonicalBodyPayload,\n hashCanonicalPayload,\n \"Content-address hash\",\n )}`;\n}\n\n/** Creates an acceptance record whose ID addresses its exact canonical body. */\nexport function createEconomyRecoveryAcceptanceEnvelope(\n body: EconomyRecoveryAcceptanceBodyV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyRecoveryAcceptanceEnvelopeV1 {\n return {\n ...body,\n acceptanceEnvelopeId: deriveContentAddressedId(\n \"recovery-acceptance\",\n canonicalEconomyRecoveryAcceptanceBodyPayload(body),\n hashCanonicalPayload,\n ),\n };\n}\n\n/** Validates schema, privacy shape, and the acceptance content address. */\nexport function assertEconomyRecoveryAcceptanceEnvelope(\n envelope: EconomyRecoveryAcceptanceEnvelopeV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertExactKeys(envelope, ACCEPTANCE_KEYS, \"Recovery acceptance envelope\");\n assertAcceptanceBody(envelope);\n assertEconomyIdentifier(\n envelope.acceptanceEnvelopeId,\n \"acceptanceEnvelopeId\",\n );\n economyAssert(\n envelope.acceptanceEnvelopeId ===\n deriveContentAddressedId(\n \"recovery-acceptance\",\n canonicalEconomyRecoveryAcceptanceBodyPayload(envelope),\n hashCanonicalPayload,\n ),\n \"INVALID_CONTRACT\",\n \"Recovery acceptance content address does not match canonical bytes\",\n );\n}\n\n/** Canonical complete acceptance bytes written create-only in each region. */\nexport function canonicalEconomyRecoveryAcceptanceEnvelopePayload(\n envelope: EconomyRecoveryAcceptanceEnvelopeV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyRecoveryAcceptanceEnvelope(\n envelope,\n hashCanonicalPayload,\n );\n return JSON.stringify({\n schemaVersion: envelope.schemaVersion,\n recoveryVersion: envelope.recoveryVersion,\n recordType: envelope.recordType,\n acceptanceEnvelopeId: envelope.acceptanceEnvelopeId,\n authorityId: envelope.authorityId,\n commandId: envelope.commandId,\n correlationId: envelope.correlationId,\n idempotencyFingerprint: canonicalFingerprint(\n envelope.idempotencyFingerprint,\n ),\n commandEnvelopeHash: envelope.commandEnvelopeHash,\n acceptedReceiptId: envelope.acceptedReceiptId,\n acceptedReceiptHash: envelope.acceptedReceiptHash,\n sealedPayload: canonicalSealedPayload(envelope.sealedPayload),\n preparedAt: envelope.preparedAt,\n acceptedAt: envelope.acceptedAt,\n });\n}\n\nfunction assertCommittedResultBody(\n body: EconomyRecoveryCommittedResultBodyV1,\n): void {\n assertExactKeys(\n body,\n \"committedResultId\" in body\n ? COMMITTED_RESULT_KEYS\n : COMMITTED_RESULT_BODY_KEYS,\n \"Recovery committed-result body\",\n );\n assertRecoveryVersion(\n body.schemaVersion,\n body.recoveryVersion,\n body.recordType,\n \"economy-recovery-committed-result\",\n \"recovery committed result\",\n );\n for (const [value, label] of [\n [body.authorityId, \"authorityId\"],\n [body.commandId, \"commandId\"],\n [body.correlationId, \"correlationId\"],\n [body.acceptanceEnvelopeId, \"acceptanceEnvelopeId\"],\n [body.resultReceiptId, \"resultReceiptId\"],\n [body.authorityCommitId, \"authorityCommitId\"],\n ] as const) {\n assertEconomyIdentifier(value, label);\n }\n for (const [value, label] of [\n [body.acceptanceEnvelopeHash, \"Acceptance-envelope hash\"],\n [body.resultReceiptHash, \"Result-receipt hash\"],\n [body.authorityCommitHash, \"Authority-commit hash\"],\n [body.authorityHeadHashAfter, \"Authority-head hash\"],\n ] as const) {\n assertCanonicalHash(value, label);\n }\n economyAssert(\n RESULT_OUTCOMES.has(body.outcome),\n \"INVALID_CONTRACT\",\n \"Recovery committed result has an unsupported outcome\",\n );\n assertUnsignedInteger(body.authoritySequence, \"Authority sequence\");\n economyAssert(\n BigInt(body.authoritySequence) > 0n,\n \"INVALID_CONTRACT\",\n \"Authority sequence must be positive\",\n );\n const completed = body.outcome === \"completed\";\n economyAssert(\n completed ===\n (body.transactionId !== undefined &&\n body.transactionCanonicalHash !== undefined),\n \"INVALID_CONTRACT\",\n \"Only completed recovery results require transaction identity and hash\",\n );\n if (body.transactionId !== undefined) {\n assertEconomyIdentifier(body.transactionId, \"transactionId\");\n }\n if (body.transactionCanonicalHash !== undefined) {\n assertCanonicalHash(\n body.transactionCanonicalHash,\n \"Transaction canonical hash\",\n );\n }\n assertEconomySealedRecoveryPayload(body.sealedPayload);\n parseIsoTimestamp(body.committedAt);\n}\n\n/** Canonical body bytes used to derive a committed-result ID. */\nexport function canonicalEconomyRecoveryCommittedResultBodyPayload(\n body: EconomyRecoveryCommittedResultBodyV1,\n): string {\n assertCommittedResultBody(body);\n return JSON.stringify({\n schemaVersion: body.schemaVersion,\n recoveryVersion: body.recoveryVersion,\n recordType: body.recordType,\n authorityId: body.authorityId,\n commandId: body.commandId,\n correlationId: body.correlationId,\n acceptanceEnvelopeId: body.acceptanceEnvelopeId,\n acceptanceEnvelopeHash: body.acceptanceEnvelopeHash,\n resultReceiptId: body.resultReceiptId,\n resultReceiptHash: body.resultReceiptHash,\n outcome: body.outcome,\n authorityCommitId: body.authorityCommitId,\n authorityCommitHash: body.authorityCommitHash,\n authoritySequence: body.authoritySequence,\n authorityHeadHashAfter: body.authorityHeadHashAfter,\n ...(body.transactionId === undefined\n ? {}\n : { transactionId: body.transactionId }),\n ...(body.transactionCanonicalHash === undefined\n ? {}\n : { transactionCanonicalHash: body.transactionCanonicalHash }),\n sealedPayload: canonicalSealedPayload(body.sealedPayload),\n committedAt: body.committedAt,\n });\n}\n\n/** Creates a result record whose ID addresses its exact canonical body. */\nexport function createEconomyRecoveryCommittedResult(\n body: EconomyRecoveryCommittedResultBodyV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyRecoveryCommittedResultV1 {\n return {\n ...body,\n committedResultId: deriveContentAddressedId(\n \"recovery-result\",\n canonicalEconomyRecoveryCommittedResultBodyPayload(body),\n hashCanonicalPayload,\n ),\n };\n}\n\n/** Validates schema, privacy shape, and the committed-result content address. */\nexport function assertEconomyRecoveryCommittedResult(\n result: EconomyRecoveryCommittedResultV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertExactKeys(\n result,\n COMMITTED_RESULT_KEYS,\n \"Recovery committed result\",\n );\n assertCommittedResultBody(result);\n assertEconomyIdentifier(result.committedResultId, \"committedResultId\");\n economyAssert(\n result.committedResultId ===\n deriveContentAddressedId(\n \"recovery-result\",\n canonicalEconomyRecoveryCommittedResultBodyPayload(result),\n hashCanonicalPayload,\n ),\n \"INVALID_CONTRACT\",\n \"Recovery result content address does not match canonical bytes\",\n );\n}\n\n/** Canonical complete result bytes written create-only in each region. */\nexport function canonicalEconomyRecoveryCommittedResultPayload(\n result: EconomyRecoveryCommittedResultV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyRecoveryCommittedResult(result, hashCanonicalPayload);\n return JSON.stringify({\n schemaVersion: result.schemaVersion,\n recoveryVersion: result.recoveryVersion,\n recordType: result.recordType,\n committedResultId: result.committedResultId,\n authorityId: result.authorityId,\n commandId: result.commandId,\n correlationId: result.correlationId,\n acceptanceEnvelopeId: result.acceptanceEnvelopeId,\n acceptanceEnvelopeHash: result.acceptanceEnvelopeHash,\n resultReceiptId: result.resultReceiptId,\n resultReceiptHash: result.resultReceiptHash,\n outcome: result.outcome,\n authorityCommitId: result.authorityCommitId,\n authorityCommitHash: result.authorityCommitHash,\n authoritySequence: result.authoritySequence,\n authorityHeadHashAfter: result.authorityHeadHashAfter,\n ...(result.transactionId === undefined\n ? {}\n : { transactionId: result.transactionId }),\n ...(result.transactionCanonicalHash === undefined\n ? {}\n : { transactionCanonicalHash: result.transactionCanonicalHash }),\n sealedPayload: canonicalSealedPayload(result.sealedPayload),\n committedAt: result.committedAt,\n });\n}\n\n/**\n * Proves that a committed result is the terminal recovery record for the exact\n * accepted command. It also recomputes the acceptance record hash.\n */\nexport function assertEconomyRecoveryResultLink(\n acceptance: EconomyRecoveryAcceptanceEnvelopeV1,\n result: EconomyRecoveryCommittedResultV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n const acceptancePayload =\n canonicalEconomyRecoveryAcceptanceEnvelopePayload(\n acceptance,\n hashCanonicalPayload,\n );\n assertEconomyRecoveryCommittedResult(result, hashCanonicalPayload);\n economyAssert(\n result.authorityId === acceptance.authorityId &&\n result.commandId === acceptance.commandId &&\n result.correlationId === acceptance.correlationId &&\n result.acceptanceEnvelopeId === acceptance.acceptanceEnvelopeId &&\n result.acceptanceEnvelopeHash ===\n canonicalHash(\n acceptancePayload,\n hashCanonicalPayload,\n \"Acceptance-envelope hash\",\n ) &&\n parseIsoTimestamp(result.committedAt) >=\n parseIsoTimestamp(acceptance.acceptedAt),\n \"INVALID_CONTRACT\",\n \"Recovery committed result does not match its acceptance envelope\",\n );\n}\n\n/** Validates a detached evidence signature without owning signing keys. */\nexport function assertEconomyEvidenceSignatureMetadata(\n signature: EconomyEvidenceSignatureMetadataV1,\n): void {\n assertExactKeys(\n signature,\n new Set([\n \"schemaVersion\",\n \"signatureVersion\",\n \"algorithm\",\n \"keyId\",\n \"signedAt\",\n ]),\n \"Evidence signature metadata\",\n );\n economyAssert(\n signature.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n signature.signatureVersion === \"1\" &&\n SIGNATURE_ALGORITHMS.has(signature.algorithm),\n \"INVALID_CONTRACT\",\n \"Unsupported evidence signature\",\n );\n assertEconomyIdentifier(signature.keyId, \"signature keyId\");\n parseIsoTimestamp(signature.signedAt);\n}\n\n/** Validates a detached evidence signature without owning signing keys. */\nexport function assertEconomyEvidenceSignature(\n signature: EconomyEvidenceSignatureV1,\n): void {\n assertExactKeys(\n signature,\n new Set([\n \"schemaVersion\",\n \"signatureVersion\",\n \"algorithm\",\n \"keyId\",\n \"signedAt\",\n \"value\",\n ]),\n \"Evidence signature\",\n );\n assertEconomyEvidenceSignatureMetadata({\n schemaVersion: signature.schemaVersion,\n signatureVersion: signature.signatureVersion,\n algorithm: signature.algorithm,\n keyId: signature.keyId,\n signedAt: signature.signedAt,\n });\n assertBase64url(signature.value, \"Evidence signature value\", 32, 2_048);\n}\n\nfunction assertRegionalEvidenceBody(\n body: EconomyRegionalEvidenceReceiptBodyV1,\n): void {\n assertExactKeys(\n body,\n \"evidenceReceiptId\" in body ? REGIONAL_KEYS : REGIONAL_BODY_KEYS,\n \"Regional evidence-receipt body\",\n );\n assertRecoveryVersion(\n body.schemaVersion,\n body.recoveryVersion,\n body.recordType,\n \"economy-regional-evidence-receipt\",\n \"regional evidence receipt\",\n );\n for (const [value, label] of [\n [body.journalId, \"journalId\"],\n [body.region, \"region\"],\n [body.authorityId, \"authorityId\"],\n [body.commandId, \"commandId\"],\n [body.recoveryRecordId, \"recoveryRecordId\"],\n ] as const) {\n assertEconomyIdentifier(value, label);\n }\n assertUnsignedInteger(body.sequence, \"Regional evidence sequence\");\n economyAssert(\n BigInt(body.sequence) > 0n,\n \"INVALID_CONTRACT\",\n \"Regional evidence sequence must be positive\",\n );\n economyAssert(\n body.recoveryRecordKind === \"acceptance\" ||\n body.recoveryRecordKind === \"committed-result\",\n \"INVALID_CONTRACT\",\n \"Unsupported recovery record kind\",\n );\n assertCanonicalHash(\n body.recoveryRecordContentHash,\n \"Recovery-record content hash\",\n );\n if (BigInt(body.sequence) === 1n) {\n economyAssert(\n body.previousReceiptHash === undefined,\n \"INVALID_CONTRACT\",\n \"First regional evidence receipt cannot have a previous hash\",\n );\n } else {\n economyAssert(\n body.previousReceiptHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Non-genesis regional evidence receipt requires a previous hash\",\n );\n assertCanonicalHash(\n body.previousReceiptHash,\n \"Previous evidence-receipt hash\",\n );\n }\n const storedAt = parseIsoTimestamp(body.storedAt);\n const retentionUntil = parseIsoTimestamp(body.retentionUntil);\n economyAssert(\n storedAt < retentionUntil,\n \"INVALID_TIME_WINDOW\",\n \"Regional evidence retention must end after storage\",\n );\n}\n\n/** Canonical body bytes used to derive a regional evidence-receipt ID. */\nexport function canonicalEconomyRegionalEvidenceReceiptBodyPayload(\n body: EconomyRegionalEvidenceReceiptBodyV1,\n): string {\n assertRegionalEvidenceBody(body);\n return JSON.stringify({\n schemaVersion: body.schemaVersion,\n recoveryVersion: body.recoveryVersion,\n recordType: body.recordType,\n journalId: body.journalId,\n region: body.region,\n sequence: body.sequence,\n ...(body.previousReceiptHash === undefined\n ? {}\n : { previousReceiptHash: body.previousReceiptHash }),\n authorityId: body.authorityId,\n commandId: body.commandId,\n recoveryRecordKind: body.recoveryRecordKind,\n recoveryRecordId: body.recoveryRecordId,\n recoveryRecordContentHash: body.recoveryRecordContentHash,\n storedAt: body.storedAt,\n retentionUntil: body.retentionUntil,\n });\n}\n\n/** Creates a signed region receipt after the adapter has produced a signature. */\nexport function createEconomyRegionalEvidenceReceipt(\n body: EconomyRegionalEvidenceReceiptBodyV1,\n signature: EconomyEvidenceSignatureV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyRegionalEvidenceReceiptV1 {\n return {\n ...body,\n evidenceReceiptId: deriveContentAddressedId(\n \"regional-evidence\",\n canonicalEconomyRegionalEvidenceReceiptBodyPayload(body),\n hashCanonicalPayload,\n ),\n signature,\n };\n}\n\n/** Validates a region receipt and its content-addressed unsigned body. */\nexport function assertEconomyRegionalEvidenceReceipt(\n receipt: EconomyRegionalEvidenceReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertExactKeys(receipt, REGIONAL_KEYS, \"Regional evidence receipt\");\n assertRegionalEvidenceBody(receipt);\n assertEconomyIdentifier(receipt.evidenceReceiptId, \"evidenceReceiptId\");\n assertEconomyEvidenceSignature(receipt.signature);\n economyAssert(\n receipt.evidenceReceiptId ===\n deriveContentAddressedId(\n \"regional-evidence\",\n canonicalEconomyRegionalEvidenceReceiptBodyPayload(receipt),\n hashCanonicalPayload,\n ),\n \"INVALID_CONTRACT\",\n \"Regional evidence-receipt ID does not match canonical bytes\",\n );\n economyAssert(\n parseIsoTimestamp(receipt.signature.signedAt) >=\n parseIsoTimestamp(receipt.storedAt) &&\n parseIsoTimestamp(receipt.signature.signedAt) <\n parseIsoTimestamp(receipt.retentionUntil),\n \"INVALID_TIME_WINDOW\",\n \"Regional evidence signature time must fall within retention\",\n );\n}\n\n/**\n * Prepares the regional content address and exact bytes for an external signer.\n * No placeholder signature value is required or returned.\n */\nexport function prepareEconomyRegionalEvidenceReceiptSignature(\n body: EconomyRegionalEvidenceReceiptBodyV1,\n signature: EconomyEvidenceSignatureMetadataV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyPreparedEvidenceSignatureV1 {\n assertRegionalEvidenceBody(body);\n assertEconomyEvidenceSignatureMetadata(signature);\n economyAssert(\n parseIsoTimestamp(signature.signedAt) >=\n parseIsoTimestamp(body.storedAt) &&\n parseIsoTimestamp(signature.signedAt) <\n parseIsoTimestamp(body.retentionUntil),\n \"INVALID_TIME_WINDOW\",\n \"Regional evidence signature time must fall within retention\",\n );\n const contentAddressedId = deriveContentAddressedId(\n \"regional-evidence\",\n canonicalEconomyRegionalEvidenceReceiptBodyPayload(body),\n hashCanonicalPayload,\n );\n const canonicalPayload = JSON.stringify({\n domain: \"economy.regional-evidence-receipt.signature.v1\",\n evidenceReceiptId: contentAddressedId,\n body: JSON.parse(\n canonicalEconomyRegionalEvidenceReceiptBodyPayload(body),\n ) as unknown,\n signature: canonicalSignatureMetadata(signature),\n });\n return { contentAddressedId, canonicalPayload };\n}\n\n/** Exact bytes covered by a regional receipt's detached signature. */\nexport function canonicalEconomyRegionalEvidenceReceiptSigningPayload(\n receipt: EconomyRegionalEvidenceReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyRegionalEvidenceReceipt(receipt, hashCanonicalPayload);\n const prepared = prepareEconomyRegionalEvidenceReceiptSignature(\n receipt,\n {\n schemaVersion: receipt.signature.schemaVersion,\n signatureVersion: receipt.signature.signatureVersion,\n algorithm: receipt.signature.algorithm,\n keyId: receipt.signature.keyId,\n signedAt: receipt.signature.signedAt,\n },\n hashCanonicalPayload,\n );\n economyAssert(\n prepared.contentAddressedId === receipt.evidenceReceiptId,\n \"INVALID_CONTRACT\",\n \"Regional evidence signing ID does not match its receipt\",\n );\n return prepared.canonicalPayload;\n}\n\n/** Canonical complete region-receipt bytes, including its signature. */\nexport function canonicalEconomyRegionalEvidenceReceiptPayload(\n receipt: EconomyRegionalEvidenceReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyRegionalEvidenceReceipt(receipt, hashCanonicalPayload);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n recoveryVersion: receipt.recoveryVersion,\n recordType: receipt.recordType,\n evidenceReceiptId: receipt.evidenceReceiptId,\n journalId: receipt.journalId,\n region: receipt.region,\n sequence: receipt.sequence,\n ...(receipt.previousReceiptHash === undefined\n ? {}\n : { previousReceiptHash: receipt.previousReceiptHash }),\n authorityId: receipt.authorityId,\n commandId: receipt.commandId,\n recoveryRecordKind: receipt.recoveryRecordKind,\n recoveryRecordId: receipt.recoveryRecordId,\n recoveryRecordContentHash: receipt.recoveryRecordContentHash,\n storedAt: receipt.storedAt,\n retentionUntil: receipt.retentionUntil,\n signature: canonicalSignature(receipt.signature),\n });\n}\n\nfunction assertSignatureVerification(\n signature: EconomyEvidenceSignatureV1,\n canonicalPayload: string,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n label: string,\n): void {\n economyAssert(\n verifySignature({\n algorithm: signature.algorithm,\n keyId: signature.keyId,\n signedAt: signature.signedAt,\n signature: signature.value,\n canonicalPayload,\n }),\n \"INVALID_CONTRACT\",\n `${label} signature could not be verified`,\n );\n}\n\n/** Verifies one region receipt through an infrastructure-supplied key adapter. */\nexport function assertEconomyRegionalEvidenceReceiptSignature(\n receipt: EconomyRegionalEvidenceReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n): void {\n assertSignatureVerification(\n receipt.signature,\n canonicalEconomyRegionalEvidenceReceiptSigningPayload(\n receipt,\n hashCanonicalPayload,\n ),\n verifySignature,\n \"Regional evidence receipt\",\n );\n}\n\n/**\n * Verifies an ordered regional hash-chain segment. Segments beginning after\n * sequence one must supply the trusted preceding receipt hash.\n */\nexport function assertEconomyRegionalEvidenceChain(\n receipts: readonly EconomyRegionalEvidenceReceiptV1[],\n expectedPreviousReceiptHash: string | undefined,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n): void {\n economyAssert(\n receipts.length > 0,\n \"INVALID_CONTRACT\",\n \"Regional evidence chain cannot be empty\",\n );\n const first = receipts[0]!;\n assertEconomyRegionalEvidenceReceiptSignature(\n first,\n hashCanonicalPayload,\n verifySignature,\n );\n if (BigInt(first.sequence) === 1n) {\n economyAssert(\n expectedPreviousReceiptHash === undefined,\n \"INVALID_CONTRACT\",\n \"Genesis evidence chain cannot have a trusted preceding hash\",\n );\n } else {\n economyAssert(\n expectedPreviousReceiptHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Partial evidence chain requires its trusted preceding hash\",\n );\n assertCanonicalHash(\n expectedPreviousReceiptHash,\n \"Expected preceding evidence-receipt hash\",\n );\n economyAssert(\n first.previousReceiptHash === expectedPreviousReceiptHash,\n \"INVALID_CONTRACT\",\n \"Regional evidence chain does not start from the trusted hash\",\n );\n }\n\n let previous = first;\n for (const receipt of receipts.slice(1)) {\n assertEconomyRegionalEvidenceReceiptSignature(\n receipt,\n hashCanonicalPayload,\n verifySignature,\n );\n const previousHash = canonicalHash(\n canonicalEconomyRegionalEvidenceReceiptPayload(\n previous,\n hashCanonicalPayload,\n ),\n hashCanonicalPayload,\n \"Regional evidence-receipt chain hash\",\n );\n economyAssert(\n receipt.journalId === previous.journalId &&\n receipt.region === previous.region &&\n BigInt(receipt.sequence) === BigInt(previous.sequence) + 1n &&\n receipt.previousReceiptHash === previousHash &&\n parseIsoTimestamp(receipt.storedAt) >=\n parseIsoTimestamp(previous.storedAt),\n \"INVALID_CONTRACT\",\n \"Regional evidence receipts do not form one contiguous hash chain\",\n );\n previous = receipt;\n }\n}\n\n/**\n * Proves that at least two distinct regions retained byte-identical recovery\n * content. Region-specific receipt metadata and signatures may differ.\n */\nexport function assertEconomyRegionalEvidenceEquality(\n receipts: readonly EconomyRegionalEvidenceReceiptV1[],\n expectedRegions: readonly string[],\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n economyAssert(\n receipts.length >= 2 && expectedRegions.length >= 2,\n \"INVALID_CONTRACT\",\n \"Regional equality requires at least two evidence regions\",\n );\n const expected = new Set(expectedRegions);\n economyAssert(\n expected.size === expectedRegions.length,\n \"INVALID_CONTRACT\",\n \"Expected evidence regions must be unique\",\n );\n expectedRegions.forEach((region) =>\n assertEconomyIdentifier(region, \"expected region\"),\n );\n const observed = new Set<string>();\n const first = receipts[0]!;\n for (const receipt of receipts) {\n assertEconomyRegionalEvidenceReceipt(receipt, hashCanonicalPayload);\n economyAssert(\n expected.has(receipt.region) && !observed.has(receipt.region),\n \"INVALID_CONTRACT\",\n \"Regional evidence contains an unexpected or duplicate region\",\n );\n observed.add(receipt.region);\n economyAssert(\n receipt.authorityId === first.authorityId &&\n receipt.commandId === first.commandId &&\n receipt.recoveryRecordKind === first.recoveryRecordKind &&\n receipt.recoveryRecordId === first.recoveryRecordId &&\n receipt.recoveryRecordContentHash ===\n first.recoveryRecordContentHash,\n \"INVALID_CONTRACT\",\n \"Evidence regions do not bind byte-identical recovery content\",\n );\n }\n economyAssert(\n observed.size === expected.size,\n \"INVALID_CONTRACT\",\n \"Regional evidence does not cover the complete expected region set\",\n );\n}\n\n/** Validates the exact portable Merkle-proof shape. */\nexport function assertEconomyMerkleInclusionProof(\n proof: EconomyMerkleInclusionProofV1,\n): void {\n assertExactKeys(\n proof,\n new Set([\n \"schemaVersion\",\n \"proofVersion\",\n \"algorithm\",\n \"anchorId\",\n \"anchorManifestHash\",\n \"leafHash\",\n \"leafIndex\",\n \"leafCount\",\n \"siblings\",\n ]),\n \"Merkle inclusion proof\",\n );\n economyAssert(\n proof.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n proof.proofVersion === \"1\" &&\n proof.algorithm === \"duplicate-last-sha256-v1\",\n \"INVALID_CONTRACT\",\n \"Unsupported Merkle inclusion proof\",\n );\n assertEconomyIdentifier(proof.anchorId, \"anchorId\");\n assertCanonicalHash(proof.anchorManifestHash, \"Anchor-manifest hash\");\n assertCanonicalHash(proof.leafHash, \"Merkle leaf hash\");\n assertUnsignedInteger(proof.leafIndex, \"Merkle leaf index\");\n assertUnsignedInteger(proof.leafCount, \"Merkle leaf count\");\n economyAssert(\n BigInt(proof.leafCount) > 0n &&\n BigInt(proof.leafIndex) < BigInt(proof.leafCount) &&\n proof.siblings.length <= 128,\n \"INVALID_CONTRACT\",\n \"Merkle leaf position is outside its bounded tree\",\n );\n for (const step of proof.siblings) {\n assertExactKeys(\n step,\n new Set([\"schemaVersion\", \"side\", \"hash\"]),\n \"Merkle proof step\",\n );\n economyAssert(\n step.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n (step.side === \"left\" || step.side === \"right\"),\n \"INVALID_CONTRACT\",\n \"Unsupported Merkle proof step\",\n );\n assertCanonicalHash(step.hash, \"Merkle sibling hash\");\n }\n}\n\nfunction canonicalMerkleProof(\n proof: EconomyMerkleInclusionProofV1,\n): Readonly<Record<string, unknown>> {\n return {\n schemaVersion: proof.schemaVersion,\n proofVersion: proof.proofVersion,\n algorithm: proof.algorithm,\n anchorId: proof.anchorId,\n anchorManifestHash: proof.anchorManifestHash,\n leafHash: proof.leafHash,\n leafIndex: proof.leafIndex,\n leafCount: proof.leafCount,\n siblings: proof.siblings.map((step) => ({\n schemaVersion: step.schemaVersion,\n side: step.side,\n hash: step.hash,\n })),\n };\n}\n\n/**\n * Recomputes duplicate-last Merkle inclusion against a canonical hourly anchor.\n * The hash adapter receives only domain-separated canonical node bytes.\n */\nexport function assertEconomyMerkleInclusion(\n proof: EconomyMerkleInclusionProofV1,\n anchor: EconomyIntegrityAnchorManifestV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertEconomyMerkleInclusionProof(proof);\n assertEconomyIntegrityAnchorManifest(anchor);\n const anchorHash = canonicalHash(\n canonicalEconomyIntegrityAnchorManifestPayload(anchor),\n hashCanonicalPayload,\n \"Anchor-manifest hash\",\n );\n economyAssert(\n proof.anchorId === anchor.anchorId &&\n proof.anchorManifestHash === anchorHash &&\n proof.leafCount === anchor.leafCount,\n \"INVALID_CONTRACT\",\n \"Merkle proof does not match its authority anchor\",\n );\n\n let currentHash = proof.leafHash;\n let index = BigInt(proof.leafIndex);\n let width = BigInt(proof.leafCount);\n let consumed = 0;\n while (width > 1n) {\n const step = proof.siblings[consumed];\n economyAssert(\n step !== undefined,\n \"INVALID_CONTRACT\",\n \"Merkle proof is missing a tree level\",\n );\n const expectsLeft = index % 2n === 1n;\n economyAssert(\n step.side === (expectsLeft ? \"left\" : \"right\"),\n \"INVALID_CONTRACT\",\n \"Merkle proof sibling is on the wrong side\",\n );\n if (!expectsLeft && index + 1n === width) {\n economyAssert(\n step.hash === currentHash,\n \"INVALID_CONTRACT\",\n \"Odd Merkle levels must duplicate their final leaf\",\n );\n }\n const leftHash = expectsLeft ? step.hash : currentHash;\n const rightHash = expectsLeft ? currentHash : step.hash;\n currentHash = canonicalHash(\n JSON.stringify({\n domain: \"economy.merkle-node.v1\",\n leftHash,\n rightHash,\n }),\n hashCanonicalPayload,\n \"Merkle parent hash\",\n );\n consumed += 1;\n index /= 2n;\n width = (width + 1n) / 2n;\n }\n economyAssert(\n consumed === proof.siblings.length &&\n currentHash === anchor.merkleRootHash,\n \"INVALID_CONTRACT\",\n \"Merkle proof does not resolve to the anchor root\",\n );\n}\n\nfunction assertPortableEvidenceReference(\n reference: EconomyPortableEvidenceReferenceV1,\n): void {\n assertExactKeys(\n reference,\n new Set([\n \"schemaVersion\",\n \"region\",\n \"evidenceReceiptId\",\n \"evidenceReceiptHash\",\n ]),\n \"Portable evidence reference\",\n );\n economyAssert(\n reference.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported portable evidence-reference version\",\n );\n assertEconomyIdentifier(reference.region, \"evidence region\");\n assertEconomyIdentifier(\n reference.evidenceReceiptId,\n \"evidenceReceiptId\",\n );\n assertCanonicalHash(\n reference.evidenceReceiptHash,\n \"Evidence-receipt hash\",\n );\n}\n\nfunction evidenceReferenceOrder(\n left: EconomyPortableEvidenceReferenceV1,\n right: EconomyPortableEvidenceReferenceV1,\n): number {\n return compareUnicodeCodeUnits(left.region, right.region);\n}\n\nfunction canonicalPortableEvidenceReference(\n reference: EconomyPortableEvidenceReferenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: reference.schemaVersion,\n region: reference.region,\n evidenceReceiptId: reference.evidenceReceiptId,\n evidenceReceiptHash: reference.evidenceReceiptHash,\n };\n}\n\nfunction assertPortableBody(\n body: EconomyPortableCustomerReceiptBodyV1,\n): void {\n assertExactKeys(\n body,\n \"portableReceiptId\" in body ? PORTABLE_KEYS : PORTABLE_BODY_KEYS,\n \"Portable customer-receipt body\",\n );\n assertRecoveryVersion(\n body.schemaVersion,\n body.recoveryVersion,\n body.recordType,\n \"economy-portable-customer-receipt\",\n \"portable customer receipt\",\n );\n for (const [value, label] of [\n [body.authorityId, \"authorityId\"],\n [body.commandId, \"commandId\"],\n [body.transactionId, \"transactionId\"],\n [body.resultReceiptId, \"resultReceiptId\"],\n [body.committedResultId, \"committedResultId\"],\n [body.authorityCommitId, \"authorityCommitId\"],\n [body.tokenTermsVersion, \"tokenTermsVersion\"],\n ] as const) {\n assertEconomyIdentifier(value, label);\n }\n economyAssert(\n ACTIVITY_TYPES.has(body.activityType) &&\n (body.direction === \"credit\" || body.direction === \"debit\"),\n \"INVALID_CONTRACT\",\n \"Portable customer receipt has an unsupported activity or direction\",\n );\n economyAssert(\n parseTokenSubunits(body.tokenAmount) > 0n,\n \"INVALID_AMOUNT\",\n \"Portable customer receipt amount must be positive\",\n );\n for (const [value, label] of [\n [body.transactionCanonicalHash, \"Transaction canonical hash\"],\n [body.resultReceiptHash, \"Result-receipt hash\"],\n [body.committedResultContentHash, \"Committed-result content hash\"],\n [body.authorityCommitHash, \"Authority-commit hash\"],\n ] as const) {\n assertCanonicalHash(value, label);\n }\n assertUnsignedInteger(body.authoritySequence, \"Authority sequence\");\n economyAssert(\n BigInt(body.authoritySequence) > 0n &&\n body.cashRedemptionAllowed === false,\n \"INVALID_CONTRACT\",\n \"Portable receipt requires a positive sequence and no cash redemption\",\n );\n economyAssert(\n body.regionalEvidence.length >= 2,\n \"INVALID_CONTRACT\",\n \"Portable customer receipt requires at least two evidence regions\",\n );\n let previous: EconomyPortableEvidenceReferenceV1 | undefined;\n for (const reference of body.regionalEvidence) {\n assertPortableEvidenceReference(reference);\n economyAssert(\n previous === undefined ||\n evidenceReferenceOrder(previous, reference) < 0,\n \"INVALID_CONTRACT\",\n \"Portable evidence references must be unique and canonically ordered\",\n );\n previous = reference;\n }\n if (body.merkleInclusionProof !== undefined) {\n assertEconomyMerkleInclusionProof(body.merkleInclusionProof);\n economyAssert(\n body.merkleInclusionProof.leafHash === body.authorityCommitHash,\n \"INVALID_CONTRACT\",\n \"Portable receipt Merkle proof must cover its authority commit\",\n );\n }\n const committedAt = parseIsoTimestamp(body.committedAt);\n const issuedAt = parseIsoTimestamp(body.issuedAt);\n economyAssert(\n committedAt <= issuedAt,\n \"INVALID_TIME_WINDOW\",\n \"Portable receipt cannot be issued before its authority commit\",\n );\n}\n\n/** Canonical body bytes used to derive a portable receipt ID. */\nexport function canonicalEconomyPortableCustomerReceiptBodyPayload(\n body: EconomyPortableCustomerReceiptBodyV1,\n): string {\n assertPortableBody(body);\n return JSON.stringify({\n schemaVersion: body.schemaVersion,\n recoveryVersion: body.recoveryVersion,\n recordType: body.recordType,\n authorityId: body.authorityId,\n commandId: body.commandId,\n activityType: body.activityType,\n direction: body.direction,\n tokenAmount: body.tokenAmount,\n transactionId: body.transactionId,\n transactionCanonicalHash: body.transactionCanonicalHash,\n resultReceiptId: body.resultReceiptId,\n resultReceiptHash: body.resultReceiptHash,\n committedResultId: body.committedResultId,\n committedResultContentHash: body.committedResultContentHash,\n authorityCommitId: body.authorityCommitId,\n authorityCommitHash: body.authorityCommitHash,\n authoritySequence: body.authoritySequence,\n regionalEvidence: body.regionalEvidence.map(\n canonicalPortableEvidenceReference,\n ),\n ...(body.merkleInclusionProof === undefined\n ? {}\n : {\n merkleInclusionProof: canonicalMerkleProof(\n body.merkleInclusionProof,\n ),\n }),\n tokenTermsVersion: body.tokenTermsVersion,\n cashRedemptionAllowed: body.cashRedemptionAllowed,\n committedAt: body.committedAt,\n issuedAt: body.issuedAt,\n });\n}\n\n/** Creates a signed portable receipt from a canonical content-addressed body. */\nexport function createEconomyPortableCustomerReceipt(\n body: EconomyPortableCustomerReceiptBodyV1,\n signature: EconomyEvidenceSignatureV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyPortableCustomerReceiptV1 {\n return {\n ...body,\n portableReceiptId: deriveContentAddressedId(\n \"portable-token-receipt\",\n canonicalEconomyPortableCustomerReceiptBodyPayload(body),\n hashCanonicalPayload,\n ),\n signature,\n };\n}\n\n/** Validates schema, privacy shape, signature shape, and content address. */\nexport function assertEconomyPortableCustomerReceipt(\n receipt: EconomyPortableCustomerReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertExactKeys(receipt, PORTABLE_KEYS, \"Portable customer receipt\");\n assertPortableBody(receipt);\n assertEconomyIdentifier(receipt.portableReceiptId, \"portableReceiptId\");\n assertEconomyEvidenceSignature(receipt.signature);\n economyAssert(\n receipt.portableReceiptId ===\n deriveContentAddressedId(\n \"portable-token-receipt\",\n canonicalEconomyPortableCustomerReceiptBodyPayload(receipt),\n hashCanonicalPayload,\n ),\n \"INVALID_CONTRACT\",\n \"Portable customer-receipt ID does not match canonical bytes\",\n );\n economyAssert(\n parseIsoTimestamp(receipt.signature.signedAt) >=\n parseIsoTimestamp(receipt.issuedAt),\n \"INVALID_TIME_WINDOW\",\n \"Portable customer receipt cannot be signed before it is issued\",\n );\n}\n\n/**\n * Prepares the portable content address and exact bytes for an external signer.\n * No placeholder signature value is required or returned.\n */\nexport function prepareEconomyPortableCustomerReceiptSignature(\n body: EconomyPortableCustomerReceiptBodyV1,\n signature: EconomyEvidenceSignatureMetadataV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyPreparedEvidenceSignatureV1 {\n assertPortableBody(body);\n assertEconomyEvidenceSignatureMetadata(signature);\n economyAssert(\n parseIsoTimestamp(signature.signedAt) >=\n parseIsoTimestamp(body.issuedAt),\n \"INVALID_TIME_WINDOW\",\n \"Portable customer receipt cannot be signed before it is issued\",\n );\n const contentAddressedId = deriveContentAddressedId(\n \"portable-token-receipt\",\n canonicalEconomyPortableCustomerReceiptBodyPayload(body),\n hashCanonicalPayload,\n );\n const canonicalPayload = JSON.stringify({\n domain: \"economy.portable-customer-receipt.signature.v1\",\n portableReceiptId: contentAddressedId,\n body: JSON.parse(\n canonicalEconomyPortableCustomerReceiptBodyPayload(body),\n ) as unknown,\n signature: canonicalSignatureMetadata(signature),\n });\n return { contentAddressedId, canonicalPayload };\n}\n\n/** Exact bytes covered by a portable receipt's detached signature. */\nexport function canonicalEconomyPortableCustomerReceiptSigningPayload(\n receipt: EconomyPortableCustomerReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyPortableCustomerReceipt(receipt, hashCanonicalPayload);\n const prepared = prepareEconomyPortableCustomerReceiptSignature(\n receipt,\n {\n schemaVersion: receipt.signature.schemaVersion,\n signatureVersion: receipt.signature.signatureVersion,\n algorithm: receipt.signature.algorithm,\n keyId: receipt.signature.keyId,\n signedAt: receipt.signature.signedAt,\n },\n hashCanonicalPayload,\n );\n economyAssert(\n prepared.contentAddressedId === receipt.portableReceiptId,\n \"INVALID_CONTRACT\",\n \"Portable receipt signing ID does not match its receipt\",\n );\n return prepared.canonicalPayload;\n}\n\n/** Canonical complete portable-receipt bytes, including its signature. */\nexport function canonicalEconomyPortableCustomerReceiptPayload(\n receipt: EconomyPortableCustomerReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyPortableCustomerReceipt(receipt, hashCanonicalPayload);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n recoveryVersion: receipt.recoveryVersion,\n recordType: receipt.recordType,\n portableReceiptId: receipt.portableReceiptId,\n authorityId: receipt.authorityId,\n commandId: receipt.commandId,\n activityType: receipt.activityType,\n direction: receipt.direction,\n tokenAmount: receipt.tokenAmount,\n transactionId: receipt.transactionId,\n transactionCanonicalHash: receipt.transactionCanonicalHash,\n resultReceiptId: receipt.resultReceiptId,\n resultReceiptHash: receipt.resultReceiptHash,\n committedResultId: receipt.committedResultId,\n committedResultContentHash: receipt.committedResultContentHash,\n authorityCommitId: receipt.authorityCommitId,\n authorityCommitHash: receipt.authorityCommitHash,\n authoritySequence: receipt.authoritySequence,\n regionalEvidence: receipt.regionalEvidence.map(\n canonicalPortableEvidenceReference,\n ),\n ...(receipt.merkleInclusionProof === undefined\n ? {}\n : {\n merkleInclusionProof: canonicalMerkleProof(\n receipt.merkleInclusionProof,\n ),\n }),\n tokenTermsVersion: receipt.tokenTermsVersion,\n cashRedemptionAllowed: receipt.cashRedemptionAllowed,\n committedAt: receipt.committedAt,\n issuedAt: receipt.issuedAt,\n signature: canonicalSignature(receipt.signature),\n });\n}\n\n/** Verifies a portable receipt through an infrastructure-supplied key adapter. */\nexport function assertEconomyPortableCustomerReceiptSignature(\n receipt: EconomyPortableCustomerReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n): void {\n assertSignatureVerification(\n receipt.signature,\n canonicalEconomyPortableCustomerReceiptSigningPayload(\n receipt,\n hashCanonicalPayload,\n ),\n verifySignature,\n \"Portable customer receipt\",\n );\n}\n\n/**\n * Cross-validates the complete portable proof graph without storage, identity,\n * key-vault, or cloud-SDK dependencies.\n */\nexport function assertEconomyPortableCustomerReceiptEvidence(\n receipt: EconomyPortableCustomerReceiptV1,\n regionalReceipts: readonly EconomyRegionalEvidenceReceiptV1[],\n expectedRegions: readonly string[],\n anchor: EconomyIntegrityAnchorManifestV1 | undefined,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n): void {\n assertEconomyPortableCustomerReceiptSignature(\n receipt,\n hashCanonicalPayload,\n verifySignature,\n );\n assertEconomyRegionalEvidenceEquality(\n regionalReceipts,\n expectedRegions,\n hashCanonicalPayload,\n );\n economyAssert(\n regionalReceipts[0]?.recoveryRecordKind === \"committed-result\" &&\n regionalReceipts[0].recoveryRecordId === receipt.committedResultId &&\n regionalReceipts[0].recoveryRecordContentHash ===\n receipt.committedResultContentHash,\n \"INVALID_CONTRACT\",\n \"Portable receipt does not reference the retained committed result\",\n );\n\n const receiptByRegion = new Map(\n regionalReceipts.map((regionalReceipt) => [\n regionalReceipt.region,\n regionalReceipt,\n ]),\n );\n economyAssert(\n receipt.regionalEvidence.length === regionalReceipts.length,\n \"INVALID_CONTRACT\",\n \"Portable receipt does not cover the complete regional evidence set\",\n );\n for (const reference of receipt.regionalEvidence) {\n const regionalReceipt = receiptByRegion.get(reference.region);\n economyAssert(\n regionalReceipt !== undefined &&\n regionalReceipt.evidenceReceiptId === reference.evidenceReceiptId &&\n canonicalHash(\n canonicalEconomyRegionalEvidenceReceiptPayload(\n regionalReceipt,\n hashCanonicalPayload,\n ),\n hashCanonicalPayload,\n \"Regional evidence-receipt hash\",\n ) === reference.evidenceReceiptHash,\n \"INVALID_CONTRACT\",\n \"Portable receipt regional evidence reference does not match\",\n );\n assertEconomyRegionalEvidenceReceiptSignature(\n regionalReceipt,\n hashCanonicalPayload,\n verifySignature,\n );\n }\n\n if (receipt.merkleInclusionProof === undefined) {\n economyAssert(\n anchor === undefined,\n \"INVALID_CONTRACT\",\n \"An anchor cannot be supplied without a portable inclusion proof\",\n );\n } else {\n economyAssert(\n anchor !== undefined,\n \"INVALID_CONTRACT\",\n \"Portable inclusion proof requires its anchor manifest\",\n );\n assertEconomyMerkleInclusion(\n receipt.merkleInclusionProof,\n anchor,\n hashCanonicalPayload,\n );\n }\n}\n","import { parseTokenSubunits, type TokenSubunitString } from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type AllocationId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type SpendRequestPurpose = \"gameplay-conversion\" | \"non-gameplay\";\nexport type SpendRequestStatus =\n | \"requested\"\n | \"approved\"\n | \"rejected\"\n | \"expired\"\n | \"executed\"\n | \"cancelled\";\n\n/** Future child request; baseline adapters must reject creation while disabled. */\nexport interface SpendRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly requestId: string;\n readonly childAccountId: AccountId;\n readonly allocationId: AllocationId;\n readonly purpose: SpendRequestPurpose;\n readonly amount: TokenSubunitString;\n readonly status: SpendRequestStatus;\n readonly requestedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n readonly decidedByAccountId?: AccountId;\n readonly decidedAt?: IsoTimestamp;\n readonly approvalNonceHash?: string;\n readonly resultingTransactionId?: TransactionId;\n}\n\n/** Validates future child requests while creation remains policy-disabled. */\nexport function assertSpendRequest(request: SpendRequestV1): void {\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported spend-request contract version\",\n );\n assertEconomyIdentifier(request.requestId, \"requestId\");\n assertEconomyIdentifier(request.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(request.allocationId, \"allocationId\");\n economyAssert(\n request.purpose === \"gameplay-conversion\" ||\n request.purpose === \"non-gameplay\",\n \"INVALID_CONTRACT\",\n \"Spend request has an unsupported purpose\",\n );\n economyAssert(\n [\n \"requested\",\n \"approved\",\n \"rejected\",\n \"expired\",\n \"executed\",\n \"cancelled\",\n ].includes(request.status),\n \"INVALID_CONTRACT\",\n \"Spend request has an unsupported status\",\n );\n economyAssert(\n parseTokenSubunits(request.amount) > 0n,\n \"INVALID_AMOUNT\",\n \"Spend-request amount must be positive\",\n );\n const requestedAt = parseIsoTimestamp(request.requestedAt);\n const expiresAt = parseIsoTimestamp(request.expiresAt);\n economyAssert(\n expiresAt > requestedAt,\n \"INVALID_TIME_WINDOW\",\n \"Spend-request expiry must follow creation\",\n );\n\n const decisionRequired = [\"approved\", \"rejected\", \"executed\"].includes(\n request.status,\n );\n economyAssert(\n !decisionRequired ||\n (request.decidedByAccountId !== undefined &&\n request.decidedAt !== undefined),\n \"INVALID_CONTRACT\",\n \"Decided spend requests require a guardian actor and timestamp\",\n );\n if (request.decidedByAccountId !== undefined) {\n assertEconomyIdentifier(request.decidedByAccountId, \"decidedByAccountId\");\n }\n if (request.decidedAt !== undefined) {\n const decidedAt = parseIsoTimestamp(request.decidedAt);\n economyAssert(\n decidedAt >= requestedAt && decidedAt <= expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Spend-request decision must occur before expiry\",\n );\n }\n if (request.approvalNonceHash !== undefined) {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(request.approvalNonceHash),\n \"INVALID_CONTRACT\",\n \"Approval nonces must be stored as SHA-256 hashes\",\n );\n }\n if (request.status === \"approved\" || request.status === \"executed\") {\n economyAssert(\n request.approvalNonceHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Approved spend requests require a one-time approval nonce hash\",\n );\n }\n if (request.resultingTransactionId !== undefined) {\n assertEconomyIdentifier(\n request.resultingTransactionId,\n \"resultingTransactionId\",\n );\n economyAssert(\n request.status === \"executed\",\n \"INVALID_CONTRACT\",\n \"Only executed spend requests may reference a ledger transaction\",\n );\n }\n}\n","import {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { serializeTokenSubunits } from \"./amount.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { CanonicalPayloadHashFunctionV1 } from \"./integrity.js\";\nimport {\n assertWalletLifetimeSnapshot,\n assertWalletPortfolioReadScope,\n type WalletActivityEntryV1,\n type WalletLifetimeSnapshotV1,\n type WalletPortfolioReadScopeV1,\n} from \"./ports/query.js\";\nimport {\n assertWallet,\n assertWalletBalanceSummary,\n type WalletBalanceSummaryV1,\n type WalletV1,\n} from \"./wallets.js\";\n\nconst INITIALIZATION_IDENTITY_DOMAIN =\n \"economy.personal-wallet-initialization.identity.v1\";\nconst ZERO_TOKEN_SUBUNITS = serializeTokenSubunits(0n);\n\nexport type WalletInitializationNoOpCodeV1 =\n | \"WALLET_INITIALIZED\"\n | \"WALLET_ALREADY_INITIALIZED\";\n\n/** Deterministic storage identities for one self-owned personal wallet. */\nexport interface PersonalWalletInitializationDocumentIdsV1 {\n readonly walletDescriptorId: string;\n readonly accessProjectionId: string;\n readonly balanceProjectionId: string;\n readonly lifetimeProjectionId: string;\n readonly outboxEventId: string;\n}\n\n/** Privacy-minimized semantic payload bound by the audited command hash. */\nexport interface PersonalWalletInitializationCommandV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandType: \"initialize-wallet\";\n readonly walletKind: \"personal\";\n readonly subjectAccountId: AccountId;\n readonly walletId: string;\n readonly portfolioId: string;\n readonly initializedAt: IsoTimestamp;\n}\n\n/** Non-economic integration intent emitted in the same authority batch. */\nexport interface PersonalWalletInitializationOutboxIntentV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly eventType: \"wallet.initialized.v1\";\n readonly eventId: string;\n readonly subjectAccountId: AccountId;\n readonly walletId: string;\n readonly portfolioId: string;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Complete rebuildable baseline for one new self-owned personal wallet. */\nexport interface PersonalWalletInitializationStateV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly documentIds: PersonalWalletInitializationDocumentIdsV1;\n readonly command: PersonalWalletInitializationCommandV1;\n readonly wallet: WalletV1;\n readonly scope: WalletPortfolioReadScopeV1;\n readonly balance: WalletBalanceSummaryV1;\n readonly lifetime: WalletLifetimeSnapshotV1;\n /** Initialization itself is not an economic activity. */\n readonly activityEntries: readonly WalletActivityEntryV1[];\n readonly outboxIntent: PersonalWalletInitializationOutboxIntentV1;\n}\n\nexport interface CreatePersonalWalletInitializationStateInputV1 {\n readonly subjectAccountId: AccountId;\n readonly initializedAt: IsoTimestamp;\n}\n\nconst STATE_KEYS = new Set([\n \"schemaVersion\",\n \"documentIds\",\n \"command\",\n \"wallet\",\n \"scope\",\n \"balance\",\n \"lifetime\",\n \"activityEntries\",\n \"outboxIntent\",\n]);\nconst COMMAND_KEYS = new Set([\n \"schemaVersion\",\n \"commandType\",\n \"walletKind\",\n \"subjectAccountId\",\n \"walletId\",\n \"portfolioId\",\n \"initializedAt\",\n]);\nconst OUTBOX_KEYS = new Set([\n \"schemaVersion\",\n \"eventType\",\n \"eventId\",\n \"subjectAccountId\",\n \"walletId\",\n \"portfolioId\",\n \"occurredAt\",\n]);\nconst DOCUMENT_ID_KEYS = new Set([\n \"walletDescriptorId\",\n \"accessProjectionId\",\n \"balanceProjectionId\",\n \"lifetimeProjectionId\",\n \"outboxEventId\",\n]);\n\nfunction assertExactKeys(\n value: object,\n allowed: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowed.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported field`,\n );\n}\n\nfunction identityDigest(\n subjectAccountId: AccountId,\n hash: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyIdentifier(subjectAccountId, \"subjectAccountId\");\n const canonicalIdentity = JSON.stringify({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n domain: INITIALIZATION_IDENTITY_DOMAIN,\n subjectAccountId,\n });\n const canonicalHash = hash(canonicalIdentity);\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(canonicalHash),\n \"INVALID_CONTRACT\",\n \"Wallet initialization identity hash must be canonical SHA-256\",\n );\n return canonicalHash.slice(\"sha256:\".length);\n}\n\n/** Produces stable, non-guessable-by-sequence IDs without owning cryptography. */\nexport function createPersonalWalletInitializationDocumentIds(\n subjectAccountId: AccountId,\n hash: CanonicalPayloadHashFunctionV1,\n): PersonalWalletInitializationDocumentIdsV1 & {\n readonly walletId: string;\n readonly portfolioId: string;\n} {\n const digest = identityDigest(subjectAccountId, hash);\n return {\n walletId: `wallet:personal:${digest}`,\n portfolioId: `portfolio:self:${digest}`,\n walletDescriptorId: `wallet-descriptor:${digest}`,\n accessProjectionId: `wallet-access:${digest}`,\n balanceProjectionId: `wallet-balance:${digest}`,\n lifetimeProjectionId: `wallet-lifetime:${digest}`,\n outboxEventId: `outbox:wallet-initialized:${digest}`,\n };\n}\n\n/** Validates the exact semantic initialization payload before hashing it. */\nexport function assertPersonalWalletInitializationCommand(\n command: PersonalWalletInitializationCommandV1,\n): void {\n assertExactKeys(command, COMMAND_KEYS, \"Wallet initialization command\");\n economyAssert(\n command.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n command.commandType === \"initialize-wallet\" &&\n command.walletKind === \"personal\",\n \"INVALID_CONTRACT\",\n \"Unsupported personal-wallet initialization command\",\n );\n assertEconomyIdentifier(command.subjectAccountId, \"subjectAccountId\");\n assertEconomyIdentifier(command.walletId, \"walletId\");\n assertEconomyIdentifier(command.portfolioId, \"portfolioId\");\n parseIsoTimestamp(command.initializedAt);\n}\n\n/** Returns the exact UTF-8 JSON bytes an approved SHA-256 adapter must hash. */\nexport function canonicalPersonalWalletInitializationCommandPayload(\n command: PersonalWalletInitializationCommandV1,\n): string {\n assertPersonalWalletInitializationCommand(command);\n return JSON.stringify({\n schemaVersion: command.schemaVersion,\n commandType: command.commandType,\n walletKind: command.walletKind,\n subjectAccountId: command.subjectAccountId,\n walletId: command.walletId,\n portfolioId: command.portfolioId,\n initializedAt: command.initializedAt,\n });\n}\n\n/** Validates the privacy-minimized outbox intent. */\nexport function assertPersonalWalletInitializationOutboxIntent(\n intent: PersonalWalletInitializationOutboxIntentV1,\n): void {\n assertExactKeys(intent, OUTBOX_KEYS, \"Wallet initialization outbox intent\");\n economyAssert(\n intent.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n intent.eventType === \"wallet.initialized.v1\",\n \"INVALID_CONTRACT\",\n \"Unsupported wallet initialization outbox intent\",\n );\n assertEconomyIdentifier(intent.eventId, \"eventId\");\n assertEconomyIdentifier(intent.subjectAccountId, \"subjectAccountId\");\n assertEconomyIdentifier(intent.walletId, \"walletId\");\n assertEconomyIdentifier(intent.portfolioId, \"portfolioId\");\n parseIsoTimestamp(intent.occurredAt);\n}\n\n/** Canonical bytes for the create-only initialization outbox fact. */\nexport function canonicalPersonalWalletInitializationOutboxPayload(\n intent: PersonalWalletInitializationOutboxIntentV1,\n): string {\n assertPersonalWalletInitializationOutboxIntent(intent);\n return JSON.stringify({\n schemaVersion: intent.schemaVersion,\n eventType: intent.eventType,\n eventId: intent.eventId,\n subjectAccountId: intent.subjectAccountId,\n walletId: intent.walletId,\n portfolioId: intent.portfolioId,\n occurredAt: intent.occurredAt,\n });\n}\n\n/**\n * Builds the complete exact-zero personal-wallet baseline. The caller supplies\n * SHA-256 and persists these records with receipts, idempotency, the authority\n * manifest, and the conditional head advance in one ACID boundary.\n */\nexport function createPersonalWalletInitializationState(\n input: CreatePersonalWalletInitializationStateInputV1,\n hash: CanonicalPayloadHashFunctionV1,\n): PersonalWalletInitializationStateV1 {\n parseIsoTimestamp(input.initializedAt);\n const { walletId, portfolioId, ...documentIds } =\n createPersonalWalletInitializationDocumentIds(\n input.subjectAccountId,\n hash,\n );\n const command: PersonalWalletInitializationCommandV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n commandType: \"initialize-wallet\",\n walletKind: \"personal\",\n subjectAccountId: input.subjectAccountId,\n walletId,\n portfolioId,\n initializedAt: input.initializedAt,\n };\n const state: PersonalWalletInitializationStateV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n documentIds,\n command,\n wallet: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n accountId: input.subjectAccountId,\n kind: \"personal\",\n ownerType: \"account\",\n ownerId: input.subjectAccountId,\n status: \"active\",\n version: 1,\n createdAt: input.initializedAt,\n },\n scope: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n portfolioId,\n subjectAccountId: input.subjectAccountId,\n components: [{ walletId, role: \"personal\" }],\n },\n balance: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n available: ZERO_TOKEN_SUBUNITS,\n reserved: ZERO_TOKEN_SUBUNITS,\n held: ZERO_TOKEN_SUBUNITS,\n rewardProgress: ZERO_TOKEN_SUBUNITS,\n version: 1,\n asOf: input.initializedAt,\n },\n lifetime: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n totals: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n bought: ZERO_TOKEN_SUBUNITS,\n earned: ZERO_TOKEN_SUBUNITS,\n allocated: ZERO_TOKEN_SUBUNITS,\n reclaimed: ZERO_TOKEN_SUBUNITS,\n spent: ZERO_TOKEN_SUBUNITS,\n reversed: ZERO_TOKEN_SUBUNITS,\n },\n version: 1,\n asOf: input.initializedAt,\n },\n activityEntries: [],\n outboxIntent: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n eventType: \"wallet.initialized.v1\",\n eventId: documentIds.outboxEventId,\n subjectAccountId: input.subjectAccountId,\n walletId,\n portfolioId,\n occurredAt: input.initializedAt,\n },\n };\n assertPersonalWalletInitializationState(state);\n return state;\n}\n\n/** Proves the personal-wallet initialization state is complete and exact-zero. */\nexport function assertPersonalWalletInitializationState(\n state: PersonalWalletInitializationStateV1,\n): void {\n assertExactKeys(state, STATE_KEYS, \"Wallet initialization state\");\n assertExactKeys(\n state.documentIds,\n DOCUMENT_ID_KEYS,\n \"Wallet initialization document IDs\",\n );\n economyAssert(\n state.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet initialization state\",\n );\n for (const identifier of Object.values(state.documentIds)) {\n assertEconomyIdentifier(identifier, \"wallet initialization document ID\");\n }\n economyAssert(\n new Set(Object.values(state.documentIds)).size ===\n Object.values(state.documentIds).length,\n \"INVALID_CONTRACT\",\n \"Wallet initialization document IDs must be unique\",\n );\n assertPersonalWalletInitializationCommand(state.command);\n assertWallet(state.wallet);\n assertWalletPortfolioReadScope(state.scope);\n assertWalletBalanceSummary(state.balance);\n assertWalletLifetimeSnapshot(state.lifetime);\n assertPersonalWalletInitializationOutboxIntent(state.outboxIntent);\n economyAssert(\n state.wallet.walletId === state.command.walletId &&\n state.wallet.accountId === state.command.subjectAccountId &&\n state.wallet.ownerId === state.command.subjectAccountId &&\n state.wallet.kind === \"personal\" &&\n state.wallet.ownerType === \"account\" &&\n state.wallet.createdAt === state.command.initializedAt &&\n state.scope.portfolioId === state.command.portfolioId &&\n state.scope.subjectAccountId === state.command.subjectAccountId &&\n state.scope.components.length === 1 &&\n state.scope.components[0]?.walletId === state.command.walletId &&\n state.scope.components[0]?.role === \"personal\" &&\n state.scope.components[0]?.beneficiaryAccountId === undefined &&\n state.balance.walletId === state.command.walletId &&\n state.balance.available === ZERO_TOKEN_SUBUNITS &&\n state.balance.reserved === ZERO_TOKEN_SUBUNITS &&\n state.balance.held === ZERO_TOKEN_SUBUNITS &&\n state.balance.rewardProgress === ZERO_TOKEN_SUBUNITS &&\n state.balance.version === 1 &&\n state.balance.asOf === state.command.initializedAt &&\n state.lifetime.walletId === state.command.walletId &&\n state.lifetime.version === 1 &&\n state.lifetime.asOf === state.command.initializedAt &&\n state.lifetime.totals.bought === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.earned === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.allocated === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.reclaimed === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.spent === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.reversed === ZERO_TOKEN_SUBUNITS &&\n state.activityEntries.length === 0 &&\n state.outboxIntent.eventId === state.documentIds.outboxEventId &&\n state.outboxIntent.subjectAccountId === state.command.subjectAccountId &&\n state.outboxIntent.walletId === state.command.walletId &&\n state.outboxIntent.portfolioId === state.command.portfolioId &&\n state.outboxIntent.occurredAt === state.command.initializedAt,\n \"INVALID_CONTRACT\",\n \"Personal-wallet initialization state is incomplete or inconsistent\",\n );\n}\n"],"mappings":"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","names":["assertExactKeys","assertExactKeys","assertCanonicalHash","hashCanonicalPayload","ACTIVITY_TYPES","ACTIVITY_STATUSES","ACTIVITY_SOURCES","assertCanonicalHash","assertCanonicalHash","canonicalHash","assertCanonicalHash","hashCanonicalPayload","assertWholePositive","assertExactKeys","assertCanonicalHash","ACTIVITY_TYPES","ACTIVITY_STATUSES","ACTIVITY_SOURCES","hasControlCharacters","assertOpaqueCursor","assertUniqueValues","TRANSITION_PRECEDENCE","sameTransition","compareTransitions","ACTIVITY_TYPES","assertExactKeys","assertCanonicalHash","hashCanonicalPayload","canonicalFingerprint","assertExactKeys","canonicalHash"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/amount.ts","../src/canonical-order.ts","../src/contracts.ts","../src/acquisition.ts","../src/admin-reporting.ts","../src/allocations.ts","../src/audit.ts","../src/authority.ts","../src/ledger.ts","../src/audit-graph.ts","../src/early-backers.ts","../src/google-rewarded-web.ts","../src/integrity.ts","../src/lots.ts","../src/module-allowances.ts","../src/operations.ts","../src/operator-adjustments.ts","../src/paid-lots.ts","../src/ports/persistence.ts","../src/wallets.ts","../src/projection.ts","../src/ports/query.ts","../src/purchase-caps.ts","../src/purchase-intents.ts","../src/recurrence.ts","../src/recovery.ts","../src/spend-requests.ts","../src/wallet-initialization.ts"],"sourcesContent":["/** Stable machine-readable failures exposed by the economy domain. */\nexport type EconomyErrorCode =\n | \"INVALID_AMOUNT\"\n | \"AMOUNT_OUT_OF_RANGE\"\n | \"AMOUNT_NOT_WHOLE_TOKEN\"\n | \"INVALID_CONTRACT\"\n | \"UNBALANCED_TRANSACTION\"\n | \"DUPLICATE_IDENTIFIER\"\n | \"DUPLICATE_TRANSACTION\"\n | \"INSUFFICIENT_BALANCE\"\n | \"INSUFFICIENT_ELIGIBLE_LOTS\"\n | \"SOURCE_LOT_RESTRICTED\"\n | \"REVERSAL_ALREADY_EXISTS\"\n | \"NEGATIVE_PROJECTION\"\n | \"INVALID_TIME_WINDOW\"\n | \"ADJUSTMENT_SELF_APPROVAL\"\n | \"ADJUSTMENT_EXPIRED\"\n | \"ADJUSTMENT_PREVIEW_MISMATCH\"\n | \"ADJUSTMENT_NOT_APPROVED\";\n\nexport interface EconomyErrorEnvelopeV1 {\n readonly schemaVersion: \"1\";\n readonly error: {\n readonly code: EconomyErrorCode;\n readonly message: string;\n readonly requestId?: string;\n };\n}\n\n/**\n * Domain error with a stable code and deliberately non-sensitive message.\n * Provider evidence, identities, and payment details must not be included.\n */\nexport class EconomyError extends Error {\n readonly code: EconomyErrorCode;\n\n constructor(code: EconomyErrorCode, message: string) {\n super(message);\n this.name = \"EconomyError\";\n this.code = code;\n }\n}\n\n/** Throws a stable economy error when a domain assertion fails. */\nexport function economyAssert(\n condition: unknown,\n code: EconomyErrorCode,\n message: string,\n): asserts condition {\n if (!condition) {\n throw new EconomyError(code, message);\n }\n}\n\n/** Creates a bounded, non-sensitive error contract for an HTTP adapter. */\nexport function toEconomyErrorEnvelope(\n error: EconomyError,\n requestId?: string,\n): EconomyErrorEnvelopeV1 {\n return {\n schemaVersion: \"1\",\n error: {\n code: error.code,\n message: error.message.slice(0, 256),\n ...(requestId === undefined ? {} : { requestId }),\n },\n };\n}\n","import { EconomyError, economyAssert } from \"./errors.js\";\n\n/** Number of indivisible subunits in one public Token. */\nexport const TOKEN_SUBUNITS_PER_TOKEN = 1_000n;\n\n/** PostgreSQL-compatible signed bigint bounds. */\nexport const TOKEN_SUBUNITS_MIN = -(2n ** 63n);\nexport const TOKEN_SUBUNITS_MAX = 2n ** 63n - 1n;\n\ndeclare const tokenSubunitStringBrand: unique symbol;\n\n/** Canonical base-10 representation used at JSON and persistence boundaries. */\nexport type TokenSubunitString = string & {\n readonly [tokenSubunitStringBrand]: \"TokenSubunitString\";\n};\n\nconst CANONICAL_INTEGER = /^(?:0|-?[1-9][0-9]*)$/u;\n\nfunction assertInRange(amount: bigint): void {\n economyAssert(\n amount >= TOKEN_SUBUNITS_MIN && amount <= TOKEN_SUBUNITS_MAX,\n \"AMOUNT_OUT_OF_RANGE\",\n \"TokenSubunit amount is outside the signed 64-bit range\",\n );\n}\n\n/** Parses a canonical base-10 TokenSubunit string without floating point. */\nexport function parseTokenSubunits(value: string): bigint {\n economyAssert(\n typeof value === \"string\" && CANONICAL_INTEGER.test(value),\n \"INVALID_AMOUNT\",\n \"TokenSubunit amount must be a canonical base-10 integer string\",\n );\n\n try {\n const amount = BigInt(value);\n assertInRange(amount);\n return amount;\n } catch (error) {\n if (error instanceof EconomyError) {\n throw error;\n }\n throw new EconomyError(\"INVALID_AMOUNT\", \"TokenSubunit amount is invalid\");\n }\n}\n\n/** Serializes a signed 64-bit TokenSubunit amount to canonical base-10. */\nexport function serializeTokenSubunits(amount: bigint): TokenSubunitString {\n assertInRange(amount);\n return amount.toString(10) as TokenSubunitString;\n}\n\n/** Converts an exact whole-Token integer into TokenSubunits. */\nexport function wholeTokensToSubunits(tokens: bigint): bigint {\n const amount = tokens * TOKEN_SUBUNITS_PER_TOKEN;\n assertInRange(amount);\n return amount;\n}\n\n/** Returns true when a subunit amount represents an exact whole Token. */\nexport function isWholeTokenAmount(amount: bigint): boolean {\n return amount % TOKEN_SUBUNITS_PER_TOKEN === 0n;\n}\n\n/** Converts TokenSubunits to whole Tokens, rejecting fractional progress. */\nexport function subunitsToWholeTokens(amount: bigint): bigint {\n economyAssert(\n isWholeTokenAmount(amount),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Amount must contain whole Tokens\",\n );\n return amount / TOKEN_SUBUNITS_PER_TOKEN;\n}\n\n/** Sums amount strings with signed 64-bit overflow protection. */\nexport function sumTokenSubunits(values: readonly string[]): bigint {\n let total = 0n;\n for (const value of values) {\n total += parseTokenSubunits(value);\n assertInRange(total);\n }\n return total;\n}\n","/**\n * Compares strings using locale-independent ECMAScript UTF-16 code-unit order.\n *\n * Canonical transaction identifiers and metadata keys use a validated ASCII\n * alphabet, so this ordering is byte-for-byte equivalent to PostgreSQL\n * `COLLATE \"C\"` for those fields.\n */\nexport function compareUnicodeCodeUnits(left: string, right: string): number {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n}\n","import { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport const ECONOMY_CONTRACT_VERSION = \"1\" as const;\nexport type EconomyContractVersion = typeof ECONOMY_CONTRACT_VERSION;\n\nexport type AccountId = string;\nexport type AllocationId = string;\nexport type HouseholdId = string;\nexport type LearningEntitlementId = string;\nexport type LearningModuleVersionId = string;\nexport type LotId = string;\nexport type ModuleAllowanceId = string;\nexport type ModuleSpendHoldId = string;\nexport type ModuleSpendQuoteId = string;\nexport type PostingId = string;\nexport type ProviderEventId = string;\nexport type TransactionId = string;\nexport type WalletId = string;\nexport type IsoTimestamp = string;\n\nconst IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;\n\n/** Validates opaque pseudonymous domain identifiers. */\nexport function assertEconomyIdentifier(\n value: string,\n label = \"identifier\",\n): void {\n economyAssert(\n typeof value === \"string\" && IDENTIFIER.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a non-empty opaque identifier`,\n );\n}\n\n/** Parses a bounded ISO timestamp and returns milliseconds since epoch. */\nexport function parseIsoTimestamp(value: IsoTimestamp): number {\n economyAssert(\n typeof value === \"string\",\n \"INVALID_CONTRACT\",\n \"Timestamp must be an ISO-8601 UTC value\",\n );\n const match = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{3}))?Z$/u.exec(\n value,\n );\n economyAssert(\n match !== null,\n \"INVALID_CONTRACT\",\n \"Timestamp must be an ISO-8601 UTC value\",\n );\n const milliseconds = Date.parse(value);\n const base = match[1];\n const fraction = match[2] ?? \"000\";\n economyAssert(\n Number.isFinite(milliseconds) &&\n base !== undefined &&\n new Date(milliseconds).toISOString() === `${base}.${fraction}Z`,\n \"INVALID_CONTRACT\",\n \"Timestamp must be valid\",\n );\n return milliseconds;\n}\n\n/** Returns a new record with keys sorted by locale-independent code units. */\nexport function sortStringRecord(\n value: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> {\n return Object.fromEntries(\n Object.entries(value).sort(([left], [right]) =>\n compareUnicodeCodeUnits(left, right),\n ),\n );\n}\n","import {\n TOKEN_SUBUNITS_PER_TOKEN,\n isWholeTokenAmount,\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type ProviderEventId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { ActivityStatus, ActivityType } from \"./ledger.js\";\n\nexport interface TokenPackV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly packId: string;\n readonly catalogVersion: string;\n readonly currency: \"GBP\";\n readonly priceMinorUnits: string;\n readonly grantAmount: TokenSubunitString;\n readonly active: boolean;\n}\n\n/** Product-copy reference only; it is not a redemption or exchange promise. */\nexport interface TokenReferenceRateV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly rateVersion: string;\n readonly currency: \"GBP\";\n readonly referenceMinorUnitsPerToken: string;\n readonly tokenSubunitsPerToken: string;\n readonly cashRedemptionAllowed: false;\n}\n\nexport const BASELINE_GBP_REFERENCE_RATE: TokenReferenceRateV1 = Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n rateVersion: \"gbp-reference-v1\",\n currency: \"GBP\",\n referenceMinorUnitsPerToken: \"10\",\n tokenSubunitsPerToken: TOKEN_SUBUNITS_PER_TOKEN.toString(10),\n cashRedemptionAllowed: false,\n});\n\nexport const BASELINE_GBP_CATALOG_VERSION = \"gbp-v1\" as const;\n\n/** Initial flat-price public catalog. Changes require a new catalog version. */\nexport const BASELINE_GBP_TOKEN_PACKS: readonly TokenPackV1[] = Object.freeze([\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n packId: \"gbp_5_50_v1\",\n catalogVersion: BASELINE_GBP_CATALOG_VERSION,\n currency: \"GBP\",\n priceMinorUnits: \"500\",\n grantAmount: serializeTokenSubunits(50_000n),\n active: true,\n }),\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n packId: \"gbp_10_100_v1\",\n catalogVersion: BASELINE_GBP_CATALOG_VERSION,\n currency: \"GBP\",\n priceMinorUnits: \"1000\",\n grantAmount: serializeTokenSubunits(100_000n),\n active: true,\n }),\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n packId: \"gbp_25_250_v1\",\n catalogVersion: BASELINE_GBP_CATALOG_VERSION,\n currency: \"GBP\",\n priceMinorUnits: \"2500\",\n grantAmount: serializeTokenSubunits(250_000n),\n active: true,\n }),\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n packId: \"gbp_50_500_v1\",\n catalogVersion: BASELINE_GBP_CATALOG_VERSION,\n currency: \"GBP\",\n priceMinorUnits: \"5000\",\n grantAmount: serializeTokenSubunits(500_000n),\n active: true,\n }),\n]);\n\nexport interface PurchaseLimitPolicyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly maxOrderPriceMinorUnits: string;\n readonly rollingPayerPriceMinorUnits: string;\n readonly rollingHouseholdPriceMinorUnits: string;\n readonly rollingDays: number;\n}\n\n/** Default server limits; household controls may only lower these values. */\nexport const BASELINE_PURCHASE_LIMIT_POLICY: PurchaseLimitPolicyV1 =\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n maxOrderPriceMinorUnits: \"5000\",\n rollingPayerPriceMinorUnits: \"10000\",\n rollingHouseholdPriceMinorUnits: \"10000\",\n rollingDays: 30,\n });\n\nexport type PurchaseIntentStatus =\n | \"created\"\n | \"checkout-created\"\n | \"paid-unreconciled\"\n | \"credited\"\n | \"expired\"\n | \"cancelled\"\n | \"disputed\";\n\n/** Short-lived server authority binding checkout facts to a payer/household. */\nexport interface PurchaseIntentV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly intentId: string;\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly receivingWalletId: WalletId;\n readonly packId: string;\n readonly catalogVersion: string;\n readonly expectedCurrency: \"GBP\";\n readonly expectedPriceMinorUnits: string;\n readonly grantAmount: TokenSubunitString;\n readonly status: PurchaseIntentStatus;\n readonly createdAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n readonly providerCheckoutReferenceHash?: string;\n}\n\nexport interface RewardRateV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly rateVersion: string;\n readonly provider: \"ayet\" | \"bitlabs\";\n /** TokenSubunits granted per denominator of authoritative GBP minor units. */\n readonly tokenSubunitsNumerator: string;\n readonly gbpMinorUnitsDenominator: string;\n readonly effectiveFrom: IsoTimestamp;\n readonly effectiveUntil?: IsoTimestamp;\n}\n\nexport interface FxSnapshotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly snapshotId: string;\n readonly sourceCurrency: string;\n readonly quoteCurrency: \"GBP\";\n /** Exact rational conversion to GBP minor units. */\n readonly gbpMinorUnitsNumerator: string;\n readonly sourceMinorUnitsDenominator: string;\n readonly capturedAt: IsoTimestamp;\n}\n\nexport type RewardConversionStatus =\n | \"pending\"\n | \"completed\"\n | \"reconciled\";\n\nexport type BitLabsConversionState =\n | \"PENDING\"\n | \"COMPLETED\"\n | \"RECONCILED\";\n\nexport interface RewardActivityTransitionV1 {\n readonly conversionStatus: RewardConversionStatus;\n readonly activityType: ActivityType;\n readonly activityStatus: ActivityStatus;\n}\n\nexport interface RewardConversionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly provider: \"ayet\" | \"bitlabs\";\n readonly providerEventId: ProviderEventId;\n readonly beneficiaryAccountId: AccountId;\n readonly walletId: WalletId;\n readonly status: RewardConversionStatus;\n readonly providerPayoutMinorUnits: string;\n readonly providerCurrency: string;\n readonly gbpMinorUnits: string;\n readonly tokenSubunits: TokenSubunitString;\n readonly rateVersion: string;\n readonly fxSnapshotId: string;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Validates a minimized, signed-provider conversion record before journaling. */\nexport function assertRewardConversion(\n conversion: RewardConversionV1,\n): void {\n economyAssert(\n conversion.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported reward-conversion contract version\",\n );\n economyAssert(\n conversion.provider === \"ayet\" || conversion.provider === \"bitlabs\",\n \"INVALID_CONTRACT\",\n \"Unsupported reward-conversion provider\",\n );\n assertEconomyIdentifier(conversion.providerEventId, \"providerEventId\");\n assertEconomyIdentifier(\n conversion.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n assertEconomyIdentifier(conversion.walletId, \"walletId\");\n economyAssert(\n [\"pending\", \"completed\", \"reconciled\"].includes(conversion.status),\n \"INVALID_CONTRACT\",\n \"Unsupported reward-conversion status\",\n );\n economyAssert(\n /^[A-Z]{3}$/u.test(conversion.providerCurrency),\n \"INVALID_CONTRACT\",\n \"Reward payout currency must use an uppercase ISO code\",\n );\n economyAssert(\n parseNonNegativeInteger(\n conversion.providerPayoutMinorUnits,\n \"Provider payout\",\n ) > 0n &&\n parseNonNegativeInteger(conversion.gbpMinorUnits, \"GBP payout\") >= 0n &&\n parseTokenSubunits(conversion.tokenSubunits) > 0n,\n \"INVALID_AMOUNT\",\n \"Reward conversion must carry positive payout and Token values\",\n );\n assertEconomyIdentifier(conversion.rateVersion, \"rateVersion\");\n assertEconomyIdentifier(conversion.fxSnapshotId, \"fxSnapshotId\");\n parseIsoTimestamp(conversion.occurredAt);\n}\n\nfunction parseNonNegativeInteger(value: string, label: string): bigint {\n economyAssert(\n /^(?:0|[1-9][0-9]*)$/u.test(value),\n \"INVALID_AMOUNT\",\n `${label} must be a non-negative integer string`,\n );\n return BigInt(value);\n}\n\n/** Validates a paid pack; pack grants are whole Tokens in the baseline. */\nexport function assertTokenPack(pack: TokenPackV1): void {\n economyAssert(\n pack.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported Token pack contract version\",\n );\n assertEconomyIdentifier(pack.packId, \"packId\");\n assertEconomyIdentifier(pack.catalogVersion, \"catalogVersion\");\n economyAssert(\n pack.currency === \"GBP\" && typeof pack.active === \"boolean\",\n \"INVALID_CONTRACT\",\n \"Token packs must use GBP and declare whether they are active\",\n );\n economyAssert(\n parseNonNegativeInteger(pack.priceMinorUnits, \"Pack price\") > 0n,\n \"INVALID_AMOUNT\",\n \"Pack price must be positive\",\n );\n const grant = parseTokenSubunits(pack.grantAmount);\n economyAssert(\n grant > 0n && isWholeTokenAmount(grant),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Paid pack grants must contain whole Tokens\",\n );\n}\n\n/** Validates nominal reference metadata without creating redemption rights. */\nexport function assertTokenReferenceRate(\n rate: TokenReferenceRateV1,\n): void {\n economyAssert(\n rate.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported Token reference-rate contract version\",\n );\n assertEconomyIdentifier(rate.rateVersion, \"rateVersion\");\n const referenceMinorUnits = parseNonNegativeInteger(\n rate.referenceMinorUnitsPerToken,\n \"Reference minor units per Token\",\n );\n const subunitsPerToken = parseNonNegativeInteger(\n rate.tokenSubunitsPerToken,\n \"TokenSubunits per Token\",\n );\n economyAssert(\n rate.currency === \"GBP\" &&\n referenceMinorUnits > 0n &&\n subunitsPerToken === TOKEN_SUBUNITS_PER_TOKEN &&\n rate.cashRedemptionAllowed === false,\n \"INVALID_CONTRACT\",\n \"Token reference rate must preserve the GBP nominal, subunit, and no-redemption boundary\",\n );\n}\n\n/** Proves that every pack in one catalog uses the same flat nominal ratio. */\nexport function assertFlatTokenCatalog(\n packs: readonly TokenPackV1[],\n referenceRate: TokenReferenceRateV1,\n): void {\n assertTokenReferenceRate(referenceRate);\n economyAssert(\n packs.length > 0,\n \"INVALID_CONTRACT\",\n \"Token catalog must contain at least one pack\",\n );\n const packIds = new Set<string>();\n const catalogVersion = packs[0]?.catalogVersion;\n const referenceMinorUnits = BigInt(\n referenceRate.referenceMinorUnitsPerToken,\n );\n const subunitsPerToken = BigInt(referenceRate.tokenSubunitsPerToken);\n for (const pack of packs) {\n assertTokenPack(pack);\n economyAssert(\n !packIds.has(pack.packId),\n \"DUPLICATE_IDENTIFIER\",\n \"Token catalog pack IDs must be unique\",\n );\n economyAssert(\n pack.catalogVersion === catalogVersion,\n \"INVALID_CONTRACT\",\n \"Token catalog packs must share one catalog version\",\n );\n packIds.add(pack.packId);\n const scaledReference =\n parseTokenSubunits(pack.grantAmount) * referenceMinorUnits;\n economyAssert(\n scaledReference % subunitsPerToken === 0n &&\n scaledReference / subunitsPerToken === BigInt(pack.priceMinorUnits),\n \"INVALID_CONTRACT\",\n \"Token catalog must use the declared flat nominal reference ratio\",\n );\n }\n}\n\n/** Validates server-side order and rolling acquisition ceilings. */\nexport function assertPurchaseLimitPolicy(\n policy: PurchaseLimitPolicyV1,\n): void {\n economyAssert(\n policy.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-limit contract version\",\n );\n const maxOrder = parseNonNegativeInteger(\n policy.maxOrderPriceMinorUnits,\n \"Maximum order\",\n );\n const payer = parseNonNegativeInteger(\n policy.rollingPayerPriceMinorUnits,\n \"Rolling payer limit\",\n );\n const household = parseNonNegativeInteger(\n policy.rollingHouseholdPriceMinorUnits,\n \"Rolling household limit\",\n );\n economyAssert(\n maxOrder > 0n && payer >= maxOrder && household >= maxOrder,\n \"INVALID_AMOUNT\",\n \"Rolling purchase limits must cover at least one maximum order\",\n );\n economyAssert(\n Number.isSafeInteger(policy.rollingDays) &&\n policy.rollingDays >= 1 &&\n policy.rollingDays <= 365,\n \"INVALID_CONTRACT\",\n \"Purchase-limit rolling window must be a bounded whole-day count\",\n );\n}\n\n/** Validates the immutable server-side facts bound into a purchase intent. */\nexport function assertPurchaseIntentBinding(\n intent: PurchaseIntentV1,\n pack: TokenPackV1,\n): void {\n assertTokenPack(pack);\n economyAssert(\n intent.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-intent contract version\",\n );\n assertEconomyIdentifier(intent.intentId, \"intentId\");\n assertEconomyIdentifier(intent.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(intent.receivingHouseholdId, \"receivingHouseholdId\");\n assertEconomyIdentifier(intent.receivingWalletId, \"receivingWalletId\");\n assertEconomyIdentifier(intent.packId, \"packId\");\n assertEconomyIdentifier(intent.catalogVersion, \"catalogVersion\");\n\n const createdAt = parseIsoTimestamp(intent.createdAt);\n const expiresAt = parseIsoTimestamp(intent.expiresAt);\n economyAssert(\n expiresAt > createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase intent expiry must follow its creation time\",\n );\n economyAssert(\n intent.expectedCurrency === \"GBP\" &&\n intent.packId === pack.packId &&\n intent.catalogVersion === pack.catalogVersion &&\n intent.expectedCurrency === pack.currency &&\n intent.expectedPriceMinorUnits === pack.priceMinorUnits &&\n intent.grantAmount === pack.grantAmount,\n \"INVALID_CONTRACT\",\n \"Purchase intent does not match its authoritative catalog pack\",\n );\n parseNonNegativeInteger(intent.expectedPriceMinorUnits, \"Expected price\");\n parseTokenSubunits(intent.grantAmount);\n economyAssert(\n [\n \"created\",\n \"checkout-created\",\n \"paid-unreconciled\",\n \"credited\",\n \"expired\",\n \"cancelled\",\n \"disputed\",\n ].includes(intent.status),\n \"INVALID_CONTRACT\",\n \"Purchase intent has an unsupported status\",\n );\n if (intent.providerCheckoutReferenceHash !== undefined) {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(intent.providerCheckoutReferenceHash),\n \"INVALID_CONTRACT\",\n \"Checkout references must be stored as sanitized SHA-256 hashes\",\n );\n }\n}\n\n/** Rejects stale, inactive, or already-consumed intents before checkout creation. */\nexport function assertOpenPurchaseIntent(\n intent: PurchaseIntentV1,\n pack: TokenPackV1,\n checkedAt: IsoTimestamp,\n): void {\n assertPurchaseIntentBinding(intent, pack);\n const checkedAtValue = parseIsoTimestamp(checkedAt);\n economyAssert(\n pack.active &&\n (intent.status === \"created\" || intent.status === \"checkout-created\") &&\n checkedAtValue >= parseIsoTimestamp(intent.createdAt) &&\n checkedAtValue < parseIsoTimestamp(intent.expiresAt),\n \"INVALID_TIME_WINDOW\",\n \"Purchase intent is inactive, expired, or not open for checkout\",\n );\n}\n\nexport function assertRewardRate(rate: RewardRateV1): void {\n economyAssert(\n rate.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported reward-rate contract version\",\n );\n assertEconomyIdentifier(rate.rateVersion, \"rateVersion\");\n economyAssert(\n rate.provider === \"ayet\" || rate.provider === \"bitlabs\",\n \"INVALID_CONTRACT\",\n \"Unsupported reward provider\",\n );\n const effectiveFrom = parseIsoTimestamp(rate.effectiveFrom);\n if (rate.effectiveUntil !== undefined) {\n economyAssert(\n parseIsoTimestamp(rate.effectiveUntil) > effectiveFrom,\n \"INVALID_TIME_WINDOW\",\n \"Reward-rate expiry must follow its effective time\",\n );\n }\n}\n\nexport function assertFxSnapshot(fx: FxSnapshotV1): void {\n economyAssert(\n fx.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported FX snapshot contract version\",\n );\n assertEconomyIdentifier(fx.snapshotId, \"snapshotId\");\n economyAssert(\n /^[A-Z]{3}$/u.test(fx.sourceCurrency) && fx.quoteCurrency === \"GBP\",\n \"INVALID_CONTRACT\",\n \"FX snapshots must convert an ISO currency into GBP\",\n );\n parseIsoTimestamp(fx.capturedAt);\n}\n\n/** Converts provider payout using exact rational FX and rate snapshots. */\nexport function convertRewardPayout(\n providerPayoutMinorUnits: string,\n rate: RewardRateV1,\n fx: FxSnapshotV1,\n): { readonly gbpMinorUnits: string; readonly tokenSubunits: TokenSubunitString } {\n assertRewardRate(rate);\n assertFxSnapshot(fx);\n const payout = parseNonNegativeInteger(\n providerPayoutMinorUnits,\n \"Provider payout\",\n );\n const fxNumerator = parseNonNegativeInteger(\n fx.gbpMinorUnitsNumerator,\n \"FX numerator\",\n );\n const fxDenominator = parseNonNegativeInteger(\n fx.sourceMinorUnitsDenominator,\n \"FX denominator\",\n );\n const tokenNumerator = parseNonNegativeInteger(\n rate.tokenSubunitsNumerator,\n \"Rate numerator\",\n );\n const tokenDenominator = parseNonNegativeInteger(\n rate.gbpMinorUnitsDenominator,\n \"Rate denominator\",\n );\n economyAssert(\n fxDenominator > 0n && tokenDenominator > 0n,\n \"INVALID_AMOUNT\",\n \"FX and reward-rate denominators must be positive\",\n );\n economyAssert(\n fxNumerator > 0n && tokenNumerator > 0n,\n \"INVALID_AMOUNT\",\n \"FX and reward-rate numerators must be positive\",\n );\n\n const gbpMinorUnits = (payout * fxNumerator) / fxDenominator;\n const tokenSubunits = (gbpMinorUnits * tokenNumerator) / tokenDenominator;\n return {\n gbpMinorUnits: gbpMinorUnits.toString(10),\n tokenSubunits: serializeTokenSubunits(tokenSubunits),\n };\n}\n\n/** Maps BitLabs' signed callback state into an immutable journal transition. */\nexport function mapBitLabsConversionState(\n state: string,\n): RewardActivityTransitionV1 {\n const transitions: Readonly<\n Record<BitLabsConversionState, RewardActivityTransitionV1>\n > = {\n PENDING: {\n conversionStatus: \"pending\",\n activityType: \"hold\",\n activityStatus: \"held\",\n },\n COMPLETED: {\n conversionStatus: \"completed\",\n activityType: \"offerwall\",\n activityStatus: \"settled\",\n },\n RECONCILED: {\n conversionStatus: \"reconciled\",\n activityType: \"reversal\",\n activityStatus: \"reversed\",\n },\n };\n const transition = transitions[state as BitLabsConversionState];\n economyAssert(\n transition !== undefined,\n \"INVALID_CONTRACT\",\n \"Unsupported BitLabs conversion state\",\n );\n return transition;\n}\n","import {\n parseTokenSubunits,\n TOKEN_SUBUNITS_MAX,\n TOKEN_SUBUNITS_MIN,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport const ADMIN_TOKEN_DEFAULT_WINDOW_DAYS = 30;\nexport const ADMIN_TOKEN_MAXIMUM_WINDOW_DAYS = 365;\nexport const ADMIN_TOKEN_MAXIMUM_HOURLY_WINDOW_DAYS = 31;\nexport const ADMIN_TOKEN_MAXIMUM_PAGE_SIZE = 100;\nexport const ADMIN_TOKEN_MAXIMUM_TREND_POINTS =\n ADMIN_TOKEN_MAXIMUM_HOURLY_WINDOW_DAYS * 24 * 5;\nexport const ADMIN_TOKEN_MINIMUM_COHORT_SIZE = 5;\nexport const ADMIN_TOKEN_ANOMALY_BASELINE_DAYS = 28;\n\nconst DAY_MILLISECONDS = 86_400_000;\nconst HOUR_MILLISECONDS = 3_600_000;\n\nexport type AdminTokenActivityTypeV1 =\n | \"acquisition\"\n | \"spend\"\n | \"reversal\"\n | \"hold\"\n | \"failure\";\n\nexport type AdminTokenActivityStatusV1 =\n | \"pending\"\n | \"held\"\n | \"settled\"\n | \"reversed\"\n | \"failed\";\n\n/**\n * Privacy-safe source groupings. Provider names and provider identifiers are\n * intentionally absent from this public reporting boundary.\n */\nexport type AdminTokenActivitySourceV1 =\n | \"paid-purchase\"\n | \"subscription\"\n | \"rewarded-activity\"\n | \"gameplay\"\n | \"system-adjustment\"\n | \"unknown\";\n\nexport type AdminTokenActivitySortV1 =\n | \"occurred-at-desc\"\n | \"amount-absolute-desc\";\n\n/**\n * Closed, non-identifying label codes. Presentation layers map these codes to\n * localized text instead of forwarding source metadata into a response.\n */\nexport type AdminTokenSafeLabelV1 =\n | \"token-acquisition\"\n | \"token-spend\"\n | \"token-reversal\"\n | \"token-hold\"\n | \"token-activity-failed\"\n | \"token-system-adjustment\"\n | \"token-activity-unclassified\";\n\nexport type AdminTokenPseudonymAudienceV1 =\n | \"admin-token-activity\"\n | \"mcp-token-activity\";\n\nexport type AdminTokenBalancePseudonymAudienceV1 =\n | \"admin-token-balances\"\n | \"mcp-token-balances\";\n\nexport interface AdminTokenReportingWindowV1 {\n readonly fromInclusive: IsoTimestamp;\n readonly toExclusive: IsoTimestamp;\n}\n\n/**\n * One deliberately narrow reporting row. Aliases are generated by a\n * consuming service using its approved audience-separated pseudonym adapter.\n * `safeLabel` is a closed code that presentation maps to text; it is never\n * copied from ledger metadata.\n */\nexport interface AdminTokenActivityEntryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly occurredAt: IsoTimestamp;\n readonly activityType: AdminTokenActivityTypeV1;\n readonly status: AdminTokenActivityStatusV1;\n readonly source: AdminTokenActivitySourceV1;\n readonly amount: TokenSubunitString;\n readonly safeLabel: AdminTokenSafeLabelV1;\n readonly rowAlias: string;\n readonly subjectAlias: string;\n}\n\nexport interface AdminTokenActivityFilterV1 {\n readonly activityTypes?: readonly AdminTokenActivityTypeV1[];\n readonly statuses?: readonly AdminTokenActivityStatusV1[];\n readonly sources?: readonly AdminTokenActivitySourceV1[];\n readonly subjectAlias?: string;\n}\n\n/**\n * Trusted, server-decoded scope carried inside a signed opaque cursor. A host\n * must authenticate the opaque cursor before constructing this binding.\n */\nexport interface AdminTokenActivityCursorBindingV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly sort: AdminTokenActivitySortV1;\n readonly window: AdminTokenReportingWindowV1;\n readonly filter?: AdminTokenActivityFilterV1;\n readonly audience: AdminTokenPseudonymAudienceV1;\n readonly pseudonymVersion: string;\n}\n\nexport interface AdminTokenActivityPageRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly limit: number;\n readonly cursor?: string;\n /**\n * Required exactly when `cursor` is present. This is produced only after the\n * host authenticates and decodes the opaque cursor.\n */\n readonly cursorBinding?: AdminTokenActivityCursorBindingV1;\n readonly sort: AdminTokenActivitySortV1;\n readonly window: AdminTokenReportingWindowV1;\n readonly filter?: AdminTokenActivityFilterV1;\n /** Fixed by the authenticated host endpoint, never selected by a client. */\n readonly audience: AdminTokenPseudonymAudienceV1;\n /** Fixed by the host's active pseudonym key/version policy. */\n readonly pseudonymVersion: string;\n}\n\nexport interface AdminTokenActivityResultMetadataV1\n extends AdminTokenReportingWindowV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly generatedAt: IsoTimestamp;\n readonly sort: AdminTokenActivitySortV1;\n readonly filter?: AdminTokenActivityFilterV1;\n readonly pageLimit: number;\n readonly audience: AdminTokenPseudonymAudienceV1;\n readonly pseudonymVersion: string;\n /** This literal is a machine-testable non-disclosure assertion. */\n readonly rawIdentifiersIncluded: false;\n}\n\nexport interface AdminTokenActivityPageV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly entries: readonly AdminTokenActivityEntryV1[];\n readonly hasMore: boolean;\n readonly nextCursor?: string;\n readonly metadata: AdminTokenActivityResultMetadataV1;\n}\n\nexport interface AdminTokenAggregateBalancesV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly available: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly rewardProgress: TokenSubunitString;\n}\n\nexport interface AdminTokenAggregateLifetimeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly bought: TokenSubunitString;\n readonly earned: TokenSubunitString;\n readonly allocated: TokenSubunitString;\n readonly reclaimed: TokenSubunitString;\n readonly spent: TokenSubunitString;\n readonly reversed: TokenSubunitString;\n}\n\n/** Point-read global projection. It contains no account or wallet identity. */\nexport interface AdminTokenEconomySummaryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly generatedAt: IsoTimestamp;\n readonly projectionAsOf: IsoTimestamp;\n readonly authoritySequence: string;\n readonly walletCount: number;\n readonly activeWalletCount: number;\n readonly balances: AdminTokenAggregateBalancesV1;\n readonly lifetime: AdminTokenAggregateLifetimeV1;\n readonly rawIdentifiersIncluded: false;\n}\n\nexport type AdminTokenWalletComponentV1 =\n | \"household\"\n | \"personal\"\n | \"gameplay-allocation\";\n\nexport type AdminTokenWalletStatusV1 = \"active\" | \"closed\";\n\nexport type AdminTokenWalletBalanceSortV1 =\n | \"available-desc\"\n | \"updated-at-desc\";\n\nexport interface AdminTokenWalletBalanceEntryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletAlias: string;\n readonly subjectAlias: string;\n readonly component: AdminTokenWalletComponentV1;\n readonly status: AdminTokenWalletStatusV1;\n readonly available: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly rewardProgress: TokenSubunitString;\n readonly updatedAt: IsoTimestamp;\n readonly authoritySequence: string;\n}\n\nexport interface AdminTokenWalletBalanceFilterV1 {\n readonly components?: readonly AdminTokenWalletComponentV1[];\n readonly statuses?: readonly AdminTokenWalletStatusV1[];\n readonly subjectAlias?: string;\n}\n\nexport interface AdminTokenWalletBalanceCursorBindingV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly sort: AdminTokenWalletBalanceSortV1;\n readonly filter?: AdminTokenWalletBalanceFilterV1;\n readonly audience: AdminTokenBalancePseudonymAudienceV1;\n readonly pseudonymVersion: string;\n}\n\nexport interface AdminTokenWalletBalancePageRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly limit: number;\n readonly cursor?: string;\n /** Trusted binding produced only after the host verifies the opaque cursor. */\n readonly cursorBinding?: AdminTokenWalletBalanceCursorBindingV1;\n readonly sort: AdminTokenWalletBalanceSortV1;\n readonly filter?: AdminTokenWalletBalanceFilterV1;\n readonly audience: AdminTokenBalancePseudonymAudienceV1;\n readonly pseudonymVersion: string;\n}\n\nexport interface AdminTokenWalletBalanceResultMetadataV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly generatedAt: IsoTimestamp;\n readonly sort: AdminTokenWalletBalanceSortV1;\n readonly filter?: AdminTokenWalletBalanceFilterV1;\n readonly pageLimit: number;\n readonly audience: AdminTokenBalancePseudonymAudienceV1;\n readonly pseudonymVersion: string;\n readonly rawIdentifiersIncluded: false;\n}\n\nexport interface AdminTokenWalletBalancePageV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly entries: readonly AdminTokenWalletBalanceEntryV1[];\n readonly hasMore: boolean;\n readonly nextCursor?: string;\n readonly metadata: AdminTokenWalletBalanceResultMetadataV1;\n}\n\nexport type AdminTokenTrendGranularityV1 = \"hour\" | \"day\";\n\nexport interface AdminTokenTrendRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly window: AdminTokenReportingWindowV1;\n readonly granularity: AdminTokenTrendGranularityV1;\n readonly activityTypes?: readonly AdminTokenActivityTypeV1[];\n}\n\nexport interface SuppressedAdminTokenTrendAggregateV1 {\n readonly visibility: \"suppressed\";\n readonly reason: \"cohort-below-minimum\";\n readonly threshold: typeof ADMIN_TOKEN_MINIMUM_COHORT_SIZE;\n}\n\nexport interface ReportedAdminTokenTrendAggregateV1 {\n readonly visibility: \"reported\";\n readonly distinctSubjects: number;\n readonly activityCount: number;\n readonly signedAmount: TokenSubunitString;\n}\n\nexport type AdminTokenTrendAggregateV1 =\n | SuppressedAdminTokenTrendAggregateV1\n | ReportedAdminTokenTrendAggregateV1;\n\nexport type AdminTokenAnomalyStatusV1 = \"normal\" | \"irregular-spike\";\n\nexport type AdminTokenAnomalyExplanationCodeV1 =\n | \"below-absolute-minimum\"\n | \"within-baseline-variation\"\n | \"zero-mad-absolute-threshold-exceeded\"\n | \"median-mad-and-absolute-threshold-exceeded\";\n\nexport interface AdminTokenExactStatisticV1 {\n /** Canonical signed integer numerator. */\n readonly numerator: string;\n /** Reduced exact denominator; half-subunits cover both median operations. */\n readonly denominator: 1 | 2;\n}\n\nexport interface AdminTokenAnomalyIndicatorV1 {\n readonly method: \"same-window-median-mad-v1\";\n readonly status: AdminTokenAnomalyStatusV1;\n readonly baselineWindowCount: typeof ADMIN_TOKEN_ANOMALY_BASELINE_DAYS;\n readonly medianAmount: AdminTokenExactStatisticV1;\n readonly medianAbsoluteDeviation: AdminTokenExactStatisticV1;\n readonly minimumAbsoluteDelta: TokenSubunitString;\n readonly deviationFromMedian: AdminTokenExactStatisticV1;\n readonly madMultiplierMilli: number;\n readonly explanationCode: AdminTokenAnomalyExplanationCodeV1;\n}\n\nexport type AdminTokenAnomalyUnavailableReasonV1 =\n | \"insufficient-history\"\n | \"privacy-suppressed-baseline\";\n\nexport interface AdminTokenAnomalyUnavailableV1 {\n readonly method: \"same-window-median-mad-v1\";\n readonly status: \"unavailable\";\n readonly reason: AdminTokenAnomalyUnavailableReasonV1;\n readonly eligibleBaselineWindowCount: number;\n readonly requiredBaselineWindowCount:\n typeof ADMIN_TOKEN_ANOMALY_BASELINE_DAYS;\n}\n\nexport type AdminTokenAnomalyV1 =\n | AdminTokenAnomalyIndicatorV1\n | AdminTokenAnomalyUnavailableV1;\n\nexport interface AdminTokenAnomalyBaselineSampleV1 {\n readonly amount: TokenSubunitString;\n readonly distinctSubjects: number;\n}\n\nexport interface CreateAdminTokenAnomalyIndicatorInputV1 {\n readonly observedAmount: TokenSubunitString;\n /** Exactly 28 preceding, non-suppressed values for the same time window. */\n readonly baselineSamples: readonly AdminTokenAnomalyBaselineSampleV1[];\n readonly minimumAbsoluteDelta: TokenSubunitString;\n /** Fixed-point multiplier where 1,000 represents one MAD. */\n readonly madMultiplierMilli: number;\n}\n\nexport interface CreateAdminTokenAnomalyUnavailableInputV1 {\n readonly reason: AdminTokenAnomalyUnavailableReasonV1;\n readonly eligibleBaselineWindowCount: number;\n}\n\ninterface AdminTokenTrendPointBaseV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly bucketStart: IsoTimestamp;\n readonly bucketEnd: IsoTimestamp;\n readonly activityType: AdminTokenActivityTypeV1;\n}\n\nexport interface SuppressedAdminTokenTrendPointV1\n extends AdminTokenTrendPointBaseV1 {\n readonly aggregate: SuppressedAdminTokenTrendAggregateV1;\n readonly anomaly?: never;\n}\n\nexport interface ReportedAdminTokenTrendPointV1\n extends AdminTokenTrendPointBaseV1 {\n readonly aggregate: ReportedAdminTokenTrendAggregateV1;\n readonly anomaly: AdminTokenAnomalyV1;\n}\n\nexport type AdminTokenTrendPointV1 =\n | SuppressedAdminTokenTrendPointV1\n | ReportedAdminTokenTrendPointV1;\n\nexport interface AdminTokenTrendResultMetadataV1\n extends AdminTokenReportingWindowV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly generatedAt: IsoTimestamp;\n readonly granularity: AdminTokenTrendGranularityV1;\n /** Explicit server-normalized activity types represented by this result. */\n readonly activityTypes: readonly AdminTokenActivityTypeV1[];\n readonly minimumCohortSize: typeof ADMIN_TOKEN_MINIMUM_COHORT_SIZE;\n readonly anomalyBaselineDays: typeof ADMIN_TOKEN_ANOMALY_BASELINE_DAYS;\n /** This literal is a machine-testable non-disclosure assertion. */\n readonly rawIdentifiersIncluded: false;\n}\n\nexport interface AdminTokenTrendResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly series: readonly AdminTokenTrendPointV1[];\n readonly metadata: AdminTokenTrendResultMetadataV1;\n}\n\n/**\n * Provider-neutral read boundary. Authentication, authorization, HMAC aliases,\n * query timeouts, rate limits, and database access remain host responsibilities.\n */\nexport interface AdminEconomyReportingQueryPortV1 {\n getAdminTokenEconomySummary(): Promise<AdminTokenEconomySummaryV1>;\n listAdminTokenWalletBalances(\n request: AdminTokenWalletBalancePageRequestV1,\n ): Promise<AdminTokenWalletBalancePageV1>;\n listAdminTokenActivity(\n request: AdminTokenActivityPageRequestV1,\n ): Promise<AdminTokenActivityPageV1>;\n getAdminTokenTrends(\n request: AdminTokenTrendRequestV1,\n ): Promise<AdminTokenTrendResultV1>;\n}\n\nconst ACTIVITY_TYPES = new Set<AdminTokenActivityTypeV1>([\n \"acquisition\",\n \"spend\",\n \"reversal\",\n \"hold\",\n \"failure\",\n]);\nconst ACTIVITY_STATUSES = new Set<AdminTokenActivityStatusV1>([\n \"pending\",\n \"held\",\n \"settled\",\n \"reversed\",\n \"failed\",\n]);\nconst ACTIVITY_SOURCES = new Set<AdminTokenActivitySourceV1>([\n \"paid-purchase\",\n \"subscription\",\n \"rewarded-activity\",\n \"gameplay\",\n \"system-adjustment\",\n \"unknown\",\n]);\nconst SAFE_LABELS = new Set<AdminTokenSafeLabelV1>([\n \"token-acquisition\",\n \"token-spend\",\n \"token-reversal\",\n \"token-hold\",\n \"token-activity-failed\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n]);\nconst SAFE_LABELS_BY_ACTIVITY_TYPE: Readonly<\n Record<AdminTokenActivityTypeV1, ReadonlySet<AdminTokenSafeLabelV1>>\n> = {\n acquisition: new Set([\n \"token-acquisition\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n ]),\n spend: new Set([\n \"token-spend\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n ]),\n reversal: new Set([\n \"token-reversal\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n ]),\n hold: new Set([\n \"token-hold\",\n \"token-system-adjustment\",\n \"token-activity-unclassified\",\n ]),\n failure: new Set([\n \"token-activity-failed\",\n \"token-activity-unclassified\",\n ]),\n};\nconst ACTIVITY_SORTS = new Set<AdminTokenActivitySortV1>([\n \"occurred-at-desc\",\n \"amount-absolute-desc\",\n]);\nconst PSEUDONYM_AUDIENCES = new Set<AdminTokenPseudonymAudienceV1>([\n \"admin-token-activity\",\n \"mcp-token-activity\",\n]);\nconst BALANCE_PSEUDONYM_AUDIENCES =\n new Set<AdminTokenBalancePseudonymAudienceV1>([\n \"admin-token-balances\",\n \"mcp-token-balances\",\n ]);\nconst WALLET_COMPONENTS = new Set<AdminTokenWalletComponentV1>([\n \"household\",\n \"personal\",\n \"gameplay-allocation\",\n]);\nconst WALLET_STATUSES = new Set<AdminTokenWalletStatusV1>([\n \"active\",\n \"closed\",\n]);\nconst WALLET_BALANCE_SORTS = new Set<AdminTokenWalletBalanceSortV1>([\n \"available-desc\",\n \"updated-at-desc\",\n]);\nconst TREND_GRANULARITIES = new Set<AdminTokenTrendGranularityV1>([\n \"hour\",\n \"day\",\n]);\nconst ALIAS = /^[A-Za-z0-9_-]{16,96}$/u;\nconst OPAQUE_CURSOR = /^c1\\.[A-Za-z0-9_-]{32,480}$/u;\nconst PSEUDONYM_VERSION = /^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/u;\nconst EXACT_STATISTIC_INTEGER = /^(?:0|-?[1-9][0-9]*)$/u;\nconst POSITIVE_UNSIGNED_INTEGER = /^[1-9][0-9]*$/u;\nconst MAXIMUM_STATISTIC_HALF_SUBUNITS =\n (TOKEN_SUBUNITS_MAX - TOKEN_SUBUNITS_MIN) * 2n;\nconst ANOMALY_UNAVAILABLE_REASONS =\n new Set<AdminTokenAnomalyUnavailableReasonV1>([\n \"insufficient-history\",\n \"privacy-suppressed-baseline\",\n ]);\n\nfunction assertPlainObject(\n value: unknown,\n label: string,\n): asserts value is Readonly<Record<PropertyKey, unknown>> {\n economyAssert(\n typeof value === \"object\" && value !== null && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n const prototype = Object.getPrototypeOf(value);\n economyAssert(\n (prototype === Object.prototype || prototype === null)\n && !Reflect.has(value, \"toJSON\"),\n \"INVALID_CONTRACT\",\n `${label} must be a plain data object without serialization hooks`,\n );\n}\n\nfunction assertExactKeys(\n value: unknown,\n allowedKeys: readonly string[],\n label: string,\n): void {\n assertPlainObject(value, label);\n const allowed = new Set(allowedKeys);\n const keys = Reflect.ownKeys(value);\n economyAssert(\n allowedKeys.every(\n (key) => !Reflect.has(value, key) || Object.hasOwn(value, key),\n ) && keys.every((key) => {\n if (typeof key !== \"string\" || !allowed.has(key)) {\n return false;\n }\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor !== undefined\n && descriptor.enumerable\n && \"value\" in descriptor;\n }),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported, identifying, or non-data property`,\n );\n}\n\nfunction assertAlias(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && ALIAS.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be an opaque pseudonymous alias`,\n );\n}\n\nfunction assertOpaqueCursor(value: string): void {\n economyAssert(\n typeof value === \"string\" && OPAQUE_CURSOR.test(value),\n \"INVALID_CONTRACT\",\n \"Admin Token cursor must be a bounded confidentiality-protected opaque value\",\n );\n}\n\nfunction assertUniqueValues<T extends string>(\n values: readonly T[],\n allowed: ReadonlySet<T>,\n label: string,\n): void {\n economyAssert(\n Array.isArray(values),\n \"INVALID_CONTRACT\",\n `${label} must be a list`,\n );\n const unique = new Set(values);\n economyAssert(\n values.length > 0\n && values.length === unique.size\n && values.every((value) => allowed.has(value)),\n \"INVALID_CONTRACT\",\n `${label} must contain unique supported values`,\n );\n}\n\nfunction absolute(value: bigint): bigint {\n return value < 0n ? -value : value;\n}\n\nfunction compareTextDescending(left: string, right: string): number {\n if (left === right) {\n return 0;\n }\n return left > right ? -1 : 1;\n}\n\nfunction assertReportingWindow(\n window: AdminTokenReportingWindowV1,\n maximumDays = ADMIN_TOKEN_MAXIMUM_WINDOW_DAYS,\n): { readonly from: number; readonly to: number } {\n assertExactKeys(\n window,\n [\"fromInclusive\", \"toExclusive\"],\n \"Admin Token reporting window\",\n );\n const from = parseIsoTimestamp(window.fromInclusive);\n const to = parseIsoTimestamp(window.toExclusive);\n economyAssert(\n from < to && to - from <= maximumDays * DAY_MILLISECONDS,\n \"INVALID_TIME_WINDOW\",\n `Admin Token reporting window must be positive and no longer than ${maximumDays} days`,\n );\n return { from, to };\n}\n\n/** Constructs the deterministic 30-day interactive default ending at `asOf`. */\nexport function createDefaultAdminTokenReportingWindow(\n asOf: IsoTimestamp,\n): AdminTokenReportingWindowV1 {\n const to = parseIsoTimestamp(asOf);\n return {\n fromInclusive: new Date(\n to - ADMIN_TOKEN_DEFAULT_WINDOW_DAYS * DAY_MILLISECONDS,\n ).toISOString(),\n toExclusive: new Date(to).toISOString(),\n };\n}\n\nfunction assertNonNegativeTokenAmounts(\n amounts: readonly TokenSubunitString[],\n label: string,\n): void {\n economyAssert(\n amounts.every((amount) => parseTokenSubunits(amount) >= 0n),\n \"INVALID_AMOUNT\",\n `${label} cannot contain a negative amount`,\n );\n}\n\nfunction assertPositiveAuthoritySequence(\n sequence: string,\n label: string,\n): void {\n economyAssert(\n typeof sequence === \"string\"\n && POSITIVE_UNSIGNED_INTEGER.test(sequence),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical positive integer`,\n );\n}\n\n/** Validates a point-read global economy projection with exact totals. */\nexport function assertAdminTokenEconomySummary(\n summary: AdminTokenEconomySummaryV1,\n): void {\n assertExactKeys(\n summary,\n [\n \"schemaVersion\",\n \"generatedAt\",\n \"projectionAsOf\",\n \"authoritySequence\",\n \"walletCount\",\n \"activeWalletCount\",\n \"balances\",\n \"lifetime\",\n \"rawIdentifiersIncluded\",\n ],\n \"Admin Token economy summary\",\n );\n assertExactKeys(\n summary.balances,\n [\"schemaVersion\", \"available\", \"reserved\", \"held\", \"rewardProgress\"],\n \"Admin Token aggregate balances\",\n );\n assertExactKeys(\n summary.lifetime,\n [\n \"schemaVersion\",\n \"bought\",\n \"earned\",\n \"allocated\",\n \"reclaimed\",\n \"spent\",\n \"reversed\",\n ],\n \"Admin Token aggregate lifetime\",\n );\n economyAssert(\n summary.schemaVersion === ECONOMY_CONTRACT_VERSION\n && summary.balances.schemaVersion === ECONOMY_CONTRACT_VERSION\n && summary.lifetime.schemaVersion === ECONOMY_CONTRACT_VERSION\n && summary.rawIdentifiersIncluded === false\n && Number.isSafeInteger(summary.walletCount)\n && summary.walletCount >= 0\n && Number.isSafeInteger(summary.activeWalletCount)\n && summary.activeWalletCount >= 0\n && summary.activeWalletCount <= summary.walletCount,\n \"INVALID_CONTRACT\",\n \"Admin Token economy summary metadata is invalid\",\n );\n const generatedAt = parseIsoTimestamp(summary.generatedAt);\n const projectionAsOf = parseIsoTimestamp(summary.projectionAsOf);\n economyAssert(\n projectionAsOf <= generatedAt,\n \"INVALID_TIME_WINDOW\",\n \"Admin Token projection cannot be newer than its generated result\",\n );\n assertPositiveAuthoritySequence(\n summary.authoritySequence,\n \"Admin Token summary authority sequence\",\n );\n assertNonNegativeTokenAmounts(\n [\n summary.balances.available,\n summary.balances.reserved,\n summary.balances.held,\n summary.balances.rewardProgress,\n summary.lifetime.bought,\n summary.lifetime.earned,\n summary.lifetime.allocated,\n summary.lifetime.reclaimed,\n summary.lifetime.spent,\n summary.lifetime.reversed,\n ],\n \"Admin Token economy summary\",\n );\n}\n\nfunction assertAdminTokenWalletBalanceFilter(\n filter: AdminTokenWalletBalanceFilterV1,\n): void {\n assertExactKeys(\n filter,\n [\"components\", \"statuses\", \"subjectAlias\"],\n \"Admin Token wallet balance filter\",\n );\n if (filter.components !== undefined) {\n assertUniqueValues(\n filter.components,\n WALLET_COMPONENTS,\n \"Admin Token wallet components\",\n );\n }\n if (filter.statuses !== undefined) {\n assertUniqueValues(\n filter.statuses,\n WALLET_STATUSES,\n \"Admin Token wallet statuses\",\n );\n }\n if (filter.subjectAlias !== undefined) {\n assertAlias(filter.subjectAlias, \"Wallet subject alias filter\");\n }\n}\n\nfunction sameWalletBalanceFilter(\n left: AdminTokenWalletBalanceFilterV1 | undefined,\n right: AdminTokenWalletBalanceFilterV1 | undefined,\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right;\n }\n return sameOptionalValues(left.components, right.components)\n && sameOptionalValues(left.statuses, right.statuses)\n && left.subjectAlias === right.subjectAlias;\n}\n\nexport function assertAdminTokenWalletBalanceCursorBinding(\n binding: AdminTokenWalletBalanceCursorBindingV1,\n): void {\n assertExactKeys(\n binding,\n [\n \"schemaVersion\",\n \"sort\",\n \"filter\",\n \"audience\",\n \"pseudonymVersion\",\n ],\n \"Admin Token wallet balance cursor binding\",\n );\n economyAssert(\n binding.schemaVersion === ECONOMY_CONTRACT_VERSION\n && WALLET_BALANCE_SORTS.has(binding.sort)\n && BALANCE_PSEUDONYM_AUDIENCES.has(binding.audience)\n && PSEUDONYM_VERSION.test(binding.pseudonymVersion),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token wallet balance cursor binding\",\n );\n if (binding.filter !== undefined) {\n assertAdminTokenWalletBalanceFilter(binding.filter);\n }\n}\n\nexport function assertAdminTokenWalletBalancePageRequest(\n request: AdminTokenWalletBalancePageRequestV1,\n): void {\n assertExactKeys(\n request,\n [\n \"schemaVersion\",\n \"limit\",\n \"cursor\",\n \"cursorBinding\",\n \"sort\",\n \"filter\",\n \"audience\",\n \"pseudonymVersion\",\n ],\n \"Admin Token wallet balance request\",\n );\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION\n && Number.isSafeInteger(request.limit)\n && request.limit >= 1\n && request.limit <= ADMIN_TOKEN_MAXIMUM_PAGE_SIZE\n && WALLET_BALANCE_SORTS.has(request.sort)\n && BALANCE_PSEUDONYM_AUDIENCES.has(request.audience)\n && PSEUDONYM_VERSION.test(request.pseudonymVersion),\n \"INVALID_CONTRACT\",\n \"Unsupported or unbounded Admin Token wallet balance request\",\n );\n if (request.filter !== undefined) {\n assertAdminTokenWalletBalanceFilter(request.filter);\n }\n economyAssert(\n (request.cursor === undefined) === (request.cursorBinding === undefined),\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance cursor and binding must be provided together\",\n );\n if (request.cursor === undefined || request.cursorBinding === undefined) {\n return;\n }\n assertOpaqueCursor(request.cursor);\n assertAdminTokenWalletBalanceCursorBinding(request.cursorBinding);\n economyAssert(\n request.cursorBinding.sort === request.sort\n && request.cursorBinding.audience === request.audience\n && request.cursorBinding.pseudonymVersion === request.pseudonymVersion\n && sameWalletBalanceFilter(request.cursorBinding.filter, request.filter),\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance cursor is not bound to the normalized query\",\n );\n}\n\nfunction assertAdminTokenWalletBalanceEntry(\n entry: AdminTokenWalletBalanceEntryV1,\n): void {\n assertExactKeys(\n entry,\n [\n \"schemaVersion\",\n \"walletAlias\",\n \"subjectAlias\",\n \"component\",\n \"status\",\n \"available\",\n \"reserved\",\n \"held\",\n \"rewardProgress\",\n \"updatedAt\",\n \"authoritySequence\",\n ],\n \"Admin Token wallet balance entry\",\n );\n economyAssert(\n entry.schemaVersion === ECONOMY_CONTRACT_VERSION\n && WALLET_COMPONENTS.has(entry.component)\n && WALLET_STATUSES.has(entry.status),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token wallet balance entry\",\n );\n assertAlias(entry.walletAlias, \"Wallet alias\");\n assertAlias(entry.subjectAlias, \"Wallet subject alias\");\n economyAssert(\n entry.walletAlias !== entry.subjectAlias,\n \"INVALID_CONTRACT\",\n \"Wallet and subject aliases must use separate pseudonym domains\",\n );\n assertNonNegativeTokenAmounts(\n [entry.available, entry.reserved, entry.held, entry.rewardProgress],\n \"Admin Token wallet balance entry\",\n );\n parseIsoTimestamp(entry.updatedAt);\n assertPositiveAuthoritySequence(\n entry.authoritySequence,\n \"Admin Token wallet balance authority sequence\",\n );\n}\n\nfunction compareWalletBalanceEntries(\n left: AdminTokenWalletBalanceEntryV1,\n right: AdminTokenWalletBalanceEntryV1,\n sort: AdminTokenWalletBalanceSortV1,\n): number {\n if (sort === \"available-desc\") {\n const leftAvailable = parseTokenSubunits(left.available);\n const rightAvailable = parseTokenSubunits(right.available);\n if (leftAvailable !== rightAvailable) {\n return leftAvailable > rightAvailable ? -1 : 1;\n }\n }\n const leftUpdatedAt = parseIsoTimestamp(left.updatedAt);\n const rightUpdatedAt = parseIsoTimestamp(right.updatedAt);\n if (leftUpdatedAt !== rightUpdatedAt) {\n return leftUpdatedAt > rightUpdatedAt ? -1 : 1;\n }\n return compareTextDescending(left.walletAlias, right.walletAlias);\n}\n\nexport function assertAdminTokenWalletBalancePage(\n page: AdminTokenWalletBalancePageV1,\n): void {\n assertExactKeys(\n page,\n [\"schemaVersion\", \"entries\", \"hasMore\", \"nextCursor\", \"metadata\"],\n \"Admin Token wallet balance page\",\n );\n assertExactKeys(\n page.metadata,\n [\n \"schemaVersion\",\n \"generatedAt\",\n \"sort\",\n \"filter\",\n \"pageLimit\",\n \"audience\",\n \"pseudonymVersion\",\n \"rawIdentifiersIncluded\",\n ],\n \"Admin Token wallet balance metadata\",\n );\n economyAssert(\n page.schemaVersion === ECONOMY_CONTRACT_VERSION\n && page.metadata.schemaVersion === ECONOMY_CONTRACT_VERSION\n && typeof page.hasMore === \"boolean\"\n && page.metadata.rawIdentifiersIncluded === false\n && WALLET_BALANCE_SORTS.has(page.metadata.sort)\n && BALANCE_PSEUDONYM_AUDIENCES.has(page.metadata.audience)\n && PSEUDONYM_VERSION.test(page.metadata.pseudonymVersion)\n && Number.isSafeInteger(page.metadata.pageLimit)\n && page.metadata.pageLimit >= 1\n && page.metadata.pageLimit <= ADMIN_TOKEN_MAXIMUM_PAGE_SIZE\n && Array.isArray(page.entries)\n && page.entries.length <= page.metadata.pageLimit\n && page.hasMore === (page.nextCursor !== undefined)\n && (!page.hasMore || page.entries.length > 0),\n \"INVALID_CONTRACT\",\n \"Unsupported or unbounded Admin Token wallet balance page\",\n );\n if (page.metadata.filter !== undefined) {\n assertAdminTokenWalletBalanceFilter(page.metadata.filter);\n }\n parseIsoTimestamp(page.metadata.generatedAt);\n if (page.nextCursor !== undefined) {\n assertOpaqueCursor(page.nextCursor);\n }\n\n const walletAliases = new Set<string>();\n let previous: AdminTokenWalletBalanceEntryV1 | undefined;\n for (const entry of page.entries) {\n assertAdminTokenWalletBalanceEntry(entry);\n const filter = page.metadata.filter;\n economyAssert(\n filter === undefined\n || ((filter.components === undefined\n || filter.components.includes(entry.component))\n && (filter.statuses === undefined\n || filter.statuses.includes(entry.status))\n && (filter.subjectAlias === undefined\n || filter.subjectAlias === entry.subjectAlias)),\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance result contains an unrequested row\",\n );\n economyAssert(\n !walletAliases.has(entry.walletAlias),\n \"DUPLICATE_IDENTIFIER\",\n \"Admin Token wallet balance page cannot repeat a wallet alias\",\n );\n walletAliases.add(entry.walletAlias);\n if (previous !== undefined) {\n economyAssert(\n compareWalletBalanceEntries(previous, entry, page.metadata.sort) < 0,\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance page does not use its declared stable sort\",\n );\n }\n previous = entry;\n }\n}\n\nexport function assertAdminTokenWalletBalancePageForRequest(\n page: AdminTokenWalletBalancePageV1,\n request: AdminTokenWalletBalancePageRequestV1,\n): void {\n assertAdminTokenWalletBalancePageRequest(request);\n assertAdminTokenWalletBalancePage(page);\n economyAssert(\n page.metadata.sort === request.sort\n && sameWalletBalanceFilter(page.metadata.filter, request.filter)\n && page.metadata.pageLimit === request.limit\n && page.metadata.audience === request.audience\n && page.metadata.pseudonymVersion === request.pseudonymVersion,\n \"INVALID_CONTRACT\",\n \"Admin Token wallet balance result does not match its normalized request\",\n );\n}\n\n/** Validates one narrow row and rejects all undeclared identifier properties. */\nexport function assertAdminTokenActivityEntry(\n entry: AdminTokenActivityEntryV1,\n): void {\n assertExactKeys(\n entry,\n [\n \"schemaVersion\",\n \"occurredAt\",\n \"activityType\",\n \"status\",\n \"source\",\n \"amount\",\n \"safeLabel\",\n \"rowAlias\",\n \"subjectAlias\",\n ],\n \"Admin Token activity entry\",\n );\n economyAssert(\n entry.schemaVersion === ECONOMY_CONTRACT_VERSION\n && ACTIVITY_TYPES.has(entry.activityType)\n && ACTIVITY_STATUSES.has(entry.status)\n && ACTIVITY_SOURCES.has(entry.source),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token activity contract\",\n );\n parseIsoTimestamp(entry.occurredAt);\n const amount = parseTokenSubunits(entry.amount);\n economyAssert(\n (amount !== 0n || entry.activityType === \"failure\")\n && (entry.activityType !== \"acquisition\" || amount > 0n)\n && (entry.activityType !== \"spend\" || amount < 0n),\n \"INVALID_AMOUNT\",\n \"Admin Token activity amount has an invalid sign or zero value\",\n );\n economyAssert(\n (entry.activityType === \"failure\") === (entry.status === \"failed\"),\n \"INVALID_CONTRACT\",\n \"Failed rows must use the failure activity type\",\n );\n economyAssert(\n SAFE_LABELS.has(entry.safeLabel)\n && SAFE_LABELS_BY_ACTIVITY_TYPE[entry.activityType]?.has(entry.safeLabel)\n === true,\n \"INVALID_CONTRACT\",\n \"Admin Token activity label must use the approved non-identifying allowlist\",\n );\n assertAlias(entry.rowAlias, \"Row alias\");\n assertAlias(entry.subjectAlias, \"Subject alias\");\n economyAssert(\n entry.rowAlias !== entry.subjectAlias,\n \"INVALID_CONTRACT\",\n \"Row and subject aliases must use separate pseudonym domains\",\n );\n}\n\n/** Validates a bounded, normalized Admin activity query. */\nfunction assertAdminTokenActivityFilter(\n filter: AdminTokenActivityFilterV1,\n): void {\n assertExactKeys(\n filter,\n [\n \"activityTypes\",\n \"statuses\",\n \"sources\",\n \"subjectAlias\",\n ],\n \"Admin Token activity filter\",\n );\n if (filter.activityTypes !== undefined) {\n assertUniqueValues(\n filter.activityTypes,\n ACTIVITY_TYPES,\n \"Admin Token activity types\",\n );\n }\n if (filter.statuses !== undefined) {\n assertUniqueValues(\n filter.statuses,\n ACTIVITY_STATUSES,\n \"Admin Token activity statuses\",\n );\n }\n if (filter.sources !== undefined) {\n assertUniqueValues(\n filter.sources,\n ACTIVITY_SOURCES,\n \"Admin Token activity sources\",\n );\n }\n if (filter.subjectAlias !== undefined) {\n assertAlias(filter.subjectAlias, \"Subject alias filter\");\n }\n}\n\nfunction sameOptionalValues<T extends string>(\n left: readonly T[] | undefined,\n right: readonly T[] | undefined,\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right;\n }\n return left.length === right.length\n && left.every((value) => right.includes(value));\n}\n\nfunction sameActivityFilter(\n left: AdminTokenActivityFilterV1 | undefined,\n right: AdminTokenActivityFilterV1 | undefined,\n): boolean {\n if (left === undefined || right === undefined) {\n return left === right;\n }\n return sameOptionalValues(left.activityTypes, right.activityTypes)\n && sameOptionalValues(left.statuses, right.statuses)\n && sameOptionalValues(left.sources, right.sources)\n && left.subjectAlias === right.subjectAlias;\n}\n\n/** Validates the trusted query scope decoded from a signed opaque cursor. */\nexport function assertAdminTokenActivityCursorBinding(\n binding: AdminTokenActivityCursorBindingV1,\n): void {\n assertExactKeys(\n binding,\n [\n \"schemaVersion\",\n \"sort\",\n \"window\",\n \"filter\",\n \"audience\",\n \"pseudonymVersion\",\n ],\n \"Admin Token activity cursor binding\",\n );\n economyAssert(\n binding.schemaVersion === ECONOMY_CONTRACT_VERSION\n && ACTIVITY_SORTS.has(binding.sort)\n && PSEUDONYM_AUDIENCES.has(binding.audience)\n && PSEUDONYM_VERSION.test(binding.pseudonymVersion),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token activity cursor binding\",\n );\n assertReportingWindow(binding.window);\n if (binding.filter !== undefined) {\n assertAdminTokenActivityFilter(binding.filter);\n }\n}\n\n/** Validates a bounded, normalized Admin activity query. */\nexport function assertAdminTokenActivityPageRequest(\n request: AdminTokenActivityPageRequestV1,\n): void {\n assertExactKeys(\n request,\n [\n \"schemaVersion\",\n \"limit\",\n \"cursor\",\n \"cursorBinding\",\n \"sort\",\n \"window\",\n \"filter\",\n \"audience\",\n \"pseudonymVersion\",\n ],\n \"Admin Token activity request\",\n );\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION\n && Number.isSafeInteger(request.limit)\n && request.limit >= 1\n && request.limit <= ADMIN_TOKEN_MAXIMUM_PAGE_SIZE\n && ACTIVITY_SORTS.has(request.sort)\n && PSEUDONYM_AUDIENCES.has(request.audience)\n && PSEUDONYM_VERSION.test(request.pseudonymVersion),\n \"INVALID_CONTRACT\",\n \"Unsupported or unbounded Admin Token activity request\",\n );\n assertReportingWindow(request.window);\n if (request.filter !== undefined) {\n assertAdminTokenActivityFilter(request.filter);\n }\n economyAssert(\n (request.cursor === undefined) === (request.cursorBinding === undefined),\n \"INVALID_CONTRACT\",\n \"Admin Token activity cursor and trusted binding must be provided together\",\n );\n if (request.cursor === undefined || request.cursorBinding === undefined) {\n return;\n }\n assertOpaqueCursor(request.cursor);\n assertAdminTokenActivityCursorBinding(request.cursorBinding);\n economyAssert(\n request.cursorBinding.sort === request.sort\n && request.cursorBinding.window.fromInclusive\n === request.window.fromInclusive\n && request.cursorBinding.window.toExclusive === request.window.toExclusive\n && request.cursorBinding.audience === request.audience\n && request.cursorBinding.pseudonymVersion === request.pseudonymVersion\n && sameActivityFilter(request.cursorBinding.filter, request.filter),\n \"INVALID_CONTRACT\",\n \"Admin Token cursor is not bound to the normalized query\",\n );\n}\n\nfunction compareActivityEntries(\n left: AdminTokenActivityEntryV1,\n right: AdminTokenActivityEntryV1,\n sort: AdminTokenActivitySortV1,\n): number {\n if (sort === \"amount-absolute-desc\") {\n const leftAmount = absolute(parseTokenSubunits(left.amount));\n const rightAmount = absolute(parseTokenSubunits(right.amount));\n if (leftAmount !== rightAmount) {\n return leftAmount > rightAmount ? -1 : 1;\n }\n }\n const leftTime = parseIsoTimestamp(left.occurredAt);\n const rightTime = parseIsoTimestamp(right.occurredAt);\n if (leftTime !== rightTime) {\n return leftTime > rightTime ? -1 : 1;\n }\n return compareTextDescending(left.rowAlias, right.rowAlias);\n}\n\n/** Validates page privacy metadata, bounds, uniqueness, and stable order. */\nexport function assertAdminTokenActivityPage(\n page: AdminTokenActivityPageV1,\n): void {\n assertExactKeys(\n page,\n [\"schemaVersion\", \"entries\", \"hasMore\", \"nextCursor\", \"metadata\"],\n \"Admin Token activity page\",\n );\n assertExactKeys(\n page.metadata,\n [\n \"schemaVersion\",\n \"generatedAt\",\n \"fromInclusive\",\n \"toExclusive\",\n \"sort\",\n \"filter\",\n \"pageLimit\",\n \"audience\",\n \"pseudonymVersion\",\n \"rawIdentifiersIncluded\",\n ],\n \"Admin Token activity metadata\",\n );\n economyAssert(\n page.schemaVersion === ECONOMY_CONTRACT_VERSION\n && page.metadata.schemaVersion === ECONOMY_CONTRACT_VERSION\n && typeof page.hasMore === \"boolean\"\n && page.metadata.rawIdentifiersIncluded === false\n && ACTIVITY_SORTS.has(page.metadata.sort)\n && PSEUDONYM_AUDIENCES.has(page.metadata.audience)\n && PSEUDONYM_VERSION.test(page.metadata.pseudonymVersion)\n && Number.isSafeInteger(page.metadata.pageLimit)\n && page.metadata.pageLimit >= 1\n && page.metadata.pageLimit <= ADMIN_TOKEN_MAXIMUM_PAGE_SIZE,\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token activity result metadata\",\n );\n const window = assertReportingWindow({\n fromInclusive: page.metadata.fromInclusive,\n toExclusive: page.metadata.toExclusive,\n });\n if (page.metadata.filter !== undefined) {\n assertAdminTokenActivityFilter(page.metadata.filter);\n }\n parseIsoTimestamp(page.metadata.generatedAt);\n economyAssert(\n Array.isArray(page.entries)\n && page.entries.length <= page.metadata.pageLimit\n && page.hasMore === (page.nextCursor !== undefined)\n && (!page.hasMore || page.entries.length > 0),\n \"INVALID_CONTRACT\",\n \"Admin Token activity page is unbounded or has inconsistent pagination\",\n );\n if (page.nextCursor !== undefined) {\n assertOpaqueCursor(page.nextCursor);\n }\n\n const rowAliases = new Set<string>();\n let previous: AdminTokenActivityEntryV1 | undefined;\n for (const entry of page.entries) {\n assertAdminTokenActivityEntry(entry);\n const occurredAt = parseIsoTimestamp(entry.occurredAt);\n economyAssert(\n occurredAt >= window.from && occurredAt < window.to,\n \"INVALID_TIME_WINDOW\",\n \"Admin Token activity falls outside the declared result window\",\n );\n const filter = page.metadata.filter;\n economyAssert(\n filter === undefined\n || ((filter.activityTypes === undefined\n || filter.activityTypes.includes(entry.activityType))\n && (filter.statuses === undefined\n || filter.statuses.includes(entry.status))\n && (filter.sources === undefined\n || filter.sources.includes(entry.source))\n && (filter.subjectAlias === undefined\n || filter.subjectAlias === entry.subjectAlias)),\n \"INVALID_CONTRACT\",\n \"Admin Token activity result contains a row outside its metadata filters\",\n );\n economyAssert(\n !rowAliases.has(entry.rowAlias),\n \"DUPLICATE_IDENTIFIER\",\n \"Admin Token activity page cannot repeat a row alias\",\n );\n rowAliases.add(entry.rowAlias);\n if (previous !== undefined) {\n economyAssert(\n compareActivityEntries(previous, entry, page.metadata.sort) < 0,\n \"INVALID_CONTRACT\",\n \"Admin Token activity page does not use its declared stable sort\",\n );\n }\n previous = entry;\n }\n}\n\n/**\n * Proves that a result retained the server-normalized window, sort, audience,\n * pseudonym version, page bound, and filters of its request.\n */\nexport function assertAdminTokenActivityPageForRequest(\n page: AdminTokenActivityPageV1,\n request: AdminTokenActivityPageRequestV1,\n): void {\n assertAdminTokenActivityPageRequest(request);\n assertAdminTokenActivityPage(page);\n economyAssert(\n page.metadata.fromInclusive === request.window.fromInclusive\n && page.metadata.toExclusive === request.window.toExclusive\n && page.metadata.sort === request.sort\n && sameActivityFilter(page.metadata.filter, request.filter)\n && page.metadata.pageLimit === request.limit\n && page.metadata.audience === request.audience\n && page.metadata.pseudonymVersion === request.pseudonymVersion,\n \"INVALID_CONTRACT\",\n \"Admin Token activity result metadata does not match its normalized request\",\n );\n}\n\n/** Validates a bounded trend request before a reporting adapter runs it. */\nexport function assertAdminTokenTrendRequest(\n request: AdminTokenTrendRequestV1,\n): void {\n assertExactKeys(\n request,\n [\"schemaVersion\", \"window\", \"granularity\", \"activityTypes\"],\n \"Admin Token trend request\",\n );\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION\n && TREND_GRANULARITIES.has(request.granularity),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token trend request\",\n );\n assertReportingWindow(\n request.window,\n request.granularity === \"hour\"\n ? ADMIN_TOKEN_MAXIMUM_HOURLY_WINDOW_DAYS\n : ADMIN_TOKEN_MAXIMUM_WINDOW_DAYS,\n );\n if (request.activityTypes !== undefined) {\n assertUniqueValues(\n request.activityTypes,\n ACTIVITY_TYPES,\n \"Admin Token trend activity types\",\n );\n }\n}\n\n/**\n * Returns a conventional median for values already expressed in half\n * TokenSubunits. Inputs produced by this module guarantee an integral result.\n */\nfunction medianHalfSubunits(values: readonly bigint[]): bigint {\n const ordered = [...values].sort((left, right) =>\n left === right ? 0 : left < right ? -1 : 1,\n );\n const lower = ordered[Math.floor((ordered.length - 1) / 2)];\n const upper = ordered[Math.floor(ordered.length / 2)];\n economyAssert(\n lower !== undefined && upper !== undefined,\n \"INVALID_CONTRACT\",\n \"Median requires at least one value\",\n );\n const sum = lower + upper;\n economyAssert(\n sum % 2n === 0n,\n \"INVALID_AMOUNT\",\n \"Median cannot be represented in exact half TokenSubunits\",\n );\n return sum / 2n;\n}\n\nfunction serializeExactStatistic(\n halfSubunits: bigint,\n): AdminTokenExactStatisticV1 {\n economyAssert(\n absolute(halfSubunits) <= MAXIMUM_STATISTIC_HALF_SUBUNITS,\n \"AMOUNT_OUT_OF_RANGE\",\n \"Admin Token statistic exceeds its exact bounded representation\",\n );\n if (halfSubunits % 2n === 0n) {\n return {\n numerator: (halfSubunits / 2n).toString(10),\n denominator: 1,\n };\n }\n return {\n numerator: halfSubunits.toString(10),\n denominator: 2,\n };\n}\n\nfunction parseExactStatistic(\n value: AdminTokenExactStatisticV1,\n label: string,\n): bigint {\n assertExactKeys(value, [\"numerator\", \"denominator\"], label);\n economyAssert(\n typeof value.numerator === \"string\"\n && value.numerator.length <= 22\n && EXACT_STATISTIC_INTEGER.test(value.numerator)\n && (value.denominator === 1 || value.denominator === 2),\n \"INVALID_AMOUNT\",\n `${label} must be an exact bounded rational TokenSubunit value`,\n );\n const numerator = BigInt(value.numerator);\n economyAssert(\n value.denominator === 1 || numerator % 2n !== 0n,\n \"INVALID_AMOUNT\",\n `${label} must use a reduced exact representation`,\n );\n const halfSubunits =\n numerator * BigInt(2 / value.denominator);\n economyAssert(\n absolute(halfSubunits) <= MAXIMUM_STATISTIC_HALF_SUBUNITS,\n \"AMOUNT_OUT_OF_RANGE\",\n `${label} exceeds its exact bounded representation`,\n );\n return halfSubunits;\n}\n\nfunction classifyAnomaly(options: {\n absoluteDeltaHalfSubunits: bigint;\n medianAbsoluteDeviationHalfSubunits: bigint;\n minimumAbsoluteDeltaHalfSubunits: bigint;\n madMultiplierMilli: number;\n}): Pick<\n AdminTokenAnomalyIndicatorV1,\n \"status\" | \"explanationCode\"\n> {\n if (\n options.absoluteDeltaHalfSubunits\n < options.minimumAbsoluteDeltaHalfSubunits\n ) {\n return {\n status: \"normal\",\n explanationCode: \"below-absolute-minimum\",\n };\n }\n if (options.medianAbsoluteDeviationHalfSubunits === 0n) {\n return options.absoluteDeltaHalfSubunits > 0n\n ? {\n status: \"irregular-spike\",\n explanationCode: \"zero-mad-absolute-threshold-exceeded\",\n }\n : {\n status: \"normal\",\n explanationCode: \"within-baseline-variation\",\n };\n }\n const exceedsBaseline =\n options.absoluteDeltaHalfSubunits * 1_000n\n >= options.medianAbsoluteDeviationHalfSubunits\n * BigInt(options.madMultiplierMilli);\n return exceedsBaseline\n ? {\n status: \"irregular-spike\",\n explanationCode: \"median-mad-and-absolute-threshold-exceeded\",\n }\n : {\n status: \"normal\",\n explanationCode: \"within-baseline-variation\",\n };\n}\n\n/**\n * Creates an exact, explainable conventional same-window median/MAD indicator.\n * Exact rational statistics avoid floating-point and preserve half-TokenSubunit\n * results from the two even-sized median operations.\n */\nexport function createAdminTokenAnomalyIndicator(\n input: CreateAdminTokenAnomalyIndicatorInputV1,\n): AdminTokenAnomalyIndicatorV1 {\n assertExactKeys(\n input,\n [\n \"observedAmount\",\n \"baselineSamples\",\n \"minimumAbsoluteDelta\",\n \"madMultiplierMilli\",\n ],\n \"Admin Token anomaly input\",\n );\n economyAssert(\n Array.isArray(input.baselineSamples)\n && input.baselineSamples.length === ADMIN_TOKEN_ANOMALY_BASELINE_DAYS\n && Number.isSafeInteger(input.madMultiplierMilli)\n && input.madMultiplierMilli >= 1\n && input.madMultiplierMilli <= 1_000_000,\n \"INVALID_CONTRACT\",\n \"Admin Token anomaly input requires 28 baselines and a bounded fixed-point multiplier\",\n );\n const observed = parseTokenSubunits(input.observedAmount);\n const baseline = input.baselineSamples.map((sample) => {\n assertExactKeys(\n sample,\n [\"amount\", \"distinctSubjects\"],\n \"Admin Token anomaly baseline sample\",\n );\n economyAssert(\n Number.isSafeInteger(sample.distinctSubjects)\n && sample.distinctSubjects >= ADMIN_TOKEN_MINIMUM_COHORT_SIZE,\n \"INVALID_CONTRACT\",\n \"Admin Token anomaly baselines must exclude privacy-suppressed cohorts\",\n );\n return parseTokenSubunits(sample.amount);\n });\n const minimum = parseTokenSubunits(input.minimumAbsoluteDelta);\n economyAssert(\n minimum > 0n,\n \"INVALID_AMOUNT\",\n \"Admin Token anomaly absolute minimum must be positive\",\n );\n const baselineHalfSubunits = baseline.map((amount) => amount * 2n);\n const medianHalf = medianHalfSubunits(baselineHalfSubunits);\n const medianAbsoluteDeviationHalf = medianHalfSubunits(\n baselineHalfSubunits.map((amount) => absolute(amount - medianHalf)),\n );\n const deviationHalf = observed * 2n - medianHalf;\n const classification = classifyAnomaly({\n absoluteDeltaHalfSubunits: absolute(deviationHalf),\n medianAbsoluteDeviationHalfSubunits:\n medianAbsoluteDeviationHalf,\n minimumAbsoluteDeltaHalfSubunits: minimum * 2n,\n madMultiplierMilli: input.madMultiplierMilli,\n });\n return {\n method: \"same-window-median-mad-v1\",\n ...classification,\n baselineWindowCount: ADMIN_TOKEN_ANOMALY_BASELINE_DAYS,\n medianAmount: serializeExactStatistic(medianHalf),\n medianAbsoluteDeviation:\n serializeExactStatistic(medianAbsoluteDeviationHalf),\n minimumAbsoluteDelta: input.minimumAbsoluteDelta,\n deviationFromMedian: serializeExactStatistic(deviationHalf),\n madMultiplierMilli: input.madMultiplierMilli,\n };\n}\n\n/** Creates a non-identifying explanation when 28 eligible baselines do not exist. */\nexport function createAdminTokenAnomalyUnavailable(\n input: CreateAdminTokenAnomalyUnavailableInputV1,\n): AdminTokenAnomalyUnavailableV1 {\n assertExactKeys(\n input,\n [\"reason\", \"eligibleBaselineWindowCount\"],\n \"Unavailable Admin Token anomaly input\",\n );\n economyAssert(\n ANOMALY_UNAVAILABLE_REASONS.has(input.reason)\n && Number.isSafeInteger(input.eligibleBaselineWindowCount)\n && input.eligibleBaselineWindowCount >= 0\n && input.eligibleBaselineWindowCount\n < ADMIN_TOKEN_ANOMALY_BASELINE_DAYS,\n \"INVALID_CONTRACT\",\n \"Unavailable Admin Token anomaly requires a bounded reason and eligible baseline count\",\n );\n return {\n method: \"same-window-median-mad-v1\",\n status: \"unavailable\",\n reason: input.reason,\n eligibleBaselineWindowCount: input.eligibleBaselineWindowCount,\n requiredBaselineWindowCount: ADMIN_TOKEN_ANOMALY_BASELINE_DAYS,\n };\n}\n\nfunction assertAdminTokenAnomalyIndicator(\n anomaly: AdminTokenAnomalyIndicatorV1,\n observedAmount: TokenSubunitString,\n): void {\n assertExactKeys(\n anomaly,\n [\n \"method\",\n \"status\",\n \"baselineWindowCount\",\n \"medianAmount\",\n \"medianAbsoluteDeviation\",\n \"minimumAbsoluteDelta\",\n \"deviationFromMedian\",\n \"madMultiplierMilli\",\n \"explanationCode\",\n ],\n \"Admin Token anomaly indicator\",\n );\n const observed = parseTokenSubunits(observedAmount);\n const medianHalf = parseExactStatistic(\n anomaly.medianAmount,\n \"Admin Token anomaly median\",\n );\n const madHalf = parseExactStatistic(\n anomaly.medianAbsoluteDeviation,\n \"Admin Token anomaly median absolute deviation\",\n );\n const minimum = parseTokenSubunits(anomaly.minimumAbsoluteDelta);\n const deviationHalf = parseExactStatistic(\n anomaly.deviationFromMedian,\n \"Admin Token anomaly deviation\",\n );\n economyAssert(\n anomaly.method === \"same-window-median-mad-v1\"\n && anomaly.baselineWindowCount === ADMIN_TOKEN_ANOMALY_BASELINE_DAYS\n && medianHalf >= TOKEN_SUBUNITS_MIN * 2n\n && medianHalf <= TOKEN_SUBUNITS_MAX * 2n\n && madHalf >= 0n\n && minimum > 0n\n && Number.isSafeInteger(anomaly.madMultiplierMilli)\n && anomaly.madMultiplierMilli >= 1\n && anomaly.madMultiplierMilli <= 1_000_000\n && deviationHalf === observed * 2n - medianHalf,\n \"INVALID_CONTRACT\",\n \"Admin Token anomaly arithmetic or method is invalid\",\n );\n const expected = classifyAnomaly({\n absoluteDeltaHalfSubunits: absolute(deviationHalf),\n medianAbsoluteDeviationHalfSubunits: madHalf,\n minimumAbsoluteDeltaHalfSubunits: minimum * 2n,\n madMultiplierMilli: anomaly.madMultiplierMilli,\n });\n economyAssert(\n anomaly.status === expected.status\n && anomaly.explanationCode === expected.explanationCode,\n \"INVALID_CONTRACT\",\n \"Admin Token anomaly classification is inconsistent with its explanation\",\n );\n}\n\nfunction assertAdminTokenAnomalyUnavailable(\n anomaly: AdminTokenAnomalyUnavailableV1,\n): void {\n assertExactKeys(\n anomaly,\n [\n \"method\",\n \"status\",\n \"reason\",\n \"eligibleBaselineWindowCount\",\n \"requiredBaselineWindowCount\",\n ],\n \"Unavailable Admin Token anomaly\",\n );\n economyAssert(\n anomaly.method === \"same-window-median-mad-v1\"\n && anomaly.status === \"unavailable\"\n && ANOMALY_UNAVAILABLE_REASONS.has(anomaly.reason)\n && Number.isSafeInteger(anomaly.eligibleBaselineWindowCount)\n && anomaly.eligibleBaselineWindowCount >= 0\n && anomaly.eligibleBaselineWindowCount\n < ADMIN_TOKEN_ANOMALY_BASELINE_DAYS\n && anomaly.requiredBaselineWindowCount\n === ADMIN_TOKEN_ANOMALY_BASELINE_DAYS,\n \"INVALID_CONTRACT\",\n \"Unavailable Admin Token anomaly metadata is invalid\",\n );\n}\n\nfunction assertTrendBucketAlignment(\n start: number,\n end: number,\n granularity: AdminTokenTrendGranularityV1,\n): void {\n const expectedDuration =\n granularity === \"hour\" ? HOUR_MILLISECONDS : DAY_MILLISECONDS;\n const date = new Date(start);\n const aligned =\n date.getUTCMinutes() === 0\n && date.getUTCSeconds() === 0\n && date.getUTCMilliseconds() === 0\n && (granularity === \"hour\" || date.getUTCHours() === 0);\n economyAssert(\n aligned && end - start === expectedDuration,\n \"INVALID_TIME_WINDOW\",\n \"Admin Token trend bucket is not aligned to its declared granularity\",\n );\n}\n\nfunction assertTrendAggregate(\n aggregate: AdminTokenTrendAggregateV1,\n): void {\n assertPlainObject(aggregate, \"Admin Token trend aggregate\");\n if (aggregate.visibility === \"suppressed\") {\n assertExactKeys(\n aggregate,\n [\"visibility\", \"reason\", \"threshold\"],\n \"Suppressed Admin Token trend aggregate\",\n );\n economyAssert(\n aggregate.reason === \"cohort-below-minimum\"\n && aggregate.threshold === ADMIN_TOKEN_MINIMUM_COHORT_SIZE,\n \"INVALID_CONTRACT\",\n \"Suppressed Admin Token trend aggregate has invalid privacy metadata\",\n );\n return;\n }\n assertExactKeys(\n aggregate,\n [\n \"visibility\",\n \"distinctSubjects\",\n \"activityCount\",\n \"signedAmount\",\n ],\n \"Reported Admin Token trend aggregate\",\n );\n parseTokenSubunits(aggregate.signedAmount);\n economyAssert(\n aggregate.visibility === \"reported\"\n && Number.isSafeInteger(aggregate.distinctSubjects)\n && aggregate.distinctSubjects >= ADMIN_TOKEN_MINIMUM_COHORT_SIZE\n && Number.isSafeInteger(aggregate.activityCount)\n && aggregate.activityCount >= aggregate.distinctSubjects,\n \"INVALID_CONTRACT\",\n \"Reported Admin Token trend aggregate is invalid or below the privacy threshold\",\n );\n}\n\n/** Validates suppression, bucket bounds, exact arithmetic, and anomaly details. */\nexport function assertAdminTokenTrendResult(\n result: AdminTokenTrendResultV1,\n): void {\n assertExactKeys(\n result,\n [\"schemaVersion\", \"series\", \"metadata\"],\n \"Admin Token trend result\",\n );\n assertExactKeys(\n result.metadata,\n [\n \"schemaVersion\",\n \"generatedAt\",\n \"fromInclusive\",\n \"toExclusive\",\n \"granularity\",\n \"activityTypes\",\n \"minimumCohortSize\",\n \"anomalyBaselineDays\",\n \"rawIdentifiersIncluded\",\n ],\n \"Admin Token trend metadata\",\n );\n economyAssert(\n result.schemaVersion === ECONOMY_CONTRACT_VERSION\n && result.metadata.schemaVersion === ECONOMY_CONTRACT_VERSION\n && TREND_GRANULARITIES.has(result.metadata.granularity)\n && result.metadata.minimumCohortSize\n === ADMIN_TOKEN_MINIMUM_COHORT_SIZE\n && result.metadata.anomalyBaselineDays\n === ADMIN_TOKEN_ANOMALY_BASELINE_DAYS\n && result.metadata.rawIdentifiersIncluded === false\n && Array.isArray(result.series)\n && result.series.length <= ADMIN_TOKEN_MAXIMUM_TREND_POINTS,\n \"INVALID_CONTRACT\",\n \"Unsupported or unbounded Admin Token trend result\",\n );\n assertUniqueValues(\n result.metadata.activityTypes,\n ACTIVITY_TYPES,\n \"Admin Token trend result activity types\",\n );\n const window = assertReportingWindow(\n {\n fromInclusive: result.metadata.fromInclusive,\n toExclusive: result.metadata.toExclusive,\n },\n result.metadata.granularity === \"hour\"\n ? ADMIN_TOKEN_MAXIMUM_HOURLY_WINDOW_DAYS\n : ADMIN_TOKEN_MAXIMUM_WINDOW_DAYS,\n );\n parseIsoTimestamp(result.metadata.generatedAt);\n\n const pointKeys = new Set<string>();\n let previousKey: string | undefined;\n for (const point of result.series) {\n assertExactKeys(\n point,\n [\n \"schemaVersion\",\n \"bucketStart\",\n \"bucketEnd\",\n \"activityType\",\n \"aggregate\",\n \"anomaly\",\n ],\n \"Admin Token trend point\",\n );\n economyAssert(\n point.schemaVersion === ECONOMY_CONTRACT_VERSION\n && ACTIVITY_TYPES.has(point.activityType)\n && result.metadata.activityTypes.includes(point.activityType),\n \"INVALID_CONTRACT\",\n \"Unsupported Admin Token trend point\",\n );\n const start = parseIsoTimestamp(point.bucketStart);\n const end = parseIsoTimestamp(point.bucketEnd);\n economyAssert(\n start >= window.from && end <= window.to,\n \"INVALID_TIME_WINDOW\",\n \"Admin Token trend bucket falls outside the declared result window\",\n );\n assertTrendBucketAlignment(start, end, result.metadata.granularity);\n assertTrendAggregate(point.aggregate);\n if (point.aggregate.visibility === \"suppressed\") {\n economyAssert(\n point.anomaly === undefined,\n \"INVALID_CONTRACT\",\n \"Suppressed Admin Token cohorts cannot include anomaly details\",\n );\n } else {\n economyAssert(\n point.anomaly !== undefined,\n \"INVALID_CONTRACT\",\n \"Reported Admin Token cohorts require an anomaly result\",\n );\n if (point.anomaly.status === \"unavailable\") {\n assertAdminTokenAnomalyUnavailable(point.anomaly);\n } else {\n assertAdminTokenAnomalyIndicator(\n point.anomaly,\n point.aggregate.signedAmount,\n );\n }\n }\n const key = `${point.bucketStart}\\u0000${point.activityType}`;\n economyAssert(\n !pointKeys.has(key) && (previousKey === undefined || previousKey < key),\n \"DUPLICATE_IDENTIFIER\",\n \"Admin Token trend points must be unique and stably ordered\",\n );\n pointKeys.add(key);\n previousKey = key;\n }\n}\n\n/**\n * Proves that a trend result retained the normalized window, granularity, and\n * activity-type selection of its request.\n */\nexport function assertAdminTokenTrendResultForRequest(\n result: AdminTokenTrendResultV1,\n request: AdminTokenTrendRequestV1,\n): void {\n assertAdminTokenTrendRequest(request);\n assertAdminTokenTrendResult(result);\n const requestedActivityTypes =\n request.activityTypes ?? [...ACTIVITY_TYPES];\n economyAssert(\n result.metadata.fromInclusive === request.window.fromInclusive\n && result.metadata.toExclusive === request.window.toExclusive\n && result.metadata.granularity === request.granularity\n && sameOptionalValues(\n result.metadata.activityTypes,\n requestedActivityTypes,\n ),\n \"INVALID_CONTRACT\",\n \"Admin Token trend result metadata does not match its normalized request\",\n );\n}\n","import {\n isWholeTokenAmount,\n parseTokenSubunits,\n serializeTokenSubunits,\n sumTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type AllocationId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { SourceLotSliceV1 } from \"./lots.js\";\n\nexport type AllocationStatus = \"active\" | \"closed\";\nexport type PeriodicLimitWindow = \"daily\" | \"weekly\" | \"monthly\";\n\nexport interface GameplayLimitsV1 {\n readonly perTransaction: TokenSubunitString;\n readonly periodic: TokenSubunitString;\n readonly periodicWindow: PeriodicLimitWindow;\n}\n\n/** Guardian-funded, child-visible reservation. This is not a gameplay ledger. */\nexport interface GameplayAllocationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly allocationId: AllocationId;\n readonly householdId: HouseholdId;\n readonly hostWalletId: WalletId;\n readonly childWalletId: WalletId;\n readonly childAccountId: AccountId;\n readonly status: AllocationStatus;\n readonly reservedAmount: TokenSubunitString;\n readonly remainingAmount: TokenSubunitString;\n readonly reclaimedAmount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly reclaimedSlices: readonly SourceLotSliceV1[];\n readonly limits: GameplayLimitsV1;\n readonly version: number;\n readonly createdAt: IsoTimestamp;\n readonly updatedAt: IsoTimestamp;\n}\n\nfunction assertWholePositive(amount: TokenSubunitString, label: string): bigint {\n const parsed = parseTokenSubunits(amount);\n economyAssert(parsed > 0n, \"INVALID_AMOUNT\", `${label} must be positive`);\n economyAssert(\n isWholeTokenAmount(parsed),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n `${label} must contain whole Tokens`,\n );\n return parsed;\n}\n\nfunction assertSlices(\n slices: readonly SourceLotSliceV1[],\n expectedAmount: bigint,\n label: string,\n): void {\n economyAssert(slices.length > 0, \"INVALID_CONTRACT\", `${label} are required`);\n const lotIds = new Set<string>();\n for (const slice of slices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n economyAssert(\n !lotIds.has(slice.lotId),\n \"DUPLICATE_IDENTIFIER\",\n `${label} must not repeat a lot`,\n );\n lotIds.add(slice.lotId);\n economyAssert(\n parseTokenSubunits(slice.amount) > 0n,\n \"INVALID_AMOUNT\",\n `${label} amounts must be positive`,\n );\n }\n economyAssert(\n sumTokenSubunits(slices.map((slice) => slice.amount)) === expectedAmount,\n \"INVALID_CONTRACT\",\n `${label} must sum to the command amount`,\n );\n}\n\n/** Validates allocation arithmetic and whole-Token reservation policy. */\nexport function assertGameplayAllocation(\n allocation: GameplayAllocationV1,\n): void {\n economyAssert(\n allocation.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported allocation contract version\",\n );\n assertEconomyIdentifier(allocation.allocationId, \"allocationId\");\n assertEconomyIdentifier(allocation.householdId, \"householdId\");\n assertEconomyIdentifier(allocation.hostWalletId, \"hostWalletId\");\n assertEconomyIdentifier(allocation.childWalletId, \"childWalletId\");\n assertEconomyIdentifier(allocation.childAccountId, \"childAccountId\");\n const createdAt = parseIsoTimestamp(allocation.createdAt);\n const updatedAt = parseIsoTimestamp(allocation.updatedAt);\n economyAssert(\n updatedAt >= createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Allocation update time cannot precede its creation time\",\n );\n economyAssert(\n allocation.status === \"active\" || allocation.status === \"closed\",\n \"INVALID_CONTRACT\",\n \"Allocation has an unsupported status\",\n );\n\n const reserved = parseTokenSubunits(allocation.reservedAmount);\n const remaining = parseTokenSubunits(allocation.remainingAmount);\n const reclaimed = parseTokenSubunits(allocation.reclaimedAmount);\n economyAssert(\n reserved > 0n &&\n remaining >= 0n &&\n reclaimed >= 0n &&\n isWholeTokenAmount(reserved) &&\n isWholeTokenAmount(remaining) &&\n isWholeTokenAmount(reclaimed),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Allocation reservations and reclaims must contain whole Tokens\",\n );\n economyAssert(\n remaining + reclaimed <= reserved,\n \"INVALID_CONTRACT\",\n \"Allocation remaining and reclaimed amounts exceed its reservation\",\n );\n\n const fundingByLot = new Map<string, bigint>();\n let funded = 0n;\n for (const slice of allocation.fundingSlices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n const amount = parseTokenSubunits(slice.amount);\n economyAssert(\n amount > 0n,\n \"INVALID_AMOUNT\",\n \"Allocation funding slices must be positive\",\n );\n funded += amount;\n fundingByLot.set(\n slice.lotId,\n (fundingByLot.get(slice.lotId) ?? 0n) + amount,\n );\n }\n economyAssert(\n funded === reserved,\n \"INVALID_CONTRACT\",\n \"Allocation funding provenance must equal its total reservation\",\n );\n\n const reclaimedByLot = new Map<string, bigint>();\n let reclaimedFromSlices = 0n;\n for (const slice of allocation.reclaimedSlices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n const amount = parseTokenSubunits(slice.amount);\n economyAssert(\n amount > 0n,\n \"INVALID_AMOUNT\",\n \"Allocation reclaim slices must be positive\",\n );\n reclaimedFromSlices += amount;\n reclaimedByLot.set(\n slice.lotId,\n (reclaimedByLot.get(slice.lotId) ?? 0n) + amount,\n );\n }\n economyAssert(\n reclaimedFromSlices === reclaimed,\n \"INVALID_CONTRACT\",\n \"Allocation reclaim provenance must equal its reclaimed amount\",\n );\n for (const [lotId, amount] of reclaimedByLot) {\n economyAssert(\n amount <= (fundingByLot.get(lotId) ?? 0n),\n \"SOURCE_LOT_RESTRICTED\",\n \"Reclaimed provenance cannot exceed allocation funding\",\n );\n }\n economyAssert(\n allocation.version >= 1 && Number.isSafeInteger(allocation.version),\n \"INVALID_CONTRACT\",\n \"Allocation version must be a positive safe integer\",\n );\n\n const perTransaction = parseTokenSubunits(allocation.limits.perTransaction);\n const periodic = parseTokenSubunits(allocation.limits.periodic);\n economyAssert(\n [\"daily\", \"weekly\", \"monthly\"].includes(allocation.limits.periodicWindow),\n \"INVALID_CONTRACT\",\n \"Gameplay limit has an unsupported period\",\n );\n economyAssert(\n perTransaction >= 0n &&\n periodic >= 0n &&\n isWholeTokenAmount(perTransaction) &&\n isWholeTokenAmount(periodic),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Gameplay limits must contain whole Tokens\",\n );\n economyAssert(\n perTransaction <= periodic || periodic === 0n,\n \"INVALID_CONTRACT\",\n \"Per-transaction limit cannot exceed an enabled periodic limit\",\n );\n}\n\nexport interface CreateGameplayAllocationInputV1 {\n readonly allocationId: AllocationId;\n readonly householdId: HouseholdId;\n readonly hostWalletId: WalletId;\n readonly childWalletId: WalletId;\n readonly childAccountId: AccountId;\n readonly amount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly limits: GameplayLimitsV1;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Creates a new whole-Token reservation from already-selected source lots. */\nexport function createGameplayAllocation(\n input: CreateGameplayAllocationInputV1,\n): GameplayAllocationV1 {\n const amount = assertWholePositive(input.amount, \"Allocation amount\");\n assertSlices(input.fundingSlices, amount, \"Allocation funding slices\");\n const allocation: GameplayAllocationV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n allocationId: input.allocationId,\n householdId: input.householdId,\n hostWalletId: input.hostWalletId,\n childWalletId: input.childWalletId,\n childAccountId: input.childAccountId,\n status: \"active\",\n reservedAmount: input.amount,\n remainingAmount: input.amount,\n reclaimedAmount: serializeTokenSubunits(0n),\n fundingSlices: input.fundingSlices,\n reclaimedSlices: [],\n limits: input.limits,\n version: 1,\n createdAt: input.occurredAt,\n updatedAt: input.occurredAt,\n };\n assertGameplayAllocation(allocation);\n return allocation;\n}\n\nexport interface BoostGameplayAllocationInputV1 {\n readonly amount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Returns the next immutable allocation state after a whole-Token boost. */\nexport function boostGameplayAllocation(\n allocation: GameplayAllocationV1,\n input: BoostGameplayAllocationInputV1,\n): GameplayAllocationV1 {\n assertGameplayAllocation(allocation);\n economyAssert(\n allocation.status === \"active\" && allocation.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Allocation is closed or its optimistic version is stale\",\n );\n const amount = assertWholePositive(input.amount, \"Boost amount\");\n assertSlices(input.fundingSlices, amount, \"Boost funding slices\");\n\n const next: GameplayAllocationV1 = {\n ...allocation,\n reservedAmount: serializeTokenSubunits(\n parseTokenSubunits(allocation.reservedAmount) + amount,\n ),\n remainingAmount: serializeTokenSubunits(\n parseTokenSubunits(allocation.remainingAmount) + amount,\n ),\n fundingSlices: [...allocation.fundingSlices, ...input.fundingSlices],\n version: allocation.version + 1,\n updatedAt: input.occurredAt,\n };\n assertGameplayAllocation(next);\n return next;\n}\n\nexport interface ReclaimGameplayAllocationInputV1 {\n readonly amount: TokenSubunitString;\n readonly sourceSlices: readonly SourceLotSliceV1[];\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Reclaims unused whole Tokens without changing spent history. */\nexport function reclaimGameplayAllocation(\n allocation: GameplayAllocationV1,\n input: ReclaimGameplayAllocationInputV1,\n): GameplayAllocationV1 {\n assertGameplayAllocation(allocation);\n economyAssert(\n allocation.status === \"active\" && allocation.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Allocation is closed or its optimistic version is stale\",\n );\n const amount = assertWholePositive(input.amount, \"Reclaim amount\");\n economyAssert(\n amount <= parseTokenSubunits(allocation.remainingAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Cannot reclaim more than the unused allocation\",\n );\n assertSlices(input.sourceSlices, amount, \"Reclaim source slices\");\n const fundedLotIds = new Set(\n allocation.fundingSlices.map((slice) => slice.lotId),\n );\n economyAssert(\n input.sourceSlices.every((slice) => fundedLotIds.has(slice.lotId)),\n \"SOURCE_LOT_RESTRICTED\",\n \"Reclaim slices must originate from the allocation\",\n );\n\n const remaining = parseTokenSubunits(allocation.remainingAmount) - amount;\n const next: GameplayAllocationV1 = {\n ...allocation,\n remainingAmount: serializeTokenSubunits(remaining),\n reclaimedAmount: serializeTokenSubunits(\n parseTokenSubunits(allocation.reclaimedAmount) + amount,\n ),\n reclaimedSlices: [...allocation.reclaimedSlices, ...input.sourceSlices],\n status: remaining === 0n ? \"closed\" : allocation.status,\n version: allocation.version + 1,\n updatedAt: input.occurredAt,\n };\n assertGameplayAllocation(next);\n return next;\n}\n","import { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type ProviderEventId,\n type TransactionId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { EconomyCommandType } from \"./ports/persistence.js\";\n\n/** Additive authoritative command types; legacy V1/V2 command unions stay unchanged. */\nexport type EconomyAuditedCommandTypeV1 =\n | EconomyCommandType\n | \"initialize-wallet\"\n | \"initialize-admin-reporting\";\n\nexport type EconomyCommandSourceV1 =\n | \"browser\"\n | \"shopify\"\n | \"ayet\"\n | \"bitlabs\"\n | \"operator\"\n | \"system\";\n\nexport type EconomyCommandProcessingModeV1 = \"initial\" | \"replay\";\n\nexport type EconomyPrincipalTypeV1 =\n | \"account\"\n | \"delegated-child\"\n | \"service\"\n | \"operator\";\n\nexport type EconomyCausationKindV1 =\n | \"provider-event\"\n | \"economy-command\"\n | \"ledger-transaction\"\n | \"workflow-event\"\n | \"authority-commit\";\n\n/** One privacy-safe edge in an economy audit correlation graph. */\nexport interface EconomyCausationReferenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly kind: EconomyCausationKindV1;\n readonly causationId: string;\n}\n\nexport type EconomyHmacFingerprintDomainV1 =\n | \"economy.idempotency-key.v1\"\n | \"economy.google-reporting-key.v1\"\n | \"economy.provider-event-key.v1\"\n | \"economy.provider-object-key.v1\"\n | \"economy.provider-payload.v1\"\n | \"economy.provider-reconciliation.v1\";\n\nexport type EconomyHmacSha256DigestV1 = `hmac-sha256:${string}`;\n\n/**\n * A versioned, domain-separated HMAC fingerprint produced by an approved\n * infrastructure adapter. It is a correlation token, not reversible evidence.\n */\nexport interface EconomyHmacFingerprintV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly fingerprintVersion: \"1\";\n readonly algorithm: \"hmac-sha256\";\n readonly domain: EconomyHmacFingerprintDomainV1;\n readonly keyVersion: string;\n readonly digest: EconomyHmacSha256DigestV1;\n}\n\n/**\n * Hashes of sanitized authorization-decision manifests. The manifests must\n * contain no raw tokens, capability payloads, session IDs, or personal data.\n */\nexport interface EconomyAuthorizationEvidenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly capabilityEvidenceHash: string;\n readonly featureFlagEvidenceHash: string;\n readonly assuranceEvidenceHash: string;\n readonly authenticatedAt: IsoTimestamp;\n readonly authorizedAt: IsoTimestamp;\n}\n\n/**\n * Privacy-minimized command facts for the authoritative V3 boundary.\n *\n * This is deliberately standalone rather than extending\n * `EconomyCommandEnvelopeV1`: the published legacy envelope contains a raw\n * caller idempotency key, which must never enter new audit storage.\n */\nexport interface AuditedEconomyCommandEnvelopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandId: string;\n readonly commandType: EconomyAuditedCommandTypeV1;\n readonly commandSource: EconomyCommandSourceV1;\n readonly idempotencyFingerprint: EconomyHmacFingerprintV1;\n readonly actorAccountId: AccountId;\n readonly subjectAccountId: AccountId;\n readonly principalType: EconomyPrincipalTypeV1;\n readonly relationshipId?: string;\n readonly authorizationVersion?: number;\n readonly authorizationEvidence: EconomyAuthorizationEvidenceV1;\n readonly routeId: string;\n readonly buildId: string;\n readonly correlationId: string;\n readonly causation?: EconomyCausationReferenceV1;\n /**\n * SHA-256 of the canonical, already-sanitized semantic command payload.\n * Provider callback bytes use an HMAC fingerprint instead.\n */\n readonly payloadHash: string;\n readonly providerEvidenceManifestHash?: string;\n readonly acceptedAt: IsoTimestamp;\n readonly acceptedRegion: string;\n readonly writerFencingToken: string;\n}\n\nexport type EconomyAcquisitionProviderV1 = \"shopify\" | \"ayet\" | \"bitlabs\";\n\n/**\n * Privacy-minimized verified provider evidence. Every value derived from a raw\n * provider identifier or callback body is represented by a domain-separated\n * HMAC fingerprint. Signatures and payment data have no storage field.\n */\nexport interface EconomyProviderEvidenceHashV1 {\n readonly schemaVersion: EconomyContractVersion;\n /** Opaque internal identifier; never the provider's event identifier. */\n readonly providerEventId: ProviderEventId;\n readonly commandId: string;\n readonly provider: EconomyAcquisitionProviderV1;\n readonly providerObjectKeyFingerprint?: EconomyHmacFingerprintV1;\n readonly providerEventKeyFingerprint: EconomyHmacFingerprintV1;\n readonly eventType: string;\n readonly payloadFingerprint: EconomyHmacFingerprintV1;\n readonly reconciliationEvidenceFingerprint?: EconomyHmacFingerprintV1;\n readonly signatureScheme: string;\n readonly signatureVerifiedAt: IsoTimestamp;\n readonly providerOccurredAt?: IsoTimestamp;\n readonly receivedAt: IsoTimestamp;\n readonly operationalHandleBindingId?: string;\n}\n\nexport type EconomyOperationalHandlePurposeV1 =\n | \"reconciliation\"\n | \"refund\"\n | \"dispute\";\n\n/**\n * Ledger-side binding for a provider handle encrypted and retained by the\n * consuming site. The ciphertext, nonce, authentication tag, and key URI are\n * not package fields; only hashes and non-secret cryptographic metadata bind\n * the external sealed record.\n */\nexport interface EconomyEncryptedOperationalHandleBindingV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly handleBindingId: string;\n readonly commandId: string;\n readonly provider: EconomyAcquisitionProviderV1;\n readonly purpose: EconomyOperationalHandlePurposeV1;\n readonly cipherSuite: \"AES-256-GCM\";\n readonly keyVersion: string;\n readonly ciphertextContentHash: string;\n readonly encryptionContextHash: string;\n readonly createdAt: IsoTimestamp;\n}\n\n/** One canonical content reference inside a sanitized evidence manifest. */\nexport interface EconomyEvidenceRecordReferenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recordId: string;\n readonly contentHash: string;\n}\n\n/**\n * Sanitized manifest bound by an audited provider command. Its referenced\n * records contain HMAC fingerprints, never raw provider material.\n */\nexport interface EconomyProviderEvidenceManifestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly evidenceManifestId: string;\n readonly commandId: string;\n readonly provider: EconomyAcquisitionProviderV1;\n readonly evidenceReferences: readonly EconomyEvidenceRecordReferenceV1[];\n readonly operationalHandleReferences: readonly EconomyEvidenceRecordReferenceV1[];\n readonly createdAt: IsoTimestamp;\n}\n\n/** Privacy-safe acknowledgement returned after durable command acceptance. */\nexport interface EconomyAcceptedCommandReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly receiptId: string;\n readonly commandId: string;\n readonly correlationId: string;\n readonly commandEnvelopeHash: string;\n readonly acceptedAt: IsoTimestamp;\n}\n\nexport type EconomyCommandResultOutcomeV1 =\n | \"completed\"\n | \"failed\"\n | \"no-op\";\n\n/**\n * Immutable terminal receipt. A completed result binds one journal\n * transaction, a failed result binds one safe failure code, and a no-op binds\n * one safe reason proving that no economic transaction was required.\n */\nexport interface EconomyCommandResultReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly receiptId: string;\n readonly commandId: string;\n readonly correlationId: string;\n readonly acceptedReceiptId: string;\n readonly commandEnvelopeHash: string;\n readonly outcome: EconomyCommandResultOutcomeV1;\n readonly resultHash: string;\n readonly transactionId?: TransactionId;\n readonly transactionCanonicalHash?: string;\n readonly failureCode?: string;\n readonly noOpCode?: string;\n readonly recordedAt: IsoTimestamp;\n}\n\n/** Raw-key-free actor/subject namespace used by authoritative V3 replay. */\nexport interface EconomyAuditedIdempotencyScopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly idempotencyFingerprint: EconomyHmacFingerprintV1;\n readonly commandType: EconomyAuditedCommandTypeV1;\n readonly actorAccountId: AccountId;\n readonly subjectAccountId: AccountId;\n readonly principalType: EconomyPrincipalTypeV1;\n readonly relationshipId?: string;\n readonly authorizationVersion?: number;\n}\n\nexport type EconomyAuditedIdempotencyStateV1 =\n | \"accepted\"\n | EconomyCommandResultOutcomeV1;\n\n/**\n * Persisted V3 replay result. The adapter returns this record for an exact\n * canonical scope match; a fingerprint collision with different canonical\n * command bytes is a security conflict, never a replay.\n */\nexport interface EconomyAuditedIdempotencyResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandId: string;\n readonly commandEnvelopeHash: string;\n readonly acceptedReceiptId: string;\n readonly resultReceiptId?: string;\n readonly state: EconomyAuditedIdempotencyStateV1;\n readonly responseHash: string;\n readonly recordedAt: IsoTimestamp;\n}\n\nexport type EconomyCommandProcessingDispositionV1 =\n | {\n readonly mode: \"initial\";\n }\n | {\n readonly mode: \"replay\";\n readonly result: EconomyAuditedIdempotencyResultV1;\n };\n\nconst COMMAND_TYPES = new Set<EconomyAuditedCommandTypeV1>([\n \"credit-purchase\",\n \"credit-subscription\",\n \"credit-reward\",\n \"credit-event\",\n \"credit-competition\",\n \"allocate\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"release-hold\",\n \"refund\",\n \"chargeback\",\n \"reverse\",\n \"adjust\",\n \"initialize-wallet\",\n \"initialize-admin-reporting\",\n]);\n\nconst COMMAND_SOURCES = new Set<EconomyCommandSourceV1>([\n \"browser\",\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n \"operator\",\n \"system\",\n]);\n\nconst PRINCIPAL_TYPES = new Set<EconomyPrincipalTypeV1>([\n \"account\",\n \"delegated-child\",\n \"service\",\n \"operator\",\n]);\n\nconst PROVIDER_SOURCES = new Set<EconomyCommandSourceV1>([\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n]);\n\nconst CAUSATION_KINDS = new Set<EconomyCausationKindV1>([\n \"provider-event\",\n \"economy-command\",\n \"ledger-transaction\",\n \"workflow-event\",\n \"authority-commit\",\n]);\n\nconst PROVIDERS = new Set<EconomyAcquisitionProviderV1>([\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n]);\n\nconst FINGERPRINT_DOMAINS = new Set<EconomyHmacFingerprintDomainV1>([\n \"economy.idempotency-key.v1\",\n \"economy.google-reporting-key.v1\",\n \"economy.provider-event-key.v1\",\n \"economy.provider-object-key.v1\",\n \"economy.provider-payload.v1\",\n \"economy.provider-reconciliation.v1\",\n]);\n\nconst SOURCE_COMMAND_TYPES: Readonly<\n Record<EconomyCommandSourceV1, ReadonlySet<EconomyAuditedCommandTypeV1>>\n> = {\n browser: new Set([\n \"allocate\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"release-hold\",\n \"initialize-wallet\",\n ]),\n shopify: new Set([\n \"credit-purchase\",\n \"hold\",\n \"release-hold\",\n \"refund\",\n \"chargeback\",\n \"reverse\",\n ]),\n ayet: new Set([\"credit-reward\", \"hold\", \"release-hold\", \"reverse\"]),\n bitlabs: new Set([\"credit-reward\", \"hold\", \"release-hold\", \"reverse\"]),\n operator: new Set([\"adjust\", \"reverse\", \"hold\", \"release-hold\"]),\n system: new Set([\n \"credit-event\",\n \"credit-competition\",\n \"initialize-admin-reporting\",\n \"hold\",\n \"release-hold\",\n \"reverse\",\n ]),\n};\n\nconst COMMAND_ENVELOPE_KEYS = new Set([\n \"schemaVersion\",\n \"commandId\",\n \"commandType\",\n \"commandSource\",\n \"idempotencyFingerprint\",\n \"actorAccountId\",\n \"subjectAccountId\",\n \"principalType\",\n \"relationshipId\",\n \"authorizationVersion\",\n \"authorizationEvidence\",\n \"routeId\",\n \"buildId\",\n \"correlationId\",\n \"causation\",\n \"payloadHash\",\n \"providerEvidenceManifestHash\",\n \"acceptedAt\",\n \"acceptedRegion\",\n \"writerFencingToken\",\n]);\n\nfunction assertExactKeys(\n value: object,\n allowedKeys: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowedKeys.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported or raw field`,\n );\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction assertSafeClassifier(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" &&\n /^[A-Za-z][A-Za-z0-9._:-]{0,95}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a bounded safe classifier`,\n );\n}\n\nfunction assertRelationshipContext(\n relationshipId: string | undefined,\n authorizationVersion: number | undefined,\n): void {\n if (relationshipId !== undefined) {\n assertEconomyIdentifier(relationshipId, \"relationshipId\");\n }\n if (authorizationVersion !== undefined) {\n economyAssert(\n Number.isSafeInteger(authorizationVersion) &&\n authorizationVersion >= 1,\n \"INVALID_CONTRACT\",\n \"Authorization version must be a positive safe integer\",\n );\n }\n economyAssert(\n (relationshipId === undefined) ===\n (authorizationVersion === undefined),\n \"INVALID_CONTRACT\",\n \"Relationship identity and authorization version must be supplied together\",\n );\n}\n\n/** Validates a domain-separated HMAC fingerprint and its expected domain. */\nexport function assertEconomyHmacFingerprint(\n fingerprint: EconomyHmacFingerprintV1,\n expectedDomain?: EconomyHmacFingerprintDomainV1,\n): void {\n assertExactKeys(\n fingerprint,\n new Set([\n \"schemaVersion\",\n \"fingerprintVersion\",\n \"algorithm\",\n \"domain\",\n \"keyVersion\",\n \"digest\",\n ]),\n \"Economy HMAC fingerprint\",\n );\n economyAssert(\n fingerprint.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n fingerprint.fingerprintVersion === \"1\" &&\n fingerprint.algorithm === \"hmac-sha256\" &&\n FINGERPRINT_DOMAINS.has(fingerprint.domain) &&\n (expectedDomain === undefined ||\n fingerprint.domain === expectedDomain),\n \"INVALID_CONTRACT\",\n \"Unsupported economy HMAC fingerprint contract or domain\",\n );\n assertEconomyIdentifier(fingerprint.keyVersion, \"fingerprint keyVersion\");\n economyAssert(\n /^hmac-sha256:[a-f0-9]{64}$/u.test(fingerprint.digest),\n \"INVALID_CONTRACT\",\n \"Economy HMAC fingerprint digest must be canonical\",\n );\n}\n\n/** Validates hashes of a sanitized, server-derived authorization decision. */\nexport function assertEconomyAuthorizationEvidence(\n evidence: EconomyAuthorizationEvidenceV1,\n): void {\n assertExactKeys(\n evidence,\n new Set([\n \"schemaVersion\",\n \"capabilityEvidenceHash\",\n \"featureFlagEvidenceHash\",\n \"assuranceEvidenceHash\",\n \"authenticatedAt\",\n \"authorizedAt\",\n ]),\n \"Economy authorization evidence\",\n );\n economyAssert(\n evidence.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported economy authorization-evidence version\",\n );\n assertCanonicalHash(\n evidence.capabilityEvidenceHash,\n \"Capability evidence hash\",\n );\n assertCanonicalHash(\n evidence.featureFlagEvidenceHash,\n \"Feature-flag evidence hash\",\n );\n assertCanonicalHash(\n evidence.assuranceEvidenceHash,\n \"Assurance evidence hash\",\n );\n const authenticatedAt = parseIsoTimestamp(evidence.authenticatedAt);\n economyAssert(\n parseIsoTimestamp(evidence.authorizedAt) >= authenticatedAt,\n \"INVALID_TIME_WINDOW\",\n \"Authorization cannot precede authentication\",\n );\n}\n\nfunction assertCausationReference(\n causation: EconomyCausationReferenceV1,\n): void {\n assertExactKeys(\n causation,\n new Set([\"schemaVersion\", \"kind\", \"causationId\"]),\n \"Economy causation reference\",\n );\n economyAssert(\n causation.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n CAUSATION_KINDS.has(causation.kind),\n \"INVALID_CONTRACT\",\n \"Economy causation reference is unsupported\",\n );\n assertEconomyIdentifier(causation.causationId, \"causationId\");\n}\n\nfunction assertCommandSourcePrincipal(\n envelope: AuditedEconomyCommandEnvelopeV1,\n): void {\n if (envelope.commandSource === \"browser\") {\n economyAssert(\n envelope.principalType === \"account\" ||\n envelope.principalType === \"delegated-child\",\n \"INVALID_CONTRACT\",\n \"Browser economy commands require an account principal\",\n );\n } else if (envelope.commandSource === \"operator\") {\n economyAssert(\n envelope.principalType === \"operator\",\n \"INVALID_CONTRACT\",\n \"Operator commands require an operator principal\",\n );\n } else {\n economyAssert(\n envelope.principalType === \"service\",\n \"INVALID_CONTRACT\",\n \"Provider and system commands require a service principal\",\n );\n }\n\n if (envelope.principalType === \"account\") {\n economyAssert(\n envelope.actorAccountId === envelope.subjectAccountId,\n \"INVALID_CONTRACT\",\n \"Direct account commands require the actor to be the subject\",\n );\n }\n if (envelope.principalType === \"delegated-child\") {\n economyAssert(\n envelope.actorAccountId !== envelope.subjectAccountId &&\n envelope.relationshipId !== undefined,\n \"INVALID_CONTRACT\",\n \"Delegated-child commands require a distinct actor and relationship\",\n );\n }\n if (envelope.commandType === \"initialize-wallet\") {\n economyAssert(\n envelope.commandSource === \"browser\" &&\n envelope.principalType === \"account\" &&\n envelope.actorAccountId === envelope.subjectAccountId &&\n envelope.relationshipId === undefined &&\n envelope.authorizationVersion === undefined,\n \"INVALID_CONTRACT\",\n \"Wallet initialization requires a direct self-account browser command\",\n );\n }\n}\n\n/** Validates a fingerprint-only, server-derived authoritative command. */\nexport function assertAuditedEconomyCommandEnvelope(\n envelope: AuditedEconomyCommandEnvelopeV1,\n): void {\n assertExactKeys(\n envelope,\n COMMAND_ENVELOPE_KEYS,\n \"Audited economy command envelope\",\n );\n economyAssert(\n envelope.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n COMMAND_TYPES.has(envelope.commandType) &&\n COMMAND_SOURCES.has(envelope.commandSource) &&\n PRINCIPAL_TYPES.has(envelope.principalType),\n \"INVALID_CONTRACT\",\n \"Unsupported audited economy command contract\",\n );\n economyAssert(\n SOURCE_COMMAND_TYPES[envelope.commandSource].has(envelope.commandType),\n \"INVALID_CONTRACT\",\n \"Economy command type is incompatible with its original source\",\n );\n assertEconomyIdentifier(envelope.commandId, \"commandId\");\n assertEconomyHmacFingerprint(\n envelope.idempotencyFingerprint,\n \"economy.idempotency-key.v1\",\n );\n assertEconomyIdentifier(envelope.actorAccountId, \"actorAccountId\");\n assertEconomyIdentifier(envelope.subjectAccountId, \"subjectAccountId\");\n assertRelationshipContext(\n envelope.relationshipId,\n envelope.authorizationVersion,\n );\n assertCommandSourcePrincipal(envelope);\n assertEconomyAuthorizationEvidence(envelope.authorizationEvidence);\n assertEconomyIdentifier(envelope.routeId, \"routeId\");\n assertEconomyIdentifier(envelope.buildId, \"buildId\");\n assertEconomyIdentifier(envelope.correlationId, \"correlationId\");\n if (envelope.causation !== undefined) {\n assertCausationReference(envelope.causation);\n economyAssert(\n envelope.causation.kind !== \"economy-command\" ||\n envelope.causation.causationId !== envelope.commandId,\n \"INVALID_CONTRACT\",\n \"An economy command cannot cause itself\",\n );\n }\n assertCanonicalHash(envelope.payloadHash, \"Command payload hash\");\n if (envelope.providerEvidenceManifestHash !== undefined) {\n assertCanonicalHash(\n envelope.providerEvidenceManifestHash,\n \"Provider evidence manifest hash\",\n );\n }\n economyAssert(\n PROVIDER_SOURCES.has(envelope.commandSource)\n ? envelope.providerEvidenceManifestHash !== undefined &&\n envelope.causation?.kind === \"provider-event\"\n : envelope.providerEvidenceManifestHash === undefined,\n \"INVALID_CONTRACT\",\n \"Provider evidence and provider-event causation must match the command source\",\n );\n const authorizedAt = parseIsoTimestamp(\n envelope.authorizationEvidence.authorizedAt,\n );\n economyAssert(\n parseIsoTimestamp(envelope.acceptedAt) >= authorizedAt,\n \"INVALID_TIME_WINDOW\",\n \"Command acceptance cannot precede authorization\",\n );\n assertEconomyIdentifier(envelope.acceptedRegion, \"acceptedRegion\");\n assertEconomyIdentifier(\n envelope.writerFencingToken,\n \"writerFencingToken\",\n );\n}\n\n/** Validates privacy-minimized provider evidence before immutable append. */\nexport function assertEconomyProviderEvidenceHash(\n evidence: EconomyProviderEvidenceHashV1,\n): void {\n assertExactKeys(\n evidence,\n new Set([\n \"schemaVersion\",\n \"providerEventId\",\n \"commandId\",\n \"provider\",\n \"providerObjectKeyFingerprint\",\n \"providerEventKeyFingerprint\",\n \"eventType\",\n \"payloadFingerprint\",\n \"reconciliationEvidenceFingerprint\",\n \"signatureScheme\",\n \"signatureVerifiedAt\",\n \"providerOccurredAt\",\n \"receivedAt\",\n \"operationalHandleBindingId\",\n ]),\n \"Economy provider evidence\",\n );\n economyAssert(\n evidence.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n PROVIDERS.has(evidence.provider),\n \"INVALID_CONTRACT\",\n \"Provider evidence contract or provider is unsupported\",\n );\n assertEconomyIdentifier(evidence.providerEventId, \"providerEventId\");\n assertEconomyIdentifier(evidence.commandId, \"commandId\");\n if (evidence.providerObjectKeyFingerprint !== undefined) {\n assertEconomyHmacFingerprint(\n evidence.providerObjectKeyFingerprint,\n \"economy.provider-object-key.v1\",\n );\n }\n assertEconomyHmacFingerprint(\n evidence.providerEventKeyFingerprint,\n \"economy.provider-event-key.v1\",\n );\n assertEconomyHmacFingerprint(\n evidence.payloadFingerprint,\n \"economy.provider-payload.v1\",\n );\n if (evidence.reconciliationEvidenceFingerprint !== undefined) {\n assertEconomyHmacFingerprint(\n evidence.reconciliationEvidenceFingerprint,\n \"economy.provider-reconciliation.v1\",\n );\n }\n assertSafeClassifier(evidence.eventType, \"Provider event type\");\n assertSafeClassifier(evidence.signatureScheme, \"Provider signature scheme\");\n const signatureVerifiedAt = parseIsoTimestamp(evidence.signatureVerifiedAt);\n const receivedAt = parseIsoTimestamp(evidence.receivedAt);\n if (evidence.providerOccurredAt !== undefined) {\n economyAssert(\n parseIsoTimestamp(evidence.providerOccurredAt) <= receivedAt,\n \"INVALID_TIME_WINDOW\",\n \"Provider occurrence cannot be after evidence receipt\",\n );\n }\n economyAssert(\n receivedAt >= signatureVerifiedAt,\n \"INVALID_TIME_WINDOW\",\n \"Provider evidence cannot be received before signature verification\",\n );\n if (evidence.operationalHandleBindingId !== undefined) {\n assertEconomyIdentifier(\n evidence.operationalHandleBindingId,\n \"operationalHandleBindingId\",\n );\n }\n}\n\n/** Validates a ledger binding for site-owned encrypted provider state. */\nexport function assertEconomyEncryptedOperationalHandleBinding(\n binding: EconomyEncryptedOperationalHandleBindingV1,\n): void {\n assertExactKeys(\n binding,\n new Set([\n \"schemaVersion\",\n \"handleBindingId\",\n \"commandId\",\n \"provider\",\n \"purpose\",\n \"cipherSuite\",\n \"keyVersion\",\n \"ciphertextContentHash\",\n \"encryptionContextHash\",\n \"createdAt\",\n ]),\n \"Encrypted operational-handle binding\",\n );\n economyAssert(\n binding.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n PROVIDERS.has(binding.provider) &&\n [\"reconciliation\", \"refund\", \"dispute\"].includes(binding.purpose) &&\n binding.cipherSuite === \"AES-256-GCM\",\n \"INVALID_CONTRACT\",\n \"Unsupported encrypted operational-handle binding\",\n );\n assertEconomyIdentifier(binding.handleBindingId, \"handleBindingId\");\n assertEconomyIdentifier(binding.commandId, \"commandId\");\n assertEconomyIdentifier(binding.keyVersion, \"keyVersion\");\n assertCanonicalHash(\n binding.ciphertextContentHash,\n \"Ciphertext content hash\",\n );\n assertCanonicalHash(\n binding.encryptionContextHash,\n \"Encryption-context hash\",\n );\n parseIsoTimestamp(binding.createdAt);\n}\n\nfunction assertEvidenceRecordReference(\n reference: EconomyEvidenceRecordReferenceV1,\n): void {\n assertExactKeys(\n reference,\n new Set([\"schemaVersion\", \"recordId\", \"contentHash\"]),\n \"Evidence record reference\",\n );\n economyAssert(\n reference.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported evidence-record reference\",\n );\n assertEconomyIdentifier(reference.recordId, \"evidence recordId\");\n assertCanonicalHash(reference.contentHash, \"Evidence content hash\");\n}\n\nfunction assertUniqueSortedReferences(\n references: readonly EconomyEvidenceRecordReferenceV1[],\n label: string,\n): void {\n economyAssert(\n references.length > 0,\n \"INVALID_CONTRACT\",\n `${label} must not be empty`,\n );\n let previousId: string | undefined;\n for (const reference of references) {\n assertEvidenceRecordReference(reference);\n economyAssert(\n previousId === undefined ||\n compareUnicodeCodeUnits(previousId, reference.recordId) < 0,\n \"INVALID_CONTRACT\",\n `${label} must have unique record IDs in canonical order`,\n );\n previousId = reference.recordId;\n }\n}\n\n/** Validates a canonical sanitized provider-evidence manifest. */\nexport function assertEconomyProviderEvidenceManifest(\n manifest: EconomyProviderEvidenceManifestV1,\n): void {\n assertExactKeys(\n manifest,\n new Set([\n \"schemaVersion\",\n \"evidenceManifestId\",\n \"commandId\",\n \"provider\",\n \"evidenceReferences\",\n \"operationalHandleReferences\",\n \"createdAt\",\n ]),\n \"Provider evidence manifest\",\n );\n economyAssert(\n manifest.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n PROVIDERS.has(manifest.provider),\n \"INVALID_CONTRACT\",\n \"Unsupported provider-evidence manifest\",\n );\n assertEconomyIdentifier(manifest.evidenceManifestId, \"evidenceManifestId\");\n assertEconomyIdentifier(manifest.commandId, \"commandId\");\n economyAssert(\n Array.isArray(manifest.evidenceReferences) &&\n Array.isArray(manifest.operationalHandleReferences),\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest references must be arrays\",\n );\n assertUniqueSortedReferences(\n manifest.evidenceReferences,\n \"Provider evidence references\",\n );\n let previousHandleId: string | undefined;\n for (const reference of manifest.operationalHandleReferences) {\n assertEvidenceRecordReference(reference);\n economyAssert(\n previousHandleId === undefined ||\n compareUnicodeCodeUnits(previousHandleId, reference.recordId) < 0,\n \"INVALID_CONTRACT\",\n \"Operational-handle references must have unique IDs in canonical order\",\n );\n previousHandleId = reference.recordId;\n }\n parseIsoTimestamp(manifest.createdAt);\n}\n\n/** Validates a client-safe durable-acceptance receipt. */\nexport function assertEconomyAcceptedCommandReceipt(\n receipt: EconomyAcceptedCommandReceiptV1,\n): void {\n assertExactKeys(\n receipt,\n new Set([\n \"schemaVersion\",\n \"receiptId\",\n \"commandId\",\n \"correlationId\",\n \"commandEnvelopeHash\",\n \"acceptedAt\",\n ]),\n \"Accepted-command receipt\",\n );\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported accepted-command receipt contract version\",\n );\n assertEconomyIdentifier(receipt.receiptId, \"receiptId\");\n assertEconomyIdentifier(receipt.commandId, \"commandId\");\n assertEconomyIdentifier(receipt.correlationId, \"correlationId\");\n assertCanonicalHash(receipt.commandEnvelopeHash, \"Command envelope hash\");\n parseIsoTimestamp(receipt.acceptedAt);\n}\n\n/** Validates the exclusive completed, failed, and no-op result shapes. */\nexport function assertEconomyCommandResultReceipt(\n receipt: EconomyCommandResultReceiptV1,\n): void {\n assertExactKeys(\n receipt,\n new Set([\n \"schemaVersion\",\n \"receiptId\",\n \"commandId\",\n \"correlationId\",\n \"acceptedReceiptId\",\n \"commandEnvelopeHash\",\n \"outcome\",\n \"resultHash\",\n \"transactionId\",\n \"transactionCanonicalHash\",\n \"failureCode\",\n \"noOpCode\",\n \"recordedAt\",\n ]),\n \"Command-result receipt\",\n );\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n [\"completed\", \"failed\", \"no-op\"].includes(receipt.outcome),\n \"INVALID_CONTRACT\",\n \"Unsupported command-result receipt contract or outcome\",\n );\n assertEconomyIdentifier(receipt.receiptId, \"receiptId\");\n assertEconomyIdentifier(receipt.commandId, \"commandId\");\n assertEconomyIdentifier(receipt.correlationId, \"correlationId\");\n assertEconomyIdentifier(receipt.acceptedReceiptId, \"acceptedReceiptId\");\n assertCanonicalHash(receipt.commandEnvelopeHash, \"Command envelope hash\");\n assertCanonicalHash(receipt.resultHash, \"Command result hash\");\n parseIsoTimestamp(receipt.recordedAt);\n\n if (receipt.outcome === \"completed\") {\n economyAssert(\n receipt.transactionId !== undefined &&\n receipt.transactionCanonicalHash !== undefined &&\n receipt.failureCode === undefined &&\n receipt.noOpCode === undefined,\n \"INVALID_CONTRACT\",\n \"Completed receipts require one transaction and no outcome code\",\n );\n assertEconomyIdentifier(receipt.transactionId, \"transactionId\");\n assertCanonicalHash(\n receipt.transactionCanonicalHash,\n \"Transaction canonical hash\",\n );\n } else if (receipt.outcome === \"failed\") {\n economyAssert(\n receipt.transactionId === undefined &&\n receipt.transactionCanonicalHash === undefined &&\n receipt.noOpCode === undefined &&\n typeof receipt.failureCode === \"string\" &&\n /^[A-Z][A-Z0-9_]{2,95}$/u.test(receipt.failureCode),\n \"INVALID_CONTRACT\",\n \"Failed receipts require only a bounded failure code\",\n );\n } else {\n economyAssert(\n receipt.transactionId === undefined &&\n receipt.transactionCanonicalHash === undefined &&\n receipt.failureCode === undefined &&\n typeof receipt.noOpCode === \"string\" &&\n /^[A-Z][A-Z0-9_]{2,95}$/u.test(receipt.noOpCode),\n \"INVALID_CONTRACT\",\n \"No-op receipts require only a bounded no-op code\",\n );\n }\n}\n\n/** Validates the raw-key-free idempotency namespace used by V3. */\nexport function assertEconomyAuditedIdempotencyScope(\n scope: EconomyAuditedIdempotencyScopeV1,\n): void {\n assertExactKeys(\n scope,\n new Set([\n \"schemaVersion\",\n \"idempotencyFingerprint\",\n \"commandType\",\n \"actorAccountId\",\n \"subjectAccountId\",\n \"principalType\",\n \"relationshipId\",\n \"authorizationVersion\",\n ]),\n \"Audited idempotency scope\",\n );\n economyAssert(\n scope.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n COMMAND_TYPES.has(scope.commandType) &&\n PRINCIPAL_TYPES.has(scope.principalType),\n \"INVALID_CONTRACT\",\n \"Unsupported audited idempotency scope\",\n );\n assertEconomyHmacFingerprint(\n scope.idempotencyFingerprint,\n \"economy.idempotency-key.v1\",\n );\n assertEconomyIdentifier(scope.actorAccountId, \"actorAccountId\");\n assertEconomyIdentifier(scope.subjectAccountId, \"subjectAccountId\");\n assertRelationshipContext(\n scope.relationshipId,\n scope.authorizationVersion,\n );\n}\n\n/** Validates an exact accepted or terminal V3 replay result. */\nexport function assertEconomyAuditedIdempotencyResult(\n result: EconomyAuditedIdempotencyResultV1,\n): void {\n assertExactKeys(\n result,\n new Set([\n \"schemaVersion\",\n \"commandId\",\n \"commandEnvelopeHash\",\n \"acceptedReceiptId\",\n \"resultReceiptId\",\n \"state\",\n \"responseHash\",\n \"recordedAt\",\n ]),\n \"Audited idempotency result\",\n );\n economyAssert(\n result.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n [\"accepted\", \"completed\", \"failed\", \"no-op\"].includes(result.state),\n \"INVALID_CONTRACT\",\n \"Unsupported audited idempotency result\",\n );\n assertEconomyIdentifier(result.commandId, \"commandId\");\n assertCanonicalHash(result.commandEnvelopeHash, \"Command envelope hash\");\n assertEconomyIdentifier(result.acceptedReceiptId, \"acceptedReceiptId\");\n economyAssert(\n (result.state === \"accepted\") ===\n (result.resultReceiptId === undefined),\n \"INVALID_CONTRACT\",\n \"Only terminal idempotency results require a result receipt\",\n );\n if (result.resultReceiptId !== undefined) {\n assertEconomyIdentifier(result.resultReceiptId, \"resultReceiptId\");\n }\n assertCanonicalHash(result.responseHash, \"Idempotency response hash\");\n parseIsoTimestamp(result.recordedAt);\n}\n\nfunction canonicalFingerprint(\n fingerprint: EconomyHmacFingerprintV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: fingerprint.schemaVersion,\n fingerprintVersion: fingerprint.fingerprintVersion,\n algorithm: fingerprint.algorithm,\n domain: fingerprint.domain,\n keyVersion: fingerprint.keyVersion,\n digest: fingerprint.digest,\n };\n}\n\nfunction canonicalAuthorizationEvidence(\n evidence: EconomyAuthorizationEvidenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: evidence.schemaVersion,\n capabilityEvidenceHash: evidence.capabilityEvidenceHash,\n featureFlagEvidenceHash: evidence.featureFlagEvidenceHash,\n assuranceEvidenceHash: evidence.assuranceEvidenceHash,\n authenticatedAt: evidence.authenticatedAt,\n authorizedAt: evidence.authorizedAt,\n };\n}\n\nfunction canonicalCausation(\n causation: EconomyCausationReferenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: causation.schemaVersion,\n kind: causation.kind,\n causationId: causation.causationId,\n };\n}\n\nfunction canonicalEvidenceReference(\n reference: EconomyEvidenceRecordReferenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: reference.schemaVersion,\n recordId: reference.recordId,\n contentHash: reference.contentHash,\n };\n}\n\n/**\n * Produces deterministic UTF-8 JSON for an audited-command hash adapter.\n * The legacy transaction canonical payload remains a separate stable format.\n */\nexport function canonicalAuditedEconomyCommandEnvelopePayload(\n envelope: AuditedEconomyCommandEnvelopeV1,\n): string {\n assertAuditedEconomyCommandEnvelope(envelope);\n return JSON.stringify({\n schemaVersion: envelope.schemaVersion,\n commandId: envelope.commandId,\n commandType: envelope.commandType,\n commandSource: envelope.commandSource,\n idempotencyFingerprint: canonicalFingerprint(\n envelope.idempotencyFingerprint,\n ),\n actorAccountId: envelope.actorAccountId,\n subjectAccountId: envelope.subjectAccountId,\n principalType: envelope.principalType,\n ...(envelope.relationshipId === undefined\n ? {}\n : { relationshipId: envelope.relationshipId }),\n ...(envelope.authorizationVersion === undefined\n ? {}\n : { authorizationVersion: envelope.authorizationVersion }),\n authorizationEvidence: canonicalAuthorizationEvidence(\n envelope.authorizationEvidence,\n ),\n routeId: envelope.routeId,\n buildId: envelope.buildId,\n correlationId: envelope.correlationId,\n ...(envelope.causation === undefined\n ? {}\n : { causation: canonicalCausation(envelope.causation) }),\n payloadHash: envelope.payloadHash,\n ...(envelope.providerEvidenceManifestHash === undefined\n ? {}\n : {\n providerEvidenceManifestHash:\n envelope.providerEvidenceManifestHash,\n }),\n acceptedAt: envelope.acceptedAt,\n acceptedRegion: envelope.acceptedRegion,\n writerFencingToken: envelope.writerFencingToken,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for privacy-minimized provider evidence. */\nexport function canonicalEconomyProviderEvidenceHashPayload(\n evidence: EconomyProviderEvidenceHashV1,\n): string {\n assertEconomyProviderEvidenceHash(evidence);\n return JSON.stringify({\n schemaVersion: evidence.schemaVersion,\n providerEventId: evidence.providerEventId,\n commandId: evidence.commandId,\n provider: evidence.provider,\n ...(evidence.providerObjectKeyFingerprint === undefined\n ? {}\n : {\n providerObjectKeyFingerprint: canonicalFingerprint(\n evidence.providerObjectKeyFingerprint,\n ),\n }),\n providerEventKeyFingerprint: canonicalFingerprint(\n evidence.providerEventKeyFingerprint,\n ),\n eventType: evidence.eventType,\n payloadFingerprint: canonicalFingerprint(evidence.payloadFingerprint),\n ...(evidence.reconciliationEvidenceFingerprint === undefined\n ? {}\n : {\n reconciliationEvidenceFingerprint: canonicalFingerprint(\n evidence.reconciliationEvidenceFingerprint,\n ),\n }),\n signatureScheme: evidence.signatureScheme,\n signatureVerifiedAt: evidence.signatureVerifiedAt,\n ...(evidence.providerOccurredAt === undefined\n ? {}\n : { providerOccurredAt: evidence.providerOccurredAt }),\n receivedAt: evidence.receivedAt,\n ...(evidence.operationalHandleBindingId === undefined\n ? {}\n : {\n operationalHandleBindingId:\n evidence.operationalHandleBindingId,\n }),\n });\n}\n\n/** Produces deterministic UTF-8 JSON for an encrypted-handle binding. */\nexport function canonicalEconomyEncryptedOperationalHandleBindingPayload(\n binding: EconomyEncryptedOperationalHandleBindingV1,\n): string {\n assertEconomyEncryptedOperationalHandleBinding(binding);\n return JSON.stringify({\n schemaVersion: binding.schemaVersion,\n handleBindingId: binding.handleBindingId,\n commandId: binding.commandId,\n provider: binding.provider,\n purpose: binding.purpose,\n cipherSuite: binding.cipherSuite,\n keyVersion: binding.keyVersion,\n ciphertextContentHash: binding.ciphertextContentHash,\n encryptionContextHash: binding.encryptionContextHash,\n createdAt: binding.createdAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for a sanitized evidence manifest. */\nexport function canonicalEconomyProviderEvidenceManifestPayload(\n manifest: EconomyProviderEvidenceManifestV1,\n): string {\n assertEconomyProviderEvidenceManifest(manifest);\n return JSON.stringify({\n schemaVersion: manifest.schemaVersion,\n evidenceManifestId: manifest.evidenceManifestId,\n commandId: manifest.commandId,\n provider: manifest.provider,\n evidenceReferences: manifest.evidenceReferences.map(\n canonicalEvidenceReference,\n ),\n operationalHandleReferences: manifest.operationalHandleReferences.map(\n canonicalEvidenceReference,\n ),\n createdAt: manifest.createdAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for a privacy-safe accepted receipt. */\nexport function canonicalEconomyAcceptedCommandReceiptPayload(\n receipt: EconomyAcceptedCommandReceiptV1,\n): string {\n assertEconomyAcceptedCommandReceipt(receipt);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n receiptId: receipt.receiptId,\n commandId: receipt.commandId,\n correlationId: receipt.correlationId,\n commandEnvelopeHash: receipt.commandEnvelopeHash,\n acceptedAt: receipt.acceptedAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for a terminal command receipt. */\nexport function canonicalEconomyCommandResultReceiptPayload(\n receipt: EconomyCommandResultReceiptV1,\n): string {\n assertEconomyCommandResultReceipt(receipt);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n receiptId: receipt.receiptId,\n commandId: receipt.commandId,\n correlationId: receipt.correlationId,\n acceptedReceiptId: receipt.acceptedReceiptId,\n commandEnvelopeHash: receipt.commandEnvelopeHash,\n outcome: receipt.outcome,\n resultHash: receipt.resultHash,\n ...(receipt.transactionId === undefined\n ? {}\n : { transactionId: receipt.transactionId }),\n ...(receipt.transactionCanonicalHash === undefined\n ? {}\n : { transactionCanonicalHash: receipt.transactionCanonicalHash }),\n ...(receipt.failureCode === undefined\n ? {}\n : { failureCode: receipt.failureCode }),\n ...(receipt.noOpCode === undefined\n ? {}\n : { noOpCode: receipt.noOpCode }),\n recordedAt: receipt.recordedAt,\n });\n}\n\n/**\n * Rejects a replay candidate unless every canonical accepted-command byte\n * matches. Processing mode is intentionally external to the envelope, so the\n * original command source remains unchanged on replay.\n */\nexport function assertExactAuditedEconomyCommandReplay(\n existing: AuditedEconomyCommandEnvelopeV1,\n candidate: AuditedEconomyCommandEnvelopeV1,\n): void {\n economyAssert(\n canonicalAuditedEconomyCommandEnvelopePayload(existing) ===\n canonicalAuditedEconomyCommandEnvelopePayload(candidate),\n \"DUPLICATE_IDENTIFIER\",\n \"Idempotency fingerprint collision does not match the canonical command\",\n );\n}\n","import { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { CanonicalPayloadHashFunctionV1 } from \"./integrity.js\";\n\n/** Application ceiling below Cosmos DB's 100-operation transactional limit. */\nexport const ECONOMY_AUTHORITY_MAX_BATCH_OPERATIONS = 80;\n\n/** Commit-manifest create plus authority-head conditional replacement. */\nexport const ECONOMY_AUTHORITY_COMMIT_OVERHEAD_OPERATIONS = 2;\n\n/** Maximum referenced record writes within one 80-operation authority batch. */\nexport const ECONOMY_AUTHORITY_MAX_RECORD_REFERENCES =\n ECONOMY_AUTHORITY_MAX_BATCH_OPERATIONS -\n ECONOMY_AUTHORITY_COMMIT_OVERHEAD_OPERATIONS;\n\n/** Application ceiling below Cosmos DB's 2 MiB transactional-batch limit. */\nexport const ECONOMY_AUTHORITY_MAX_BATCH_BYTES = 1_572_864;\n\n/** Validates adapter-measured transactional operation and byte counts. */\nexport function assertEconomyAuthorityBatchLimits(\n operationCount: number,\n serializedBytes: number,\n): void {\n economyAssert(\n Number.isSafeInteger(operationCount) &&\n operationCount >=\n ECONOMY_AUTHORITY_COMMIT_OVERHEAD_OPERATIONS + 1 &&\n operationCount <= ECONOMY_AUTHORITY_MAX_BATCH_OPERATIONS,\n \"INVALID_CONTRACT\",\n \"Authority batch operation count exceeds the application boundary\",\n );\n economyAssert(\n Number.isSafeInteger(serializedBytes) &&\n serializedBytes > 0 &&\n serializedBytes <= ECONOMY_AUTHORITY_MAX_BATCH_BYTES,\n \"INVALID_CONTRACT\",\n \"Authority batch serialized size exceeds the application boundary\",\n );\n}\n\nexport type EconomyAuthorityStateV1 =\n | \"open\"\n | \"acquisition-closed\"\n | \"closed\"\n | \"rebuilding\";\n\nexport type EconomyAuthorityCommitKindV1 =\n | \"genesis\"\n | \"first-party-command\"\n | \"provider-acceptance\"\n | \"provider-result\"\n | \"integrity-verification\"\n | \"state-transition\"\n | \"writer-fence-transition\"\n | \"reconstruction\";\n\nexport type EconomyAuthorityRecordKindV1 =\n | \"command-envelope\"\n | \"provider-evidence-manifest\"\n | \"provider-evidence\"\n | \"operational-handle-binding\"\n | \"workflow-event\"\n | \"accepted-receipt\"\n | \"result-receipt\"\n | \"journal-transaction\"\n | \"source-lot\"\n | \"source-lot-movement\"\n | \"gameplay-allocation\"\n | \"wallet\"\n | \"balance-projection\"\n | \"lifetime-projection\"\n | \"idempotency-result\"\n | \"outbox-event\"\n | \"work-item\"\n | \"dead-letter\"\n | \"integrity-receipt\"\n | \"integrity-anchor\";\n\nexport type EconomyAuthorityWriteKindV1 =\n | \"create\"\n | \"conditional-replace\";\n\n/**\n * Canonical reference to one record created or conditionally replaced by an\n * authority commit. Conditional replacements bind the previous content and a\n * hash of the adapter's optimistic-concurrency token; unconditional replacement\n * has no representation.\n */\nexport interface EconomyAuthorityRecordReferenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recordKind: EconomyAuthorityRecordKindV1;\n readonly recordId: string;\n readonly writeKind: EconomyAuthorityWriteKindV1;\n readonly contentHash: string;\n readonly previousContentHash?: string;\n readonly expectedConcurrencyTokenHash?: string;\n}\n\n/**\n * Immutable, hash-linked record of one authoritative atomic boundary.\n *\n * First-party commands carry acceptance and terminal effects in one manifest.\n * Provider commands use a provider-acceptance manifest followed by a\n * provider-result manifest after external reconciliation.\n */\nexport interface EconomyAuthorityCommitManifestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commitId: string;\n readonly authorityId: string;\n readonly sequence: string;\n readonly commitKind: EconomyAuthorityCommitKindV1;\n readonly previousCommitHash?: string;\n readonly commandId?: string;\n readonly correlationId?: string;\n readonly authorityStateBefore: EconomyAuthorityStateV1;\n readonly authorityStateAfter: EconomyAuthorityStateV1;\n readonly stateReasonCode?: string;\n readonly recoveryVerificationReceiptId?: string;\n readonly recoveryVerificationReceiptHash?: string;\n readonly dualApprovalEvidenceHash?: string;\n readonly writerRegion: string;\n readonly writerFencingToken: string;\n readonly recordReferences: readonly EconomyAuthorityRecordReferenceV1[];\n readonly committedAt: IsoTimestamp;\n}\n\n/** Compare-and-swap projection for the singleton authority head. */\nexport interface EconomyAuthorityHeadV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly authorityId: string;\n readonly version: string;\n readonly state: EconomyAuthorityStateV1;\n readonly lastCommitId?: string;\n readonly lastCommitHash?: string;\n readonly writerRegion: string;\n readonly writerFencingToken: string;\n readonly updatedAt: IsoTimestamp;\n}\n\n/** Manifest plus the canonical hash calculated by an approved adapter. */\nexport interface HashedEconomyAuthorityCommitManifestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly manifest: EconomyAuthorityCommitManifestV1;\n readonly canonicalHash: string;\n}\n\nexport type EconomyIntegrityVerificationStatusV1 = \"valid\" | \"invalid\";\n\nexport type EconomyIntegrityFailureCodeV1 =\n | \"authority-head-mismatch\"\n | \"commit-hash-mismatch\"\n | \"commit-link-mismatch\"\n | \"record-hash-mismatch\"\n | \"journal-head-mismatch\"\n | \"projection-mismatch\";\n\n/** Immutable, privacy-safe evidence of one bounded integrity verification. */\nexport interface EconomyIntegrityVerificationReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly verificationId: string;\n readonly authorityId: string;\n readonly status: EconomyIntegrityVerificationStatusV1;\n readonly checkedThroughSequence: string;\n readonly checkedCommits: string;\n readonly checkedRecords: string;\n readonly expectedAuthorityHeadHash: string;\n readonly observedAuthorityHeadHash: string;\n readonly expectedJournalHeadHash?: string;\n readonly observedJournalHeadHash?: string;\n readonly expectedProjectionSetHash?: string;\n readonly observedProjectionSetHash?: string;\n readonly anchorManifestHash?: string;\n readonly failureCode?: EconomyIntegrityFailureCodeV1;\n readonly firstInvalidCommitId?: string;\n readonly firstInvalidRecordId?: string;\n readonly verifiedAt: IsoTimestamp;\n}\n\n/**\n * Canonical hourly Merkle-root manifest. Signing and storage are deliberately\n * infrastructure responsibilities; this contract contains no private key,\n * signature, storage URI, or administrator-proof claim.\n */\nexport interface EconomyIntegrityAnchorManifestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly anchorId: string;\n readonly authorityId: string;\n readonly firstCommitSequence: string;\n readonly lastCommitSequence: string;\n readonly leafCount: string;\n readonly merkleRootHash: string;\n readonly authorityHeadHash: string;\n readonly producedAt: IsoTimestamp;\n}\n\nconst AUTHORITY_STATES = new Set<EconomyAuthorityStateV1>([\n \"open\",\n \"acquisition-closed\",\n \"closed\",\n \"rebuilding\",\n]);\n\nconst COMMIT_KINDS = new Set<EconomyAuthorityCommitKindV1>([\n \"genesis\",\n \"first-party-command\",\n \"provider-acceptance\",\n \"provider-result\",\n \"integrity-verification\",\n \"state-transition\",\n \"writer-fence-transition\",\n \"reconstruction\",\n]);\n\nconst RECORD_KINDS = new Set<EconomyAuthorityRecordKindV1>([\n \"command-envelope\",\n \"provider-evidence-manifest\",\n \"provider-evidence\",\n \"operational-handle-binding\",\n \"workflow-event\",\n \"accepted-receipt\",\n \"result-receipt\",\n \"journal-transaction\",\n \"source-lot\",\n \"source-lot-movement\",\n \"gameplay-allocation\",\n \"wallet\",\n \"balance-projection\",\n \"lifetime-projection\",\n \"idempotency-result\",\n \"outbox-event\",\n \"work-item\",\n \"dead-letter\",\n \"integrity-receipt\",\n \"integrity-anchor\",\n]);\n\nconst INTEGRITY_FAILURE_CODES = new Set<EconomyIntegrityFailureCodeV1>([\n \"authority-head-mismatch\",\n \"commit-hash-mismatch\",\n \"commit-link-mismatch\",\n \"record-hash-mismatch\",\n \"journal-head-mismatch\",\n \"projection-mismatch\",\n]);\n\nconst HEAD_KEYS = new Set([\n \"schemaVersion\",\n \"authorityId\",\n \"version\",\n \"state\",\n \"lastCommitId\",\n \"lastCommitHash\",\n \"writerRegion\",\n \"writerFencingToken\",\n \"updatedAt\",\n]);\n\nconst MANIFEST_KEYS = new Set([\n \"schemaVersion\",\n \"commitId\",\n \"authorityId\",\n \"sequence\",\n \"commitKind\",\n \"previousCommitHash\",\n \"commandId\",\n \"correlationId\",\n \"authorityStateBefore\",\n \"authorityStateAfter\",\n \"stateReasonCode\",\n \"recoveryVerificationReceiptId\",\n \"recoveryVerificationReceiptHash\",\n \"dualApprovalEvidenceHash\",\n \"writerRegion\",\n \"writerFencingToken\",\n \"recordReferences\",\n \"committedAt\",\n]);\n\nfunction assertExactKeys(\n value: object,\n allowedKeys: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowedKeys.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported field`,\n );\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction assertCanonicalUnsignedInteger(\n value: string,\n label: string,\n): void {\n economyAssert(\n typeof value === \"string\" && /^(?:0|[1-9][0-9]{0,38})$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical unsigned integer`,\n );\n}\n\nfunction assertSafeReasonCode(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^[A-Z][A-Z0-9_]{2,95}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a bounded uppercase reason code`,\n );\n}\n\nfunction referenceOrder(\n left: EconomyAuthorityRecordReferenceV1,\n right: EconomyAuthorityRecordReferenceV1,\n): number {\n const byKind = compareUnicodeCodeUnits(left.recordKind, right.recordKind);\n return byKind === 0\n ? compareUnicodeCodeUnits(left.recordId, right.recordId)\n : byKind;\n}\n\n/** Validates one create-only or optimistic conditional-replace reference. */\nexport function assertEconomyAuthorityRecordReference(\n reference: EconomyAuthorityRecordReferenceV1,\n): void {\n assertExactKeys(\n reference,\n new Set([\n \"schemaVersion\",\n \"recordKind\",\n \"recordId\",\n \"writeKind\",\n \"contentHash\",\n \"previousContentHash\",\n \"expectedConcurrencyTokenHash\",\n ]),\n \"Authority record reference\",\n );\n economyAssert(\n reference.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n RECORD_KINDS.has(reference.recordKind) &&\n [\"create\", \"conditional-replace\"].includes(reference.writeKind),\n \"INVALID_CONTRACT\",\n \"Unsupported authority record reference\",\n );\n assertEconomyIdentifier(reference.recordId, \"authority recordId\");\n assertCanonicalHash(reference.contentHash, \"Authority record content hash\");\n if (reference.writeKind === \"create\") {\n economyAssert(\n reference.previousContentHash === undefined &&\n reference.expectedConcurrencyTokenHash === undefined,\n \"INVALID_CONTRACT\",\n \"Create references cannot carry replacement concurrency evidence\",\n );\n } else {\n economyAssert(\n reference.previousContentHash !== undefined &&\n reference.expectedConcurrencyTokenHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Conditional replacements require prior content and concurrency hashes\",\n );\n assertCanonicalHash(\n reference.previousContentHash,\n \"Previous record content hash\",\n );\n assertCanonicalHash(\n reference.expectedConcurrencyTokenHash,\n \"Expected concurrency-token hash\",\n );\n }\n}\n\nfunction assertCanonicalRecordReferences(\n references: readonly EconomyAuthorityRecordReferenceV1[],\n): void {\n economyAssert(\n references.length > 0 &&\n references.length <= ECONOMY_AUTHORITY_MAX_RECORD_REFERENCES,\n \"INVALID_CONTRACT\",\n `Authority commits require between 1 and ${ECONOMY_AUTHORITY_MAX_RECORD_REFERENCES} record references`,\n );\n let previous: EconomyAuthorityRecordReferenceV1 | undefined;\n for (const reference of references) {\n assertEconomyAuthorityRecordReference(reference);\n economyAssert(\n previous === undefined || referenceOrder(previous, reference) < 0,\n \"INVALID_CONTRACT\",\n \"Authority record references must be unique and canonically ordered\",\n );\n previous = reference;\n }\n}\n\nfunction assertCommitCommandBinding(\n manifest: EconomyAuthorityCommitManifestV1,\n): void {\n const commandCommit = [\n \"first-party-command\",\n \"provider-acceptance\",\n \"provider-result\",\n ].includes(manifest.commitKind);\n economyAssert(\n commandCommit\n ? manifest.commandId !== undefined &&\n manifest.correlationId !== undefined\n : manifest.commandId === undefined &&\n manifest.correlationId === undefined,\n \"INVALID_CONTRACT\",\n \"Only command commits require command and correlation identifiers\",\n );\n if (manifest.commandId !== undefined) {\n assertEconomyIdentifier(manifest.commandId, \"commandId\");\n assertEconomyIdentifier(manifest.correlationId!, \"correlationId\");\n }\n}\n\nfunction assertStateTransitionEvidence(\n manifest: EconomyAuthorityCommitManifestV1,\n): void {\n const changesState =\n manifest.authorityStateBefore !== manifest.authorityStateAfter;\n economyAssert(\n (manifest.commitKind === \"state-transition\") === changesState,\n \"INVALID_CONTRACT\",\n \"Only state-transition commits may change authority state\",\n );\n if (manifest.commitKind === \"state-transition\") {\n economyAssert(\n manifest.stateReasonCode !== undefined,\n \"INVALID_CONTRACT\",\n \"Authority state transitions require a reason code\",\n );\n assertSafeReasonCode(\n manifest.stateReasonCode,\n \"Authority state-transition reason\",\n );\n const allowedTransition =\n (manifest.authorityStateBefore === \"open\" &&\n (manifest.authorityStateAfter === \"acquisition-closed\" ||\n manifest.authorityStateAfter === \"closed\")) ||\n (manifest.authorityStateBefore === \"acquisition-closed\" &&\n (manifest.authorityStateAfter === \"closed\" ||\n manifest.authorityStateAfter === \"open\")) ||\n (manifest.authorityStateBefore === \"closed\" &&\n manifest.authorityStateAfter === \"rebuilding\") ||\n (manifest.authorityStateBefore === \"rebuilding\" &&\n (manifest.authorityStateAfter === \"closed\" ||\n manifest.authorityStateAfter === \"open\"));\n economyAssert(\n allowedTransition,\n \"INVALID_CONTRACT\",\n \"Authority state transition is not permitted\",\n );\n if (\n manifest.authorityStateAfter === \"open\" &&\n manifest.authorityStateBefore !== \"open\"\n ) {\n economyAssert(\n (manifest.authorityStateBefore === \"rebuilding\" ||\n manifest.authorityStateBefore === \"acquisition-closed\") &&\n manifest.recoveryVerificationReceiptId !== undefined &&\n manifest.recoveryVerificationReceiptHash !== undefined &&\n manifest.dualApprovalEvidenceHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Reopening requires a recoverable state, fresh verification, and dual approval\",\n );\n assertEconomyIdentifier(\n manifest.recoveryVerificationReceiptId,\n \"recoveryVerificationReceiptId\",\n );\n assertCanonicalHash(\n manifest.recoveryVerificationReceiptHash,\n \"Recovery verification-receipt hash\",\n );\n assertCanonicalHash(\n manifest.dualApprovalEvidenceHash,\n \"Dual-approval evidence hash\",\n );\n } else {\n economyAssert(\n manifest.recoveryVerificationReceiptId === undefined &&\n manifest.recoveryVerificationReceiptHash === undefined &&\n manifest.dualApprovalEvidenceHash === undefined,\n \"INVALID_CONTRACT\",\n \"Recovery evidence is only valid when reopening from rebuilding\",\n );\n }\n } else if (manifest.commitKind === \"writer-fence-transition\") {\n economyAssert(\n manifest.stateReasonCode !== undefined &&\n manifest.recoveryVerificationReceiptId === undefined &&\n manifest.recoveryVerificationReceiptHash === undefined &&\n manifest.dualApprovalEvidenceHash === undefined,\n \"INVALID_CONTRACT\",\n \"Writer-fence transitions require only a reason code\",\n );\n assertSafeReasonCode(\n manifest.stateReasonCode,\n \"Writer-fence transition reason\",\n );\n } else {\n economyAssert(\n manifest.stateReasonCode === undefined &&\n manifest.recoveryVerificationReceiptId === undefined &&\n manifest.recoveryVerificationReceiptHash === undefined &&\n manifest.dualApprovalEvidenceHash === undefined,\n \"INVALID_CONTRACT\",\n \"Non-transition commits cannot carry transition evidence\",\n );\n }\n}\n\nfunction assertCommitAllowedInState(\n manifest: EconomyAuthorityCommitManifestV1,\n): void {\n const state = manifest.authorityStateBefore;\n if (\n manifest.commitKind === \"first-party-command\" ||\n manifest.commitKind === \"provider-acceptance\"\n ) {\n economyAssert(\n state === \"open\",\n \"INVALID_CONTRACT\",\n \"New commands and provider acceptance require an open authority\",\n );\n } else if (manifest.commitKind === \"provider-result\") {\n economyAssert(\n state === \"open\" || state === \"acquisition-closed\",\n \"INVALID_CONTRACT\",\n \"Provider results require an open or acquisition-closed authority\",\n );\n } else if (manifest.commitKind === \"reconstruction\") {\n economyAssert(\n state === \"rebuilding\",\n \"INVALID_CONTRACT\",\n \"Reconstruction commits require rebuilding state\",\n );\n }\n}\n\n/** Validates one immutable authority commit manifest. */\nexport function assertEconomyAuthorityCommitManifest(\n manifest: EconomyAuthorityCommitManifestV1,\n): void {\n assertExactKeys(manifest, MANIFEST_KEYS, \"Authority commit manifest\");\n economyAssert(\n manifest.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n COMMIT_KINDS.has(manifest.commitKind) &&\n AUTHORITY_STATES.has(manifest.authorityStateBefore) &&\n AUTHORITY_STATES.has(manifest.authorityStateAfter),\n \"INVALID_CONTRACT\",\n \"Unsupported authority commit manifest\",\n );\n assertEconomyIdentifier(manifest.commitId, \"commitId\");\n assertEconomyIdentifier(manifest.authorityId, \"authorityId\");\n assertCanonicalUnsignedInteger(manifest.sequence, \"Commit sequence\");\n economyAssert(\n manifest.sequence !== \"0\",\n \"INVALID_CONTRACT\",\n \"Authority commit sequence must be positive\",\n );\n if (manifest.previousCommitHash !== undefined) {\n assertCanonicalHash(\n manifest.previousCommitHash,\n \"Previous authority commit hash\",\n );\n }\n economyAssert(\n (manifest.sequence === \"1\") ===\n (manifest.previousCommitHash === undefined),\n \"INVALID_CONTRACT\",\n \"Only the first authority commit omits its previous hash\",\n );\n economyAssert(\n (manifest.commitKind === \"genesis\") === (manifest.sequence === \"1\"),\n \"INVALID_CONTRACT\",\n \"The first authority commit must be the unique genesis commit\",\n );\n economyAssert(\n Array.isArray(manifest.recordReferences),\n \"INVALID_CONTRACT\",\n \"Authority record references must be an array\",\n );\n assertCommitCommandBinding(manifest);\n assertStateTransitionEvidence(manifest);\n assertCommitAllowedInState(manifest);\n assertEconomyIdentifier(manifest.writerRegion, \"writerRegion\");\n assertEconomyIdentifier(\n manifest.writerFencingToken,\n \"writerFencingToken\",\n );\n assertCanonicalRecordReferences(manifest.recordReferences);\n parseIsoTimestamp(manifest.committedAt);\n}\n\n/** Validates an empty or populated singleton authority head. */\nexport function assertEconomyAuthorityHead(\n head: EconomyAuthorityHeadV1,\n): void {\n assertExactKeys(head, HEAD_KEYS, \"Economy authority head\");\n economyAssert(\n head.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n AUTHORITY_STATES.has(head.state),\n \"INVALID_CONTRACT\",\n \"Unsupported economy authority head\",\n );\n assertEconomyIdentifier(head.authorityId, \"authorityId\");\n assertCanonicalUnsignedInteger(head.version, \"Authority-head version\");\n const hasCommitId = head.lastCommitId !== undefined;\n const hasCommitHash = head.lastCommitHash !== undefined;\n economyAssert(\n hasCommitId === hasCommitHash &&\n (head.version !== \"0\") === hasCommitId,\n \"INVALID_CONTRACT\",\n \"Authority-head version and last-commit fields are inconsistent\",\n );\n if (head.lastCommitId !== undefined) {\n assertEconomyIdentifier(head.lastCommitId, \"lastCommitId\");\n assertCanonicalHash(head.lastCommitHash!, \"Last commit hash\");\n }\n assertEconomyIdentifier(head.writerRegion, \"writerRegion\");\n assertEconomyIdentifier(\n head.writerFencingToken,\n \"writerFencingToken\",\n );\n parseIsoTimestamp(head.updatedAt);\n}\n\n/**\n * Proves that a canonical manifest advances the locked singleton authority\n * head by exactly one sequence and returns the compare-and-swap replacement.\n */\nexport function advanceEconomyAuthorityHead(\n head: EconomyAuthorityHeadV1,\n manifest: EconomyAuthorityCommitManifestV1,\n manifestCanonicalHash: string,\n): EconomyAuthorityHeadV1 {\n assertEconomyAuthorityHead(head);\n assertEconomyAuthorityCommitManifest(manifest);\n assertCanonicalHash(manifestCanonicalHash, \"Authority manifest hash\");\n economyAssert(\n manifest.authorityId === head.authorityId &&\n BigInt(manifest.sequence) === BigInt(head.version) + 1n &&\n manifest.previousCommitHash === head.lastCommitHash &&\n manifest.authorityStateBefore === head.state,\n \"INVALID_CONTRACT\",\n \"Authority manifest does not extend the locked head\",\n );\n const fenceTransition = manifest.commitKind === \"writer-fence-transition\";\n economyAssert(\n fenceTransition\n ? manifest.writerRegion !== head.writerRegion ||\n manifest.writerFencingToken !== head.writerFencingToken\n : manifest.writerRegion === head.writerRegion &&\n manifest.writerFencingToken === head.writerFencingToken,\n \"INVALID_CONTRACT\",\n \"Authority writer identity may change only through a fence transition\",\n );\n economyAssert(\n parseIsoTimestamp(manifest.committedAt) >=\n parseIsoTimestamp(head.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Authority commit cannot precede the locked head\",\n );\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n authorityId: head.authorityId,\n version: manifest.sequence,\n state: manifest.authorityStateAfter,\n lastCommitId: manifest.commitId,\n lastCommitHash: manifestCanonicalHash,\n writerRegion: manifest.writerRegion,\n writerFencingToken: manifest.writerFencingToken,\n updatedAt: manifest.committedAt,\n };\n}\n\n/** Validates one append-only result from a bounded integrity check. */\nexport function assertEconomyIntegrityVerificationReceipt(\n receipt: EconomyIntegrityVerificationReceiptV1,\n): void {\n assertExactKeys(\n receipt,\n new Set([\n \"schemaVersion\",\n \"verificationId\",\n \"authorityId\",\n \"status\",\n \"checkedThroughSequence\",\n \"checkedCommits\",\n \"checkedRecords\",\n \"expectedAuthorityHeadHash\",\n \"observedAuthorityHeadHash\",\n \"expectedJournalHeadHash\",\n \"observedJournalHeadHash\",\n \"expectedProjectionSetHash\",\n \"observedProjectionSetHash\",\n \"anchorManifestHash\",\n \"failureCode\",\n \"firstInvalidCommitId\",\n \"firstInvalidRecordId\",\n \"verifiedAt\",\n ]),\n \"Integrity-verification receipt\",\n );\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n [\"valid\", \"invalid\"].includes(receipt.status),\n \"INVALID_CONTRACT\",\n \"Unsupported integrity-verification receipt\",\n );\n assertEconomyIdentifier(receipt.verificationId, \"verificationId\");\n assertEconomyIdentifier(receipt.authorityId, \"authorityId\");\n assertCanonicalUnsignedInteger(\n receipt.checkedThroughSequence,\n \"Checked-through sequence\",\n );\n assertCanonicalUnsignedInteger(receipt.checkedCommits, \"Checked commits\");\n assertCanonicalUnsignedInteger(receipt.checkedRecords, \"Checked records\");\n assertCanonicalHash(\n receipt.expectedAuthorityHeadHash,\n \"Expected authority-head hash\",\n );\n assertCanonicalHash(\n receipt.observedAuthorityHeadHash,\n \"Observed authority-head hash\",\n );\n const journalPair =\n receipt.expectedJournalHeadHash !== undefined ||\n receipt.observedJournalHeadHash !== undefined;\n economyAssert(\n !journalPair ||\n (receipt.expectedJournalHeadHash !== undefined &&\n receipt.observedJournalHeadHash !== undefined),\n \"INVALID_CONTRACT\",\n \"Journal integrity hashes must be supplied together\",\n );\n if (receipt.expectedJournalHeadHash !== undefined) {\n assertCanonicalHash(\n receipt.expectedJournalHeadHash,\n \"Expected journal-head hash\",\n );\n assertCanonicalHash(\n receipt.observedJournalHeadHash!,\n \"Observed journal-head hash\",\n );\n }\n const projectionPair =\n receipt.expectedProjectionSetHash !== undefined ||\n receipt.observedProjectionSetHash !== undefined;\n economyAssert(\n !projectionPair ||\n (receipt.expectedProjectionSetHash !== undefined &&\n receipt.observedProjectionSetHash !== undefined),\n \"INVALID_CONTRACT\",\n \"Projection integrity hashes must be supplied together\",\n );\n if (receipt.expectedProjectionSetHash !== undefined) {\n assertCanonicalHash(\n receipt.expectedProjectionSetHash,\n \"Expected projection-set hash\",\n );\n assertCanonicalHash(\n receipt.observedProjectionSetHash!,\n \"Observed projection-set hash\",\n );\n }\n if (receipt.anchorManifestHash !== undefined) {\n assertCanonicalHash(\n receipt.anchorManifestHash,\n \"Integrity anchor manifest hash\",\n );\n }\n if (receipt.firstInvalidCommitId !== undefined) {\n assertEconomyIdentifier(\n receipt.firstInvalidCommitId,\n \"firstInvalidCommitId\",\n );\n }\n if (receipt.firstInvalidRecordId !== undefined) {\n assertEconomyIdentifier(\n receipt.firstInvalidRecordId,\n \"firstInvalidRecordId\",\n );\n }\n if (receipt.status === \"valid\") {\n economyAssert(\n receipt.failureCode === undefined &&\n receipt.firstInvalidCommitId === undefined &&\n receipt.firstInvalidRecordId === undefined &&\n receipt.expectedAuthorityHeadHash ===\n receipt.observedAuthorityHeadHash &&\n (receipt.expectedJournalHeadHash === undefined ||\n receipt.expectedJournalHeadHash ===\n receipt.observedJournalHeadHash) &&\n (receipt.expectedProjectionSetHash === undefined ||\n receipt.expectedProjectionSetHash ===\n receipt.observedProjectionSetHash),\n \"INVALID_CONTRACT\",\n \"Valid integrity receipts cannot contain mismatches\",\n );\n } else {\n economyAssert(\n receipt.failureCode !== undefined &&\n INTEGRITY_FAILURE_CODES.has(receipt.failureCode),\n \"INVALID_CONTRACT\",\n \"Invalid integrity receipts require a safe failure code\",\n );\n if (receipt.failureCode === \"authority-head-mismatch\") {\n economyAssert(\n receipt.expectedAuthorityHeadHash !==\n receipt.observedAuthorityHeadHash,\n \"INVALID_CONTRACT\",\n \"Authority-head mismatch requires different head hashes\",\n );\n }\n if (receipt.failureCode === \"journal-head-mismatch\") {\n economyAssert(\n receipt.expectedJournalHeadHash !== undefined &&\n receipt.expectedJournalHeadHash !==\n receipt.observedJournalHeadHash,\n \"INVALID_CONTRACT\",\n \"Journal-head mismatch requires different journal hashes\",\n );\n }\n if (receipt.failureCode === \"projection-mismatch\") {\n economyAssert(\n receipt.expectedProjectionSetHash !== undefined &&\n receipt.expectedProjectionSetHash !==\n receipt.observedProjectionSetHash,\n \"INVALID_CONTRACT\",\n \"Projection mismatch requires different projection hashes\",\n );\n }\n if (\n receipt.failureCode === \"commit-hash-mismatch\" ||\n receipt.failureCode === \"commit-link-mismatch\"\n ) {\n economyAssert(\n receipt.firstInvalidCommitId !== undefined,\n \"INVALID_CONTRACT\",\n \"Commit integrity failures require the first invalid commit\",\n );\n }\n if (receipt.failureCode === \"record-hash-mismatch\") {\n economyAssert(\n receipt.firstInvalidRecordId !== undefined,\n \"INVALID_CONTRACT\",\n \"Record integrity failures require the first invalid record\",\n );\n }\n }\n parseIsoTimestamp(receipt.verifiedAt);\n}\n\n/** Validates one canonical hourly Merkle-root manifest. */\nexport function assertEconomyIntegrityAnchorManifest(\n manifest: EconomyIntegrityAnchorManifestV1,\n): void {\n assertExactKeys(\n manifest,\n new Set([\n \"schemaVersion\",\n \"anchorId\",\n \"authorityId\",\n \"firstCommitSequence\",\n \"lastCommitSequence\",\n \"leafCount\",\n \"merkleRootHash\",\n \"authorityHeadHash\",\n \"producedAt\",\n ]),\n \"Integrity anchor manifest\",\n );\n economyAssert(\n manifest.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported integrity anchor manifest\",\n );\n assertEconomyIdentifier(manifest.anchorId, \"anchorId\");\n assertEconomyIdentifier(manifest.authorityId, \"authorityId\");\n assertCanonicalUnsignedInteger(\n manifest.firstCommitSequence,\n \"First commit sequence\",\n );\n assertCanonicalUnsignedInteger(\n manifest.lastCommitSequence,\n \"Last commit sequence\",\n );\n assertCanonicalUnsignedInteger(manifest.leafCount, \"Merkle leaf count\");\n economyAssert(\n BigInt(manifest.firstCommitSequence) <=\n BigInt(manifest.lastCommitSequence) &&\n BigInt(manifest.leafCount) ===\n BigInt(manifest.lastCommitSequence) -\n BigInt(manifest.firstCommitSequence) +\n 1n,\n \"INVALID_CONTRACT\",\n \"Integrity anchor sequence range and leaf count are inconsistent\",\n );\n assertCanonicalHash(manifest.merkleRootHash, \"Merkle root hash\");\n assertCanonicalHash(manifest.authorityHeadHash, \"Authority-head hash\");\n parseIsoTimestamp(manifest.producedAt);\n}\n\nfunction canonicalAuthorityRecordReference(\n reference: EconomyAuthorityRecordReferenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: reference.schemaVersion,\n recordKind: reference.recordKind,\n recordId: reference.recordId,\n writeKind: reference.writeKind,\n contentHash: reference.contentHash,\n ...(reference.previousContentHash === undefined\n ? {}\n : { previousContentHash: reference.previousContentHash }),\n ...(reference.expectedConcurrencyTokenHash === undefined\n ? {}\n : {\n expectedConcurrencyTokenHash:\n reference.expectedConcurrencyTokenHash,\n }),\n };\n}\n\n/** Produces deterministic UTF-8 JSON for a singleton authority head. */\nexport function canonicalEconomyAuthorityHeadPayload(\n head: EconomyAuthorityHeadV1,\n): string {\n assertEconomyAuthorityHead(head);\n return JSON.stringify({\n schemaVersion: head.schemaVersion,\n authorityId: head.authorityId,\n version: head.version,\n state: head.state,\n ...(head.lastCommitId === undefined\n ? {}\n : { lastCommitId: head.lastCommitId }),\n ...(head.lastCommitHash === undefined\n ? {}\n : { lastCommitHash: head.lastCommitHash }),\n writerRegion: head.writerRegion,\n writerFencingToken: head.writerFencingToken,\n updatedAt: head.updatedAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for an authority commit manifest. */\nexport function canonicalEconomyAuthorityCommitManifestPayload(\n manifest: EconomyAuthorityCommitManifestV1,\n): string {\n assertEconomyAuthorityCommitManifest(manifest);\n return JSON.stringify({\n schemaVersion: manifest.schemaVersion,\n commitId: manifest.commitId,\n authorityId: manifest.authorityId,\n sequence: manifest.sequence,\n commitKind: manifest.commitKind,\n ...(manifest.previousCommitHash === undefined\n ? {}\n : { previousCommitHash: manifest.previousCommitHash }),\n ...(manifest.commandId === undefined\n ? {}\n : { commandId: manifest.commandId }),\n ...(manifest.correlationId === undefined\n ? {}\n : { correlationId: manifest.correlationId }),\n authorityStateBefore: manifest.authorityStateBefore,\n authorityStateAfter: manifest.authorityStateAfter,\n ...(manifest.stateReasonCode === undefined\n ? {}\n : { stateReasonCode: manifest.stateReasonCode }),\n ...(manifest.recoveryVerificationReceiptId === undefined\n ? {}\n : {\n recoveryVerificationReceiptId:\n manifest.recoveryVerificationReceiptId,\n }),\n ...(manifest.recoveryVerificationReceiptHash === undefined\n ? {}\n : {\n recoveryVerificationReceiptHash:\n manifest.recoveryVerificationReceiptHash,\n }),\n ...(manifest.dualApprovalEvidenceHash === undefined\n ? {}\n : {\n dualApprovalEvidenceHash:\n manifest.dualApprovalEvidenceHash,\n }),\n writerRegion: manifest.writerRegion,\n writerFencingToken: manifest.writerFencingToken,\n recordReferences: manifest.recordReferences.map(\n canonicalAuthorityRecordReference,\n ),\n committedAt: manifest.committedAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for an integrity-verification receipt. */\nexport function canonicalEconomyIntegrityVerificationReceiptPayload(\n receipt: EconomyIntegrityVerificationReceiptV1,\n): string {\n assertEconomyIntegrityVerificationReceipt(receipt);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n verificationId: receipt.verificationId,\n authorityId: receipt.authorityId,\n status: receipt.status,\n checkedThroughSequence: receipt.checkedThroughSequence,\n checkedCommits: receipt.checkedCommits,\n checkedRecords: receipt.checkedRecords,\n expectedAuthorityHeadHash: receipt.expectedAuthorityHeadHash,\n observedAuthorityHeadHash: receipt.observedAuthorityHeadHash,\n ...(receipt.expectedJournalHeadHash === undefined\n ? {}\n : { expectedJournalHeadHash: receipt.expectedJournalHeadHash }),\n ...(receipt.observedJournalHeadHash === undefined\n ? {}\n : { observedJournalHeadHash: receipt.observedJournalHeadHash }),\n ...(receipt.expectedProjectionSetHash === undefined\n ? {}\n : {\n expectedProjectionSetHash:\n receipt.expectedProjectionSetHash,\n }),\n ...(receipt.observedProjectionSetHash === undefined\n ? {}\n : {\n observedProjectionSetHash:\n receipt.observedProjectionSetHash,\n }),\n ...(receipt.anchorManifestHash === undefined\n ? {}\n : { anchorManifestHash: receipt.anchorManifestHash }),\n ...(receipt.failureCode === undefined\n ? {}\n : { failureCode: receipt.failureCode }),\n ...(receipt.firstInvalidCommitId === undefined\n ? {}\n : { firstInvalidCommitId: receipt.firstInvalidCommitId }),\n ...(receipt.firstInvalidRecordId === undefined\n ? {}\n : { firstInvalidRecordId: receipt.firstInvalidRecordId }),\n verifiedAt: receipt.verifiedAt,\n });\n}\n\n/** Produces deterministic UTF-8 JSON for an hourly integrity anchor. */\nexport function canonicalEconomyIntegrityAnchorManifestPayload(\n manifest: EconomyIntegrityAnchorManifestV1,\n): string {\n assertEconomyIntegrityAnchorManifest(manifest);\n return JSON.stringify({\n schemaVersion: manifest.schemaVersion,\n anchorId: manifest.anchorId,\n authorityId: manifest.authorityId,\n firstCommitSequence: manifest.firstCommitSequence,\n lastCommitSequence: manifest.lastCommitSequence,\n leafCount: manifest.leafCount,\n merkleRootHash: manifest.merkleRootHash,\n authorityHeadHash: manifest.authorityHeadHash,\n producedAt: manifest.producedAt,\n });\n}\n\n/**\n * Proves that a reopening manifest binds a successful verification receipt.\n * The consuming service remains responsible for its maximum allowed age.\n */\nexport function assertEconomyAuthorityRecoveryEvidence(\n manifest: EconomyAuthorityCommitManifestV1,\n receipt: EconomyIntegrityVerificationReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertEconomyAuthorityCommitManifest(manifest);\n assertEconomyIntegrityVerificationReceipt(receipt);\n economyAssert(\n manifest.commitKind === \"state-transition\" &&\n manifest.authorityStateAfter === \"open\" &&\n receipt.status === \"valid\" &&\n receipt.authorityId === manifest.authorityId &&\n receipt.verificationId ===\n manifest.recoveryVerificationReceiptId &&\n BigInt(receipt.checkedThroughSequence) <\n BigInt(manifest.sequence) &&\n parseIsoTimestamp(receipt.verifiedAt) <=\n parseIsoTimestamp(manifest.committedAt),\n \"INVALID_CONTRACT\",\n \"Authority reopening is not bound to a prior successful verification\",\n );\n const receiptHash = hashCanonicalPayload(\n canonicalEconomyIntegrityVerificationReceiptPayload(receipt),\n );\n assertCanonicalHash(receiptHash, \"Recovery verification-receipt hash\");\n economyAssert(\n receiptHash === manifest.recoveryVerificationReceiptHash,\n \"INVALID_CONTRACT\",\n \"Recovery verification receipt does not match its manifest hash\",\n );\n}\n\n/**\n * Returns a copy in the canonical record-reference order expected by manifests.\n * Construction helpers may use this before validation; canonicalization itself\n * never silently reorders a malformed manifest.\n */\nexport function sortEconomyAuthorityRecordReferences(\n references: readonly EconomyAuthorityRecordReferenceV1[],\n): readonly EconomyAuthorityRecordReferenceV1[] {\n return [...references].sort(referenceOrder);\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n sumTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n sortStringRecord,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type LotId,\n type PostingId,\n type ProviderEventId,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { TokenSource } from \"./lots.js\";\n\nexport type ActivityType =\n | \"purchase\"\n | \"subscription\"\n | \"rewarded-ad\"\n | \"offerwall\"\n | \"allocation\"\n | \"boost\"\n | \"reclaim\"\n | \"spend\"\n | \"hold\"\n | \"refund\"\n | \"chargeback\"\n | \"adjustment\"\n | \"reversal\"\n | \"event\"\n | \"competition\";\n\nexport type ActivityStatus =\n | \"pending\"\n | \"held\"\n | \"settled\"\n | \"reversed\"\n | \"failed\";\n\n/**\n * States permitted on an immutable transaction accepted by the V2\n * persistence boundary. Pending and failed work belongs to the command\n * workflow, while a reversed presentation state is derived from an immutable\n * compensating transaction rather than written back to the original journal\n * row.\n */\nexport type EconomicJournalStatus = \"held\" | \"settled\";\n\n/** A journal transaction that has an immediate economic effect. */\nexport type EconomicJournalTransactionV1 = Omit<\n LedgerTransactionV1,\n \"status\"\n> & {\n readonly status: EconomicJournalStatus;\n};\n\nconst ACTIVITY_TYPES = new Set<ActivityType>([\n \"purchase\",\n \"subscription\",\n \"rewarded-ad\",\n \"offerwall\",\n \"allocation\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"refund\",\n \"chargeback\",\n \"adjustment\",\n \"reversal\",\n \"event\",\n \"competition\",\n]);\n\nconst ACTIVITY_STATUSES = new Set<ActivityStatus>([\n \"pending\",\n \"held\",\n \"settled\",\n \"reversed\",\n \"failed\",\n]);\n\nconst ACTIVITY_SOURCES = new Set<TokenSource>([\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n \"google-ad-manager\",\n \"subscription\",\n \"event\",\n \"competition\",\n \"adjustment\",\n]);\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction hasControlCharacters(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || code === 127;\n });\n}\n\n/** One signed side of an immutable double-entry transaction. */\nexport interface LedgerPostingV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly postingId: PostingId;\n readonly transactionId: TransactionId;\n readonly accountId: AccountId;\n readonly walletId?: WalletId;\n readonly lotId?: LotId;\n readonly amount: TokenSubunitString;\n}\n\n/** Immutable transaction envelope. Posting amounts must sum to exactly zero. */\nexport interface LedgerTransactionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transactionId: TransactionId;\n readonly activityType: ActivityType;\n readonly status: ActivityStatus;\n readonly idempotencyKey: string;\n readonly providerEventId?: ProviderEventId;\n readonly reversesTransactionId?: TransactionId;\n readonly effectiveAt: IsoTimestamp;\n readonly recordedAt: IsoTimestamp;\n readonly previousCanonicalHash?: string;\n readonly canonicalHash?: string;\n readonly metadata: Readonly<Record<string, string>>;\n readonly postings: readonly LedgerPostingV1[];\n}\n\n/** Privacy-safe, display-oriented journal entry returned by an API adapter. */\nexport interface ActivityEntryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transactionId: TransactionId;\n readonly activityType: ActivityType;\n readonly status: ActivityStatus;\n readonly occurredAt: IsoTimestamp;\n readonly amount: TokenSubunitString;\n /** Stable source identity used for filtering and provenance presentation. */\n readonly source: TokenSource;\n readonly beneficiaryAccountId?: AccountId;\n readonly maskedReference?: string;\n readonly sourceLabel: string;\n}\n\n/** Validates one privacy-safe activity row returned by an HTTP adapter. */\nexport function assertActivityEntry(entry: ActivityEntryV1): void {\n economyAssert(\n entry.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported activity-entry contract version\",\n );\n assertEconomyIdentifier(entry.transactionId, \"transactionId\");\n economyAssert(\n ACTIVITY_TYPES.has(entry.activityType) &&\n ACTIVITY_STATUSES.has(entry.status) &&\n ACTIVITY_SOURCES.has(entry.source),\n \"INVALID_CONTRACT\",\n \"Activity type, status, or source is unsupported\",\n );\n parseIsoTimestamp(entry.occurredAt);\n economyAssert(\n parseTokenSubunits(entry.amount) !== 0n,\n \"INVALID_AMOUNT\",\n \"Activity entries cannot contain a zero amount\",\n );\n if (entry.beneficiaryAccountId !== undefined) {\n assertEconomyIdentifier(\n entry.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n }\n if (entry.maskedReference !== undefined) {\n economyAssert(\n typeof entry.maskedReference === \"string\" &&\n entry.maskedReference.length > 0 &&\n entry.maskedReference.length <= 128 &&\n !hasControlCharacters(entry.maskedReference),\n \"INVALID_CONTRACT\",\n \"Masked activity references must be bounded and safe for display\",\n );\n }\n economyAssert(\n typeof entry.sourceLabel === \"string\" &&\n entry.sourceLabel.trim().length > 0 &&\n entry.sourceLabel.length <= 128 &&\n !hasControlCharacters(entry.sourceLabel),\n \"INVALID_CONTRACT\",\n \"Activity source labels must be bounded and safe for display\",\n );\n}\n\n/** Proves the structural and arithmetic invariants of one transaction. */\nexport function assertBalancedTransaction(\n transaction: LedgerTransactionV1,\n): void {\n economyAssert(\n transaction.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported ledger contract version\",\n );\n assertEconomyIdentifier(transaction.transactionId, \"transactionId\");\n assertEconomyIdentifier(transaction.idempotencyKey, \"idempotencyKey\");\n economyAssert(\n ACTIVITY_TYPES.has(transaction.activityType) &&\n ACTIVITY_STATUSES.has(transaction.status),\n \"INVALID_CONTRACT\",\n \"Transaction activity type or status is unsupported\",\n );\n if (transaction.providerEventId !== undefined) {\n assertEconomyIdentifier(transaction.providerEventId, \"providerEventId\");\n }\n if (transaction.reversesTransactionId !== undefined) {\n assertEconomyIdentifier(\n transaction.reversesTransactionId,\n \"reversesTransactionId\",\n );\n }\n economyAssert(\n (transaction.activityType === \"reversal\") ===\n (transaction.reversesTransactionId !== undefined),\n \"INVALID_CONTRACT\",\n \"Reversal transactions must identify exactly one original transaction\",\n );\n const effectiveAt = parseIsoTimestamp(transaction.effectiveAt);\n const recordedAt = parseIsoTimestamp(transaction.recordedAt);\n economyAssert(\n recordedAt >= effectiveAt,\n \"INVALID_TIME_WINDOW\",\n \"Transaction recording time cannot precede its effective time\",\n );\n if (transaction.previousCanonicalHash !== undefined) {\n assertCanonicalHash(\n transaction.previousCanonicalHash,\n \"Previous canonical hash\",\n );\n }\n if (transaction.canonicalHash !== undefined) {\n assertCanonicalHash(transaction.canonicalHash, \"Canonical hash\");\n }\n const metadataEntries = Object.entries(transaction.metadata);\n economyAssert(\n metadataEntries.length <= 32 &&\n metadataEntries.every(\n ([key, value]) =>\n /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/u.test(key) &&\n value.length <= 512 &&\n !hasControlCharacters(value),\n ),\n \"INVALID_CONTRACT\",\n \"Transaction metadata must be bounded and free of control characters\",\n );\n economyAssert(\n transaction.postings.length >= 2,\n \"UNBALANCED_TRANSACTION\",\n \"A ledger transaction needs at least two postings\",\n );\n\n const postingIds = new Set<string>();\n for (const posting of transaction.postings) {\n economyAssert(\n posting.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported posting contract version\",\n );\n assertEconomyIdentifier(posting.postingId, \"postingId\");\n assertEconomyIdentifier(posting.accountId, \"accountId\");\n if (posting.walletId !== undefined) {\n assertEconomyIdentifier(posting.walletId, \"walletId\");\n }\n if (posting.lotId !== undefined) {\n assertEconomyIdentifier(posting.lotId, \"lotId\");\n }\n economyAssert(\n posting.transactionId === transaction.transactionId,\n \"INVALID_CONTRACT\",\n \"Posting transactionId must match its transaction\",\n );\n economyAssert(\n !postingIds.has(posting.postingId),\n \"DUPLICATE_IDENTIFIER\",\n \"Posting identifiers must be unique within a transaction\",\n );\n postingIds.add(posting.postingId);\n economyAssert(\n parseTokenSubunits(posting.amount) !== 0n,\n \"INVALID_AMOUNT\",\n \"Zero-value postings are not permitted\",\n );\n }\n\n economyAssert(\n sumTokenSubunits(transaction.postings.map((posting) => posting.amount)) ===\n 0n,\n \"UNBALANCED_TRANSACTION\",\n \"Ledger postings must sum to zero TokenSubunits\",\n );\n}\n\n/**\n * Narrows a balanced V1 transaction to the states accepted by the V2 journal.\n * This is additive: legacy V1 validators retain their existing status union.\n */\nexport function assertEconomicJournalTransaction(\n transaction: LedgerTransactionV1,\n): asserts transaction is EconomicJournalTransactionV1 {\n assertBalancedTransaction(transaction);\n economyAssert(\n transaction.status === \"held\" || transaction.status === \"settled\",\n \"INVALID_CONTRACT\",\n \"Pending, failed, and derived reversed activity cannot be journal transactions\",\n );\n}\n\n/**\n * Produces deterministic UTF-8 JSON for an approved SHA-256/HSM adapter.\n * Hashing itself deliberately remains outside this provider-neutral package.\n */\nexport function canonicalTransactionPayload(\n transaction: LedgerTransactionV1,\n): string {\n assertBalancedTransaction(transaction);\n const postings = [...transaction.postings]\n .sort((left, right) =>\n compareUnicodeCodeUnits(left.postingId, right.postingId),\n )\n .map((posting) => ({\n schemaVersion: posting.schemaVersion,\n postingId: posting.postingId,\n transactionId: posting.transactionId,\n accountId: posting.accountId,\n ...(posting.walletId === undefined ? {} : { walletId: posting.walletId }),\n ...(posting.lotId === undefined ? {} : { lotId: posting.lotId }),\n amount: posting.amount,\n }));\n\n return JSON.stringify({\n schemaVersion: transaction.schemaVersion,\n transactionId: transaction.transactionId,\n activityType: transaction.activityType,\n status: transaction.status,\n idempotencyKey: transaction.idempotencyKey,\n ...(transaction.providerEventId === undefined\n ? {}\n : { providerEventId: transaction.providerEventId }),\n ...(transaction.reversesTransactionId === undefined\n ? {}\n : { reversesTransactionId: transaction.reversesTransactionId }),\n effectiveAt: transaction.effectiveAt,\n recordedAt: transaction.recordedAt,\n ...(transaction.previousCanonicalHash === undefined\n ? {}\n : { previousCanonicalHash: transaction.previousCanonicalHash }),\n metadata: sortStringRecord(transaction.metadata),\n postings,\n });\n}\n\nexport interface ReversalInputV1 {\n readonly transactionId: TransactionId;\n readonly postingIds: readonly PostingId[];\n readonly idempotencyKey: string;\n readonly effectiveAt: IsoTimestamp;\n readonly recordedAt: IsoTimestamp;\n readonly metadata?: Readonly<Record<string, string>>;\n readonly previousCanonicalHash?: string;\n}\n\n/** Creates an immutable compensating transaction; it never edits the original. */\nexport function createReversalTransaction(\n original: LedgerTransactionV1,\n input: ReversalInputV1,\n): LedgerTransactionV1 {\n assertBalancedTransaction(original);\n economyAssert(\n original.reversesTransactionId === undefined,\n \"INVALID_CONTRACT\",\n \"A reversal cannot itself be reversed by this helper\",\n );\n economyAssert(\n input.postingIds.length === original.postings.length,\n \"INVALID_CONTRACT\",\n \"A reversal needs one new posting identifier per original posting\",\n );\n\n const postings = original.postings.map((posting, index) => {\n const postingId = input.postingIds[index];\n economyAssert(\n postingId !== undefined,\n \"INVALID_CONTRACT\",\n \"Missing reversal posting identifier\",\n );\n return {\n ...posting,\n postingId,\n transactionId: input.transactionId,\n amount: serializeTokenSubunits(-parseTokenSubunits(posting.amount)),\n } satisfies LedgerPostingV1;\n });\n\n const transaction: LedgerTransactionV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n transactionId: input.transactionId,\n activityType: \"reversal\",\n status: \"settled\",\n idempotencyKey: input.idempotencyKey,\n reversesTransactionId: original.transactionId,\n effectiveAt: input.effectiveAt,\n recordedAt: input.recordedAt,\n ...(input.previousCanonicalHash === undefined\n ? {}\n : { previousCanonicalHash: input.previousCanonicalHash }),\n metadata: input.metadata ?? {},\n postings,\n };\n assertBalancedTransaction(transaction);\n return transaction;\n}\n\n/** Rejects a second effective reversal for the same original transaction. */\nexport function assertReversalAvailable(\n originalTransactionId: TransactionId,\n existingTransactions: readonly LedgerTransactionV1[],\n): void {\n assertEconomyIdentifier(originalTransactionId, \"originalTransactionId\");\n economyAssert(\n !existingTransactions.some(\n (transaction) =>\n transaction.reversesTransactionId === originalTransactionId &&\n transaction.status !== \"failed\",\n ),\n \"REVERSAL_ALREADY_EXISTS\",\n \"The transaction already has an effective reversal\",\n );\n}\n","import {\n assertAuditedEconomyCommandEnvelope,\n assertEconomyAcceptedCommandReceipt,\n assertEconomyCommandResultReceipt,\n assertEconomyEncryptedOperationalHandleBinding,\n assertEconomyProviderEvidenceHash,\n assertEconomyProviderEvidenceManifest,\n canonicalAuditedEconomyCommandEnvelopePayload,\n canonicalEconomyAcceptedCommandReceiptPayload,\n canonicalEconomyCommandResultReceiptPayload,\n canonicalEconomyEncryptedOperationalHandleBindingPayload,\n canonicalEconomyProviderEvidenceHashPayload,\n canonicalEconomyProviderEvidenceManifestPayload,\n type AuditedEconomyCommandEnvelopeV1,\n type EconomyAcceptedCommandReceiptV1,\n type EconomyEncryptedOperationalHandleBindingV1,\n type EconomyProviderEvidenceHashV1,\n type EconomyProviderEvidenceManifestV1,\n type EconomyCommandResultReceiptV1,\n} from \"./audit.js\";\nimport {\n advanceEconomyAuthorityHead,\n assertEconomyAuthorityCommitManifest,\n assertEconomyAuthorityHead,\n canonicalEconomyAuthorityCommitManifestPayload,\n type EconomyAuthorityCommitManifestV1,\n type EconomyAuthorityHeadV1,\n type EconomyAuthorityRecordKindV1,\n type EconomyAuthorityRecordReferenceV1,\n type HashedEconomyAuthorityCommitManifestV1,\n} from \"./authority.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n type EconomyContractVersion,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { CanonicalPayloadHashFunctionV1 } from \"./integrity.js\";\nimport {\n assertEconomicJournalTransaction,\n canonicalTransactionPayload,\n type ActivityType,\n type EconomicJournalTransactionV1,\n} from \"./ledger.js\";\n\n/** Complete bounded record graph for one accepted authoritative command. */\nexport interface EconomyAuditGraphV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandEnvelope: AuditedEconomyCommandEnvelopeV1;\n readonly commandEnvelopeHash: string;\n readonly providerEvidenceManifest?: EconomyProviderEvidenceManifestV1;\n readonly providerEvidence: readonly EconomyProviderEvidenceHashV1[];\n readonly operationalHandleBindings: readonly EconomyEncryptedOperationalHandleBindingV1[];\n readonly acceptedReceipt: EconomyAcceptedCommandReceiptV1;\n readonly resultReceipt?: EconomyCommandResultReceiptV1;\n readonly transaction?: EconomicJournalTransactionV1 & {\n readonly canonicalHash: string;\n };\n readonly startAuthorityHead: EconomyAuthorityHeadV1;\n readonly commits: readonly HashedEconomyAuthorityCommitManifestV1[];\n readonly expectedAuthorityHead: EconomyAuthorityHeadV1;\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction hashCanonicalPayload(\n payload: string,\n hash: CanonicalPayloadHashFunctionV1,\n label: string,\n): string {\n const canonicalHash = hash(payload);\n assertCanonicalHash(canonicalHash, label);\n return canonicalHash;\n}\n\nfunction findReference(\n manifest: EconomyAuthorityCommitManifestV1,\n kind: EconomyAuthorityRecordKindV1,\n id: string,\n): EconomyAuthorityRecordReferenceV1 | undefined {\n return manifest.recordReferences.find(\n (reference) =>\n reference.recordKind === kind && reference.recordId === id,\n );\n}\n\nfunction assertCreatedReference(\n manifest: EconomyAuthorityCommitManifestV1,\n kind: EconomyAuthorityRecordKindV1,\n id: string,\n contentHash: string,\n): void {\n const reference = findReference(manifest, kind, id);\n economyAssert(\n reference !== undefined &&\n reference.writeKind === \"create\" &&\n reference.contentHash === contentHash,\n \"INVALID_CONTRACT\",\n `Authority commit does not bind the expected ${kind} record`,\n );\n}\n\nfunction assertProviderGraph(\n graph: EconomyAuditGraphV1,\n hash: CanonicalPayloadHashFunctionV1,\n acceptanceCommit: EconomyAuthorityCommitManifestV1,\n): void {\n const envelope = graph.commandEnvelope;\n const providerSource =\n envelope.commandSource === \"shopify\" ||\n envelope.commandSource === \"ayet\" ||\n envelope.commandSource === \"bitlabs\";\n\n if (!providerSource) {\n economyAssert(\n graph.providerEvidenceManifest === undefined &&\n graph.providerEvidence.length === 0 &&\n graph.operationalHandleBindings.length === 0,\n \"INVALID_CONTRACT\",\n \"First-party command graphs cannot carry provider evidence\",\n );\n return;\n }\n\n const manifest = graph.providerEvidenceManifest;\n economyAssert(\n manifest !== undefined &&\n manifest.commandId === envelope.commandId &&\n manifest.provider === envelope.commandSource &&\n graph.providerEvidence.length > 0,\n \"INVALID_CONTRACT\",\n \"Provider command graph is missing its matching evidence manifest\",\n );\n assertEconomyProviderEvidenceManifest(manifest);\n economyAssert(\n Date.parse(manifest.createdAt) <= Date.parse(envelope.acceptedAt),\n \"INVALID_TIME_WINDOW\",\n \"Provider evidence manifest cannot be created after command acceptance\",\n );\n const manifestHash = hashCanonicalPayload(\n canonicalEconomyProviderEvidenceManifestPayload(manifest),\n hash,\n \"Provider evidence manifest hash\",\n );\n economyAssert(\n envelope.providerEvidenceManifestHash === manifestHash,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest does not match the command envelope\",\n );\n assertCreatedReference(\n acceptanceCommit,\n \"provider-evidence-manifest\",\n manifest.evidenceManifestId,\n manifestHash,\n );\n\n const evidenceById = new Map<string, EconomyProviderEvidenceHashV1>();\n for (const evidence of graph.providerEvidence) {\n assertEconomyProviderEvidenceHash(evidence);\n economyAssert(\n evidence.commandId === envelope.commandId &&\n evidence.provider === envelope.commandSource &&\n !evidenceById.has(evidence.providerEventId),\n \"INVALID_CONTRACT\",\n \"Provider evidence has a mismatched or duplicate graph identity\",\n );\n evidenceById.set(evidence.providerEventId, evidence);\n economyAssert(\n Date.parse(evidence.receivedAt) <= Date.parse(manifest.createdAt),\n \"INVALID_TIME_WINDOW\",\n \"Provider evidence must be received before its manifest is created\",\n );\n }\n economyAssert(\n envelope.causation?.kind === \"provider-event\" &&\n evidenceById.has(envelope.causation.causationId),\n \"INVALID_CONTRACT\",\n \"Provider command causation must reference included provider evidence\",\n );\n economyAssert(\n manifest.evidenceReferences.length === evidenceById.size,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest does not cover the exact evidence set\",\n );\n for (const reference of manifest.evidenceReferences) {\n const evidence = evidenceById.get(reference.recordId);\n economyAssert(\n evidence !== undefined,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest references an absent record\",\n );\n const contentHash = hashCanonicalPayload(\n canonicalEconomyProviderEvidenceHashPayload(evidence),\n hash,\n \"Provider evidence content hash\",\n );\n economyAssert(\n reference.contentHash === contentHash,\n \"INVALID_CONTRACT\",\n \"Provider evidence content hash does not match its manifest\",\n );\n assertCreatedReference(\n acceptanceCommit,\n \"provider-evidence\",\n evidence.providerEventId,\n contentHash,\n );\n }\n\n const handlesById = new Map<\n string,\n EconomyEncryptedOperationalHandleBindingV1\n >();\n for (const binding of graph.operationalHandleBindings) {\n assertEconomyEncryptedOperationalHandleBinding(binding);\n economyAssert(\n binding.commandId === envelope.commandId &&\n binding.provider === envelope.commandSource &&\n !handlesById.has(binding.handleBindingId),\n \"INVALID_CONTRACT\",\n \"Operational handle has a mismatched or duplicate graph identity\",\n );\n handlesById.set(binding.handleBindingId, binding);\n economyAssert(\n Date.parse(binding.createdAt) <= Date.parse(manifest.createdAt),\n \"INVALID_TIME_WINDOW\",\n \"Encrypted handle binding cannot postdate its evidence manifest\",\n );\n }\n economyAssert(\n manifest.operationalHandleReferences.length === handlesById.size,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest does not cover the exact handle set\",\n );\n for (const reference of manifest.operationalHandleReferences) {\n const binding = handlesById.get(reference.recordId);\n economyAssert(\n binding !== undefined,\n \"INVALID_CONTRACT\",\n \"Provider evidence manifest references an absent handle binding\",\n );\n const contentHash = hashCanonicalPayload(\n canonicalEconomyEncryptedOperationalHandleBindingPayload(binding),\n hash,\n \"Operational-handle binding hash\",\n );\n economyAssert(\n reference.contentHash === contentHash,\n \"INVALID_CONTRACT\",\n \"Operational-handle binding does not match its evidence manifest\",\n );\n assertCreatedReference(\n acceptanceCommit,\n \"operational-handle-binding\",\n binding.handleBindingId,\n contentHash,\n );\n }\n for (const evidence of graph.providerEvidence) {\n economyAssert(\n evidence.operationalHandleBindingId === undefined ||\n handlesById.has(evidence.operationalHandleBindingId),\n \"INVALID_CONTRACT\",\n \"Provider evidence references an absent encrypted handle binding\",\n );\n }\n}\n\nfunction expectedTransactionActivityTypes(\n envelope: AuditedEconomyCommandEnvelopeV1,\n): ReadonlySet<ActivityType> {\n if (envelope.commandType === \"credit-purchase\") {\n return new Set([\"purchase\"]);\n }\n if (envelope.commandType === \"credit-subscription\") {\n return new Set([\"subscription\"]);\n }\n if (envelope.commandType === \"credit-reward\") {\n return new Set([\n envelope.commandSource === \"ayet\" ? \"rewarded-ad\" : \"offerwall\",\n ]);\n }\n if (envelope.commandType === \"credit-event\") {\n return new Set([\"event\"]);\n }\n if (envelope.commandType === \"credit-competition\") {\n return new Set([\"competition\"]);\n }\n if (envelope.commandType === \"allocate\") {\n return new Set([\"allocation\"]);\n }\n if (envelope.commandType === \"boost\") {\n return new Set([\"boost\"]);\n }\n if (envelope.commandType === \"reclaim\") {\n return new Set([\"reclaim\"]);\n }\n if (envelope.commandType === \"spend\") {\n return new Set([\"spend\"]);\n }\n if (envelope.commandType === \"hold\") {\n return new Set([\"hold\"]);\n }\n if (\n envelope.commandType === \"release-hold\" ||\n envelope.commandType === \"reverse\"\n ) {\n return new Set([\"reversal\"]);\n }\n if (envelope.commandType === \"refund\") {\n return new Set([\"refund\"]);\n }\n if (envelope.commandType === \"chargeback\") {\n return new Set([\"chargeback\"]);\n }\n return new Set([\"adjustment\"]);\n}\n\nfunction assertReceiptGraph(\n graph: EconomyAuditGraphV1,\n commandEnvelopeHash: string,\n hash: CanonicalPayloadHashFunctionV1,\n acceptanceCommit: EconomyAuthorityCommitManifestV1,\n resultCommit: EconomyAuthorityCommitManifestV1 | undefined,\n): void {\n const envelope = graph.commandEnvelope;\n const accepted = graph.acceptedReceipt;\n assertEconomyAcceptedCommandReceipt(accepted);\n economyAssert(\n accepted.commandId === envelope.commandId &&\n accepted.correlationId === envelope.correlationId &&\n accepted.commandEnvelopeHash === commandEnvelopeHash &&\n accepted.acceptedAt === envelope.acceptedAt,\n \"INVALID_CONTRACT\",\n \"Accepted receipt is not bound to the canonical command envelope\",\n );\n const acceptedHash = hashCanonicalPayload(\n canonicalEconomyAcceptedCommandReceiptPayload(accepted),\n hash,\n \"Accepted receipt hash\",\n );\n assertCreatedReference(\n acceptanceCommit,\n \"accepted-receipt\",\n accepted.receiptId,\n acceptedHash,\n );\n\n const providerSource =\n envelope.commandSource === \"shopify\" ||\n envelope.commandSource === \"ayet\" ||\n envelope.commandSource === \"bitlabs\";\n if (graph.resultReceipt === undefined) {\n economyAssert(\n providerSource &&\n graph.transaction === undefined &&\n resultCommit === undefined,\n \"INVALID_CONTRACT\",\n \"Only a provider workflow may be durably accepted without a result\",\n );\n return;\n }\n\n const result = graph.resultReceipt;\n assertEconomyCommandResultReceipt(result);\n economyAssert(\n result.commandId === envelope.commandId &&\n result.correlationId === envelope.correlationId &&\n result.acceptedReceiptId === accepted.receiptId &&\n result.commandEnvelopeHash === commandEnvelopeHash &&\n Date.parse(result.recordedAt) >= Date.parse(accepted.acceptedAt) &&\n resultCommit !== undefined,\n \"INVALID_CONTRACT\",\n \"Result receipt is not bound to its accepted command\",\n );\n const resultHash = hashCanonicalPayload(\n canonicalEconomyCommandResultReceiptPayload(result),\n hash,\n \"Command-result receipt hash\",\n );\n assertCreatedReference(\n resultCommit,\n \"result-receipt\",\n result.receiptId,\n resultHash,\n );\n\n if (envelope.commandType === \"initialize-wallet\") {\n economyAssert(\n result.outcome === \"no-op\" &&\n (result.noOpCode === \"WALLET_INITIALIZED\" ||\n result.noOpCode === \"WALLET_ALREADY_INITIALIZED\"),\n \"INVALID_CONTRACT\",\n \"Wallet initialization must terminate without an economic transaction\",\n );\n }\n\n if (result.outcome !== \"completed\") {\n economyAssert(\n graph.transaction === undefined,\n \"INVALID_CONTRACT\",\n \"Failed and no-op results cannot carry a journal transaction\",\n );\n return;\n }\n\n const transaction = graph.transaction;\n economyAssert(\n transaction !== undefined,\n \"INVALID_CONTRACT\",\n \"Completed command graph is missing its journal transaction\",\n );\n assertEconomicJournalTransaction(transaction);\n const calculatedTransactionHash = hashCanonicalPayload(\n canonicalTransactionPayload(transaction),\n hash,\n \"Journal transaction hash\",\n );\n economyAssert(\n transaction.canonicalHash === calculatedTransactionHash &&\n result.transactionId === transaction.transactionId &&\n result.transactionCanonicalHash === transaction.canonicalHash &&\n transaction.idempotencyKey ===\n envelope.idempotencyFingerprint.digest &&\n expectedTransactionActivityTypes(envelope).has(\n transaction.activityType,\n ),\n \"INVALID_CONTRACT\",\n \"Completed result, transaction semantics, and idempotency fingerprint do not match\",\n );\n if (providerSource) {\n economyAssert(\n transaction.providerEventId === envelope.causation?.causationId &&\n graph.providerEvidence.some(\n (evidence) =>\n evidence.providerEventId === transaction.providerEventId,\n ),\n \"INVALID_CONTRACT\",\n \"Transaction provider event must be an internal included evidence ID\",\n );\n } else {\n economyAssert(\n transaction.providerEventId === undefined,\n \"INVALID_CONTRACT\",\n \"First-party transactions cannot carry provider event identities\",\n );\n }\n assertCreatedReference(\n resultCommit,\n \"journal-transaction\",\n transaction.transactionId,\n transaction.canonicalHash,\n );\n}\n\nfunction assertAuthorityCommits(\n graph: EconomyAuditGraphV1,\n hash: CanonicalPayloadHashFunctionV1,\n): {\n readonly acceptanceCommit: EconomyAuthorityCommitManifestV1;\n readonly resultCommit?: EconomyAuthorityCommitManifestV1;\n} {\n assertEconomyAuthorityHead(graph.startAuthorityHead);\n assertEconomyAuthorityHead(graph.expectedAuthorityHead);\n economyAssert(\n Array.isArray(graph.commits) &&\n graph.commits.length >= 1 &&\n graph.commits.length <= 2,\n \"INVALID_CONTRACT\",\n \"A command audit graph requires one or two authority commits\",\n );\n\n let observedHead = graph.startAuthorityHead;\n for (const commit of graph.commits) {\n economyAssert(\n commit.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported hashed authority commit\",\n );\n assertEconomyAuthorityCommitManifest(commit.manifest);\n assertCanonicalHash(commit.canonicalHash, \"Authority commit hash\");\n economyAssert(\n commit.manifest.commandId === graph.commandEnvelope.commandId &&\n commit.manifest.correlationId ===\n graph.commandEnvelope.correlationId &&\n hashCanonicalPayload(\n canonicalEconomyAuthorityCommitManifestPayload(commit.manifest),\n hash,\n \"Calculated authority commit hash\",\n ) === commit.canonicalHash,\n \"INVALID_CONTRACT\",\n \"Authority commit hash or command binding is invalid\",\n );\n observedHead = advanceEconomyAuthorityHead(\n observedHead,\n commit.manifest,\n commit.canonicalHash,\n );\n }\n economyAssert(\n observedHead.schemaVersion ===\n graph.expectedAuthorityHead.schemaVersion &&\n observedHead.authorityId ===\n graph.expectedAuthorityHead.authorityId &&\n observedHead.version === graph.expectedAuthorityHead.version &&\n observedHead.state === graph.expectedAuthorityHead.state &&\n observedHead.lastCommitId ===\n graph.expectedAuthorityHead.lastCommitId &&\n observedHead.lastCommitHash ===\n graph.expectedAuthorityHead.lastCommitHash &&\n observedHead.writerRegion ===\n graph.expectedAuthorityHead.writerRegion &&\n observedHead.writerFencingToken ===\n graph.expectedAuthorityHead.writerFencingToken &&\n observedHead.updatedAt === graph.expectedAuthorityHead.updatedAt,\n \"INVALID_CONTRACT\",\n \"Authority commits do not reconstruct the expected authority head\",\n );\n\n const providerSource =\n graph.commandEnvelope.commandSource === \"shopify\" ||\n graph.commandEnvelope.commandSource === \"ayet\" ||\n graph.commandEnvelope.commandSource === \"bitlabs\";\n const acceptanceKind = providerSource\n ? \"provider-acceptance\"\n : \"first-party-command\";\n const acceptanceCommit = graph.commits.find(\n (commit) => commit.manifest.commitKind === acceptanceKind,\n )?.manifest;\n economyAssert(\n acceptanceCommit !== undefined,\n \"INVALID_CONTRACT\",\n \"Command graph is missing its authority acceptance boundary\",\n );\n const resultCommit = providerSource\n ? graph.commits.find(\n (commit) => commit.manifest.commitKind === \"provider-result\",\n )?.manifest\n : acceptanceCommit;\n economyAssert(\n providerSource ||\n (graph.commits.length === 1 &&\n graph.resultReceipt !== undefined),\n \"INVALID_CONTRACT\",\n \"First-party acceptance and result must share one authority commit\",\n );\n economyAssert(\n !providerSource ||\n (graph.resultReceipt === undefined) === (resultCommit === undefined),\n \"INVALID_CONTRACT\",\n \"Provider result receipt and second authority boundary must agree\",\n );\n return {\n acceptanceCommit,\n ...(resultCommit === undefined ? {} : { resultCommit }),\n };\n}\n\n/**\n * Validates every actor/subject, evidence, receipt, transaction, record, and\n * authority-chain edge for one bounded command graph.\n *\n * The callback must hash exact canonical UTF-8 bytes using approved SHA-256.\n * Raw provider data and idempotency keys are neither accepted nor reconstructed.\n */\nexport function assertEconomyAuditGraph(\n graph: EconomyAuditGraphV1,\n hash: CanonicalPayloadHashFunctionV1,\n): void {\n economyAssert(\n graph.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported economy audit graph\",\n );\n assertAuditedEconomyCommandEnvelope(graph.commandEnvelope);\n const commandEnvelopeHash = hashCanonicalPayload(\n canonicalAuditedEconomyCommandEnvelopePayload(graph.commandEnvelope),\n hash,\n \"Command envelope hash\",\n );\n economyAssert(\n graph.commandEnvelopeHash === commandEnvelopeHash,\n \"INVALID_CONTRACT\",\n \"Command envelope hash does not match canonical bytes\",\n );\n const { acceptanceCommit, resultCommit } = assertAuthorityCommits(\n graph,\n hash,\n );\n assertCreatedReference(\n acceptanceCommit,\n \"command-envelope\",\n graph.commandEnvelope.commandId,\n commandEnvelopeHash,\n );\n assertProviderGraph(graph, hash, acceptanceCommit);\n assertReceiptGraph(\n graph,\n commandEnvelopeHash,\n hash,\n acceptanceCommit,\n resultCommit,\n );\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LotId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport const PRE_UTILITY_BACKER_COHORT = \"pre_utility_backer_v1\" as const;\n\nexport interface EarlyBackerWindowV1 {\n readonly publicTokensLaunchAt: IsoTimestamp;\n readonly firstPublicSpendLiveAt?: IsoTimestamp;\n}\n\n/** Paid-lot facts required to recalculate retained early-backer basis. */\nexport interface PaidLotRetentionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly lotId: LotId;\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly purchaseId: string;\n readonly catalogVersion: string;\n readonly purchasedAt: IsoTimestamp;\n readonly settledAt: IsoTimestamp;\n readonly creditedAt: IsoTimestamp;\n readonly retainedAmount: TokenSubunitString;\n}\n\nexport interface EarlyBackerEvaluationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly cohortKey: typeof PRE_UTILITY_BACKER_COHORT;\n readonly status: \"not-qualified\" | \"provisional\";\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly netRetainedAmount: TokenSubunitString;\n readonly contributingLotIds: readonly LotId[];\n readonly evaluatedAt: IsoTimestamp;\n}\n\nexport const EARLY_BACKER_SETTLEMENT_POLICY_V2 =\n \"settlement-window-v2\" as const;\n\n/**\n * Additive evaluation result using settlement as the sole qualification event.\n * Purchase and credit times remain provenance/order facts.\n */\nexport interface EarlyBackerEvaluationV2 {\n readonly schemaVersion: EconomyContractVersion;\n readonly policyVersion: typeof EARLY_BACKER_SETTLEMENT_POLICY_V2;\n readonly qualificationEvent: \"settled-at\";\n readonly cohortKey: typeof PRE_UTILITY_BACKER_COHORT;\n readonly status: \"not-qualified\" | \"provisional\";\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly netRetainedAmount: TokenSubunitString;\n readonly contributingLotIds: readonly LotId[];\n readonly evaluatedAt: IsoTimestamp;\n}\n\nfunction isWithinWindow(\n timestamp: IsoTimestamp,\n launch: number,\n cutoff: number | undefined,\n): boolean {\n const value = parseIsoTimestamp(timestamp);\n return value >= launch && (cutoff === undefined || value < cutoff);\n}\n\n/**\n * Recalculates provisional cohort basis from retained paid lots. It promises no\n * future reward and deliberately has no permanent entitled state.\n */\nexport function evaluateEarlyBacker(\n payerAccountId: AccountId,\n receivingHouseholdId: HouseholdId,\n paidLots: readonly PaidLotRetentionV1[],\n window: EarlyBackerWindowV1,\n evaluatedAt: IsoTimestamp,\n): EarlyBackerEvaluationV1 {\n assertEconomyIdentifier(payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(receivingHouseholdId, \"receivingHouseholdId\");\n const launch = parseIsoTimestamp(window.publicTokensLaunchAt);\n const cutoff =\n window.firstPublicSpendLiveAt === undefined\n ? undefined\n : parseIsoTimestamp(window.firstPublicSpendLiveAt);\n economyAssert(\n cutoff === undefined || cutoff > launch,\n \"INVALID_TIME_WINDOW\",\n \"First public spend must occur after public Token launch\",\n );\n parseIsoTimestamp(evaluatedAt);\n\n let retained = 0n;\n const contributingLotIds: LotId[] = [];\n const seenLotIds = new Set<string>();\n for (const lot of paidLots) {\n economyAssert(\n lot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot retention contract version\",\n );\n assertEconomyIdentifier(lot.lotId, \"lotId\");\n economyAssert(\n !seenLotIds.has(lot.lotId),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot retention input must not repeat a source lot\",\n );\n seenLotIds.add(lot.lotId);\n assertEconomyIdentifier(lot.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(lot.receivingHouseholdId, \"receivingHouseholdId\");\n assertEconomyIdentifier(lot.purchaseId, \"purchaseId\");\n assertEconomyIdentifier(lot.catalogVersion, \"catalogVersion\");\n const purchasedAt = parseIsoTimestamp(lot.purchasedAt);\n const settledAt = parseIsoTimestamp(lot.settledAt);\n const creditedAt = parseIsoTimestamp(lot.creditedAt);\n economyAssert(\n purchasedAt <= settledAt && settledAt <= creditedAt,\n \"INVALID_TIME_WINDOW\",\n \"Paid-lot timestamps must follow purchase, settlement, then credit order\",\n );\n if (\n lot.payerAccountId !== payerAccountId ||\n lot.receivingHouseholdId !== receivingHouseholdId\n ) {\n continue;\n }\n const inWindow =\n isWithinWindow(lot.purchasedAt, launch, cutoff) &&\n isWithinWindow(lot.settledAt, launch, cutoff) &&\n isWithinWindow(lot.creditedAt, launch, cutoff);\n const amount = parseTokenSubunits(lot.retainedAmount);\n economyAssert(\n amount >= 0n,\n \"INVALID_AMOUNT\",\n \"Retained paid-lot basis cannot be negative\",\n );\n if (inWindow && amount > 0n) {\n retained += amount;\n contributingLotIds.push(lot.lotId);\n }\n }\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n cohortKey: PRE_UTILITY_BACKER_COHORT,\n status: retained > 0n ? \"provisional\" : \"not-qualified\",\n payerAccountId,\n receivingHouseholdId,\n netRetainedAmount: serializeTokenSubunits(retained),\n contributingLotIds: contributingLotIds.sort((left, right) =>\n left.localeCompare(right),\n ),\n evaluatedAt,\n };\n}\n\n/**\n * Evaluates the approved settlement-window policy. The caller owns environment\n * and rollout classification: `publicTokensLaunchAt` and\n * `firstPublicSpendLiveAt` must be derived from the entire public cohort, so\n * staff, test, and closed-beta availability cannot open or close this window.\n * The caller must also exclude non-production/test lots before evaluation.\n */\nexport function evaluateEarlyBackerBySettlementV2(\n payerAccountId: AccountId,\n receivingHouseholdId: HouseholdId,\n paidLots: readonly PaidLotRetentionV1[],\n window: EarlyBackerWindowV1,\n evaluatedAt: IsoTimestamp,\n): EarlyBackerEvaluationV2 {\n assertEconomyIdentifier(payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(receivingHouseholdId, \"receivingHouseholdId\");\n const launch = parseIsoTimestamp(window.publicTokensLaunchAt);\n const cutoff =\n window.firstPublicSpendLiveAt === undefined\n ? undefined\n : parseIsoTimestamp(window.firstPublicSpendLiveAt);\n economyAssert(\n cutoff === undefined || cutoff > launch,\n \"INVALID_TIME_WINDOW\",\n \"First public spend must occur after public Token launch\",\n );\n const evaluationTime = parseIsoTimestamp(evaluatedAt);\n\n let retained = 0n;\n const contributingLotIds: LotId[] = [];\n const seenLotIds = new Set<string>();\n for (const lot of paidLots) {\n economyAssert(\n lot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot retention contract version\",\n );\n assertEconomyIdentifier(lot.lotId, \"lotId\");\n economyAssert(\n !seenLotIds.has(lot.lotId),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot retention input must not repeat a source lot\",\n );\n seenLotIds.add(lot.lotId);\n assertEconomyIdentifier(lot.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(lot.receivingHouseholdId, \"receivingHouseholdId\");\n assertEconomyIdentifier(lot.purchaseId, \"purchaseId\");\n assertEconomyIdentifier(lot.catalogVersion, \"catalogVersion\");\n const purchasedAt = parseIsoTimestamp(lot.purchasedAt);\n const settledAt = parseIsoTimestamp(lot.settledAt);\n const creditedAt = parseIsoTimestamp(lot.creditedAt);\n economyAssert(\n purchasedAt <= settledAt && settledAt <= creditedAt,\n \"INVALID_TIME_WINDOW\",\n \"Paid-lot timestamps must follow purchase, settlement, then credit order\",\n );\n const amount = parseTokenSubunits(lot.retainedAmount);\n economyAssert(\n amount >= 0n,\n \"INVALID_AMOUNT\",\n \"Retained paid-lot basis cannot be negative\",\n );\n if (\n lot.payerAccountId === payerAccountId &&\n lot.receivingHouseholdId === receivingHouseholdId &&\n settledAt >= launch &&\n (cutoff === undefined || settledAt < cutoff) &&\n settledAt <= evaluationTime &&\n amount > 0n\n ) {\n retained += amount;\n contributingLotIds.push(lot.lotId);\n }\n }\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n policyVersion: EARLY_BACKER_SETTLEMENT_POLICY_V2,\n qualificationEvent: \"settled-at\",\n cohortKey: PRE_UTILITY_BACKER_COHORT,\n status: retained > 0n ? \"provisional\" : \"not-qualified\",\n payerAccountId,\n receivingHouseholdId,\n netRetainedAmount: serializeTokenSubunits(retained),\n contributingLotIds: contributingLotIds.sort((left, right) =>\n left.localeCompare(right),\n ),\n evaluatedAt,\n };\n}\n","import {\n TOKEN_SUBUNITS_PER_TOKEN,\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { assertEconomyHmacFingerprint, type EconomyHmacFingerprintV1 } from \"./audit.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\n/** The only rewarded-web provider supported by this contract version. */\nexport const GOOGLE_REWARDED_WEB_PROVIDER = \"google-ad-manager\" as const;\n\n/** Nominal liability of one non-redeemable Token in GBP micros. */\nexport const GOOGLE_REWARDED_WEB_NOMINAL_MICROS_PER_TOKEN = 100_000n;\n\n/** Minimum eligible net revenue required to issue one Token. */\nexport const GOOGLE_REWARDED_WEB_MINIMUM_NET_MICROS_PER_TOKEN = 125_000n;\n\nconst SIGNED_BIGINT_MAX = 2n ** 63n - 1n;\nconst CANONICAL_UNSIGNED_INTEGER = /^(?:0|[1-9][0-9]*)$/u;\nconst SHA256 = /^sha256:[a-f0-9]{64}$/u;\n\n/** The fixed, policy-safe reward declaration shown before an ad is requested. */\nexport interface GoogleRewardedWebRewardPayloadV1 {\n readonly type: \"plasius-token-progress\";\n readonly amount: 1;\n}\n\n/**\n * Immutable economics applied to a bundle of rewarded-ad completions.\n * All GBP fields are integer micros and never floating-point values.\n */\nexport interface GoogleRewardedWebQuoteV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly quoteVersion: string;\n readonly provider: typeof GOOGLE_REWARDED_WEB_PROVIDER;\n readonly currency: \"GBP\";\n readonly bundleCompletions: number;\n readonly rewardPayload: GoogleRewardedWebRewardPayloadV1;\n readonly grossRevenueFloorMicros: string;\n readonly providerFeeMicros: string;\n readonly invalidTrafficHaircutMicros: string;\n readonly otherCostMicros: string;\n readonly eligibleNetRevenueMicros: string;\n readonly tokenAmount: TokenSubunitString;\n readonly nominalLiabilityMicros: string;\n readonly retainedMarginMicros: string;\n readonly effectiveFrom: IsoTimestamp;\n readonly effectiveUntil?: IsoTimestamp;\n}\n\n/** Input used to create an exact rewarded-web quote. */\nexport interface CreateGoogleRewardedWebQuoteInputV1 {\n readonly quoteVersion: string;\n readonly bundleCompletions: number;\n readonly rewardPayload: GoogleRewardedWebRewardPayloadV1;\n readonly grossRevenueFloorMicros: string;\n readonly providerFeeMicros: string;\n readonly invalidTrafficHaircutMicros: string;\n readonly otherCostMicros: string;\n readonly effectiveFrom: IsoTimestamp;\n readonly effectiveUntil?: IsoTimestamp;\n}\n\n/** Browser evidence recorded after GPT emits `rewardedSlotGranted`. */\nexport interface GoogleRewardedWebGrantClaimV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly provider: typeof GOOGLE_REWARDED_WEB_PROVIDER;\n /** Web GPT has no server-side verification; this value can never be upgraded. */\n readonly evidenceTrust: \"client-claimed\";\n readonly claimId: string;\n readonly sessionId: string;\n readonly beneficiaryAccountId: AccountId;\n readonly quoteVersion: string;\n readonly reportingKeyFingerprint: EconomyHmacFingerprintV1;\n readonly rewardPayload: GoogleRewardedWebRewardPayloadV1;\n readonly claimedAt: IsoTimestamp;\n}\n\n/** State of one server-created rewarded-web session and its evidence. */\nexport type GoogleRewardedWebSessionStateV1 =\n | \"created\"\n | \"bootstrapped\"\n | \"client-claimed\"\n | \"report-matched\"\n | \"financially-reconciled\"\n | \"suspended\"\n | \"expired\";\n\n/** Outcome of matching privacy-minimised claims to a Google revenue report. */\nexport interface GoogleRewardedWebReconciliationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly provider: typeof GOOGLE_REWARDED_WEB_PROVIDER;\n readonly batchId: string;\n readonly quoteVersion: string;\n readonly state: \"report-matched\" | \"financially-reconciled\" | \"mismatch\";\n readonly reportFinality: \"estimated\" | \"final\";\n readonly reportFingerprint: EconomyHmacFingerprintV1;\n readonly adUnitFingerprint: string;\n readonly periodStartedAt: IsoTimestamp;\n readonly periodEndedAt: IsoTimestamp;\n readonly acceptedClaimCount: number;\n readonly matchedPaidImpressionCount: number;\n readonly creditedBundleCount: number;\n readonly grossRevenueMicros: string;\n readonly eligibleNetRevenueMicros: string;\n readonly nominalLiabilityMicros: string;\n readonly reserveHeldMicros: string;\n readonly reconciledAt: IsoTimestamp;\n}\n\nfunction assertExactKeys(\n value: object,\n allowed: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n Object.keys(value).every((key) => allowed.has(key)) &&\n [...allowed].every(\n (key) =>\n key === \"effectiveUntil\" ||\n Object.prototype.hasOwnProperty.call(value, key),\n ),\n \"INVALID_CONTRACT\",\n `${label} contains missing or unsupported fields`,\n );\n}\n\nfunction parseGbpMicros(value: string, label: string): bigint {\n economyAssert(\n typeof value === \"string\" && CANONICAL_UNSIGNED_INTEGER.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be canonical non-negative GBP micros`,\n );\n const parsed = BigInt(value);\n economyAssert(\n parsed <= SIGNED_BIGINT_MAX,\n \"AMOUNT_OUT_OF_RANGE\",\n `${label} is outside the signed 64-bit range`,\n );\n return parsed;\n}\n\nfunction assertRewardPayload(\n payload: GoogleRewardedWebRewardPayloadV1,\n): void {\n assertExactKeys(payload, new Set([\"type\", \"amount\"]), \"Reward payload\");\n economyAssert(\n payload.type === \"plasius-token-progress\" && payload.amount === 1,\n \"INVALID_CONTRACT\",\n \"Reward payload must disclose exactly one Token of bundle progress\",\n );\n}\n\nfunction assertBoundedCount(value: number, label: string): void {\n economyAssert(\n Number.isSafeInteger(value) && value >= 0,\n \"INVALID_CONTRACT\",\n `${label} must be a non-negative safe integer`,\n );\n}\n\n/** Creates and validates an immutable one-Token rewarded-web quote. */\nexport function createGoogleRewardedWebQuote(\n input: CreateGoogleRewardedWebQuoteInputV1,\n): GoogleRewardedWebQuoteV1 {\n const gross = parseGbpMicros(\n input.grossRevenueFloorMicros,\n \"grossRevenueFloorMicros\",\n );\n const providerFee = parseGbpMicros(\n input.providerFeeMicros,\n \"providerFeeMicros\",\n );\n const invalidTrafficHaircut = parseGbpMicros(\n input.invalidTrafficHaircutMicros,\n \"invalidTrafficHaircutMicros\",\n );\n const otherCost = parseGbpMicros(input.otherCostMicros, \"otherCostMicros\");\n const deductions = providerFee + invalidTrafficHaircut + otherCost;\n economyAssert(\n deductions <= gross,\n \"INVALID_CONTRACT\",\n \"Rewarded-web costs cannot exceed the gross revenue floor\",\n );\n const eligibleNet = gross - deductions;\n const retainedMargin =\n eligibleNet - GOOGLE_REWARDED_WEB_NOMINAL_MICROS_PER_TOKEN;\n\n const quote: GoogleRewardedWebQuoteV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n quoteVersion: input.quoteVersion,\n provider: GOOGLE_REWARDED_WEB_PROVIDER,\n currency: \"GBP\",\n bundleCompletions: input.bundleCompletions,\n rewardPayload: input.rewardPayload,\n grossRevenueFloorMicros: gross.toString(10),\n providerFeeMicros: providerFee.toString(10),\n invalidTrafficHaircutMicros: invalidTrafficHaircut.toString(10),\n otherCostMicros: otherCost.toString(10),\n eligibleNetRevenueMicros: eligibleNet.toString(10),\n tokenAmount: serializeTokenSubunits(TOKEN_SUBUNITS_PER_TOKEN),\n nominalLiabilityMicros:\n GOOGLE_REWARDED_WEB_NOMINAL_MICROS_PER_TOKEN.toString(10),\n retainedMarginMicros: retainedMargin.toString(10),\n effectiveFrom: input.effectiveFrom,\n ...(input.effectiveUntil === undefined\n ? {}\n : { effectiveUntil: input.effectiveUntil }),\n };\n assertGoogleRewardedWebQuote(quote);\n return Object.freeze(quote);\n}\n\n/** Proves quote arithmetic, a whole-Token reward, and the 20% margin floor. */\nexport function assertGoogleRewardedWebQuote(\n quote: GoogleRewardedWebQuoteV1,\n): void {\n assertExactKeys(\n quote,\n new Set([\n \"schemaVersion\",\n \"quoteVersion\",\n \"provider\",\n \"currency\",\n \"bundleCompletions\",\n \"rewardPayload\",\n \"grossRevenueFloorMicros\",\n \"providerFeeMicros\",\n \"invalidTrafficHaircutMicros\",\n \"otherCostMicros\",\n \"eligibleNetRevenueMicros\",\n \"tokenAmount\",\n \"nominalLiabilityMicros\",\n \"retainedMarginMicros\",\n \"effectiveFrom\",\n \"effectiveUntil\",\n ]),\n \"Google rewarded-web quote\",\n );\n economyAssert(\n quote.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n quote.provider === GOOGLE_REWARDED_WEB_PROVIDER &&\n quote.currency === \"GBP\",\n \"INVALID_CONTRACT\",\n \"Unsupported Google rewarded-web quote contract\",\n );\n assertEconomyIdentifier(quote.quoteVersion, \"quoteVersion\");\n economyAssert(\n Number.isSafeInteger(quote.bundleCompletions) &&\n quote.bundleCompletions >= 1 &&\n quote.bundleCompletions <= 1_000,\n \"INVALID_CONTRACT\",\n \"Bundle completions must be between 1 and 1,000\",\n );\n assertRewardPayload(quote.rewardPayload);\n\n const gross = parseGbpMicros(\n quote.grossRevenueFloorMicros,\n \"grossRevenueFloorMicros\",\n );\n const providerFee = parseGbpMicros(\n quote.providerFeeMicros,\n \"providerFeeMicros\",\n );\n const invalidTrafficHaircut = parseGbpMicros(\n quote.invalidTrafficHaircutMicros,\n \"invalidTrafficHaircutMicros\",\n );\n const otherCost = parseGbpMicros(quote.otherCostMicros, \"otherCostMicros\");\n const eligibleNet = parseGbpMicros(\n quote.eligibleNetRevenueMicros,\n \"eligibleNetRevenueMicros\",\n );\n const nominalLiability = parseGbpMicros(\n quote.nominalLiabilityMicros,\n \"nominalLiabilityMicros\",\n );\n const retainedMargin = parseGbpMicros(\n quote.retainedMarginMicros,\n \"retainedMarginMicros\",\n );\n economyAssert(\n gross === providerFee + invalidTrafficHaircut + otherCost + eligibleNet,\n \"INVALID_CONTRACT\",\n \"Rewarded-web quote revenue arithmetic is inconsistent\",\n );\n economyAssert(\n parseTokenSubunits(quote.tokenAmount) === TOKEN_SUBUNITS_PER_TOKEN &&\n nominalLiability === GOOGLE_REWARDED_WEB_NOMINAL_MICROS_PER_TOKEN,\n \"INVALID_CONTRACT\",\n \"Rewarded-web quote must issue exactly one whole Token\",\n );\n economyAssert(\n eligibleNet >= GOOGLE_REWARDED_WEB_MINIMUM_NET_MICROS_PER_TOKEN &&\n retainedMargin === eligibleNet - nominalLiability &&\n retainedMargin * 5n >= eligibleNet,\n \"INVALID_CONTRACT\",\n \"Rewarded-web quote does not preserve the 20% contribution margin\",\n );\n const effectiveFrom = parseIsoTimestamp(quote.effectiveFrom);\n if (quote.effectiveUntil !== undefined) {\n economyAssert(\n parseIsoTimestamp(quote.effectiveUntil) > effectiveFrom,\n \"INVALID_TIME_WINDOW\",\n \"Rewarded-web quote expiry must follow its effective time\",\n );\n }\n}\n\n/** Validates a privacy-minimised browser grant without overstating its trust. */\nexport function assertGoogleRewardedWebGrantClaim(\n claim: GoogleRewardedWebGrantClaimV1,\n): void {\n assertExactKeys(\n claim,\n new Set([\n \"schemaVersion\",\n \"provider\",\n \"evidenceTrust\",\n \"claimId\",\n \"sessionId\",\n \"beneficiaryAccountId\",\n \"quoteVersion\",\n \"reportingKeyFingerprint\",\n \"rewardPayload\",\n \"claimedAt\",\n ]),\n \"Google rewarded-web grant claim\",\n );\n economyAssert(\n claim.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n claim.provider === GOOGLE_REWARDED_WEB_PROVIDER &&\n claim.evidenceTrust === \"client-claimed\",\n \"INVALID_CONTRACT\",\n \"Rewarded-web grant evidence must remain client-claimed\",\n );\n assertEconomyIdentifier(claim.claimId, \"claimId\");\n assertEconomyIdentifier(claim.sessionId, \"sessionId\");\n assertEconomyIdentifier(claim.beneficiaryAccountId, \"beneficiaryAccountId\");\n assertEconomyIdentifier(claim.quoteVersion, \"quoteVersion\");\n assertEconomyHmacFingerprint(\n claim.reportingKeyFingerprint,\n \"economy.google-reporting-key.v1\",\n );\n assertRewardPayload(claim.rewardPayload);\n parseIsoTimestamp(claim.claimedAt);\n}\n\n/** Validates final revenue coverage or a fail-closed mismatch record. */\nexport function assertGoogleRewardedWebReconciliation(\n reconciliation: GoogleRewardedWebReconciliationV1,\n quote: GoogleRewardedWebQuoteV1,\n): void {\n assertGoogleRewardedWebQuote(quote);\n assertExactKeys(\n reconciliation,\n new Set([\n \"schemaVersion\",\n \"provider\",\n \"batchId\",\n \"quoteVersion\",\n \"state\",\n \"reportFinality\",\n \"reportFingerprint\",\n \"adUnitFingerprint\",\n \"periodStartedAt\",\n \"periodEndedAt\",\n \"acceptedClaimCount\",\n \"matchedPaidImpressionCount\",\n \"creditedBundleCount\",\n \"grossRevenueMicros\",\n \"eligibleNetRevenueMicros\",\n \"nominalLiabilityMicros\",\n \"reserveHeldMicros\",\n \"reconciledAt\",\n ]),\n \"Google rewarded-web reconciliation\",\n );\n economyAssert(\n reconciliation.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n reconciliation.provider === GOOGLE_REWARDED_WEB_PROVIDER &&\n reconciliation.quoteVersion === quote.quoteVersion &&\n [\"report-matched\", \"financially-reconciled\", \"mismatch\"].includes(\n reconciliation.state,\n ) &&\n [\"estimated\", \"final\"].includes(reconciliation.reportFinality),\n \"INVALID_CONTRACT\",\n \"Unsupported Google rewarded-web reconciliation contract\",\n );\n assertEconomyIdentifier(reconciliation.batchId, \"batchId\");\n assertEconomyHmacFingerprint(\n reconciliation.reportFingerprint,\n \"economy.provider-reconciliation.v1\",\n );\n economyAssert(\n SHA256.test(reconciliation.adUnitFingerprint),\n \"INVALID_CONTRACT\",\n \"Ad-unit fingerprint must be a canonical SHA-256 reference\",\n );\n const periodStartedAt = parseIsoTimestamp(reconciliation.periodStartedAt);\n const periodEndedAt = parseIsoTimestamp(reconciliation.periodEndedAt);\n const reconciledAt = parseIsoTimestamp(reconciliation.reconciledAt);\n economyAssert(\n periodEndedAt > periodStartedAt && reconciledAt >= periodEndedAt,\n \"INVALID_TIME_WINDOW\",\n \"Reconciliation period and completion times are inconsistent\",\n );\n assertBoundedCount(reconciliation.acceptedClaimCount, \"acceptedClaimCount\");\n assertBoundedCount(\n reconciliation.matchedPaidImpressionCount,\n \"matchedPaidImpressionCount\",\n );\n assertBoundedCount(\n reconciliation.creditedBundleCount,\n \"creditedBundleCount\",\n );\n\n const gross = parseGbpMicros(\n reconciliation.grossRevenueMicros,\n \"grossRevenueMicros\",\n );\n const eligibleNet = parseGbpMicros(\n reconciliation.eligibleNetRevenueMicros,\n \"eligibleNetRevenueMicros\",\n );\n const nominalLiability = parseGbpMicros(\n reconciliation.nominalLiabilityMicros,\n \"nominalLiabilityMicros\",\n );\n const reserveHeld = parseGbpMicros(\n reconciliation.reserveHeldMicros,\n \"reserveHeldMicros\",\n );\n const expectedCompletions =\n BigInt(reconciliation.creditedBundleCount) *\n BigInt(quote.bundleCompletions);\n const expectedEligibleNet =\n BigInt(reconciliation.creditedBundleCount) *\n BigInt(quote.eligibleNetRevenueMicros);\n const expectedLiability =\n BigInt(reconciliation.creditedBundleCount) *\n BigInt(quote.nominalLiabilityMicros);\n\n economyAssert(\n gross >= eligibleNet &&\n nominalLiability === expectedLiability &&\n reserveHeld >= nominalLiability,\n \"INVALID_CONTRACT\",\n \"Reconciliation liability or reserve arithmetic is inconsistent\",\n );\n if (reconciliation.state === \"financially-reconciled\") {\n economyAssert(\n reconciliation.reportFinality === \"final\" &&\n BigInt(reconciliation.acceptedClaimCount) >= expectedCompletions &&\n BigInt(reconciliation.matchedPaidImpressionCount) >=\n expectedCompletions &&\n eligibleNet >= expectedEligibleNet,\n \"INVALID_CONTRACT\",\n \"Financial reconciliation requires final paid impressions and revenue coverage\",\n );\n }\n}\n\nconst STATE_TRANSITIONS: Readonly<\n Record<GoogleRewardedWebSessionStateV1, ReadonlySet<GoogleRewardedWebSessionStateV1>>\n> = {\n created: new Set([\"bootstrapped\", \"suspended\", \"expired\"]),\n bootstrapped: new Set([\"client-claimed\", \"suspended\", \"expired\"]),\n \"client-claimed\": new Set([\"report-matched\", \"suspended\", \"expired\"]),\n \"report-matched\": new Set([\n \"financially-reconciled\",\n \"suspended\",\n \"expired\",\n ]),\n \"financially-reconciled\": new Set(),\n suspended: new Set(),\n expired: new Set(),\n};\n\n/** Rejects skipped, backwards, or post-terminal evidence transitions. */\nexport function assertGoogleRewardedWebStateTransition(\n from: GoogleRewardedWebSessionStateV1,\n to: GoogleRewardedWebSessionStateV1,\n): void {\n economyAssert(\n STATE_TRANSITIONS[from]?.has(to) === true,\n \"INVALID_CONTRACT\",\n \"Rewarded-web session transition is not forward-safe\",\n );\n}\n","import {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n} from \"./contracts.js\";\nimport { EconomyError, economyAssert } from \"./errors.js\";\nimport {\n assertEconomicJournalTransaction,\n canonicalTransactionPayload,\n type EconomicJournalTransactionV1,\n} from \"./ledger.js\";\n\nexport type JournalChainId = string;\n\n/** Locked head of one canonical transaction hash chain. */\nexport interface JournalChainHeadV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly chainId: JournalChainId;\n readonly version: number;\n readonly lastTransactionId?: TransactionId;\n readonly canonicalHash?: string;\n readonly updatedAt: IsoTimestamp;\n}\n\n/** An effective economic transaction carrying its approved canonical hash. */\nexport type ChainedEconomicJournalTransactionV1 =\n EconomicJournalTransactionV1 & {\n readonly canonicalHash: string;\n };\n\nexport type JournalChainVerificationFailureCodeV1 =\n | \"duplicate-transaction\"\n | \"invalid-transaction\"\n | \"previous-hash-mismatch\"\n | \"canonical-hash-mismatch\"\n | \"end-head-mismatch\";\n\n/** Deterministic result of verifying one ordered canonical-chain segment. */\nexport interface JournalChainVerificationResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly valid: boolean;\n readonly checkedTransactions: number;\n readonly observedHead: JournalChainHeadV1;\n readonly failureCode?: JournalChainVerificationFailureCodeV1;\n readonly firstInvalidTransactionId?: TransactionId;\n}\n\n/** Approved infrastructure adapter that hashes exact canonical UTF-8 bytes. */\nexport type CanonicalPayloadHashFunctionV1 = (payload: string) => string;\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\n/** Validates an empty or populated journal-chain head. */\nexport function assertJournalChainHead(head: JournalChainHeadV1): void {\n economyAssert(\n head.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported journal-chain-head contract version\",\n );\n assertEconomyIdentifier(head.chainId, \"chainId\");\n economyAssert(\n Number.isSafeInteger(head.version) && head.version >= 0,\n \"INVALID_CONTRACT\",\n \"Journal-chain-head version must be a non-negative safe integer\",\n );\n parseIsoTimestamp(head.updatedAt);\n const hasTransaction = head.lastTransactionId !== undefined;\n const hasHash = head.canonicalHash !== undefined;\n economyAssert(\n hasTransaction === hasHash && (head.version > 0) === hasTransaction,\n \"INVALID_CONTRACT\",\n \"Journal-chain head identity, hash, and version must describe the same state\",\n );\n if (head.lastTransactionId !== undefined) {\n assertEconomyIdentifier(head.lastTransactionId, \"lastTransactionId\");\n }\n if (head.canonicalHash !== undefined) {\n assertCanonicalHash(head.canonicalHash, \"Journal-chain-head hash\");\n }\n}\n\n/**\n * Proves that a hashed transaction extends the locked head and returns the\n * exact next head. The persistence adapter must compare-and-swap the old\n * version inside the same serializable transaction that appends the journal.\n */\nexport function advanceJournalChainHead(\n head: JournalChainHeadV1,\n transaction: ChainedEconomicJournalTransactionV1,\n): JournalChainHeadV1 {\n assertJournalChainHead(head);\n assertEconomicJournalTransaction(transaction);\n assertCanonicalHash(transaction.canonicalHash, \"Transaction hash\");\n economyAssert(\n transaction.previousCanonicalHash === head.canonicalHash,\n \"INVALID_CONTRACT\",\n \"Transaction previous hash must match the locked journal-chain head\",\n );\n economyAssert(\n transaction.canonicalHash !== head.canonicalHash,\n \"DUPLICATE_TRANSACTION\",\n \"Transaction hash must advance the journal chain\",\n );\n const recordedAt = parseIsoTimestamp(transaction.recordedAt);\n economyAssert(\n recordedAt >= parseIsoTimestamp(head.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Journal-chain update cannot precede its locked head\",\n );\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n chainId: head.chainId,\n version: head.version + 1,\n lastTransactionId: transaction.transactionId,\n canonicalHash: transaction.canonicalHash,\n updatedAt: transaction.recordedAt,\n };\n}\n\nfunction invalidVerification(\n checkedTransactions: number,\n observedHead: JournalChainHeadV1,\n failureCode: JournalChainVerificationFailureCodeV1,\n firstInvalidTransactionId?: TransactionId,\n): JournalChainVerificationResultV1 {\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n valid: false,\n checkedTransactions,\n observedHead,\n failureCode,\n ...(firstInvalidTransactionId === undefined\n ? {}\n : { firstInvalidTransactionId }),\n };\n}\n\nfunction safeTransactionId(value: string): TransactionId | undefined {\n try {\n assertEconomyIdentifier(value, \"transactionId\");\n return value;\n } catch (error) {\n if (error instanceof EconomyError) {\n return undefined;\n }\n throw error;\n }\n}\n\n/**\n * Recomputes an ordered journal segment without implementing cryptography.\n *\n * The caller supplies an approved SHA-256 adapter. Malformed transactions are\n * reported as integrity failures, while an invalid hash-adapter result is a\n * contract error and fails closed.\n */\nexport function verifyJournalChainSegment(\n startHead: JournalChainHeadV1,\n transactions: readonly ChainedEconomicJournalTransactionV1[],\n expectedEndHead: JournalChainHeadV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): JournalChainVerificationResultV1 {\n assertJournalChainHead(startHead);\n assertJournalChainHead(expectedEndHead);\n economyAssert(\n startHead.chainId === expectedEndHead.chainId,\n \"INVALID_CONTRACT\",\n \"Journal verification heads must belong to the same chain\",\n );\n\n let observedHead = startHead;\n let checkedTransactions = 0;\n const transactionIds = new Set<string>();\n\n for (const transaction of transactions) {\n let canonicalPayload: string;\n try {\n assertEconomicJournalTransaction(transaction);\n canonicalPayload = canonicalTransactionPayload(transaction);\n } catch (error) {\n if (error instanceof EconomyError) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"invalid-transaction\",\n safeTransactionId(transaction.transactionId),\n );\n }\n throw error;\n }\n\n if (transactionIds.has(transaction.transactionId)) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"duplicate-transaction\",\n transaction.transactionId,\n );\n }\n transactionIds.add(transaction.transactionId);\n\n if (transaction.previousCanonicalHash !== observedHead.canonicalHash) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"previous-hash-mismatch\",\n transaction.transactionId,\n );\n }\n\n const calculatedHash = hashCanonicalPayload(canonicalPayload);\n assertCanonicalHash(calculatedHash, \"Calculated transaction hash\");\n if (calculatedHash !== transaction.canonicalHash) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"canonical-hash-mismatch\",\n transaction.transactionId,\n );\n }\n\n try {\n observedHead = advanceJournalChainHead(observedHead, transaction);\n } catch (error) {\n if (error instanceof EconomyError) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"invalid-transaction\",\n safeTransactionId(transaction.transactionId),\n );\n }\n throw error;\n }\n checkedTransactions += 1;\n }\n\n if (\n observedHead.chainId !== expectedEndHead.chainId ||\n observedHead.version !== expectedEndHead.version ||\n observedHead.lastTransactionId !== expectedEndHead.lastTransactionId ||\n observedHead.canonicalHash !== expectedEndHead.canonicalHash ||\n observedHead.updatedAt !== expectedEndHead.updatedAt\n ) {\n return invalidVerification(\n checkedTransactions,\n observedHead,\n \"end-head-mismatch\",\n );\n }\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n valid: true,\n checkedTransactions,\n observedHead,\n };\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LotId,\n type ProviderEventId,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { EconomyError, economyAssert } from \"./errors.js\";\n\nexport type TokenSource =\n | \"shopify\"\n | \"ayet\"\n | \"bitlabs\"\n | \"google-ad-manager\"\n | \"subscription\"\n | \"event\"\n | \"competition\"\n | \"adjustment\";\n\nexport type LotTransferPolicy =\n | \"household-allocatable\"\n | \"same-user-only\"\n | \"non-transferable\";\n\nexport type LotRefundState =\n | \"none\"\n | \"partial\"\n | \"refunded\"\n | \"disputed\"\n | \"chargeback-lost\";\n\nexport interface SourceLotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly lotId: LotId;\n readonly walletId: WalletId;\n readonly beneficiaryAccountId: AccountId;\n readonly householdId?: HouseholdId;\n readonly payerAccountId?: AccountId;\n readonly source: TokenSource;\n readonly providerEventId?: ProviderEventId;\n readonly rateVersion: string;\n readonly settlementEvidenceHash: string;\n readonly transferPolicy: LotTransferPolicy;\n readonly refundState: LotRefundState;\n readonly originalAmount: TokenSubunitString;\n readonly remainingAmount: TokenSubunitString;\n readonly heldAmount: TokenSubunitString;\n readonly reversedAmount: TokenSubunitString;\n readonly settledAt: IsoTimestamp;\n readonly creditedAt: IsoTimestamp;\n readonly cohortKey?: string;\n}\n\nexport type LotUseOperation = \"allocate\" | \"spend\" | \"reclaim\" | \"refund\";\n\nexport interface LotUseContextV1 {\n readonly operation: LotUseOperation;\n readonly beneficiaryAccountId: AccountId;\n readonly householdId?: HouseholdId;\n}\n\nexport interface SourceLotSliceV1 {\n readonly lotId: LotId;\n readonly amount: TokenSubunitString;\n}\n\n/** Versioned mutable projection around immutable V1 source-lot provenance. */\nexport interface VersionedSourceLotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly lot: SourceLotV1;\n readonly version: number;\n readonly updatedAt: IsoTimestamp;\n}\n\nexport type SourceLotMovementType =\n | \"allocate\"\n | \"boost\"\n | \"reclaim\"\n | \"spend\"\n | \"hold\"\n | \"release-hold\"\n | \"refund\"\n | \"chargeback\"\n | \"reversal\";\n\n/**\n * Immutable movement applied to one source-lot projection by compare-and-swap.\n * Signed deltas are authoritative; `resultingRefundState` is part of the same\n * atomic version transition.\n */\nexport interface SourceLotMovementV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly movementId: string;\n readonly transactionId: TransactionId;\n readonly lotId: LotId;\n readonly movementType: SourceLotMovementType;\n readonly remainingDelta: TokenSubunitString;\n readonly heldDelta: TokenSubunitString;\n readonly reversedDelta: TokenSubunitString;\n readonly expectedVersion: number;\n readonly resultingVersion: number;\n readonly expectedRefundState: LotRefundState;\n readonly resultingRefundState: LotRefundState;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Validates source-lot arithmetic, evidence, and immutable provenance fields. */\nexport function assertSourceLot(lot: SourceLotV1): void {\n economyAssert(\n lot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported source-lot contract version\",\n );\n assertEconomyIdentifier(lot.lotId, \"lotId\");\n assertEconomyIdentifier(lot.walletId, \"walletId\");\n assertEconomyIdentifier(lot.beneficiaryAccountId, \"beneficiaryAccountId\");\n if (lot.householdId !== undefined) {\n assertEconomyIdentifier(lot.householdId, \"householdId\");\n }\n if (lot.payerAccountId !== undefined) {\n assertEconomyIdentifier(lot.payerAccountId, \"payerAccountId\");\n }\n if (lot.providerEventId !== undefined) {\n assertEconomyIdentifier(lot.providerEventId, \"providerEventId\");\n }\n assertEconomyIdentifier(lot.rateVersion, \"rateVersion\");\n economyAssert(\n [\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n \"google-ad-manager\",\n \"subscription\",\n \"event\",\n \"competition\",\n \"adjustment\",\n ].includes(lot.source),\n \"INVALID_CONTRACT\",\n \"Source lot has an unsupported source\",\n );\n economyAssert(\n [\"household-allocatable\", \"same-user-only\", \"non-transferable\"].includes(\n lot.transferPolicy,\n ),\n \"INVALID_CONTRACT\",\n \"Source lot has an unsupported transfer policy\",\n );\n economyAssert(\n [\"none\", \"partial\", \"refunded\", \"disputed\", \"chargeback-lost\"].includes(\n lot.refundState,\n ),\n \"INVALID_CONTRACT\",\n \"Source lot has an unsupported refund state\",\n );\n if (\n lot.source === \"ayet\" ||\n lot.source === \"bitlabs\" ||\n lot.source === \"google-ad-manager\"\n ) {\n economyAssert(\n lot.transferPolicy === \"same-user-only\" &&\n lot.providerEventId !== undefined,\n \"SOURCE_LOT_RESTRICTED\",\n \"Reward-provider lots must remain with the earning account\",\n );\n }\n if (lot.source === \"shopify\") {\n economyAssert(\n lot.transferPolicy === \"household-allocatable\" &&\n lot.householdId !== undefined &&\n lot.payerAccountId !== undefined,\n \"INVALID_CONTRACT\",\n \"Shopify lots must retain payer and receiving-household provenance\",\n );\n }\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(lot.settlementEvidenceHash),\n \"INVALID_CONTRACT\",\n \"Settlement evidence must be a sanitized SHA-256 reference\",\n );\n const settledAt = parseIsoTimestamp(lot.settledAt);\n const creditedAt = parseIsoTimestamp(lot.creditedAt);\n economyAssert(\n creditedAt >= settledAt,\n \"INVALID_TIME_WINDOW\",\n \"Source-lot credit time cannot precede settlement\",\n );\n if (lot.cohortKey !== undefined) {\n assertEconomyIdentifier(lot.cohortKey, \"cohortKey\");\n }\n\n const original = parseTokenSubunits(lot.originalAmount);\n const remaining = parseTokenSubunits(lot.remainingAmount);\n const held = parseTokenSubunits(lot.heldAmount);\n const reversed = parseTokenSubunits(lot.reversedAmount);\n economyAssert(\n original > 0n && remaining >= 0n && held >= 0n && reversed >= 0n,\n \"INVALID_AMOUNT\",\n \"Source-lot amounts must be non-negative and original must be positive\",\n );\n economyAssert(\n remaining <= original && held <= remaining && reversed <= original,\n \"INVALID_CONTRACT\",\n \"Source-lot amount components exceed the original or remaining amount\",\n );\n economyAssert(\n remaining + reversed <= original,\n \"INVALID_CONTRACT\",\n \"Remaining and reversed source-lot amounts exceed the original\",\n );\n}\n\n/** Validates the optimistic projection wrapper used by V2 persistence. */\nexport function assertVersionedSourceLot(\n snapshot: VersionedSourceLotV1,\n): void {\n economyAssert(\n snapshot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported versioned source-lot contract version\",\n );\n assertSourceLot(snapshot.lot);\n economyAssert(\n Number.isSafeInteger(snapshot.version) && snapshot.version >= 1,\n \"INVALID_CONTRACT\",\n \"Source-lot version must be a positive safe integer\",\n );\n economyAssert(\n parseIsoTimestamp(snapshot.updatedAt) >=\n parseIsoTimestamp(snapshot.lot.creditedAt),\n \"INVALID_TIME_WINDOW\",\n \"Source-lot update time cannot precede its credit\",\n );\n}\n\n/** Creates the only state accepted by the V2 append-source-lot operation. */\nexport function createInitialSourceLotSnapshot(\n lot: SourceLotV1,\n): VersionedSourceLotV1 {\n assertSourceLot(lot);\n economyAssert(\n lot.refundState === \"none\" &&\n lot.originalAmount === lot.remainingAmount &&\n parseTokenSubunits(lot.heldAmount) === 0n &&\n parseTokenSubunits(lot.reversedAmount) === 0n,\n \"INVALID_CONTRACT\",\n \"A new source lot must start fully remaining, clear, and unreversed\",\n );\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n lot,\n version: 1,\n updatedAt: lot.creditedAt,\n };\n}\n\nfunction assertRefundState(value: LotRefundState): void {\n economyAssert(\n [\n \"none\",\n \"partial\",\n \"refunded\",\n \"disputed\",\n \"chargeback-lost\",\n ].includes(value),\n \"INVALID_CONTRACT\",\n \"Source-lot movement has an unsupported refund state\",\n );\n}\n\n/** Validates movement shape and operation-specific delta direction. */\nexport function assertSourceLotMovement(\n movement: SourceLotMovementV1,\n): void {\n economyAssert(\n movement.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported source-lot-movement contract version\",\n );\n assertEconomyIdentifier(movement.movementId, \"movementId\");\n assertEconomyIdentifier(movement.transactionId, \"transactionId\");\n assertEconomyIdentifier(movement.lotId, \"lotId\");\n economyAssert(\n [\n \"allocate\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"release-hold\",\n \"refund\",\n \"chargeback\",\n \"reversal\",\n ].includes(movement.movementType),\n \"INVALID_CONTRACT\",\n \"Source-lot movement has an unsupported type\",\n );\n const remaining = parseTokenSubunits(movement.remainingDelta);\n const held = parseTokenSubunits(movement.heldDelta);\n const reversed = parseTokenSubunits(movement.reversedDelta);\n economyAssert(\n remaining !== 0n || held !== 0n || reversed !== 0n,\n \"INVALID_AMOUNT\",\n \"Source-lot movement must change at least one amount\",\n );\n economyAssert(\n Number.isSafeInteger(movement.expectedVersion) &&\n movement.expectedVersion >= 1 &&\n movement.resultingVersion === movement.expectedVersion + 1,\n \"INVALID_CONTRACT\",\n \"Source-lot movement must advance its optimistic version exactly once\",\n );\n assertRefundState(movement.expectedRefundState);\n assertRefundState(movement.resultingRefundState);\n parseIsoTimestamp(movement.occurredAt);\n\n if (\n movement.movementType === \"allocate\" ||\n movement.movementType === \"boost\" ||\n movement.movementType === \"spend\"\n ) {\n economyAssert(\n remaining < 0n &&\n held === 0n &&\n reversed === 0n &&\n movement.resultingRefundState === movement.expectedRefundState,\n \"INVALID_CONTRACT\",\n \"Allocation, boost, and spend movements only consume remaining lot value\",\n );\n } else if (movement.movementType === \"reclaim\") {\n economyAssert(\n remaining > 0n &&\n held === 0n &&\n reversed === 0n &&\n movement.resultingRefundState === movement.expectedRefundState,\n \"INVALID_CONTRACT\",\n \"Reclaim movements only restore remaining lot value\",\n );\n } else if (movement.movementType === \"hold\") {\n economyAssert(\n remaining === 0n &&\n held > 0n &&\n reversed === 0n &&\n movement.resultingRefundState === \"disputed\",\n \"INVALID_CONTRACT\",\n \"Hold movements must enter disputed state and increase held value\",\n );\n } else if (movement.movementType === \"release-hold\") {\n economyAssert(\n remaining === 0n &&\n held < 0n &&\n reversed === 0n &&\n movement.expectedRefundState === \"disputed\" &&\n movement.resultingRefundState !== \"disputed\" &&\n movement.resultingRefundState !== \"refunded\" &&\n movement.resultingRefundState !== \"chargeback-lost\",\n \"INVALID_CONTRACT\",\n \"Released holds must leave disputed state without reversing value\",\n );\n } else {\n economyAssert(\n remaining < 0n &&\n reversed === -remaining &&\n held <= 0n &&\n (movement.resultingRefundState === \"partial\" ||\n movement.resultingRefundState === \"refunded\" ||\n movement.resultingRefundState === \"chargeback-lost\"),\n \"INVALID_CONTRACT\",\n \"Refund, chargeback, and reversal movements must compensate remaining value exactly\",\n );\n if (movement.movementType === \"chargeback\") {\n economyAssert(\n movement.resultingRefundState === \"chargeback-lost\",\n \"INVALID_CONTRACT\",\n \"Chargeback movements must enter chargeback-lost state\",\n );\n } else {\n economyAssert(\n movement.resultingRefundState !== \"chargeback-lost\",\n \"INVALID_CONTRACT\",\n \"Only a chargeback movement may enter chargeback-lost state\",\n );\n }\n }\n}\n\n/**\n * Applies one immutable movement to a locked source-lot snapshot. Persistence\n * must append the movement and compare-and-swap this result atomically.\n */\nexport function applySourceLotMovement(\n snapshot: VersionedSourceLotV1,\n movement: SourceLotMovementV1,\n): VersionedSourceLotV1 {\n assertVersionedSourceLot(snapshot);\n assertSourceLotMovement(movement);\n economyAssert(\n movement.lotId === snapshot.lot.lotId &&\n movement.expectedVersion === snapshot.version &&\n movement.expectedRefundState === snapshot.lot.refundState,\n \"INVALID_CONTRACT\",\n \"Source-lot movement does not match the locked lot version and refund state\",\n );\n economyAssert(\n parseIsoTimestamp(movement.occurredAt) >=\n parseIsoTimestamp(snapshot.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Source-lot movement cannot precede its current projection\",\n );\n\n const lot: SourceLotV1 = {\n ...snapshot.lot,\n remainingAmount: serializeTokenSubunits(\n parseTokenSubunits(snapshot.lot.remainingAmount) +\n parseTokenSubunits(movement.remainingDelta),\n ),\n heldAmount: serializeTokenSubunits(\n parseTokenSubunits(snapshot.lot.heldAmount) +\n parseTokenSubunits(movement.heldDelta),\n ),\n reversedAmount: serializeTokenSubunits(\n parseTokenSubunits(snapshot.lot.reversedAmount) +\n parseTokenSubunits(movement.reversedDelta),\n ),\n refundState: movement.resultingRefundState,\n };\n assertSourceLot(lot);\n\n const remaining = parseTokenSubunits(lot.remainingAmount);\n const held = parseTokenSubunits(lot.heldAmount);\n const reversed = parseTokenSubunits(lot.reversedAmount);\n const original = parseTokenSubunits(lot.originalAmount);\n if (lot.refundState === \"none\") {\n economyAssert(\n reversed === 0n && held === 0n,\n \"INVALID_CONTRACT\",\n \"A clear lot cannot retain held or reversed value\",\n );\n } else if (lot.refundState === \"partial\") {\n economyAssert(\n reversed > 0n && remaining > 0n && held === 0n,\n \"INVALID_CONTRACT\",\n \"A partial refund requires retained/reversed value and no active hold\",\n );\n } else if (lot.refundState === \"disputed\") {\n economyAssert(\n held > 0n,\n \"INVALID_CONTRACT\",\n \"A disputed lot must hold affected value\",\n );\n } else {\n economyAssert(\n remaining === 0n && held === 0n && reversed === original,\n \"INVALID_CONTRACT\",\n \"Final refund and lost-chargeback states must reverse the full lot\",\n );\n }\n\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n lot,\n version: movement.resultingVersion,\n updatedAt: movement.occurredAt,\n };\n}\n\n/** Returns unheld, unconsumed TokenSubunits in a source lot. */\nexport function availableSourceLotAmount(lot: SourceLotV1): bigint {\n assertSourceLot(lot);\n return (\n parseTokenSubunits(lot.remainingAmount) - parseTokenSubunits(lot.heldAmount)\n );\n}\n\n/** Evaluates provider/source restrictions without trusting a browser claim. */\nexport function canUseSourceLot(\n lot: SourceLotV1,\n context: LotUseContextV1,\n): boolean {\n if (context.operation === \"refund\") {\n return true;\n }\n\n if (context.operation === \"allocate\" || context.operation === \"reclaim\") {\n return (\n lot.transferPolicy === \"household-allocatable\" &&\n lot.householdId !== undefined &&\n lot.householdId === context.householdId\n );\n }\n\n if (lot.transferPolicy === \"household-allocatable\") {\n return (\n lot.householdId !== undefined && lot.householdId === context.householdId\n );\n }\n\n return lot.beneficiaryAccountId === context.beneficiaryAccountId;\n}\n\n/**\n * Selects eligible lots deterministically in credited-time/lot-id order.\n * The returned slices are a proposal; persistence must consume them atomically.\n */\nexport function selectSourceLots(\n lots: readonly SourceLotV1[],\n requestedAmount: TokenSubunitString,\n context: LotUseContextV1,\n): readonly SourceLotSliceV1[] {\n const requested = parseTokenSubunits(requestedAmount);\n economyAssert(\n requested > 0n,\n \"INVALID_AMOUNT\",\n \"Requested source-lot amount must be positive\",\n );\n assertEconomyIdentifier(context.beneficiaryAccountId, \"beneficiaryAccountId\");\n\n const ordered = [...lots].sort((left, right) => {\n const timeDifference =\n parseIsoTimestamp(left.creditedAt) - parseIsoTimestamp(right.creditedAt);\n return timeDifference === 0\n ? left.lotId.localeCompare(right.lotId)\n : timeDifference;\n });\n\n let allAvailable = 0n;\n let remaining = requested;\n const slices: SourceLotSliceV1[] = [];\n\n for (const lot of ordered) {\n const available = availableSourceLotAmount(lot);\n allAvailable += available;\n if (available === 0n || !canUseSourceLot(lot, context)) {\n continue;\n }\n const selected = available < remaining ? available : remaining;\n slices.push({ lotId: lot.lotId, amount: serializeTokenSubunits(selected) });\n remaining -= selected;\n if (remaining === 0n) {\n return slices;\n }\n }\n\n if (allAvailable >= requested) {\n throw new EconomyError(\n \"SOURCE_LOT_RESTRICTED\",\n \"Available source lots do not permit this operation\",\n );\n }\n throw new EconomyError(\n \"INSUFFICIENT_ELIGIBLE_LOTS\",\n \"Insufficient eligible source-lot balance\",\n );\n}\n","import {\n isWholeTokenAmount,\n parseTokenSubunits,\n serializeTokenSubunits,\n sumTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LearningEntitlementId,\n type LearningModuleVersionId,\n type ModuleAllowanceId,\n type ModuleSpendHoldId,\n type ModuleSpendQuoteId,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { SourceLotSliceV1 } from \"./lots.js\";\n\nexport const MODULE_ALLOWANCE_PURPOSE =\n \"junior-coder-module-entitlement\" as const;\n\nexport type ModuleAllowanceStatusV1 = \"active\" | \"closed\";\n\n/** Guardian-funded value that can only purchase modules for one child. */\nexport interface ModuleAllowanceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly purpose: typeof MODULE_ALLOWANCE_PURPOSE;\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly hostWalletId: WalletId;\n readonly allowanceWalletId: WalletId;\n readonly childAccountId: AccountId;\n readonly status: ModuleAllowanceStatusV1;\n readonly allocatedAmount: TokenSubunitString;\n readonly availableAmount: TokenSubunitString;\n readonly heldAmount: TokenSubunitString;\n readonly spentAmount: TokenSubunitString;\n readonly reclaimedAmount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly reclaimedSlices: readonly SourceLotSliceV1[];\n readonly version: number;\n readonly createdAt: IsoTimestamp;\n readonly updatedAt: IsoTimestamp;\n}\n\nexport interface CreateModuleAllowanceInputV1 {\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly hostWalletId: WalletId;\n readonly allowanceWalletId: WalletId;\n readonly childAccountId: AccountId;\n readonly amount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface FundModuleAllowanceInputV1 {\n readonly amount: TokenSubunitString;\n readonly fundingSlices: readonly SourceLotSliceV1[];\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface ReclaimModuleAllowanceInputV1 {\n readonly amount: TokenSubunitString;\n readonly sourceSlices: readonly SourceLotSliceV1[];\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface CloseModuleAllowanceInputV1 {\n readonly expectedVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Immutable Guardian-approved module price and requirements evidence. */\nexport interface ModuleSpendQuoteV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly quoteId: ModuleSpendQuoteId;\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly guardianAccountId: AccountId;\n readonly childAccountId: AccountId;\n readonly moduleVersionId: LearningModuleVersionId;\n readonly catalogVersion: string;\n readonly amount: TokenSubunitString;\n readonly requirementsManifestVersion: string;\n readonly requirementsManifestHash: string;\n readonly requirementsAcknowledgedAt: IsoTimestamp;\n readonly issuedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n}\n\nexport type CreateModuleSpendQuoteInputV1 = Omit<\n ModuleSpendQuoteV1,\n \"schemaVersion\"\n>;\n\nexport type ModuleSpendHoldStatusV1 = \"held\" | \"settled\" | \"released\";\n\n/** Versioned projection for one quote-bound allowance hold. */\nexport interface ModuleSpendHoldV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly holdId: ModuleSpendHoldId;\n readonly quoteId: ModuleSpendQuoteId;\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly guardianAccountId: AccountId;\n readonly childAccountId: AccountId;\n readonly moduleVersionId: LearningModuleVersionId;\n readonly amount: TokenSubunitString;\n readonly requirementsManifestVersion: string;\n readonly requirementsManifestHash: string;\n readonly sourceSlices: readonly SourceLotSliceV1[];\n readonly status: ModuleSpendHoldStatusV1;\n readonly holdIdempotencyKey: string;\n readonly settlementIdempotencyKey?: string;\n readonly releaseIdempotencyKey?: string;\n readonly entitlementId?: LearningEntitlementId;\n readonly settlementTransactionId?: TransactionId;\n readonly releaseTransactionId?: TransactionId;\n readonly version: number;\n readonly createdAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n readonly updatedAt: IsoTimestamp;\n}\n\nexport interface CreateModuleSpendHoldInputV1 {\n readonly holdId: ModuleSpendHoldId;\n readonly idempotencyKey: string;\n readonly sourceSlices: readonly SourceLotSliceV1[];\n readonly expectedAllowanceVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface SettleModuleSpendHoldInputV1 {\n readonly entitlementId: LearningEntitlementId;\n readonly settlementTransactionId: TransactionId;\n readonly idempotencyKey: string;\n readonly expectedAllowanceVersion: number;\n readonly expectedHoldVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface ReleaseModuleSpendHoldInputV1 {\n readonly releaseTransactionId: TransactionId;\n readonly idempotencyKey: string;\n readonly expectedAllowanceVersion: number;\n readonly expectedHoldVersion: number;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface ModuleSpendTransitionResultV1 {\n readonly allowance: ModuleAllowanceV1;\n readonly hold: ModuleSpendHoldV1;\n}\n\n/** Durable economic receipt for an activated learning entitlement. */\nexport interface ModulePurchaseReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly receiptId: string;\n readonly quoteId: ModuleSpendQuoteId;\n readonly holdId: ModuleSpendHoldId;\n readonly allowanceId: ModuleAllowanceId;\n readonly householdId: HouseholdId;\n readonly guardianAccountId: AccountId;\n readonly childAccountId: AccountId;\n readonly moduleVersionId: LearningModuleVersionId;\n readonly entitlementId: LearningEntitlementId;\n readonly amount: TokenSubunitString;\n readonly requirementsManifestVersion: string;\n readonly requirementsManifestHash: string;\n readonly settlementTransactionId: TransactionId;\n readonly issuedAt: IsoTimestamp;\n}\n\nexport interface CreateModulePurchaseReceiptInputV1 {\n readonly receiptId: string;\n readonly issuedAt: IsoTimestamp;\n}\n\nexport type ModulePurchaseFinancialStateV1 =\n | \"missing\"\n | \"held\"\n | \"settled\"\n | \"released\";\nexport type ModulePurchaseEntitlementStateV1 =\n | \"missing\"\n | \"pending\"\n | \"active\"\n | \"cancelled\";\n\n/** Privacy-minimized observation used by an authoritative reconciler. */\nexport interface ModulePurchaseReconciliationObservationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly quoteId: ModuleSpendQuoteId;\n readonly holdId: ModuleSpendHoldId;\n readonly childAccountId: AccountId;\n readonly moduleVersionId: LearningModuleVersionId;\n readonly financialState: ModulePurchaseFinancialStateV1;\n readonly entitlementState: ModulePurchaseEntitlementStateV1;\n readonly receiptPresent: boolean;\n readonly observedAt: IsoTimestamp;\n}\n\nexport type ModulePurchaseReconciliationActionV1 =\n | \"none\"\n | \"resume-settlement\"\n | \"release-hold\"\n | \"activate-entitlement\"\n | \"issue-receipt\"\n | \"cancel-pending-entitlement\"\n | \"manual-review\";\n\nexport interface ModulePurchaseReconciliationResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly action: ModulePurchaseReconciliationActionV1;\n readonly blocking: boolean;\n readonly consistent: boolean;\n readonly reasonCode: string;\n}\n\nfunction assertWholePositive(amount: TokenSubunitString, label: string): bigint {\n const parsed = parseTokenSubunits(amount);\n economyAssert(parsed > 0n, \"INVALID_AMOUNT\", `${label} must be positive`);\n economyAssert(\n isWholeTokenAmount(parsed),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n `${label} must contain whole Tokens`,\n );\n return parsed;\n}\n\nfunction assertPositiveSlices(\n slices: readonly SourceLotSliceV1[],\n expectedAmount: bigint,\n label: string,\n): void {\n economyAssert(slices.length > 0, \"INVALID_CONTRACT\", `${label} are required`);\n const lotIds = new Set<string>();\n for (const slice of slices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n economyAssert(\n !lotIds.has(slice.lotId),\n \"DUPLICATE_IDENTIFIER\",\n `${label} must not repeat a lot`,\n );\n lotIds.add(slice.lotId);\n economyAssert(\n parseTokenSubunits(slice.amount) > 0n,\n \"INVALID_AMOUNT\",\n `${label} amounts must be positive`,\n );\n }\n economyAssert(\n sumTokenSubunits(slices.map((slice) => slice.amount)) === expectedAmount,\n \"INVALID_CONTRACT\",\n `${label} must sum to the operation amount`,\n );\n}\n\nfunction sumSlicesByLot(\n slices: readonly SourceLotSliceV1[],\n): ReadonlyMap<string, bigint> {\n const totals = new Map<string, bigint>();\n for (const slice of slices) {\n assertEconomyIdentifier(slice.lotId, \"lotId\");\n const amount = parseTokenSubunits(slice.amount);\n economyAssert(amount > 0n, \"INVALID_AMOUNT\", \"Lot slices must be positive\");\n totals.set(slice.lotId, (totals.get(slice.lotId) ?? 0n) + amount);\n }\n return totals;\n}\n\nfunction assertSha256Reference(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction assertUpdatedAt(\n current: IsoTimestamp,\n occurredAt: IsoTimestamp,\n label: string,\n): void {\n economyAssert(\n parseIsoTimestamp(occurredAt) >= parseIsoTimestamp(current),\n \"INVALID_TIME_WINDOW\",\n `${label} cannot precede the current state`,\n );\n}\n\n/** Validates exact arithmetic and source-lot provenance for an allowance. */\nexport function assertModuleAllowance(allowance: ModuleAllowanceV1): void {\n economyAssert(\n allowance.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n allowance.purpose === MODULE_ALLOWANCE_PURPOSE,\n \"INVALID_CONTRACT\",\n \"Unsupported Module Allowance contract\",\n );\n assertEconomyIdentifier(allowance.allowanceId, \"allowanceId\");\n assertEconomyIdentifier(allowance.householdId, \"householdId\");\n assertEconomyIdentifier(allowance.hostWalletId, \"hostWalletId\");\n assertEconomyIdentifier(allowance.allowanceWalletId, \"allowanceWalletId\");\n assertEconomyIdentifier(allowance.childAccountId, \"childAccountId\");\n economyAssert(\n allowance.hostWalletId !== allowance.allowanceWalletId,\n \"INVALID_CONTRACT\",\n \"Host and Module Allowance wallets must be distinct\",\n );\n economyAssert(\n allowance.status === \"active\" || allowance.status === \"closed\",\n \"INVALID_CONTRACT\",\n \"Module Allowance status is unsupported\",\n );\n const createdAt = parseIsoTimestamp(allowance.createdAt);\n const updatedAt = parseIsoTimestamp(allowance.updatedAt);\n economyAssert(\n updatedAt >= createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Module Allowance update cannot precede creation\",\n );\n economyAssert(\n Number.isSafeInteger(allowance.version) && allowance.version >= 1,\n \"INVALID_CONTRACT\",\n \"Module Allowance version must be a positive safe integer\",\n );\n\n const allocated = parseTokenSubunits(allowance.allocatedAmount);\n const available = parseTokenSubunits(allowance.availableAmount);\n const held = parseTokenSubunits(allowance.heldAmount);\n const spent = parseTokenSubunits(allowance.spentAmount);\n const reclaimed = parseTokenSubunits(allowance.reclaimedAmount);\n economyAssert(\n allocated > 0n &&\n [allocated, available, held, spent, reclaimed].every(\n (amount) => amount >= 0n && isWholeTokenAmount(amount),\n ),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Module Allowance amounts must be non-negative whole Tokens\",\n );\n economyAssert(\n allocated === available + held + spent + reclaimed,\n \"INVALID_CONTRACT\",\n \"Module Allowance buckets must equal its lifetime allocation\",\n );\n economyAssert(\n allowance.status !== \"closed\" || (available === 0n && held === 0n),\n \"INVALID_CONTRACT\",\n \"A closed Module Allowance cannot retain available or held value\",\n );\n\n const fundedByLot = sumSlicesByLot(allowance.fundingSlices);\n const reclaimedByLot = sumSlicesByLot(allowance.reclaimedSlices);\n economyAssert(\n sumTokenSubunits(allowance.fundingSlices.map((slice) => slice.amount)) ===\n allocated,\n \"INVALID_CONTRACT\",\n \"Module Allowance funding provenance must equal allocated value\",\n );\n economyAssert(\n sumTokenSubunits(allowance.reclaimedSlices.map((slice) => slice.amount)) ===\n reclaimed,\n \"INVALID_CONTRACT\",\n \"Module Allowance reclaim provenance must equal reclaimed value\",\n );\n for (const [lotId, amount] of reclaimedByLot) {\n economyAssert(\n amount <= (fundedByLot.get(lotId) ?? 0n),\n \"SOURCE_LOT_RESTRICTED\",\n \"Reclaimed provenance cannot exceed Module Allowance funding\",\n );\n }\n}\n\n/** Creates a child-specific Module Allowance from locked source-lot slices. */\nexport function createModuleAllowance(\n input: CreateModuleAllowanceInputV1,\n): ModuleAllowanceV1 {\n const amount = assertWholePositive(input.amount, \"Module Allowance amount\");\n assertPositiveSlices(input.fundingSlices, amount, \"Funding slices\");\n const allowance: ModuleAllowanceV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n purpose: MODULE_ALLOWANCE_PURPOSE,\n allowanceId: input.allowanceId,\n householdId: input.householdId,\n hostWalletId: input.hostWalletId,\n allowanceWalletId: input.allowanceWalletId,\n childAccountId: input.childAccountId,\n status: \"active\",\n allocatedAmount: input.amount,\n availableAmount: input.amount,\n heldAmount: serializeTokenSubunits(0n),\n spentAmount: serializeTokenSubunits(0n),\n reclaimedAmount: serializeTokenSubunits(0n),\n fundingSlices: input.fundingSlices,\n reclaimedSlices: [],\n version: 1,\n createdAt: input.occurredAt,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(allowance);\n return allowance;\n}\n\n/** Adds Guardian-selected source-lot value without replacing prior history. */\nexport function fundModuleAllowance(\n allowance: ModuleAllowanceV1,\n input: FundModuleAllowanceInputV1,\n): ModuleAllowanceV1 {\n assertModuleAllowance(allowance);\n economyAssert(\n allowance.status === \"active\" && allowance.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Module Allowance is closed or its optimistic version is stale\",\n );\n assertUpdatedAt(allowance.updatedAt, input.occurredAt, \"Funding time\");\n const amount = assertWholePositive(input.amount, \"Module Allowance funding\");\n assertPositiveSlices(input.fundingSlices, amount, \"Funding slices\");\n const next: ModuleAllowanceV1 = {\n ...allowance,\n allocatedAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.allocatedAmount) + amount,\n ),\n availableAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.availableAmount) + amount,\n ),\n fundingSlices: [...allowance.fundingSlices, ...input.fundingSlices],\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(next);\n return next;\n}\n\n/** Returns unused value to its source lots without changing spent history. */\nexport function reclaimModuleAllowance(\n allowance: ModuleAllowanceV1,\n input: ReclaimModuleAllowanceInputV1,\n): ModuleAllowanceV1 {\n assertModuleAllowance(allowance);\n economyAssert(\n allowance.status === \"active\" && allowance.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Module Allowance is closed or its optimistic version is stale\",\n );\n assertUpdatedAt(allowance.updatedAt, input.occurredAt, \"Reclaim time\");\n const amount = assertWholePositive(input.amount, \"Module Allowance reclaim\");\n economyAssert(\n amount <= parseTokenSubunits(allowance.availableAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Cannot reclaim held, spent, or unavailable Module Allowance value\",\n );\n assertPositiveSlices(input.sourceSlices, amount, \"Reclaim slices\");\n const fundedLotIds = new Set(\n allowance.fundingSlices.map((slice) => slice.lotId),\n );\n economyAssert(\n input.sourceSlices.every((slice) => fundedLotIds.has(slice.lotId)),\n \"SOURCE_LOT_RESTRICTED\",\n \"Reclaim slices must originate from the Module Allowance\",\n );\n const next: ModuleAllowanceV1 = {\n ...allowance,\n availableAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.availableAmount) - amount,\n ),\n reclaimedAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.reclaimedAmount) + amount,\n ),\n reclaimedSlices: [...allowance.reclaimedSlices, ...input.sourceSlices],\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(next);\n return next;\n}\n\n/** Closes an empty allowance; funding later requires a new allowance. */\nexport function closeModuleAllowance(\n allowance: ModuleAllowanceV1,\n input: CloseModuleAllowanceInputV1,\n): ModuleAllowanceV1 {\n assertModuleAllowance(allowance);\n economyAssert(\n allowance.status === \"active\" && allowance.version === input.expectedVersion,\n \"INVALID_CONTRACT\",\n \"Module Allowance is closed or its optimistic version is stale\",\n );\n assertUpdatedAt(allowance.updatedAt, input.occurredAt, \"Closure time\");\n economyAssert(\n parseTokenSubunits(allowance.availableAmount) === 0n &&\n parseTokenSubunits(allowance.heldAmount) === 0n,\n \"INVALID_CONTRACT\",\n \"Available value must be reclaimed and holds resolved before closure\",\n );\n const next: ModuleAllowanceV1 = {\n ...allowance,\n status: \"closed\",\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(next);\n return next;\n}\n\n/** Validates immutable price, Guardian acknowledgement, and manifest evidence. */\nexport function assertModuleSpendQuote(quote: ModuleSpendQuoteV1): void {\n economyAssert(\n quote.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported module-spend quote contract version\",\n );\n assertEconomyIdentifier(quote.quoteId, \"quoteId\");\n assertEconomyIdentifier(quote.allowanceId, \"allowanceId\");\n assertEconomyIdentifier(quote.householdId, \"householdId\");\n assertEconomyIdentifier(quote.guardianAccountId, \"guardianAccountId\");\n assertEconomyIdentifier(quote.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(quote.moduleVersionId, \"moduleVersionId\");\n assertEconomyIdentifier(quote.catalogVersion, \"catalogVersion\");\n assertEconomyIdentifier(\n quote.requirementsManifestVersion,\n \"requirementsManifestVersion\",\n );\n assertSha256Reference(\n quote.requirementsManifestHash,\n \"Requirements manifest hash\",\n );\n assertWholePositive(quote.amount, \"Module price\");\n const acknowledgedAt = parseIsoTimestamp(quote.requirementsAcknowledgedAt);\n const issuedAt = parseIsoTimestamp(quote.issuedAt);\n const expiresAt = parseIsoTimestamp(quote.expiresAt);\n economyAssert(\n acknowledgedAt <= issuedAt && expiresAt > issuedAt,\n \"INVALID_TIME_WINDOW\",\n \"Requirements must be acknowledged before a bounded quote is issued\",\n );\n}\n\n/** Creates immutable quote evidence from server-derived catalog facts. */\nexport function createModuleSpendQuote(\n input: CreateModuleSpendQuoteInputV1,\n): ModuleSpendQuoteV1 {\n const quote: ModuleSpendQuoteV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n ...input,\n };\n assertModuleSpendQuote(quote);\n return quote;\n}\n\n/** Validates one quote-bound hold lifecycle projection. */\nexport function assertModuleSpendHold(hold: ModuleSpendHoldV1): void {\n economyAssert(\n hold.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported module-spend hold contract version\",\n );\n assertEconomyIdentifier(hold.holdId, \"holdId\");\n assertEconomyIdentifier(hold.quoteId, \"quoteId\");\n assertEconomyIdentifier(hold.allowanceId, \"allowanceId\");\n assertEconomyIdentifier(hold.householdId, \"householdId\");\n assertEconomyIdentifier(hold.guardianAccountId, \"guardianAccountId\");\n assertEconomyIdentifier(hold.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(hold.moduleVersionId, \"moduleVersionId\");\n assertEconomyIdentifier(\n hold.requirementsManifestVersion,\n \"requirementsManifestVersion\",\n );\n assertSha256Reference(\n hold.requirementsManifestHash,\n \"Requirements manifest hash\",\n );\n assertEconomyIdentifier(hold.holdIdempotencyKey, \"holdIdempotencyKey\");\n const amount = assertWholePositive(hold.amount, \"Module hold amount\");\n assertPositiveSlices(hold.sourceSlices, amount, \"Hold source slices\");\n economyAssert(\n [\"held\", \"settled\", \"released\"].includes(hold.status),\n \"INVALID_CONTRACT\",\n \"Module hold status is unsupported\",\n );\n economyAssert(\n Number.isSafeInteger(hold.version) && hold.version >= 1,\n \"INVALID_CONTRACT\",\n \"Module hold version must be a positive safe integer\",\n );\n const createdAt = parseIsoTimestamp(hold.createdAt);\n const expiresAt = parseIsoTimestamp(hold.expiresAt);\n const updatedAt = parseIsoTimestamp(hold.updatedAt);\n economyAssert(\n expiresAt > createdAt && updatedAt >= createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Module hold requires a bounded lifetime and ordered updates\",\n );\n\n if (hold.status === \"held\") {\n economyAssert(\n hold.entitlementId === undefined &&\n hold.settlementTransactionId === undefined &&\n hold.releaseTransactionId === undefined &&\n hold.settlementIdempotencyKey === undefined &&\n hold.releaseIdempotencyKey === undefined,\n \"INVALID_CONTRACT\",\n \"An unsettled hold cannot claim an entitlement or final transaction\",\n );\n } else if (hold.status === \"settled\") {\n economyAssert(\n hold.entitlementId !== undefined &&\n hold.settlementTransactionId !== undefined &&\n hold.settlementIdempotencyKey !== undefined &&\n hold.releaseTransactionId === undefined &&\n hold.releaseIdempotencyKey === undefined,\n \"INVALID_CONTRACT\",\n \"A settled hold requires entitlement and transaction evidence\",\n );\n assertEconomyIdentifier(hold.entitlementId, \"entitlementId\");\n assertEconomyIdentifier(\n hold.settlementTransactionId,\n \"settlementTransactionId\",\n );\n assertEconomyIdentifier(\n hold.settlementIdempotencyKey,\n \"settlementIdempotencyKey\",\n );\n } else {\n economyAssert(\n hold.entitlementId === undefined &&\n hold.settlementTransactionId === undefined &&\n hold.settlementIdempotencyKey === undefined &&\n hold.releaseTransactionId !== undefined &&\n hold.releaseIdempotencyKey !== undefined,\n \"INVALID_CONTRACT\",\n \"A released hold requires release evidence only\",\n );\n assertEconomyIdentifier(hold.releaseTransactionId, \"releaseTransactionId\");\n assertEconomyIdentifier(hold.releaseIdempotencyKey, \"releaseIdempotencyKey\");\n }\n}\n\nfunction assertAllowanceMatchesQuote(\n allowance: ModuleAllowanceV1,\n quote: ModuleSpendQuoteV1,\n): void {\n economyAssert(\n allowance.status === \"active\" &&\n allowance.allowanceId === quote.allowanceId &&\n allowance.householdId === quote.householdId &&\n allowance.childAccountId === quote.childAccountId,\n \"INVALID_CONTRACT\",\n \"Module quote does not belong to this active child allowance\",\n );\n}\n\nfunction assertAllowanceMatchesHold(\n allowance: ModuleAllowanceV1,\n hold: ModuleSpendHoldV1,\n): void {\n economyAssert(\n allowance.status === \"active\" &&\n allowance.allowanceId === hold.allowanceId &&\n allowance.householdId === hold.householdId &&\n allowance.childAccountId === hold.childAccountId,\n \"INVALID_CONTRACT\",\n \"Module hold does not belong to this active child allowance\",\n );\n}\n\n/** Moves quoted value from available to held after all bindings are checked. */\nexport function createModuleSpendHold(\n allowance: ModuleAllowanceV1,\n quote: ModuleSpendQuoteV1,\n input: CreateModuleSpendHoldInputV1,\n): ModuleSpendTransitionResultV1 {\n assertModuleAllowance(allowance);\n assertModuleSpendQuote(quote);\n assertAllowanceMatchesQuote(allowance, quote);\n economyAssert(\n allowance.version === input.expectedAllowanceVersion,\n \"INVALID_CONTRACT\",\n \"Module Allowance optimistic version is stale\",\n );\n const occurredAt = parseIsoTimestamp(input.occurredAt);\n economyAssert(\n occurredAt >= parseIsoTimestamp(allowance.updatedAt) &&\n occurredAt >= parseIsoTimestamp(quote.issuedAt) &&\n occurredAt < parseIsoTimestamp(quote.expiresAt),\n \"INVALID_TIME_WINDOW\",\n \"Module quote is not valid at hold time\",\n );\n const amount = parseTokenSubunits(quote.amount);\n economyAssert(\n amount <= parseTokenSubunits(allowance.availableAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Module Allowance has insufficient available value\",\n );\n assertEconomyIdentifier(input.holdId, \"holdId\");\n assertEconomyIdentifier(input.idempotencyKey, \"idempotencyKey\");\n assertPositiveSlices(input.sourceSlices, amount, \"Hold source slices\");\n const fundedLotIds = new Set(\n allowance.fundingSlices.map((slice) => slice.lotId),\n );\n economyAssert(\n input.sourceSlices.every((slice) => fundedLotIds.has(slice.lotId)),\n \"SOURCE_LOT_RESTRICTED\",\n \"Hold slices must originate from the Module Allowance\",\n );\n\n const nextAllowance: ModuleAllowanceV1 = {\n ...allowance,\n availableAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.availableAmount) - amount,\n ),\n heldAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.heldAmount) + amount,\n ),\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n const hold: ModuleSpendHoldV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n holdId: input.holdId,\n quoteId: quote.quoteId,\n allowanceId: quote.allowanceId,\n householdId: quote.householdId,\n guardianAccountId: quote.guardianAccountId,\n childAccountId: quote.childAccountId,\n moduleVersionId: quote.moduleVersionId,\n amount: quote.amount,\n requirementsManifestVersion: quote.requirementsManifestVersion,\n requirementsManifestHash: quote.requirementsManifestHash,\n sourceSlices: input.sourceSlices,\n status: \"held\",\n holdIdempotencyKey: input.idempotencyKey,\n version: 1,\n createdAt: input.occurredAt,\n expiresAt: quote.expiresAt,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(nextAllowance);\n assertModuleSpendHold(hold);\n return { allowance: nextAllowance, hold };\n}\n\n/** Settles a hold only when the pending learning entitlement is identified. */\nexport function settleModuleSpendHold(\n allowance: ModuleAllowanceV1,\n hold: ModuleSpendHoldV1,\n input: SettleModuleSpendHoldInputV1,\n): ModuleSpendTransitionResultV1 {\n assertModuleAllowance(allowance);\n assertModuleSpendHold(hold);\n assertAllowanceMatchesHold(allowance, hold);\n economyAssert(\n hold.status === \"held\" &&\n allowance.version === input.expectedAllowanceVersion &&\n hold.version === input.expectedHoldVersion,\n \"INVALID_CONTRACT\",\n \"Module hold is final or an optimistic version is stale\",\n );\n assertEconomyIdentifier(input.entitlementId, \"entitlementId\");\n assertEconomyIdentifier(\n input.settlementTransactionId,\n \"settlementTransactionId\",\n );\n assertEconomyIdentifier(input.idempotencyKey, \"idempotencyKey\");\n const occurredAt = parseIsoTimestamp(input.occurredAt);\n economyAssert(\n occurredAt >= parseIsoTimestamp(allowance.updatedAt) &&\n occurredAt >= parseIsoTimestamp(hold.updatedAt) &&\n occurredAt < parseIsoTimestamp(hold.expiresAt),\n \"INVALID_TIME_WINDOW\",\n \"Module hold cannot settle outside its valid lifetime\",\n );\n const amount = parseTokenSubunits(hold.amount);\n economyAssert(\n amount <= parseTokenSubunits(allowance.heldAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Module Allowance does not contain the quoted held value\",\n );\n const nextAllowance: ModuleAllowanceV1 = {\n ...allowance,\n heldAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.heldAmount) - amount,\n ),\n spentAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.spentAmount) + amount,\n ),\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n const nextHold: ModuleSpendHoldV1 = {\n ...hold,\n status: \"settled\",\n settlementIdempotencyKey: input.idempotencyKey,\n entitlementId: input.entitlementId,\n settlementTransactionId: input.settlementTransactionId,\n version: hold.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(nextAllowance);\n assertModuleSpendHold(nextHold);\n return { allowance: nextAllowance, hold: nextHold };\n}\n\n/** Releases failed or expired held value back to the same allowance. */\nexport function releaseModuleSpendHold(\n allowance: ModuleAllowanceV1,\n hold: ModuleSpendHoldV1,\n input: ReleaseModuleSpendHoldInputV1,\n): ModuleSpendTransitionResultV1 {\n assertModuleAllowance(allowance);\n assertModuleSpendHold(hold);\n assertAllowanceMatchesHold(allowance, hold);\n economyAssert(\n hold.status === \"held\" &&\n allowance.version === input.expectedAllowanceVersion &&\n hold.version === input.expectedHoldVersion,\n \"INVALID_CONTRACT\",\n \"Module hold is final or an optimistic version is stale\",\n );\n assertEconomyIdentifier(input.releaseTransactionId, \"releaseTransactionId\");\n assertEconomyIdentifier(input.idempotencyKey, \"idempotencyKey\");\n const occurredAt = parseIsoTimestamp(input.occurredAt);\n economyAssert(\n occurredAt >= parseIsoTimestamp(allowance.updatedAt) &&\n occurredAt >= parseIsoTimestamp(hold.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Module hold release cannot precede its current state\",\n );\n const amount = parseTokenSubunits(hold.amount);\n economyAssert(\n amount <= parseTokenSubunits(allowance.heldAmount),\n \"INSUFFICIENT_BALANCE\",\n \"Module Allowance does not contain the quoted held value\",\n );\n const nextAllowance: ModuleAllowanceV1 = {\n ...allowance,\n availableAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.availableAmount) + amount,\n ),\n heldAmount: serializeTokenSubunits(\n parseTokenSubunits(allowance.heldAmount) - amount,\n ),\n version: allowance.version + 1,\n updatedAt: input.occurredAt,\n };\n const nextHold: ModuleSpendHoldV1 = {\n ...hold,\n status: \"released\",\n releaseIdempotencyKey: input.idempotencyKey,\n releaseTransactionId: input.releaseTransactionId,\n version: hold.version + 1,\n updatedAt: input.occurredAt,\n };\n assertModuleAllowance(nextAllowance);\n assertModuleSpendHold(nextHold);\n return { allowance: nextAllowance, hold: nextHold };\n}\n\n/** Validates a durable receipt against settled economic evidence. */\nexport function assertModulePurchaseReceipt(\n receipt: ModulePurchaseReceiptV1,\n): void {\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported module-purchase receipt contract version\",\n );\n assertEconomyIdentifier(receipt.receiptId, \"receiptId\");\n assertEconomyIdentifier(receipt.quoteId, \"quoteId\");\n assertEconomyIdentifier(receipt.holdId, \"holdId\");\n assertEconomyIdentifier(receipt.allowanceId, \"allowanceId\");\n assertEconomyIdentifier(receipt.householdId, \"householdId\");\n assertEconomyIdentifier(receipt.guardianAccountId, \"guardianAccountId\");\n assertEconomyIdentifier(receipt.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(receipt.moduleVersionId, \"moduleVersionId\");\n assertEconomyIdentifier(receipt.entitlementId, \"entitlementId\");\n assertEconomyIdentifier(\n receipt.requirementsManifestVersion,\n \"requirementsManifestVersion\",\n );\n assertSha256Reference(\n receipt.requirementsManifestHash,\n \"Requirements manifest hash\",\n );\n assertEconomyIdentifier(\n receipt.settlementTransactionId,\n \"settlementTransactionId\",\n );\n assertWholePositive(receipt.amount, \"Receipt amount\");\n parseIsoTimestamp(receipt.issuedAt);\n}\n\n/** Creates a receipt only when quote and settled hold evidence match exactly. */\nexport function createModulePurchaseReceipt(\n quote: ModuleSpendQuoteV1,\n hold: ModuleSpendHoldV1,\n input: CreateModulePurchaseReceiptInputV1,\n): ModulePurchaseReceiptV1 {\n assertModuleSpendQuote(quote);\n assertModuleSpendHold(hold);\n economyAssert(\n hold.status === \"settled\" &&\n hold.quoteId === quote.quoteId &&\n hold.allowanceId === quote.allowanceId &&\n hold.householdId === quote.householdId &&\n hold.guardianAccountId === quote.guardianAccountId &&\n hold.childAccountId === quote.childAccountId &&\n hold.moduleVersionId === quote.moduleVersionId &&\n hold.amount === quote.amount &&\n hold.requirementsManifestVersion === quote.requirementsManifestVersion &&\n hold.requirementsManifestHash === quote.requirementsManifestHash,\n \"INVALID_CONTRACT\",\n \"Receipt quote and settled hold evidence do not match\",\n );\n economyAssert(\n parseIsoTimestamp(input.issuedAt) >= parseIsoTimestamp(hold.updatedAt),\n \"INVALID_TIME_WINDOW\",\n \"Receipt cannot precede settlement\",\n );\n const receipt: ModulePurchaseReceiptV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n receiptId: input.receiptId,\n quoteId: quote.quoteId,\n holdId: hold.holdId,\n allowanceId: quote.allowanceId,\n householdId: quote.householdId,\n guardianAccountId: quote.guardianAccountId,\n childAccountId: quote.childAccountId,\n moduleVersionId: quote.moduleVersionId,\n entitlementId: hold.entitlementId!,\n amount: quote.amount,\n requirementsManifestVersion: quote.requirementsManifestVersion,\n requirementsManifestHash: quote.requirementsManifestHash,\n settlementTransactionId: hold.settlementTransactionId!,\n issuedAt: input.issuedAt,\n };\n assertModulePurchaseReceipt(receipt);\n return receipt;\n}\n\n/** Validates privacy-minimized cross-service reconciliation evidence. */\nexport function assertModulePurchaseReconciliationObservation(\n observation: ModulePurchaseReconciliationObservationV1,\n): void {\n economyAssert(\n observation.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported module-purchase reconciliation contract version\",\n );\n assertEconomyIdentifier(observation.quoteId, \"quoteId\");\n assertEconomyIdentifier(observation.holdId, \"holdId\");\n assertEconomyIdentifier(observation.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(observation.moduleVersionId, \"moduleVersionId\");\n economyAssert(\n [\"missing\", \"held\", \"settled\", \"released\"].includes(\n observation.financialState,\n ),\n \"INVALID_CONTRACT\",\n \"Reconciliation financial state is unsupported\",\n );\n economyAssert(\n [\"missing\", \"pending\", \"active\", \"cancelled\"].includes(\n observation.entitlementState,\n ),\n \"INVALID_CONTRACT\",\n \"Reconciliation entitlement state is unsupported\",\n );\n economyAssert(\n typeof observation.receiptPresent === \"boolean\",\n \"INVALID_CONTRACT\",\n \"Receipt presence must be Boolean\",\n );\n parseIsoTimestamp(observation.observedAt);\n}\n\nfunction reconciliationResult(\n action: ModulePurchaseReconciliationActionV1,\n reasonCode: string,\n blocking = false,\n consistent = false,\n): ModulePurchaseReconciliationResultV1 {\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n action,\n blocking,\n consistent,\n reasonCode,\n };\n}\n\n/**\n * Returns one forward-safe action. Callers must reload and lock authoritative\n * state before carrying it out; `manual-review` never authorizes a mutation.\n */\nexport function reconcileModulePurchase(\n observation: ModulePurchaseReconciliationObservationV1,\n): ModulePurchaseReconciliationResultV1 {\n assertModulePurchaseReconciliationObservation(observation);\n const { financialState, entitlementState, receiptPresent } = observation;\n\n if (receiptPresent && !(financialState === \"settled\" && entitlementState === \"active\")) {\n return reconciliationResult(\n \"manual-review\",\n \"receipt-conflicts-with-authoritative-state\",\n true,\n );\n }\n if (financialState === \"settled\" && entitlementState === \"active\") {\n return receiptPresent\n ? reconciliationResult(\"none\", \"purchase-consistent\", false, true)\n : reconciliationResult(\"issue-receipt\", \"settled-active-receipt-missing\");\n }\n if (financialState === \"held\" && entitlementState === \"pending\") {\n return reconciliationResult(\"resume-settlement\", \"held-pending\");\n }\n if (\n financialState === \"held\" &&\n (entitlementState === \"missing\" || entitlementState === \"cancelled\")\n ) {\n return reconciliationResult(\"release-hold\", \"held-without-usable-entitlement\");\n }\n if (financialState === \"settled\" && entitlementState === \"pending\") {\n return reconciliationResult(\"activate-entitlement\", \"settled-pending\");\n }\n if (\n (financialState === \"missing\" || financialState === \"released\") &&\n entitlementState === \"pending\"\n ) {\n return reconciliationResult(\n \"cancel-pending-entitlement\",\n \"pending-without-settlement-path\",\n );\n }\n if (\n (financialState === \"missing\" || financialState === \"released\") &&\n (entitlementState === \"missing\" || entitlementState === \"cancelled\")\n ) {\n return reconciliationResult(\"none\", \"no-active-purchase\", false, true);\n }\n return reconciliationResult(\n \"manual-review\",\n financialState === \"settled\"\n ? \"settled-debit-without-entitlement\"\n : \"active-entitlement-without-settled-debit\",\n true,\n );\n}\n","import { parseTokenSubunits, type TokenSubunitString } from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type AdjustmentStatus =\n | \"draft\"\n | \"pending-approval\"\n | \"approved\"\n | \"rejected\"\n | \"executed\"\n | \"expired\";\n\n/** Dual-control request; the resulting change is always a ledger transaction. */\nexport interface AdjustmentRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly adjustmentId: string;\n readonly walletId: WalletId;\n readonly amount: TokenSubunitString;\n readonly reason: string;\n readonly ticketReference: string;\n readonly status: AdjustmentStatus;\n readonly initiatedByAccountId: AccountId;\n readonly initiatedAt: IsoTimestamp;\n readonly approvedByAccountId?: AccountId;\n readonly approvedAt?: IsoTimestamp;\n readonly resultingTransactionId?: TransactionId;\n}\n\n/** Proves that production adjustment approval was performed by another actor. */\nexport function assertDistinctAdjustmentApproval(\n request: AdjustmentRequestV1,\n): void {\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported adjustment contract version\",\n );\n assertEconomyIdentifier(request.adjustmentId, \"adjustmentId\");\n assertEconomyIdentifier(request.walletId, \"walletId\");\n assertEconomyIdentifier(request.initiatedByAccountId, \"initiatedByAccountId\");\n economyAssert(\n parseTokenSubunits(request.amount) !== 0n,\n \"INVALID_AMOUNT\",\n \"Adjustment amount cannot be zero\",\n );\n economyAssert(\n request.reason.trim().length > 0 && request.reason.length <= 512,\n \"INVALID_CONTRACT\",\n \"Adjustment reason is required and must be bounded\",\n );\n assertEconomyIdentifier(request.ticketReference, \"ticketReference\");\n const initiatedAt = parseIsoTimestamp(request.initiatedAt);\n economyAssert(\n request.approvedByAccountId !== undefined &&\n request.approvedByAccountId !== request.initiatedByAccountId,\n \"INVALID_CONTRACT\",\n \"Adjustment approval requires a distinct authorized operator\",\n );\n assertEconomyIdentifier(request.approvedByAccountId, \"approvedByAccountId\");\n economyAssert(\n request.approvedAt !== undefined &&\n parseIsoTimestamp(request.approvedAt) >= initiatedAt,\n \"INVALID_TIME_WINDOW\",\n \"Adjustment approval time must follow initiation\",\n );\n economyAssert(\n request.status === \"approved\" || request.status === \"executed\",\n \"INVALID_CONTRACT\",\n \"Only approved adjustments satisfy dual-control approval\",\n );\n if (request.resultingTransactionId !== undefined) {\n assertEconomyIdentifier(\n request.resultingTransactionId,\n \"resultingTransactionId\",\n );\n }\n}\n","import { parseTokenSubunits, type TokenSubunitString } from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type LotId,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { LotTransferPolicy } from \"./lots.js\";\n\nexport type OperatorAdjustmentOperationV1 = \"credit\" | \"reverse-credit\";\n\nexport type OperatorAdjustmentTargetComponentV1 =\n | \"personal\"\n | \"household-treasury\";\n\nexport type OperatorAdjustmentRefundPolicyV1 = \"not-refundable\";\n\nexport type OperatorAdjustmentDecisionKindV1 = \"approve\" | \"reject\";\n\nexport type OperatorAdjustmentProposalStatusV1 = \"pending-approval\";\n\nexport type OperatorAdjustmentFailureCodeV1 =\n | \"ADJUSTMENT_DISABLED\"\n | \"ADJUSTMENT_OWNER_REQUIRED\"\n | \"ADJUSTMENT_CAPABILITY_DENIED\"\n | \"ADJUSTMENT_STEP_UP_REQUIRED\"\n | \"ADJUSTMENT_TARGET_UNAVAILABLE\"\n | \"ADJUSTMENT_SELF_APPROVAL\"\n | \"ADJUSTMENT_EXPIRED\"\n | \"ADJUSTMENT_PREVIEW_MISMATCH\"\n | \"ADJUSTMENT_ALREADY_DECIDED\"\n | \"ADJUSTMENT_ALREADY_EXECUTED\"\n | \"ADJUSTMENT_NOT_APPROVED\"\n | \"ADJUSTMENT_REVERSAL_UNAVAILABLE\";\n\n/**\n * Immutable server-prepared value plan shown to both adjustment operators.\n *\n * Callers may request an account and component, but only a trusted adapter may\n * resolve the wallet, ledger accounts and deterministic source lot recorded\n * here. Browser or MCP supplied wallet and ledger identifiers are never input\n * authority.\n */\nexport interface OperatorAdjustmentPreviewV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly previewId: string;\n readonly adjustmentId: string;\n readonly operation: OperatorAdjustmentOperationV1;\n readonly targetAccountId: AccountId;\n readonly targetComponent: OperatorAdjustmentTargetComponentV1;\n readonly targetWalletId: WalletId;\n readonly targetLedgerAccountId: AccountId;\n readonly offsetLedgerAccountId: AccountId;\n readonly sourceLotId: LotId;\n /** Positive magnitude. Reversals carry direction in `operation`. */\n readonly amount: TokenSubunitString;\n readonly reasonCode: string;\n /** SHA-256 of an adapter-owned, bounded ticket reference. */\n readonly ticketReferenceHash: string;\n readonly transferPolicy: LotTransferPolicy;\n readonly refundPolicy: OperatorAdjustmentRefundPolicyV1;\n readonly originalSourceLotId?: LotId;\n readonly originalTransactionId?: TransactionId;\n readonly preparedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n}\n\n/** Immutable first-operator proposal bound to the exact prepared preview. */\nexport interface OperatorAdjustmentProposalV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly proposalId: string;\n readonly adjustmentId: string;\n readonly previewHash: string;\n readonly status: OperatorAdjustmentProposalStatusV1;\n readonly proposedByAccountId: AccountId;\n readonly proposedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n}\n\n/** Immutable second-operator decision bound to the exact preview hash. */\nexport interface OperatorAdjustmentDecisionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly decisionId: string;\n readonly adjustmentId: string;\n readonly proposalId: string;\n readonly proposalHash: string;\n readonly previewHash: string;\n readonly decision: OperatorAdjustmentDecisionKindV1;\n readonly proposedByAccountId: AccountId;\n readonly decidedByAccountId: AccountId;\n readonly proposedAt: IsoTimestamp;\n readonly decidedAt: IsoTimestamp;\n}\n\n/** Immutable result edge linking an approved plan to its ledger transaction. */\nexport interface OperatorAdjustmentExecutionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly executionId: string;\n readonly adjustmentId: string;\n readonly previewHash: string;\n readonly proposalHash: string;\n readonly decisionHash: string;\n readonly sourceLotId: LotId;\n readonly transactionId: TransactionId;\n readonly resultReceiptId: string;\n readonly executedAt: IsoTimestamp;\n}\n\nconst PREVIEW_KEYS = new Set([\n \"schemaVersion\",\n \"previewId\",\n \"adjustmentId\",\n \"operation\",\n \"targetAccountId\",\n \"targetComponent\",\n \"targetWalletId\",\n \"targetLedgerAccountId\",\n \"offsetLedgerAccountId\",\n \"sourceLotId\",\n \"amount\",\n \"reasonCode\",\n \"ticketReferenceHash\",\n \"transferPolicy\",\n \"refundPolicy\",\n \"originalSourceLotId\",\n \"originalTransactionId\",\n \"preparedAt\",\n \"expiresAt\",\n]);\nconst DECISION_KEYS = new Set([\n \"schemaVersion\",\n \"decisionId\",\n \"adjustmentId\",\n \"proposalId\",\n \"proposalHash\",\n \"previewHash\",\n \"decision\",\n \"proposedByAccountId\",\n \"decidedByAccountId\",\n \"proposedAt\",\n \"decidedAt\",\n]);\nconst PROPOSAL_KEYS = new Set([\n \"schemaVersion\",\n \"proposalId\",\n \"adjustmentId\",\n \"previewHash\",\n \"status\",\n \"proposedByAccountId\",\n \"proposedAt\",\n \"expiresAt\",\n]);\nconst EXECUTION_KEYS = new Set([\n \"schemaVersion\",\n \"executionId\",\n \"adjustmentId\",\n \"previewHash\",\n \"proposalHash\",\n \"decisionHash\",\n \"sourceLotId\",\n \"transactionId\",\n \"resultReceiptId\",\n \"executedAt\",\n]);\nconst OPERATIONS = new Set<OperatorAdjustmentOperationV1>([\n \"credit\",\n \"reverse-credit\",\n]);\nconst TARGET_COMPONENTS = new Set<OperatorAdjustmentTargetComponentV1>([\n \"personal\",\n \"household-treasury\",\n]);\nconst TRANSFER_POLICIES = new Set<LotTransferPolicy>([\n \"household-allocatable\",\n \"same-user-only\",\n \"non-transferable\",\n]);\nconst DECISIONS = new Set<OperatorAdjustmentDecisionKindV1>([\n \"approve\",\n \"reject\",\n]);\n\nfunction assertExactKeys(\n value: object,\n allowed: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowed.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported field`,\n );\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction assertReasonCode(reasonCode: string): void {\n economyAssert(\n /^[A-Z][A-Z0-9_]{2,95}$/u.test(reasonCode),\n \"INVALID_CONTRACT\",\n \"Adjustment reasonCode must be a bounded uppercase identifier\",\n );\n}\n\n/** Validates one exact, positive and privacy-minimized operator value plan. */\nexport function assertOperatorAdjustmentPreview(\n preview: OperatorAdjustmentPreviewV1,\n): void {\n assertExactKeys(preview, PREVIEW_KEYS, \"Operator adjustment preview\");\n economyAssert(\n preview.schemaVersion === ECONOMY_CONTRACT_VERSION\n && OPERATIONS.has(preview.operation)\n && TARGET_COMPONENTS.has(preview.targetComponent)\n && TRANSFER_POLICIES.has(preview.transferPolicy)\n && preview.refundPolicy === \"not-refundable\",\n \"INVALID_CONTRACT\",\n \"Unsupported operator adjustment preview\",\n );\n assertEconomyIdentifier(preview.previewId, \"previewId\");\n assertEconomyIdentifier(preview.adjustmentId, \"adjustmentId\");\n assertEconomyIdentifier(preview.targetAccountId, \"targetAccountId\");\n assertEconomyIdentifier(preview.targetWalletId, \"targetWalletId\");\n assertEconomyIdentifier(\n preview.targetLedgerAccountId,\n \"targetLedgerAccountId\",\n );\n assertEconomyIdentifier(\n preview.offsetLedgerAccountId,\n \"offsetLedgerAccountId\",\n );\n assertEconomyIdentifier(preview.sourceLotId, \"sourceLotId\");\n economyAssert(\n parseTokenSubunits(preview.amount) > 0n,\n \"INVALID_AMOUNT\",\n \"Operator adjustment amount must be positive\",\n );\n assertReasonCode(preview.reasonCode);\n assertCanonicalHash(preview.ticketReferenceHash, \"ticketReferenceHash\");\n const preparedAt = parseIsoTimestamp(preview.preparedAt);\n const expiresAt = parseIsoTimestamp(preview.expiresAt);\n economyAssert(\n expiresAt > preparedAt,\n \"INVALID_TIME_WINDOW\",\n \"Operator adjustment preview must expire after preparation\",\n );\n\n if (preview.operation === \"credit\") {\n economyAssert(\n preview.originalSourceLotId === undefined\n && preview.originalTransactionId === undefined,\n \"INVALID_CONTRACT\",\n \"A credit preview cannot bind an original transaction\",\n );\n return;\n }\n\n economyAssert(\n preview.originalSourceLotId !== undefined\n && preview.originalTransactionId !== undefined,\n \"INVALID_CONTRACT\",\n \"A reversal preview must bind the original lot and transaction\",\n );\n assertEconomyIdentifier(preview.originalSourceLotId, \"originalSourceLotId\");\n assertEconomyIdentifier(\n preview.originalTransactionId,\n \"originalTransactionId\",\n );\n}\n\n/** Canonical preview bytes for an approved SHA-256 adapter. */\nexport function canonicalOperatorAdjustmentPreviewPayload(\n preview: OperatorAdjustmentPreviewV1,\n): string {\n assertOperatorAdjustmentPreview(preview);\n return JSON.stringify({\n schemaVersion: preview.schemaVersion,\n previewId: preview.previewId,\n adjustmentId: preview.adjustmentId,\n operation: preview.operation,\n targetAccountId: preview.targetAccountId,\n targetComponent: preview.targetComponent,\n targetWalletId: preview.targetWalletId,\n targetLedgerAccountId: preview.targetLedgerAccountId,\n offsetLedgerAccountId: preview.offsetLedgerAccountId,\n sourceLotId: preview.sourceLotId,\n amount: preview.amount,\n reasonCode: preview.reasonCode,\n ticketReferenceHash: preview.ticketReferenceHash,\n transferPolicy: preview.transferPolicy,\n refundPolicy: preview.refundPolicy,\n ...(preview.originalSourceLotId === undefined\n ? {}\n : { originalSourceLotId: preview.originalSourceLotId }),\n ...(preview.originalTransactionId === undefined\n ? {}\n : { originalTransactionId: preview.originalTransactionId }),\n preparedAt: preview.preparedAt,\n expiresAt: preview.expiresAt,\n });\n}\n\n/** Validates a pending proposal against the exact server-prepared preview. */\nexport function assertOperatorAdjustmentProposal(\n proposal: OperatorAdjustmentProposalV1,\n preview: OperatorAdjustmentPreviewV1,\n expectedPreviewHash: string,\n): void {\n assertOperatorAdjustmentPreview(preview);\n assertCanonicalHash(expectedPreviewHash, \"expectedPreviewHash\");\n assertExactKeys(proposal, PROPOSAL_KEYS, \"Operator adjustment proposal\");\n economyAssert(\n proposal.schemaVersion === ECONOMY_CONTRACT_VERSION\n && proposal.status === \"pending-approval\",\n \"INVALID_CONTRACT\",\n \"Unsupported operator adjustment proposal\",\n );\n assertEconomyIdentifier(proposal.proposalId, \"proposalId\");\n assertEconomyIdentifier(proposal.adjustmentId, \"adjustmentId\");\n assertCanonicalHash(proposal.previewHash, \"previewHash\");\n assertEconomyIdentifier(\n proposal.proposedByAccountId,\n \"proposedByAccountId\",\n );\n economyAssert(\n proposal.adjustmentId === preview.adjustmentId\n && proposal.previewHash === expectedPreviewHash,\n \"ADJUSTMENT_PREVIEW_MISMATCH\",\n \"Operator adjustment proposal does not match its preview\",\n );\n const proposedAt = parseIsoTimestamp(proposal.proposedAt);\n const expiresAt = parseIsoTimestamp(proposal.expiresAt);\n economyAssert(\n proposedAt >= parseIsoTimestamp(preview.preparedAt)\n && expiresAt === parseIsoTimestamp(preview.expiresAt)\n && expiresAt > proposedAt,\n \"INVALID_TIME_WINDOW\",\n \"Operator adjustment proposal times are inconsistent\",\n );\n}\n\n/** Canonical proposal bytes for the immutable pending-approval fact. */\nexport function canonicalOperatorAdjustmentProposalPayload(\n proposal: OperatorAdjustmentProposalV1,\n): string {\n assertExactKeys(proposal, PROPOSAL_KEYS, \"Operator adjustment proposal\");\n return JSON.stringify({\n schemaVersion: proposal.schemaVersion,\n proposalId: proposal.proposalId,\n adjustmentId: proposal.adjustmentId,\n previewHash: proposal.previewHash,\n status: proposal.status,\n proposedByAccountId: proposal.proposedByAccountId,\n proposedAt: proposal.proposedAt,\n expiresAt: proposal.expiresAt,\n });\n}\n\n/** Validates a distinct-operator decision against its immutable preview. */\nexport function assertOperatorAdjustmentDecision(\n decision: OperatorAdjustmentDecisionV1,\n proposal: OperatorAdjustmentProposalV1,\n preview: OperatorAdjustmentPreviewV1,\n expectedPreviewHash: string,\n expectedProposalHash: string,\n): void {\n assertOperatorAdjustmentProposal(proposal, preview, expectedPreviewHash);\n assertCanonicalHash(expectedProposalHash, \"expectedProposalHash\");\n assertExactKeys(decision, DECISION_KEYS, \"Operator adjustment decision\");\n economyAssert(\n decision.schemaVersion === ECONOMY_CONTRACT_VERSION\n && DECISIONS.has(decision.decision),\n \"INVALID_CONTRACT\",\n \"Unsupported operator adjustment decision\",\n );\n assertEconomyIdentifier(decision.decisionId, \"decisionId\");\n assertEconomyIdentifier(decision.adjustmentId, \"adjustmentId\");\n assertEconomyIdentifier(decision.proposalId, \"proposalId\");\n assertCanonicalHash(decision.proposalHash, \"proposalHash\");\n assertCanonicalHash(decision.previewHash, \"previewHash\");\n assertEconomyIdentifier(\n decision.proposedByAccountId,\n \"proposedByAccountId\",\n );\n assertEconomyIdentifier(\n decision.decidedByAccountId,\n \"decidedByAccountId\",\n );\n economyAssert(\n decision.proposedByAccountId !== decision.decidedByAccountId,\n \"ADJUSTMENT_SELF_APPROVAL\",\n \"Operator adjustment approval requires a distinct operator\",\n );\n economyAssert(\n decision.adjustmentId === preview.adjustmentId\n && decision.proposalId === proposal.proposalId\n && decision.proposalHash === expectedProposalHash\n && decision.previewHash === expectedPreviewHash,\n \"ADJUSTMENT_PREVIEW_MISMATCH\",\n \"Operator adjustment decision does not match its preview\",\n );\n const proposedAt = parseIsoTimestamp(decision.proposedAt);\n const decidedAt = parseIsoTimestamp(decision.decidedAt);\n economyAssert(\n decision.proposedByAccountId === proposal.proposedByAccountId\n && proposedAt === parseIsoTimestamp(proposal.proposedAt)\n && decidedAt >= proposedAt,\n \"INVALID_TIME_WINDOW\",\n \"Operator adjustment decision times are inconsistent\",\n );\n economyAssert(\n decidedAt <= parseIsoTimestamp(preview.expiresAt),\n \"ADJUSTMENT_EXPIRED\",\n \"Operator adjustment preview has expired\",\n );\n}\n\n/** Canonical decision bytes for approval evidence and execution binding. */\nexport function canonicalOperatorAdjustmentDecisionPayload(\n decision: OperatorAdjustmentDecisionV1,\n): string {\n assertExactKeys(decision, DECISION_KEYS, \"Operator adjustment decision\");\n return JSON.stringify({\n schemaVersion: decision.schemaVersion,\n decisionId: decision.decisionId,\n adjustmentId: decision.adjustmentId,\n proposalId: decision.proposalId,\n proposalHash: decision.proposalHash,\n previewHash: decision.previewHash,\n decision: decision.decision,\n proposedByAccountId: decision.proposedByAccountId,\n decidedByAccountId: decision.decidedByAccountId,\n proposedAt: decision.proposedAt,\n decidedAt: decision.decidedAt,\n });\n}\n\n/** Validates the immutable ledger-result edge for one approved adjustment. */\nexport function assertOperatorAdjustmentExecution(\n execution: OperatorAdjustmentExecutionV1,\n preview: OperatorAdjustmentPreviewV1,\n proposal: OperatorAdjustmentProposalV1,\n decision: OperatorAdjustmentDecisionV1,\n expectedPreviewHash: string,\n expectedProposalHash: string,\n expectedDecisionHash: string,\n): void {\n assertOperatorAdjustmentDecision(\n decision,\n proposal,\n preview,\n expectedPreviewHash,\n expectedProposalHash,\n );\n assertCanonicalHash(expectedDecisionHash, \"expectedDecisionHash\");\n assertExactKeys(execution, EXECUTION_KEYS, \"Operator adjustment execution\");\n economyAssert(\n execution.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported operator adjustment execution\",\n );\n assertEconomyIdentifier(execution.executionId, \"executionId\");\n assertEconomyIdentifier(execution.adjustmentId, \"adjustmentId\");\n assertCanonicalHash(execution.previewHash, \"previewHash\");\n assertCanonicalHash(execution.proposalHash, \"proposalHash\");\n assertCanonicalHash(execution.decisionHash, \"decisionHash\");\n assertEconomyIdentifier(execution.sourceLotId, \"sourceLotId\");\n assertEconomyIdentifier(execution.transactionId, \"transactionId\");\n assertEconomyIdentifier(execution.resultReceiptId, \"resultReceiptId\");\n economyAssert(\n decision.decision === \"approve\",\n \"ADJUSTMENT_NOT_APPROVED\",\n \"Only an approved adjustment may execute\",\n );\n economyAssert(\n execution.adjustmentId === preview.adjustmentId\n && execution.previewHash === expectedPreviewHash\n && execution.proposalHash === expectedProposalHash\n && execution.decisionHash === expectedDecisionHash\n && execution.sourceLotId === preview.sourceLotId,\n \"ADJUSTMENT_PREVIEW_MISMATCH\",\n \"Operator adjustment execution does not match its approval plan\",\n );\n economyAssert(\n parseIsoTimestamp(execution.executedAt)\n >= parseIsoTimestamp(decision.decidedAt),\n \"INVALID_TIME_WINDOW\",\n \"Operator adjustment execution predates its decision\",\n );\n}\n\n/** Canonical execution bytes for authority and audit-graph records. */\nexport function canonicalOperatorAdjustmentExecutionPayload(\n execution: OperatorAdjustmentExecutionV1,\n): string {\n assertExactKeys(execution, EXECUTION_KEYS, \"Operator adjustment execution\");\n return JSON.stringify({\n schemaVersion: execution.schemaVersion,\n executionId: execution.executionId,\n adjustmentId: execution.adjustmentId,\n previewHash: execution.previewHash,\n proposalHash: execution.proposalHash,\n decisionHash: execution.decisionHash,\n sourceLotId: execution.sourceLotId,\n transactionId: execution.transactionId,\n resultReceiptId: execution.resultReceiptId,\n executedAt: execution.executedAt,\n });\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LotId,\n} from \"./contracts.js\";\nimport type { PaidLotRetentionV1 } from \"./early-backers.js\";\nimport { economyAssert } from \"./errors.js\";\nimport { assertSourceLot, type SourceLotV1 } from \"./lots.js\";\n\nexport type PaidLotLifecycleStatusV1 =\n | \"clear\"\n | \"partially-reversed\"\n | \"disputed\"\n | \"fully-reversed\"\n | \"chargeback-lost\";\n\nexport type PaidLotLifecycleEventTypeV1 =\n | \"refund\"\n | \"dispute-hold\"\n | \"dispute-won\"\n | \"dispute-lost\"\n | \"chargeback\"\n | \"reversal\";\n\n/** Paid-purchase facts not already carried by the source lot. */\nexport interface PaidLotPurchaseProvenanceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly purchaseId: string;\n readonly catalogVersion: string;\n readonly purchasedAt: IsoTimestamp;\n}\n\n/** Provider-neutral refund/dispute evidence for a paid source lot. */\nexport interface PaidLotLifecycleEventV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly eventId: string;\n readonly lotId: LotId;\n readonly eventType: PaidLotLifecycleEventTypeV1;\n readonly amount: TokenSubunitString;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface PaidLotLifecycleReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly event: PaidLotLifecycleEventV1;\n}\n\n/**\n * Retained paid-lot projection. Immutable purchase/original facts plus every\n * receipt are sufficient to rebuild all derived amounts in occurrence order.\n */\nexport interface PaidLotLifecycleV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly lotId: LotId;\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly purchaseId: string;\n readonly catalogVersion: string;\n readonly purchasedAt: IsoTimestamp;\n readonly settledAt: IsoTimestamp;\n readonly creditedAt: IsoTimestamp;\n readonly originalAmount: TokenSubunitString;\n readonly retainedAmount: TokenSubunitString;\n readonly heldAmount: TokenSubunitString;\n readonly reversedAmount: TokenSubunitString;\n readonly refundedAmount: TokenSubunitString;\n readonly chargebackAmount: TokenSubunitString;\n readonly oneTimeReversalAmount: TokenSubunitString;\n readonly status: PaidLotLifecycleStatusV1;\n readonly version: number;\n readonly receipts: readonly PaidLotLifecycleReceiptV1[];\n readonly effectiveEventIds: readonly string[];\n}\n\n/** Exact signed projection deltas produced when one receipt is appended. */\nexport interface PaidLotLifecycleArithmeticV1 {\n readonly retainedDelta: TokenSubunitString;\n readonly heldDelta: TokenSubunitString;\n readonly reversedDelta: TokenSubunitString;\n readonly refundedDelta: TokenSubunitString;\n readonly chargebackDelta: TokenSubunitString;\n readonly oneTimeReversalDelta: TokenSubunitString;\n}\n\nexport interface PaidLotLifecycleMutationResultV1 {\n readonly lifecycle: PaidLotLifecycleV1;\n /** False only for an exact event-ID replay already recorded. */\n readonly applied: boolean;\n readonly stateChanged: boolean;\n readonly arithmetic: PaidLotLifecycleArithmeticV1;\n}\n\ninterface PaidLotImmutableFacts {\n readonly schemaVersion: EconomyContractVersion;\n readonly lotId: LotId;\n readonly payerAccountId: AccountId;\n readonly receivingHouseholdId: HouseholdId;\n readonly purchaseId: string;\n readonly catalogVersion: string;\n readonly purchasedAt: IsoTimestamp;\n readonly settledAt: IsoTimestamp;\n readonly creditedAt: IsoTimestamp;\n readonly originalAmount: TokenSubunitString;\n}\n\ninterface PaidLotProjection {\n readonly retained: bigint;\n readonly held: bigint;\n readonly reversed: bigint;\n readonly refunded: bigint;\n readonly chargeback: bigint;\n readonly oneTimeReversal: bigint;\n readonly status: PaidLotLifecycleStatusV1;\n readonly effectiveEventIds: readonly string[];\n}\n\nconst ZERO_ARITHMETIC: PaidLotLifecycleArithmeticV1 = Object.freeze({\n retainedDelta: serializeTokenSubunits(0n),\n heldDelta: serializeTokenSubunits(0n),\n reversedDelta: serializeTokenSubunits(0n),\n refundedDelta: serializeTokenSubunits(0n),\n chargebackDelta: serializeTokenSubunits(0n),\n oneTimeReversalDelta: serializeTokenSubunits(0n),\n});\n\nconst EVENT_TYPES: readonly PaidLotLifecycleEventTypeV1[] = [\n \"refund\",\n \"dispute-hold\",\n \"dispute-won\",\n \"dispute-lost\",\n \"chargeback\",\n \"reversal\",\n];\n\nconst EVENT_PRECEDENCE: Readonly<Record<PaidLotLifecycleEventTypeV1, number>> = {\n \"dispute-hold\": 0,\n \"dispute-won\": 1,\n \"dispute-lost\": 1,\n refund: 2,\n chargeback: 3,\n reversal: 4,\n};\n\n/** Validates the paid purchase facts paired with a source lot. */\nexport function assertPaidLotPurchaseProvenance(\n provenance: PaidLotPurchaseProvenanceV1,\n): void {\n economyAssert(\n provenance.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot provenance contract version\",\n );\n assertEconomyIdentifier(provenance.purchaseId, \"purchaseId\");\n assertEconomyIdentifier(provenance.catalogVersion, \"catalogVersion\");\n parseIsoTimestamp(provenance.purchasedAt);\n}\n\n/** Validates one provider-neutral paid-lot lifecycle event. */\nexport function assertPaidLotLifecycleEvent(\n event: PaidLotLifecycleEventV1,\n): void {\n economyAssert(\n event.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot lifecycle event contract version\",\n );\n assertEconomyIdentifier(event.eventId, \"eventId\");\n assertEconomyIdentifier(event.lotId, \"lotId\");\n economyAssert(\n EVENT_TYPES.includes(event.eventType),\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle event type is unsupported\",\n );\n economyAssert(\n parseTokenSubunits(event.amount) > 0n,\n \"INVALID_AMOUNT\",\n \"Paid-lot lifecycle event amount must be positive\",\n );\n parseIsoTimestamp(event.occurredAt);\n}\n\nfunction sameEvent(\n left: PaidLotLifecycleEventV1,\n right: PaidLotLifecycleEventV1,\n): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.eventId === right.eventId &&\n left.lotId === right.lotId &&\n left.eventType === right.eventType &&\n left.amount === right.amount &&\n left.occurredAt === right.occurredAt\n );\n}\n\nfunction compareEvents(\n left: PaidLotLifecycleEventV1,\n right: PaidLotLifecycleEventV1,\n): number {\n const timeDifference =\n parseIsoTimestamp(left.occurredAt) - parseIsoTimestamp(right.occurredAt);\n if (timeDifference !== 0) {\n return timeDifference;\n }\n const precedenceDifference =\n EVENT_PRECEDENCE[left.eventType] - EVENT_PRECEDENCE[right.eventType];\n return precedenceDifference === 0\n ? compareUnicodeCodeUnits(left.eventId, right.eventId)\n : precedenceDifference;\n}\n\nfunction deriveStatus(\n retained: bigint,\n held: bigint,\n reversed: bigint,\n chargeback: bigint,\n): PaidLotLifecycleStatusV1 {\n if (held > 0n) {\n return \"disputed\";\n }\n if (chargeback > 0n) {\n return \"chargeback-lost\";\n }\n if (retained === 0n) {\n return \"fully-reversed\";\n }\n return reversed > 0n ? \"partially-reversed\" : \"clear\";\n}\n\nfunction immutableFactsFromLifecycle(\n lifecycle: PaidLotLifecycleV1,\n): PaidLotImmutableFacts {\n return {\n schemaVersion: lifecycle.schemaVersion,\n lotId: lifecycle.lotId,\n payerAccountId: lifecycle.payerAccountId,\n receivingHouseholdId: lifecycle.receivingHouseholdId,\n purchaseId: lifecycle.purchaseId,\n catalogVersion: lifecycle.catalogVersion,\n purchasedAt: lifecycle.purchasedAt,\n settledAt: lifecycle.settledAt,\n creditedAt: lifecycle.creditedAt,\n originalAmount: lifecycle.originalAmount,\n };\n}\n\nfunction assertImmutableFacts(facts: PaidLotImmutableFacts): void {\n economyAssert(\n facts.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot lifecycle contract version\",\n );\n assertEconomyIdentifier(facts.lotId, \"lotId\");\n assertEconomyIdentifier(facts.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(\n facts.receivingHouseholdId,\n \"receivingHouseholdId\",\n );\n assertEconomyIdentifier(facts.purchaseId, \"purchaseId\");\n assertEconomyIdentifier(facts.catalogVersion, \"catalogVersion\");\n const purchasedAt = parseIsoTimestamp(facts.purchasedAt);\n const settledAt = parseIsoTimestamp(facts.settledAt);\n const creditedAt = parseIsoTimestamp(facts.creditedAt);\n economyAssert(\n purchasedAt <= settledAt && settledAt <= creditedAt,\n \"INVALID_TIME_WINDOW\",\n \"Paid-lot timestamps must follow purchase, settlement, then credit order\",\n );\n economyAssert(\n parseTokenSubunits(facts.originalAmount) > 0n,\n \"INVALID_AMOUNT\",\n \"Paid-lot original amount must be positive\",\n );\n}\n\nfunction projectPaidLot(\n facts: PaidLotImmutableFacts,\n receipts: readonly PaidLotLifecycleReceiptV1[],\n): PaidLotProjection {\n assertImmutableFacts(facts);\n const eventIds = new Set<string>();\n let reversalReceipts = 0;\n for (const receipt of receipts) {\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported paid-lot receipt contract version\",\n );\n assertPaidLotLifecycleEvent(receipt.event);\n economyAssert(\n receipt.event.lotId === facts.lotId &&\n !eventIds.has(receipt.event.eventId),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot receipts must be unique and belong to the lifecycle lot\",\n );\n eventIds.add(receipt.event.eventId);\n if (receipt.event.eventType === \"reversal\") {\n reversalReceipts += 1;\n }\n }\n economyAssert(\n reversalReceipts <= 1,\n \"REVERSAL_ALREADY_EXISTS\",\n \"Paid-lot lifecycle permits only one distinct reversal event\",\n );\n\n let retained = parseTokenSubunits(facts.originalAmount);\n let held = 0n;\n let reversed = 0n;\n let refunded = 0n;\n let chargeback = 0n;\n let oneTimeReversal = 0n;\n const effectiveEventIds: string[] = [];\n for (const receipt of [...receipts].sort((left, right) =>\n compareEvents(left.event, right.event),\n )) {\n const event = receipt.event;\n economyAssert(\n parseIsoTimestamp(event.occurredAt) >=\n parseIsoTimestamp(facts.creditedAt),\n \"INVALID_TIME_WINDOW\",\n \"Paid-lot lifecycle event cannot precede credit\",\n );\n const amount = parseTokenSubunits(event.amount);\n if (event.eventType === \"dispute-hold\") {\n economyAssert(\n amount <= retained - held,\n \"INSUFFICIENT_ELIGIBLE_LOTS\",\n \"Dispute hold exceeds unheld retained paid-lot basis\",\n );\n held += amount;\n } else if (event.eventType === \"dispute-won\") {\n economyAssert(\n amount <= held,\n \"INVALID_AMOUNT\",\n \"Dispute-win release exceeds held paid-lot basis\",\n );\n held -= amount;\n } else if (event.eventType === \"dispute-lost\") {\n economyAssert(\n amount <= held,\n \"INVALID_AMOUNT\",\n \"Dispute-loss amount exceeds held paid-lot basis\",\n );\n held -= amount;\n retained -= amount;\n reversed += amount;\n chargeback += amount;\n } else {\n economyAssert(\n amount <= retained - held,\n \"INSUFFICIENT_ELIGIBLE_LOTS\",\n \"Paid-lot reversal exceeds unheld retained basis\",\n );\n if (event.eventType === \"reversal\") {\n oneTimeReversal += amount;\n } else if (event.eventType === \"refund\") {\n refunded += amount;\n } else {\n chargeback += amount;\n }\n retained -= amount;\n reversed += amount;\n }\n effectiveEventIds.push(event.eventId);\n }\n\n return {\n retained,\n held,\n reversed,\n refunded,\n chargeback,\n oneTimeReversal,\n status: deriveStatus(retained, held, reversed, chargeback),\n effectiveEventIds,\n };\n}\n\nfunction projectionMatchesLifecycle(\n projection: PaidLotProjection,\n lifecycle: PaidLotLifecycleV1,\n): boolean {\n return (\n serializeTokenSubunits(projection.retained) === lifecycle.retainedAmount &&\n serializeTokenSubunits(projection.held) === lifecycle.heldAmount &&\n serializeTokenSubunits(projection.reversed) === lifecycle.reversedAmount &&\n serializeTokenSubunits(projection.refunded) === lifecycle.refundedAmount &&\n serializeTokenSubunits(projection.chargeback) ===\n lifecycle.chargebackAmount &&\n serializeTokenSubunits(projection.oneTimeReversal) ===\n lifecycle.oneTimeReversalAmount &&\n projection.status === lifecycle.status &&\n projection.effectiveEventIds.length ===\n lifecycle.effectiveEventIds.length &&\n projection.effectiveEventIds.every(\n (eventId, index) => eventId === lifecycle.effectiveEventIds[index],\n )\n );\n}\n\n/** Validates and deterministically rebuilds retained paid-lot arithmetic. */\nexport function assertPaidLotLifecycle(\n lifecycle: PaidLotLifecycleV1,\n): void {\n economyAssert(\n Number.isSafeInteger(lifecycle.version) &&\n lifecycle.version === lifecycle.receipts.length + 1,\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle version must match its receipt count\",\n );\n const projection = projectPaidLot(\n immutableFactsFromLifecycle(lifecycle),\n lifecycle.receipts,\n );\n economyAssert(\n projectionMatchesLifecycle(projection, lifecycle),\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle does not match its immutable event rebuild\",\n );\n}\n\n/** Creates the retained projection for one newly credited paid source lot. */\nexport function createPaidLotLifecycle(\n lot: SourceLotV1,\n provenance: PaidLotPurchaseProvenanceV1,\n): PaidLotLifecycleV1 {\n assertSourceLot(lot);\n assertPaidLotPurchaseProvenance(provenance);\n economyAssert(\n lot.payerAccountId !== undefined && lot.householdId !== undefined,\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle requires payer and receiving-household provenance\",\n );\n economyAssert(\n lot.refundState === \"none\" &&\n parseTokenSubunits(lot.heldAmount) === 0n &&\n parseTokenSubunits(lot.reversedAmount) === 0n,\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle must be created before any refund or dispute movement\",\n );\n economyAssert(\n parseIsoTimestamp(provenance.purchasedAt) <=\n parseIsoTimestamp(lot.settledAt),\n \"INVALID_TIME_WINDOW\",\n \"Paid purchase time cannot follow settlement\",\n );\n const facts: PaidLotImmutableFacts = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n lotId: lot.lotId,\n payerAccountId: lot.payerAccountId,\n receivingHouseholdId: lot.householdId,\n purchaseId: provenance.purchaseId,\n catalogVersion: provenance.catalogVersion,\n purchasedAt: provenance.purchasedAt,\n settledAt: lot.settledAt,\n creditedAt: lot.creditedAt,\n originalAmount: lot.originalAmount,\n };\n const projection = projectPaidLot(facts, []);\n const lifecycle: PaidLotLifecycleV1 = {\n ...facts,\n retainedAmount: serializeTokenSubunits(projection.retained),\n heldAmount: serializeTokenSubunits(projection.held),\n reversedAmount: serializeTokenSubunits(projection.reversed),\n refundedAmount: serializeTokenSubunits(projection.refunded),\n chargebackAmount: serializeTokenSubunits(projection.chargeback),\n oneTimeReversalAmount: serializeTokenSubunits(\n projection.oneTimeReversal,\n ),\n status: projection.status,\n version: 1,\n receipts: [],\n effectiveEventIds: [],\n };\n assertPaidLotLifecycle(lifecycle);\n return lifecycle;\n}\n\n/**\n * Appends one event then rebuilds every receipt in authoritative occurrence\n * order. Exact retries succeed before stale-version validation.\n */\nexport function applyPaidLotLifecycleEvent(\n lifecycle: PaidLotLifecycleV1,\n event: PaidLotLifecycleEventV1,\n expectedVersion: number,\n): PaidLotLifecycleMutationResultV1 {\n assertPaidLotLifecycle(lifecycle);\n assertPaidLotLifecycleEvent(event);\n economyAssert(\n event.lotId === lifecycle.lotId,\n \"INVALID_CONTRACT\",\n \"Paid-lot event belongs to another source lot\",\n );\n const replay = lifecycle.receipts.find(\n (receipt) => receipt.event.eventId === event.eventId,\n );\n if (replay !== undefined) {\n economyAssert(\n sameEvent(replay.event, event),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot event ID was reused with different facts\",\n );\n return {\n lifecycle,\n applied: false,\n stateChanged: false,\n arithmetic: ZERO_ARITHMETIC,\n };\n }\n economyAssert(\n expectedVersion === lifecycle.version,\n \"INVALID_CONTRACT\",\n \"Paid-lot lifecycle event has a stale expected version\",\n );\n\n const receipts: readonly PaidLotLifecycleReceiptV1[] = [\n ...lifecycle.receipts,\n { schemaVersion: ECONOMY_CONTRACT_VERSION, event },\n ];\n const projection = projectPaidLot(\n immutableFactsFromLifecycle(lifecycle),\n receipts,\n );\n const before = {\n retained: parseTokenSubunits(lifecycle.retainedAmount),\n held: parseTokenSubunits(lifecycle.heldAmount),\n reversed: parseTokenSubunits(lifecycle.reversedAmount),\n refunded: parseTokenSubunits(lifecycle.refundedAmount),\n chargeback: parseTokenSubunits(lifecycle.chargebackAmount),\n oneTimeReversal: parseTokenSubunits(lifecycle.oneTimeReversalAmount),\n };\n const next: PaidLotLifecycleV1 = {\n ...lifecycle,\n retainedAmount: serializeTokenSubunits(projection.retained),\n heldAmount: serializeTokenSubunits(projection.held),\n reversedAmount: serializeTokenSubunits(projection.reversed),\n refundedAmount: serializeTokenSubunits(projection.refunded),\n chargebackAmount: serializeTokenSubunits(projection.chargeback),\n oneTimeReversalAmount: serializeTokenSubunits(\n projection.oneTimeReversal,\n ),\n status: projection.status,\n version: lifecycle.version + 1,\n receipts,\n effectiveEventIds: projection.effectiveEventIds,\n };\n assertPaidLotLifecycle(next);\n const arithmetic: PaidLotLifecycleArithmeticV1 = {\n retainedDelta: serializeTokenSubunits(\n projection.retained - before.retained,\n ),\n heldDelta: serializeTokenSubunits(projection.held - before.held),\n reversedDelta: serializeTokenSubunits(\n projection.reversed - before.reversed,\n ),\n refundedDelta: serializeTokenSubunits(\n projection.refunded - before.refunded,\n ),\n chargebackDelta: serializeTokenSubunits(\n projection.chargeback - before.chargeback,\n ),\n oneTimeReversalDelta: serializeTokenSubunits(\n projection.oneTimeReversal - before.oneTimeReversal,\n ),\n };\n return {\n lifecycle: next,\n applied: true,\n stateChanged: Object.values(arithmetic).some((delta) => delta !== \"0\"),\n arithmetic,\n };\n}\n\n/** Reduces unordered/retried lifecycle evidence in canonical event order. */\nexport function reducePaidLotLifecycleEvents(\n initial: PaidLotLifecycleV1,\n events: readonly PaidLotLifecycleEventV1[],\n): PaidLotLifecycleV1 {\n assertPaidLotLifecycle(initial);\n const unique = new Map<string, PaidLotLifecycleEventV1>();\n for (const event of events) {\n assertPaidLotLifecycleEvent(event);\n const existing = unique.get(event.eventId);\n if (existing !== undefined) {\n economyAssert(\n sameEvent(existing, event),\n \"DUPLICATE_IDENTIFIER\",\n \"Paid-lot event ID was reused with different facts\",\n );\n } else {\n unique.set(event.eventId, event);\n }\n }\n let lifecycle = initial;\n for (const event of [...unique.values()].sort(compareEvents)) {\n lifecycle = applyPaidLotLifecycleEvent(\n lifecycle,\n event,\n lifecycle.version,\n ).lifecycle;\n }\n return lifecycle;\n}\n\n/** Creates the exact retained-basis input used by early-backer evaluators. */\nexport function createEarlyBackerRetentionFromPaidLot(\n lifecycle: PaidLotLifecycleV1,\n): PaidLotRetentionV1 {\n assertPaidLotLifecycle(lifecycle);\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n lotId: lifecycle.lotId,\n payerAccountId: lifecycle.payerAccountId,\n receivingHouseholdId: lifecycle.receivingHouseholdId,\n purchaseId: lifecycle.purchaseId,\n catalogVersion: lifecycle.catalogVersion,\n purchasedAt: lifecycle.purchasedAt,\n settledAt: lifecycle.settledAt,\n creditedAt: lifecycle.creditedAt,\n retainedAmount: lifecycle.retainedAmount,\n };\n}\n","import type { TokenSubunitString } from \"../amount.js\";\nimport type { GameplayAllocationV1 } from \"../allocations.js\";\nimport type {\n AuditedEconomyCommandEnvelopeV1,\n EconomyAuditedIdempotencyResultV1,\n EconomyAuditedIdempotencyScopeV1,\n EconomyAcceptedCommandReceiptV1,\n EconomyCommandResultReceiptV1,\n EconomyEncryptedOperationalHandleBindingV1,\n EconomyProviderEvidenceHashV1,\n EconomyProviderEvidenceManifestV1,\n EconomyHmacSha256DigestV1,\n} from \"../audit.js\";\nimport type {\n EconomyAuthorityCommitManifestV1,\n EconomyAuthorityHeadV1,\n EconomyIntegrityAnchorManifestV1,\n EconomyIntegrityVerificationReceiptV1,\n} from \"../authority.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type AllocationId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type LotId,\n type TransactionId,\n type WalletId,\n} from \"../contracts.js\";\nimport { economyAssert } from \"../errors.js\";\nimport type {\n ChainedEconomicJournalTransactionV1,\n JournalChainHeadV1,\n} from \"../integrity.js\";\nimport type { LedgerTransactionV1 } from \"../ledger.js\";\nimport type {\n SourceLotMovementV1,\n SourceLotV1,\n VersionedSourceLotV1,\n} from \"../lots.js\";\nimport type {\n BalanceProjection,\n BalanceProjectionSnapshotV1,\n WalletBalanceDeltaV1,\n WalletBalanceProjectionV1,\n WalletLifetimeDeltaV1,\n} from \"../projection.js\";\nimport type {\n WalletOwnerReferenceV1,\n WalletV1,\n} from \"../wallets.js\";\n\nexport type EconomyCommandType =\n | \"credit-purchase\"\n | \"credit-subscription\"\n | \"credit-reward\"\n | \"credit-event\"\n | \"credit-competition\"\n | \"allocate\"\n | \"boost\"\n | \"reclaim\"\n | \"spend\"\n | \"hold\"\n | \"release-hold\"\n | \"refund\"\n | \"chargeback\"\n | \"reverse\"\n | \"adjust\";\n\nexport interface EconomyCommandEnvelopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandId: string;\n readonly commandType: EconomyCommandType;\n readonly idempotencyKey: string;\n readonly actorAccountId: AccountId;\n readonly subjectAccountId: AccountId;\n readonly relationshipId?: string;\n readonly authorizationVersion?: number;\n readonly payloadHash: string;\n readonly acceptedAt: IsoTimestamp;\n readonly acceptedRegion: string;\n readonly writerFencingToken: string;\n}\n\nexport type EconomyCommandWorkflowStateV1 =\n | \"accepted\"\n | \"processing\"\n | \"failed\"\n | \"completed\";\n\n/** Immutable workflow evidence; it is never an economic journal transaction. */\nexport interface EconomyCommandWorkflowEventV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly workflowEventId: string;\n readonly commandId: string;\n readonly state: EconomyCommandWorkflowStateV1;\n /** Stable non-sensitive classifier; detailed failure data stays operational. */\n readonly failureCode?: string;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface EconomyOutboxEventV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly eventId: string;\n readonly transactionId: TransactionId;\n readonly eventType: string;\n readonly payloadHash: string;\n readonly occurredAt: IsoTimestamp;\n}\n\nexport interface PersistedIdempotencyResultV1 {\n readonly transactionId: TransactionId;\n readonly responseHash: string;\n readonly recordedAt: IsoTimestamp;\n}\n\n/** Exact actor/subject/operation namespace for a caller-owned idempotency key. */\nexport interface EconomyIdempotencyScopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly idempotencyKey: string;\n readonly commandType: EconomyCommandType;\n readonly actorAccountId: AccountId;\n readonly subjectAccountId: AccountId;\n}\n\n/** V2 replay evidence bound to one accepted command and exact scope. */\nexport interface ScopedPersistedIdempotencyResultV1\n extends PersistedIdempotencyResultV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandId: string;\n}\n\n/** Validates replay evidence before it is returned across a command boundary. */\nexport function assertScopedPersistedIdempotencyResult(\n result: ScopedPersistedIdempotencyResultV1,\n): void {\n economyAssert(\n result.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported scoped idempotency-result contract version\",\n );\n assertEconomyIdentifier(result.commandId, \"commandId\");\n assertEconomyIdentifier(result.transactionId, \"transactionId\");\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(result.responseHash),\n \"INVALID_CONTRACT\",\n \"Idempotency response hash must be a canonical SHA-256 reference\",\n );\n parseIsoTimestamp(result.recordedAt);\n}\n\nconst ECONOMY_COMMAND_TYPES = new Set<EconomyCommandType>([\n \"credit-purchase\",\n \"credit-subscription\",\n \"credit-reward\",\n \"credit-event\",\n \"credit-competition\",\n \"allocate\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"release-hold\",\n \"refund\",\n \"chargeback\",\n \"reverse\",\n \"adjust\",\n]);\n\n/** Validates the namespace that prevents cross-principal replay collisions. */\nexport function assertEconomyIdempotencyScope(\n scope: EconomyIdempotencyScopeV1,\n): void {\n economyAssert(\n scope.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n ECONOMY_COMMAND_TYPES.has(scope.commandType),\n \"INVALID_CONTRACT\",\n \"Unsupported economy idempotency scope\",\n );\n assertEconomyIdentifier(scope.idempotencyKey, \"idempotencyKey\");\n assertEconomyIdentifier(scope.actorAccountId, \"actorAccountId\");\n assertEconomyIdentifier(scope.subjectAccountId, \"subjectAccountId\");\n}\n\n/** Validates minimized accepted-command evidence before durable append. */\nexport function assertEconomyCommandEnvelope(\n envelope: EconomyCommandEnvelopeV1,\n): void {\n economyAssert(\n envelope.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported economy-command-envelope contract version\",\n );\n assertEconomyIdentifier(envelope.commandId, \"commandId\");\n economyAssert(\n ECONOMY_COMMAND_TYPES.has(envelope.commandType),\n \"INVALID_CONTRACT\",\n \"Economy command has an unsupported type\",\n );\n assertEconomyIdentifier(envelope.idempotencyKey, \"idempotencyKey\");\n assertEconomyIdentifier(envelope.actorAccountId, \"actorAccountId\");\n assertEconomyIdentifier(envelope.subjectAccountId, \"subjectAccountId\");\n if (envelope.relationshipId !== undefined) {\n assertEconomyIdentifier(envelope.relationshipId, \"relationshipId\");\n }\n if (envelope.authorizationVersion !== undefined) {\n economyAssert(\n Number.isSafeInteger(envelope.authorizationVersion) &&\n envelope.authorizationVersion >= 1,\n \"INVALID_CONTRACT\",\n \"Command authorization version must be a positive safe integer\",\n );\n }\n economyAssert(\n (envelope.relationshipId === undefined) ===\n (envelope.authorizationVersion === undefined),\n \"INVALID_CONTRACT\",\n \"Relationship identity and authorization version must be supplied together\",\n );\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(envelope.payloadHash),\n \"INVALID_CONTRACT\",\n \"Command payload hash must be a canonical SHA-256 reference\",\n );\n parseIsoTimestamp(envelope.acceptedAt);\n assertEconomyIdentifier(envelope.acceptedRegion, \"acceptedRegion\");\n assertEconomyIdentifier(\n envelope.writerFencingToken,\n \"writerFencingToken\",\n );\n}\n\n/** Validates one immutable command-workflow state event. */\nexport function assertEconomyCommandWorkflowEvent(\n event: EconomyCommandWorkflowEventV1,\n): void {\n economyAssert(\n event.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported command-workflow-event contract version\",\n );\n assertEconomyIdentifier(event.workflowEventId, \"workflowEventId\");\n assertEconomyIdentifier(event.commandId, \"commandId\");\n economyAssert(\n [\"accepted\", \"processing\", \"failed\", \"completed\"].includes(event.state),\n \"INVALID_CONTRACT\",\n \"Command workflow has an unsupported state\",\n );\n economyAssert(\n (event.state === \"failed\") === (event.failureCode !== undefined),\n \"INVALID_CONTRACT\",\n \"Only failed command workflows require a failure code\",\n );\n if (event.failureCode !== undefined) {\n assertEconomyIdentifier(event.failureCode, \"failureCode\");\n }\n parseIsoTimestamp(event.occurredAt);\n}\n\n/** Operations available only inside one serializable database transaction. */\nexport interface EconomyUnitOfWork {\n getWalletForUpdate(walletId: WalletId): Promise<WalletV1 | null>;\n listSpendableLotsForUpdate(walletId: WalletId): Promise<readonly SourceLotV1[]>;\n findLotForUpdate(lotId: LotId): Promise<SourceLotV1 | null>;\n findIdempotencyResult(\n idempotencyKey: string,\n ): Promise<PersistedIdempotencyResultV1 | null>;\n appendTransaction(transaction: LedgerTransactionV1): Promise<void>;\n appendSourceLot(lot: SourceLotV1): Promise<void>;\n updateSourceLotProjection(\n lotId: LotId,\n remainingAmount: TokenSubunitString,\n heldAmount: TokenSubunitString,\n reversedAmount: TokenSubunitString,\n ): Promise<void>;\n saveBalanceProjection(\n projection: BalanceProjection,\n transactionId: TransactionId,\n ): Promise<void>;\n saveIdempotencyResult(\n idempotencyKey: string,\n result: PersistedIdempotencyResultV1,\n ): Promise<void>;\n appendOutboxEvent(event: EconomyOutboxEventV1): Promise<void>;\n}\n\n/** Adapter boundary for serializable, ACID economy mutations. */\nexport interface EconomyPersistencePort {\n runSerializable<T>(\n operation: (unitOfWork: EconomyUnitOfWork) => Promise<T>,\n ): Promise<T>;\n getWallet(walletId: WalletId): Promise<WalletV1 | null>;\n getBalanceProjection(walletId: WalletId): Promise<BalanceProjectionSnapshotV1 | null>;\n getTransaction(transactionId: TransactionId): Promise<LedgerTransactionV1 | null>;\n rebuildProjection(): Promise<BalanceProjection>;\n}\n\n/**\n * V2 mutation surface. Unlike `EconomyUnitOfWork`, it has no absolute balance\n * overwrite: journal, source-lot movement, allocation state, balance/lifetime\n * deltas, idempotency, chain head, and outbox are committed atomically.\n */\nexport interface EconomyUnitOfWorkV2 {\n getWalletForOwnerForUpdate(\n walletId: WalletId,\n owner: WalletOwnerReferenceV1,\n ): Promise<WalletV1 | null>;\n listSpendableLotsForUpdate(\n walletId: WalletId,\n ): Promise<readonly VersionedSourceLotV1[]>;\n findLotForUpdate(lotId: LotId): Promise<VersionedSourceLotV1 | null>;\n getGameplayAllocationForUpdate(\n allocationId: AllocationId,\n householdId: HouseholdId,\n childAccountId: AccountId,\n ): Promise<GameplayAllocationV1 | null>;\n findIdempotencyResult(\n scope: EconomyIdempotencyScopeV1,\n ): Promise<ScopedPersistedIdempotencyResultV1 | null>;\n /** Locks and rejects any stale/non-active regional writer lease. */\n lockActiveWriterFence(\n acceptedRegion: string,\n writerFencingToken: string,\n ): Promise<void>;\n lockJournalChainHead(chainId: string): Promise<JournalChainHeadV1>;\n\n appendCommandEnvelope(envelope: EconomyCommandEnvelopeV1): Promise<void>;\n appendCommandWorkflowEvent(\n event: EconomyCommandWorkflowEventV1,\n ): Promise<void>;\n appendTransaction(\n transaction: ChainedEconomicJournalTransactionV1,\n ): Promise<void>;\n /** Appends `createInitialSourceLotSnapshot()` output; later changes are movements. */\n appendSourceLot(snapshot: VersionedSourceLotV1): Promise<void>;\n /** Appends movement evidence and applies its lot CAS as one operation. */\n applySourceLotMovement(movement: SourceLotMovementV1): Promise<void>;\n appendGameplayAllocation(allocation: GameplayAllocationV1): Promise<void>;\n /**\n * Compares `expectedVersion`, requires `allocation.version` to be exactly the\n * next value, and never overwrites a stale row.\n */\n saveGameplayAllocation(\n allocation: GameplayAllocationV1,\n expectedVersion: number,\n ): Promise<void>;\n /**\n * Atomically adds deltas, verifies them against the appended postings and\n * account bindings, and records transaction-scoped application keys.\n */\n applyWalletBalanceDeltas(\n transactionId: TransactionId,\n deltas: readonly WalletBalanceDeltaV1[],\n ): Promise<void>;\n /**\n * Atomically increments monotonic lifetime counters after verifying the\n * deltas against the appended transaction's deterministic classification.\n */\n applyWalletLifetimeDeltas(\n transactionId: TransactionId,\n deltas: readonly WalletLifetimeDeltaV1[],\n ): Promise<void>;\n saveIdempotencyResult(\n scope: EconomyIdempotencyScopeV1,\n result: ScopedPersistedIdempotencyResultV1,\n ): Promise<void>;\n appendOutboxEvent(event: EconomyOutboxEventV1): Promise<void>;\n /** Compare-and-swaps the full locked head, including its canonical hash. */\n advanceJournalChainHead(\n expected: JournalChainHeadV1,\n next: JournalChainHeadV1,\n ): Promise<void>;\n}\n\n/**\n * Additive authoritative persistence boundary for new consumers. V1 remains\n * exported for compatibility but must not be adapted by delegating its\n * absolute `saveBalanceProjection` operation to this interface.\n */\nexport interface EconomyPersistencePortV2 {\n runSerializable<T>(\n operation: (unitOfWork: EconomyUnitOfWorkV2) => Promise<T>,\n ): Promise<T>;\n getWallet(walletId: WalletId): Promise<WalletV1 | null>;\n listWalletsByOwner(\n owner: WalletOwnerReferenceV1,\n ): Promise<readonly WalletV1[]>;\n getGameplayAllocation(\n allocationId: AllocationId,\n householdId: HouseholdId,\n childAccountId: AccountId,\n ): Promise<GameplayAllocationV1 | null>;\n getCommandEnvelope(\n commandId: string,\n ): Promise<EconomyCommandEnvelopeV1 | null>;\n getTransaction(\n transactionId: TransactionId,\n ): Promise<ChainedEconomicJournalTransactionV1 | null>;\n rebuildWalletBalanceProjections(): Promise<\n readonly WalletBalanceProjectionV1[]\n >;\n}\n\n/**\n * V3 journal transaction whose legacy canonical `idempotencyKey` slot carries\n * the HMAC digest, never the raw HTTP Idempotency-Key. The wire field remains\n * unchanged so published transaction canonical bytes stay compatible.\n */\nexport type AuditedChainedEconomicJournalTransactionV1 = Omit<\n ChainedEconomicJournalTransactionV1,\n \"idempotencyKey\"\n> & {\n readonly idempotencyKey: EconomyHmacSha256DigestV1;\n};\n\n/**\n * Additive audit-capable mutation surface.\n *\n * First-party commands append acceptance, economic result, projections,\n * idempotency result, outbox, authority manifest, and authority-head CAS in one\n * serializable unit. Provider workflows use one unit for verified durable\n * acceptance and a second unit for the reconciled economic result.\n */\nexport type EconomyUnitOfWorkV3 = Omit<\n EconomyUnitOfWorkV2,\n | \"appendCommandEnvelope\"\n | \"findIdempotencyResult\"\n | \"saveIdempotencyResult\"\n | \"appendTransaction\"\n> & {\n findAuditedIdempotencyResult(\n scope: EconomyAuditedIdempotencyScopeV1,\n ): Promise<EconomyAuditedIdempotencyResultV1 | null>;\n lockAuthorityHead(authorityId: string): Promise<EconomyAuthorityHeadV1>;\n appendCommandEnvelope(\n envelope: AuditedEconomyCommandEnvelopeV1,\n ): Promise<void>;\n appendProviderEvidenceManifest(\n manifest: EconomyProviderEvidenceManifestV1,\n ): Promise<void>;\n appendProviderEvidence(\n evidence: EconomyProviderEvidenceHashV1,\n ): Promise<void>;\n appendEncryptedOperationalHandleBinding(\n binding: EconomyEncryptedOperationalHandleBindingV1,\n ): Promise<void>;\n appendAcceptedCommandReceipt(\n receipt: EconomyAcceptedCommandReceiptV1,\n ): Promise<void>;\n appendCommandResultReceipt(\n receipt: EconomyCommandResultReceiptV1,\n ): Promise<void>;\n appendTransaction(\n transaction: AuditedChainedEconomicJournalTransactionV1,\n ): Promise<void>;\n saveAuditedIdempotencyResult(\n scope: EconomyAuditedIdempotencyScopeV1,\n result: EconomyAuditedIdempotencyResultV1,\n ): Promise<void>;\n appendAuthorityCommitManifest(\n manifest: EconomyAuthorityCommitManifestV1,\n ): Promise<void>;\n advanceAuthorityHead(\n expected: EconomyAuthorityHeadV1,\n next: EconomyAuthorityHeadV1,\n ): Promise<void>;\n appendIntegrityVerificationReceipt(\n receipt: EconomyIntegrityVerificationReceiptV1,\n ): Promise<void>;\n appendIntegrityAnchorManifest(\n manifest: EconomyIntegrityAnchorManifestV1,\n ): Promise<void>;\n};\n\n/**\n * V3 preserves every V2 economic primitive while making the audit records\n * mandatory capabilities of an authoritative adapter. V1 and V2 remain\n * exported unchanged for existing consumers.\n */\nexport type EconomyPersistencePortV3 = Omit<\n EconomyPersistencePortV2,\n \"runSerializable\" | \"getCommandEnvelope\" | \"getTransaction\"\n> & {\n runSerializable<T>(\n operation: (unitOfWork: EconomyUnitOfWorkV3) => Promise<T>,\n ): Promise<T>;\n getCommandEnvelope(\n commandId: string,\n ): Promise<AuditedEconomyCommandEnvelopeV1 | null>;\n getTransaction(\n transactionId: TransactionId,\n ): Promise<AuditedChainedEconomicJournalTransactionV1 | null>;\n getAcceptedCommandReceipt(\n commandId: string,\n ): Promise<EconomyAcceptedCommandReceiptV1 | null>;\n getCommandResultReceipt(\n commandId: string,\n ): Promise<EconomyCommandResultReceiptV1 | null>;\n listProviderEvidence(\n commandId: string,\n ): Promise<readonly EconomyProviderEvidenceHashV1[]>;\n getProviderEvidenceManifest(\n commandId: string,\n ): Promise<EconomyProviderEvidenceManifestV1 | null>;\n listEncryptedOperationalHandleBindings(\n commandId: string,\n ): Promise<readonly EconomyEncryptedOperationalHandleBindingV1[]>;\n getAuthorityHead(authorityId: string): Promise<EconomyAuthorityHeadV1 | null>;\n getAuthorityCommitManifest(\n commitId: string,\n ): Promise<EconomyAuthorityCommitManifestV1 | null>;\n getIntegrityVerificationReceipt(\n verificationId: string,\n ): Promise<EconomyIntegrityVerificationReceiptV1 | null>;\n getIntegrityAnchorManifest(\n anchorId: string,\n ): Promise<EconomyIntegrityAnchorManifestV1 | null>;\n};\n\nexport interface EconomyClockPort {\n now(): IsoTimestamp;\n}\n\nexport interface EconomyIdPort {\n nextId(namespace: string): string;\n}\n","import {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n type WalletId,\n} from \"./contracts.js\";\nimport {\n parseTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type WalletKind =\n | \"household-treasury\"\n | \"personal\"\n | \"gameplay-allocation\"\n | \"hold\"\n | \"purchase-clearing\"\n | \"provider-clearing\"\n | \"system\";\n\nexport type WalletStatus = \"active\" | \"restricted\" | \"closed\";\nexport type WalletOwnerType = \"account\" | \"household\" | \"system\";\n\n/** Exact owner identity used by persistence lookups and IDOR-safe locking. */\nexport interface WalletOwnerReferenceV1 {\n readonly ownerType: WalletOwnerType;\n readonly ownerId: AccountId | HouseholdId | \"system\";\n}\n\n/** Versioned authoritative wallet descriptor. */\nexport interface WalletV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly accountId: AccountId;\n readonly kind: WalletKind;\n readonly ownerType: WalletOwnerType;\n readonly ownerId: AccountId | HouseholdId | \"system\";\n readonly householdId?: HouseholdId;\n readonly status: WalletStatus;\n readonly version: number;\n readonly createdAt: IsoTimestamp;\n readonly closedAt?: IsoTimestamp;\n}\n\n/** Server-computed wallet totals. Clients must never derive authority from it. */\nexport interface WalletBalanceSummaryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly available: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly rewardProgress: TokenSubunitString;\n readonly version: number;\n readonly asOf: IsoTimestamp;\n}\n\n/** Lifetime aggregates used by the Token profile. */\nexport interface WalletLifetimeTotalsV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly bought: TokenSubunitString;\n readonly earned: TokenSubunitString;\n readonly allocated: TokenSubunitString;\n readonly reclaimed: TokenSubunitString;\n readonly spent: TokenSubunitString;\n readonly reversed: TokenSubunitString;\n}\n\n/** Validates an exact wallet owner without accepting a browser-derived role. */\nexport function assertWalletOwnerReference(\n owner: WalletOwnerReferenceV1,\n): void {\n economyAssert(\n [\"account\", \"household\", \"system\"].includes(owner.ownerType),\n \"INVALID_CONTRACT\",\n \"Wallet owner reference has an unsupported type\",\n );\n if (owner.ownerType === \"system\") {\n economyAssert(\n owner.ownerId === \"system\",\n \"INVALID_CONTRACT\",\n \"System wallet lookups must use the system owner\",\n );\n } else {\n assertEconomyIdentifier(owner.ownerId, \"ownerId\");\n economyAssert(\n owner.ownerId !== \"system\",\n \"INVALID_CONTRACT\",\n \"Account and household wallets cannot use the system owner\",\n );\n }\n}\n\n/** Validates wallet ownership, lifecycle, and optimistic-version facts. */\nexport function assertWallet(wallet: WalletV1): void {\n economyAssert(\n wallet.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet contract version\",\n );\n assertEconomyIdentifier(wallet.walletId, \"walletId\");\n assertEconomyIdentifier(wallet.accountId, \"accountId\");\n economyAssert(\n [\n \"household-treasury\",\n \"personal\",\n \"gameplay-allocation\",\n \"hold\",\n \"purchase-clearing\",\n \"provider-clearing\",\n \"system\",\n ].includes(wallet.kind),\n \"INVALID_CONTRACT\",\n \"Wallet has an unsupported kind\",\n );\n economyAssert(\n [\"account\", \"household\", \"system\"].includes(wallet.ownerType),\n \"INVALID_CONTRACT\",\n \"Wallet has an unsupported owner type\",\n );\n economyAssert(\n [\"active\", \"restricted\", \"closed\"].includes(wallet.status),\n \"INVALID_CONTRACT\",\n \"Wallet has an unsupported status\",\n );\n if (wallet.ownerType === \"system\") {\n economyAssert(\n wallet.ownerId === \"system\",\n \"INVALID_CONTRACT\",\n \"System wallets must be owned by the system\",\n );\n } else {\n assertEconomyIdentifier(wallet.ownerId, \"ownerId\");\n }\n if (wallet.householdId !== undefined) {\n assertEconomyIdentifier(wallet.householdId, \"householdId\");\n }\n if (wallet.ownerType === \"household\") {\n economyAssert(\n wallet.householdId === wallet.ownerId,\n \"INVALID_CONTRACT\",\n \"Household wallets must identify the same household owner\",\n );\n }\n if (wallet.kind === \"household-treasury\") {\n economyAssert(\n wallet.ownerType === \"household\" && wallet.householdId !== undefined,\n \"INVALID_CONTRACT\",\n \"Household treasuries must be owned by their household\",\n );\n }\n if (wallet.kind === \"personal\" || wallet.kind === \"gameplay-allocation\") {\n economyAssert(\n wallet.ownerType === \"account\",\n \"INVALID_CONTRACT\",\n \"Personal and gameplay-allocation wallets must be account-owned\",\n );\n }\n if (wallet.kind === \"gameplay-allocation\") {\n economyAssert(\n wallet.householdId !== undefined,\n \"INVALID_CONTRACT\",\n \"Gameplay-allocation wallets must retain household provenance\",\n );\n }\n if (\n wallet.kind === \"purchase-clearing\" ||\n wallet.kind === \"provider-clearing\" ||\n wallet.kind === \"system\"\n ) {\n economyAssert(\n wallet.ownerType === \"system\" && wallet.householdId === undefined,\n \"INVALID_CONTRACT\",\n \"Clearing and system wallets must be system-owned\",\n );\n }\n economyAssert(\n Number.isSafeInteger(wallet.version) && wallet.version >= 1,\n \"INVALID_CONTRACT\",\n \"Wallet version must be a positive safe integer\",\n );\n const createdAt = parseIsoTimestamp(wallet.createdAt);\n if (wallet.closedAt !== undefined) {\n economyAssert(\n parseIsoTimestamp(wallet.closedAt) >= createdAt &&\n wallet.status === \"closed\",\n \"INVALID_TIME_WINDOW\",\n \"Only closed wallets may have a valid closure time\",\n );\n } else {\n economyAssert(\n wallet.status !== \"closed\",\n \"INVALID_CONTRACT\",\n \"Closed wallets require a closure time\",\n );\n }\n}\n\n/** Validates non-negative server-computed wallet balance categories. */\nexport function assertWalletBalanceSummary(\n summary: WalletBalanceSummaryV1,\n): void {\n economyAssert(\n summary.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet summary contract version\",\n );\n assertEconomyIdentifier(summary.walletId, \"walletId\");\n for (const amount of [\n summary.available,\n summary.reserved,\n summary.held,\n summary.rewardProgress,\n ]) {\n economyAssert(\n parseTokenSubunits(amount) >= 0n,\n \"INVALID_AMOUNT\",\n \"Wallet summary categories cannot be negative\",\n );\n }\n economyAssert(\n Number.isSafeInteger(summary.version) && summary.version >= 1,\n \"INVALID_CONTRACT\",\n \"Wallet summary version must be a positive safe integer\",\n );\n parseIsoTimestamp(summary.asOf);\n}\n\n/** Validates non-negative lifetime aggregates exposed by the profile API. */\nexport function assertWalletLifetimeTotals(\n totals: WalletLifetimeTotalsV1,\n): void {\n economyAssert(\n totals.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet lifetime-total contract version\",\n );\n for (const amount of [\n totals.bought,\n totals.earned,\n totals.allocated,\n totals.reclaimed,\n totals.spent,\n totals.reversed,\n ]) {\n economyAssert(\n parseTokenSubunits(amount) >= 0n,\n \"INVALID_AMOUNT\",\n \"Wallet lifetime totals cannot be negative\",\n );\n }\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n type WalletId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport {\n assertBalancedTransaction,\n assertEconomicJournalTransaction,\n type ActivityType,\n type EconomicJournalTransactionV1,\n type LedgerTransactionV1,\n} from \"./ledger.js\";\nimport {\n assertWalletBalanceSummary,\n assertWalletLifetimeTotals,\n type WalletBalanceSummaryV1,\n type WalletLifetimeTotalsV1,\n} from \"./wallets.js\";\n\nexport type BalanceProjection = Readonly<Record<AccountId, TokenSubunitString>>;\n\nexport interface BalanceProjectionSnapshotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly balances: BalanceProjection;\n readonly lastTransactionId?: TransactionId;\n readonly rebuiltAt: IsoTimestamp;\n}\n\nexport type WalletProjectionBucket = \"spendable\" | \"reserved\" | \"held\";\n\n/** Exclusive stored buckets for one wallet; reward progress is derived. */\nexport interface WalletBalanceProjectionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly spendable: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly version: number;\n readonly lastTransactionId?: TransactionId;\n readonly asOf: IsoTimestamp;\n}\n\n/** One atomic add operation against all exclusive buckets of a wallet. */\nexport interface WalletBalanceDeltaV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly spendableDelta: TokenSubunitString;\n readonly reservedDelta: TokenSubunitString;\n readonly heldDelta: TokenSubunitString;\n}\n\n/** Authoritative mapping from a ledger account to one wallet bucket. */\nexport interface WalletPostingAccountBindingV1 {\n readonly accountId: AccountId;\n readonly walletId: WalletId;\n readonly bucket: WalletProjectionBucket;\n}\n\nexport type WalletLifetimeBucket =\n | \"bought\"\n | \"earned\"\n | \"allocated\"\n | \"reclaimed\"\n | \"spent\"\n | \"reversed\";\n\n/** Positive monotonic contribution to one wallet lifetime counter. */\nexport interface WalletLifetimeDeltaV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly bucket: WalletLifetimeBucket;\n readonly amount: TokenSubunitString;\n}\n\n/** Validates one exclusive-bucket projection. */\nexport function assertWalletBalanceProjection(\n projection: WalletBalanceProjectionV1,\n): void {\n economyAssert(\n projection.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-balance-projection contract version\",\n );\n assertEconomyIdentifier(projection.walletId, \"walletId\");\n for (const amount of [\n projection.spendable,\n projection.reserved,\n projection.held,\n ]) {\n economyAssert(\n parseTokenSubunits(amount) >= 0n,\n \"NEGATIVE_PROJECTION\",\n \"Wallet projection buckets cannot be negative\",\n );\n }\n economyAssert(\n Number.isSafeInteger(projection.version) && projection.version >= 1,\n \"INVALID_CONTRACT\",\n \"Wallet projection version must be a positive safe integer\",\n );\n if (projection.lastTransactionId !== undefined) {\n assertEconomyIdentifier(\n projection.lastTransactionId,\n \"lastTransactionId\",\n );\n }\n parseIsoTimestamp(projection.asOf);\n}\n\n/** Validates one non-zero atomic wallet delta. */\nexport function assertWalletBalanceDelta(delta: WalletBalanceDeltaV1): void {\n economyAssert(\n delta.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-balance-delta contract version\",\n );\n assertEconomyIdentifier(delta.walletId, \"walletId\");\n const values = [\n parseTokenSubunits(delta.spendableDelta),\n parseTokenSubunits(delta.reservedDelta),\n parseTokenSubunits(delta.heldDelta),\n ];\n economyAssert(\n values.some((value) => value !== 0n),\n \"INVALID_AMOUNT\",\n \"Wallet balance delta must change at least one bucket\",\n );\n}\n\n/** Rejects duplicate wallet updates before one atomic persistence call. */\nexport function assertWalletBalanceDeltaBatch(\n transactionId: TransactionId,\n deltas: readonly WalletBalanceDeltaV1[],\n): void {\n assertEconomyIdentifier(transactionId, \"transactionId\");\n economyAssert(\n deltas.length > 0,\n \"INVALID_CONTRACT\",\n \"An economic transaction must update at least one wallet projection\",\n );\n const walletIds = new Set<string>();\n for (const delta of deltas) {\n assertWalletBalanceDelta(delta);\n economyAssert(\n !walletIds.has(delta.walletId),\n \"DUPLICATE_IDENTIFIER\",\n \"A balance-delta batch must update each wallet once\",\n );\n walletIds.add(delta.walletId);\n }\n}\n\n/** Applies an atomic add locally for deterministic tests and rebuilds. */\nexport function applyWalletBalanceDelta(\n projection: WalletBalanceProjectionV1,\n delta: WalletBalanceDeltaV1,\n transactionId: TransactionId,\n asOf: IsoTimestamp,\n): WalletBalanceProjectionV1 {\n assertWalletBalanceProjection(projection);\n assertWalletBalanceDelta(delta);\n assertEconomyIdentifier(transactionId, \"transactionId\");\n economyAssert(\n projection.walletId === delta.walletId,\n \"INVALID_CONTRACT\",\n \"Wallet balance delta must target its projection wallet\",\n );\n economyAssert(\n parseIsoTimestamp(asOf) >= parseIsoTimestamp(projection.asOf),\n \"INVALID_TIME_WINDOW\",\n \"Wallet balance update cannot precede its projection\",\n );\n const next: WalletBalanceProjectionV1 = {\n ...projection,\n spendable: serializeTokenSubunits(\n parseTokenSubunits(projection.spendable) +\n parseTokenSubunits(delta.spendableDelta),\n ),\n reserved: serializeTokenSubunits(\n parseTokenSubunits(projection.reserved) +\n parseTokenSubunits(delta.reservedDelta),\n ),\n held: serializeTokenSubunits(\n parseTokenSubunits(projection.held) +\n parseTokenSubunits(delta.heldDelta),\n ),\n version: projection.version + 1,\n lastTransactionId: transactionId,\n asOf,\n };\n assertWalletBalanceProjection(next);\n return next;\n}\n\n/**\n * Converts exclusive storage buckets to the legacy display DTO. Available is\n * independently usable whole Tokens in this wallet; rewardProgress is this\n * wallet's sub-Token remainder and is never netted with another wallet.\n */\nexport function createWalletBalanceSummary(\n projection: WalletBalanceProjectionV1,\n): WalletBalanceSummaryV1 {\n assertWalletBalanceProjection(projection);\n const spendable = parseTokenSubunits(projection.spendable);\n const rewardProgress = spendable % 1_000n;\n const summary: WalletBalanceSummaryV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId: projection.walletId,\n available: serializeTokenSubunits(spendable - rewardProgress),\n reserved: projection.reserved,\n held: projection.held,\n rewardProgress: serializeTokenSubunits(rewardProgress),\n version: projection.version,\n asOf: projection.asOf,\n };\n assertDeterministicWalletBalanceSummary(summary);\n return summary;\n}\n\n/** Enforces the stronger per-wallet semantics required by V1 query adapters. */\nexport function assertDeterministicWalletBalanceSummary(\n summary: WalletBalanceSummaryV1,\n): void {\n assertWalletBalanceSummary(summary);\n economyAssert(\n parseTokenSubunits(summary.available) % 1_000n === 0n &&\n parseTokenSubunits(summary.rewardProgress) < 1_000n,\n \"INVALID_CONTRACT\",\n \"Per-wallet availability must be whole Tokens with sub-Token progress below one Token\",\n );\n}\n\n/**\n * Derives a single delta per wallet from wallet-linked postings and an\n * authoritative account-to-bucket mapping. Unlinked system postings are not\n * wallet projections.\n */\nexport function deriveWalletBalanceDeltas(\n transaction: EconomicJournalTransactionV1,\n bindings: readonly WalletPostingAccountBindingV1[],\n): readonly WalletBalanceDeltaV1[] {\n assertEconomicJournalTransaction(transaction);\n const byAccount = new Map<AccountId, WalletPostingAccountBindingV1>();\n for (const binding of bindings) {\n assertEconomyIdentifier(binding.accountId, \"accountId\");\n assertEconomyIdentifier(binding.walletId, \"walletId\");\n economyAssert(\n [\"spendable\", \"reserved\", \"held\"].includes(binding.bucket),\n \"INVALID_CONTRACT\",\n \"Wallet account binding has an unsupported bucket\",\n );\n economyAssert(\n !byAccount.has(binding.accountId),\n \"DUPLICATE_IDENTIFIER\",\n \"A ledger account may bind to only one wallet bucket\",\n );\n byAccount.set(binding.accountId, binding);\n }\n\n const byWallet = new Map<WalletId, [bigint, bigint, bigint]>();\n for (const posting of transaction.postings) {\n if (posting.walletId === undefined) {\n continue;\n }\n const binding = byAccount.get(posting.accountId);\n economyAssert(\n binding !== undefined && binding.walletId === posting.walletId,\n \"INVALID_CONTRACT\",\n \"Every wallet-linked posting must match an authoritative account binding\",\n );\n const values = byWallet.get(binding.walletId) ?? [0n, 0n, 0n];\n const amount = parseTokenSubunits(posting.amount);\n if (binding.bucket === \"spendable\") {\n values[0] += amount;\n } else if (binding.bucket === \"reserved\") {\n values[1] += amount;\n } else {\n values[2] += amount;\n }\n byWallet.set(binding.walletId, values);\n }\n\n const deltas = [...byWallet.entries()]\n .map(([walletId, values]) => ({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n spendableDelta: serializeTokenSubunits(values[0]),\n reservedDelta: serializeTokenSubunits(values[1]),\n heldDelta: serializeTokenSubunits(values[2]),\n }))\n .filter(\n (delta) =>\n delta.spendableDelta !== \"0\" ||\n delta.reservedDelta !== \"0\" ||\n delta.heldDelta !== \"0\",\n )\n .sort((left, right) => left.walletId.localeCompare(right.walletId));\n assertWalletBalanceDeltaBatch(transaction.transactionId, deltas);\n return deltas;\n}\n\nconst EARNED_ACTIVITY_TYPES = new Set<ActivityType>([\n \"rewarded-ad\",\n \"offerwall\",\n \"event\",\n \"competition\",\n]);\n\n/**\n * Rebuilds monotonic gross lifetime contributions from a settled transaction.\n * Earlier bought/earned counters are never reduced by a later compensating\n * transaction; removals accrue separately in `reversed`.\n */\nexport function deriveWalletLifetimeDeltas(\n transaction: EconomicJournalTransactionV1,\n): readonly WalletLifetimeDeltaV1[] {\n assertEconomicJournalTransaction(transaction);\n if (transaction.status !== \"settled\") {\n return [];\n }\n const netByWallet = new Map<WalletId, bigint>();\n for (const posting of transaction.postings) {\n if (posting.walletId !== undefined) {\n netByWallet.set(\n posting.walletId,\n (netByWallet.get(posting.walletId) ?? 0n) +\n parseTokenSubunits(posting.amount),\n );\n }\n }\n\n const deltas: WalletLifetimeDeltaV1[] = [];\n for (const [walletId, net] of [...netByWallet.entries()].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n let bucket: WalletLifetimeBucket | undefined;\n let amount = 0n;\n if (\n net > 0n &&\n (transaction.activityType === \"purchase\" ||\n transaction.activityType === \"subscription\")\n ) {\n bucket = \"bought\";\n amount = net;\n } else if (net > 0n && EARNED_ACTIVITY_TYPES.has(transaction.activityType)) {\n bucket = \"earned\";\n amount = net;\n } else if (\n net < 0n &&\n (transaction.activityType === \"allocation\" ||\n transaction.activityType === \"boost\")\n ) {\n bucket = \"allocated\";\n amount = -net;\n } else if (net > 0n && transaction.activityType === \"reclaim\") {\n bucket = \"reclaimed\";\n amount = net;\n } else if (net < 0n && transaction.activityType === \"spend\") {\n bucket = \"spent\";\n amount = -net;\n } else if (\n net < 0n &&\n (transaction.activityType === \"refund\" ||\n transaction.activityType === \"chargeback\" ||\n transaction.activityType === \"reversal\")\n ) {\n bucket = \"reversed\";\n amount = -net;\n }\n if (bucket !== undefined) {\n deltas.push({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n bucket,\n amount: serializeTokenSubunits(amount),\n });\n }\n }\n return deltas;\n}\n\n/** Applies positive lifetime deltas for one wallet without rewriting history. */\nexport function applyWalletLifetimeDeltas(\n current: WalletLifetimeTotalsV1,\n walletId: WalletId,\n deltas: readonly WalletLifetimeDeltaV1[],\n): WalletLifetimeTotalsV1 {\n assertWalletLifetimeTotals(current);\n assertEconomyIdentifier(walletId, \"walletId\");\n const next: Record<WalletLifetimeBucket, bigint> = {\n bought: parseTokenSubunits(current.bought),\n earned: parseTokenSubunits(current.earned),\n allocated: parseTokenSubunits(current.allocated),\n reclaimed: parseTokenSubunits(current.reclaimed),\n spent: parseTokenSubunits(current.spent),\n reversed: parseTokenSubunits(current.reversed),\n };\n for (const delta of deltas) {\n economyAssert(\n delta.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n delta.walletId === walletId &&\n [\n \"bought\",\n \"earned\",\n \"allocated\",\n \"reclaimed\",\n \"spent\",\n \"reversed\",\n ].includes(delta.bucket),\n \"INVALID_CONTRACT\",\n \"Lifetime delta must target the requested wallet and a known bucket\",\n );\n const amount = parseTokenSubunits(delta.amount);\n economyAssert(\n amount > 0n,\n \"INVALID_AMOUNT\",\n \"Lifetime deltas must be positive\",\n );\n next[delta.bucket] += amount;\n }\n const totals: WalletLifetimeTotalsV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n bought: serializeTokenSubunits(next.bought),\n earned: serializeTokenSubunits(next.earned),\n allocated: serializeTokenSubunits(next.allocated),\n reclaimed: serializeTokenSubunits(next.reclaimed),\n spent: serializeTokenSubunits(next.spent),\n reversed: serializeTokenSubunits(next.reversed),\n };\n assertWalletLifetimeTotals(totals);\n return totals;\n}\n\n/** Applies one balanced transaction without mutating the existing projection. */\nexport function applyTransactionToProjection(\n current: BalanceProjection,\n transaction: LedgerTransactionV1,\n): BalanceProjection {\n assertBalancedTransaction(transaction);\n const next: Record<AccountId, TokenSubunitString> = { ...current };\n for (const posting of transaction.postings) {\n const prior = parseTokenSubunits(next[posting.accountId] ?? \"0\");\n next[posting.accountId] = serializeTokenSubunits(\n prior + parseTokenSubunits(posting.amount),\n );\n }\n return next;\n}\n\n/**\n * Rebuilds balances deterministically and rejects duplicate economic envelopes.\n */\nexport function rebuildBalanceProjection(\n transactions: readonly LedgerTransactionV1[],\n): BalanceProjection {\n let projection: BalanceProjection = {};\n const transactionIds = new Set<string>();\n const idempotencyKeys = new Set<string>();\n const providerEvents = new Set<string>();\n\n for (const transaction of transactions) {\n economyAssert(\n !transactionIds.has(transaction.transactionId),\n \"DUPLICATE_TRANSACTION\",\n \"Transaction identifiers must be unique\",\n );\n economyAssert(\n !idempotencyKeys.has(transaction.idempotencyKey),\n \"DUPLICATE_TRANSACTION\",\n \"Idempotency keys must be unique\",\n );\n if (transaction.providerEventId !== undefined) {\n economyAssert(\n !providerEvents.has(transaction.providerEventId),\n \"DUPLICATE_TRANSACTION\",\n \"Provider event identifiers must be unique\",\n );\n providerEvents.add(transaction.providerEventId);\n }\n transactionIds.add(transaction.transactionId);\n idempotencyKeys.add(transaction.idempotencyKey);\n projection = applyTransactionToProjection(projection, transaction);\n }\n\n return projection;\n}\n\n/** Enforces non-negative balances only for spendable/reservable accounts. */\nexport function assertNonNegativeAccounts(\n projection: BalanceProjection,\n protectedAccountIds: readonly AccountId[],\n): void {\n for (const accountId of protectedAccountIds) {\n economyAssert(\n parseTokenSubunits(projection[accountId] ?? \"0\") >= 0n,\n \"NEGATIVE_PROJECTION\",\n \"A protected economy account would become negative\",\n );\n }\n}\n\n/** Creates a versioned snapshot after a deterministic rebuild. */\nexport function createProjectionSnapshot(\n transactions: readonly LedgerTransactionV1[],\n rebuiltAt: IsoTimestamp,\n): BalanceProjectionSnapshotV1 {\n parseIsoTimestamp(rebuiltAt);\n const last = transactions.at(-1);\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n balances: rebuildBalanceProjection(transactions),\n ...(last === undefined ? {} : { lastTransactionId: last.transactionId }),\n rebuiltAt,\n };\n}\n","import {\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"../amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n type WalletId,\n} from \"../contracts.js\";\nimport { economyAssert } from \"../errors.js\";\nimport type { ActivityType } from \"../ledger.js\";\nimport type { TokenSource } from \"../lots.js\";\nimport { assertDeterministicWalletBalanceSummary } from \"../projection.js\";\nimport {\n assertWalletLifetimeTotals,\n type WalletBalanceSummaryV1,\n type WalletLifetimeTotalsV1,\n} from \"../wallets.js\";\n\nexport type WalletPortfolioComponentRole =\n | \"household-treasury\"\n | \"personal\"\n | \"gameplay-allocation\"\n | \"hold\";\n\n/** One server-authorized component of a portfolio read. */\nexport interface WalletPortfolioComponentScopeV1 {\n readonly walletId: WalletId;\n readonly role: WalletPortfolioComponentRole;\n readonly beneficiaryAccountId?: AccountId;\n}\n\n/**\n * Explicit portfolio scope assembled after authorization. It prevents a host's\n * household treasury and same-user-only personal wallet from being silently\n * represented as one wallet.\n */\nexport interface WalletPortfolioReadScopeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly portfolioId: string;\n readonly subjectAccountId: AccountId;\n readonly components: readonly WalletPortfolioComponentScopeV1[];\n}\n\nexport interface WalletBalanceTotalsV1 {\n readonly available: TokenSubunitString;\n readonly reserved: TokenSubunitString;\n readonly held: TokenSubunitString;\n readonly rewardProgress: TokenSubunitString;\n}\n\nexport interface WalletPortfolioBalanceComponentV1\n extends WalletPortfolioComponentScopeV1 {\n readonly summary: WalletBalanceSummaryV1;\n}\n\nexport interface WalletPortfolioSummaryV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly portfolioId: string;\n readonly subjectAccountId: AccountId;\n readonly components: readonly WalletPortfolioBalanceComponentV1[];\n /**\n * Exact column sums for display only. Progress is intentionally not promoted\n * across wallets because their source/transfer policies may differ.\n */\n readonly totals: WalletBalanceTotalsV1;\n readonly asOf: IsoTimestamp;\n}\n\n/** Self-identifying lifetime read for one wallet. */\nexport interface WalletLifetimeSnapshotV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly walletId: WalletId;\n readonly totals: WalletLifetimeTotalsV1;\n readonly version: number;\n readonly asOf: IsoTimestamp;\n}\n\nexport interface WalletPortfolioLifetimeComponentV1\n extends WalletPortfolioComponentScopeV1 {\n readonly snapshot: WalletLifetimeSnapshotV1;\n}\n\nexport interface WalletPortfolioLifetimeV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly portfolioId: string;\n readonly subjectAccountId: AccountId;\n readonly components: readonly WalletPortfolioLifetimeComponentV1[];\n readonly totals: WalletLifetimeTotalsV1;\n readonly asOf: IsoTimestamp;\n}\n\nexport type EconomicActivityStatusV1 = \"held\" | \"settled\" | \"reversed\";\nexport type WorkflowActivityStatusV1 = \"pending\" | \"failed\";\nexport type WalletActivityStatusV1 =\n | EconomicActivityStatusV1\n | WorkflowActivityStatusV1;\n\ninterface WalletActivityBaseV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly activityId: string;\n /** Component wallet whose signed display amount this row represents. */\n readonly walletId: WalletId;\n readonly activityType: ActivityType;\n readonly occurredAt: IsoTimestamp;\n readonly amount: TokenSubunitString;\n readonly source: TokenSource;\n readonly beneficiaryAccountId?: AccountId;\n readonly maskedReference?: string;\n readonly sourceLabel: string;\n}\n\n/** Economically effective or read-model-derived reversal activity. */\nexport interface EconomicWalletActivityEntryV1 extends WalletActivityBaseV1 {\n readonly entryKind: \"economic\";\n readonly transactionId: TransactionId;\n readonly status: EconomicActivityStatusV1;\n}\n\n/**\n * Non-economic accepted/failed work. Its amount is display context only and is\n * excluded from balances and lifetime aggregates.\n */\nexport interface WorkflowWalletActivityEntryV1 extends WalletActivityBaseV1 {\n readonly entryKind: \"workflow\";\n readonly commandId: string;\n readonly status: WorkflowActivityStatusV1;\n}\n\nexport type WalletActivityEntryV1 =\n | EconomicWalletActivityEntryV1\n | WorkflowWalletActivityEntryV1;\n\nexport interface WalletActivityFilterV1 {\n readonly activityTypes?: readonly ActivityType[];\n readonly statuses?: readonly WalletActivityStatusV1[];\n readonly sources?: readonly TokenSource[];\n readonly beneficiaryAccountId?: AccountId;\n readonly fromInclusive?: IsoTimestamp;\n readonly toExclusive?: IsoTimestamp;\n}\n\nexport interface WalletActivityPageRequestV1 {\n readonly limit: number;\n readonly cursor?: string;\n readonly filter?: WalletActivityFilterV1;\n}\n\nexport interface WalletActivityPageV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly entries: readonly WalletActivityEntryV1[];\n readonly hasMore: boolean;\n readonly nextCursor?: string;\n}\n\nconst ACTIVITY_TYPES = new Set<ActivityType>([\n \"purchase\",\n \"subscription\",\n \"rewarded-ad\",\n \"offerwall\",\n \"allocation\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"refund\",\n \"chargeback\",\n \"adjustment\",\n \"reversal\",\n \"event\",\n \"competition\",\n]);\nconst ACTIVITY_STATUSES = new Set<WalletActivityStatusV1>([\n \"pending\",\n \"held\",\n \"settled\",\n \"reversed\",\n \"failed\",\n]);\nconst ACTIVITY_SOURCES = new Set<TokenSource>([\n \"shopify\",\n \"ayet\",\n \"bitlabs\",\n \"google-ad-manager\",\n \"subscription\",\n \"event\",\n \"competition\",\n \"adjustment\",\n]);\nconst PORTFOLIO_ROLES = new Set<WalletPortfolioComponentRole>([\n \"household-treasury\",\n \"personal\",\n \"gameplay-allocation\",\n \"hold\",\n]);\n\nfunction hasControlCharacters(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || code === 127;\n });\n}\n\nfunction assertSafeDisplayString(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" &&\n value.trim().length > 0 &&\n value.length <= 128 &&\n !hasControlCharacters(value),\n \"INVALID_CONTRACT\",\n `${label} must be bounded and safe for display`,\n );\n}\n\nfunction assertOpaqueCursor(value: string): void {\n economyAssert(\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= 512 &&\n !hasControlCharacters(value),\n \"INVALID_CONTRACT\",\n \"Activity cursor must be a bounded opaque value\",\n );\n}\n\nfunction assertUniqueValues<T extends string>(\n values: readonly T[],\n allowed: ReadonlySet<T>,\n label: string,\n): void {\n const unique = new Set(values);\n economyAssert(\n values.length > 0 &&\n values.length === unique.size &&\n values.every((value) => allowed.has(value)),\n \"INVALID_CONTRACT\",\n `${label} must contain unique supported values`,\n );\n}\n\n/** Validates a server-created, bounded portfolio scope. */\nexport function assertWalletPortfolioReadScope(\n scope: WalletPortfolioReadScopeV1,\n): void {\n economyAssert(\n scope.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-portfolio scope contract version\",\n );\n assertEconomyIdentifier(scope.portfolioId, \"portfolioId\");\n assertEconomyIdentifier(scope.subjectAccountId, \"subjectAccountId\");\n economyAssert(\n scope.components.length > 0 && scope.components.length <= 100,\n \"INVALID_CONTRACT\",\n \"Wallet portfolio must contain between one and 100 components\",\n );\n const walletIds = new Set<string>();\n for (const component of scope.components) {\n assertEconomyIdentifier(component.walletId, \"walletId\");\n economyAssert(\n PORTFOLIO_ROLES.has(component.role),\n \"INVALID_CONTRACT\",\n \"Wallet portfolio component has an unsupported role\",\n );\n economyAssert(\n !walletIds.has(component.walletId),\n \"DUPLICATE_IDENTIFIER\",\n \"Wallet portfolio cannot repeat a wallet\",\n );\n walletIds.add(component.walletId);\n if (component.beneficiaryAccountId !== undefined) {\n assertEconomyIdentifier(\n component.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n }\n economyAssert(\n component.role !== \"gameplay-allocation\" ||\n component.beneficiaryAccountId !== undefined,\n \"INVALID_CONTRACT\",\n \"Gameplay-allocation portfolio components require a beneficiary\",\n );\n }\n}\n\n/** Validates a self-identifying wallet lifetime read. */\nexport function assertWalletLifetimeSnapshot(\n snapshot: WalletLifetimeSnapshotV1,\n): void {\n economyAssert(\n snapshot.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-lifetime-snapshot contract version\",\n );\n assertEconomyIdentifier(snapshot.walletId, \"walletId\");\n assertWalletLifetimeTotals(snapshot.totals);\n economyAssert(\n Number.isSafeInteger(snapshot.version) && snapshot.version >= 1,\n \"INVALID_CONTRACT\",\n \"Wallet lifetime version must be a positive safe integer\",\n );\n parseIsoTimestamp(snapshot.asOf);\n}\n\nfunction assertPortfolioComponentMatch(\n expected: WalletPortfolioComponentScopeV1,\n actual: WalletPortfolioComponentScopeV1,\n): void {\n economyAssert(\n expected.walletId === actual.walletId &&\n expected.role === actual.role &&\n expected.beneficiaryAccountId === actual.beneficiaryAccountId,\n \"INVALID_CONTRACT\",\n \"Portfolio result component does not match its authorized read scope\",\n );\n}\n\n/**\n * Constructs a portfolio balance without merging wallet identities or\n * promoting sub-Token progress across policy boundaries.\n */\nexport function createWalletPortfolioSummary(\n scope: WalletPortfolioReadScopeV1,\n components: readonly WalletPortfolioBalanceComponentV1[],\n asOf: IsoTimestamp,\n): WalletPortfolioSummaryV1 {\n assertWalletPortfolioReadScope(scope);\n parseIsoTimestamp(asOf);\n economyAssert(\n components.length === scope.components.length,\n \"INVALID_CONTRACT\",\n \"Portfolio balance must include every authorized component exactly once\",\n );\n const byWallet = new Map(components.map((item) => [item.walletId, item]));\n economyAssert(\n byWallet.size === components.length,\n \"DUPLICATE_IDENTIFIER\",\n \"Portfolio balance cannot repeat a wallet\",\n );\n\n const ordered = scope.components.map((expected) => {\n const actual = byWallet.get(expected.walletId);\n economyAssert(\n actual !== undefined,\n \"INVALID_CONTRACT\",\n \"Portfolio balance is missing an authorized wallet\",\n );\n assertPortfolioComponentMatch(expected, actual);\n assertDeterministicWalletBalanceSummary(actual.summary);\n economyAssert(\n actual.summary.walletId === actual.walletId &&\n actual.summary.asOf === asOf,\n \"INVALID_CONTRACT\",\n \"Portfolio component summary must identify its wallet and shared snapshot time\",\n );\n return actual;\n });\n\n const totals: WalletBalanceTotalsV1 = {\n available: serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.summary.available),\n 0n,\n ),\n ),\n reserved: serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.summary.reserved),\n 0n,\n ),\n ),\n held: serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.summary.held),\n 0n,\n ),\n ),\n rewardProgress: serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.summary.rewardProgress),\n 0n,\n ),\n ),\n };\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n portfolioId: scope.portfolioId,\n subjectAccountId: scope.subjectAccountId,\n components: ordered,\n totals,\n asOf,\n };\n}\n\n/** Validates a portfolio balance read independently of its producing adapter. */\nexport function assertWalletPortfolioSummary(\n summary: WalletPortfolioSummaryV1,\n): void {\n const scope: WalletPortfolioReadScopeV1 = {\n schemaVersion: summary.schemaVersion,\n portfolioId: summary.portfolioId,\n subjectAccountId: summary.subjectAccountId,\n components: summary.components.map(\n ({ walletId, role, beneficiaryAccountId }) => ({\n walletId,\n role,\n ...(beneficiaryAccountId === undefined\n ? {}\n : { beneficiaryAccountId }),\n }),\n ),\n };\n const rebuilt = createWalletPortfolioSummary(\n scope,\n summary.components,\n summary.asOf,\n );\n for (const field of [\n \"available\",\n \"reserved\",\n \"held\",\n \"rewardProgress\",\n ] as const) {\n economyAssert(\n summary.totals[field] === rebuilt.totals[field],\n \"INVALID_CONTRACT\",\n \"Portfolio balance totals must equal their component column sums\",\n );\n }\n}\n\n/** Builds monotonic lifetime totals while retaining per-wallet components. */\nexport function createWalletPortfolioLifetime(\n scope: WalletPortfolioReadScopeV1,\n components: readonly WalletPortfolioLifetimeComponentV1[],\n asOf: IsoTimestamp,\n): WalletPortfolioLifetimeV1 {\n assertWalletPortfolioReadScope(scope);\n parseIsoTimestamp(asOf);\n economyAssert(\n components.length === scope.components.length,\n \"INVALID_CONTRACT\",\n \"Portfolio lifetime must include every authorized component exactly once\",\n );\n const byWallet = new Map(components.map((item) => [item.walletId, item]));\n economyAssert(\n byWallet.size === components.length,\n \"DUPLICATE_IDENTIFIER\",\n \"Portfolio lifetime cannot repeat a wallet\",\n );\n const ordered = scope.components.map((expected) => {\n const actual = byWallet.get(expected.walletId);\n economyAssert(\n actual !== undefined,\n \"INVALID_CONTRACT\",\n \"Portfolio lifetime is missing an authorized wallet\",\n );\n assertPortfolioComponentMatch(expected, actual);\n assertWalletLifetimeSnapshot(actual.snapshot);\n economyAssert(\n actual.snapshot.walletId === actual.walletId &&\n actual.snapshot.asOf === asOf,\n \"INVALID_CONTRACT\",\n \"Portfolio lifetime component must identify its wallet and shared snapshot time\",\n );\n return actual;\n });\n const sumField = (\n field: Exclude<keyof WalletLifetimeTotalsV1, \"schemaVersion\">,\n ): TokenSubunitString =>\n serializeTokenSubunits(\n ordered.reduce(\n (sum, item) => sum + parseTokenSubunits(item.snapshot.totals[field]),\n 0n,\n ),\n );\n const totals: WalletLifetimeTotalsV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n bought: sumField(\"bought\"),\n earned: sumField(\"earned\"),\n allocated: sumField(\"allocated\"),\n reclaimed: sumField(\"reclaimed\"),\n spent: sumField(\"spent\"),\n reversed: sumField(\"reversed\"),\n };\n assertWalletLifetimeTotals(totals);\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n portfolioId: scope.portfolioId,\n subjectAccountId: scope.subjectAccountId,\n components: ordered,\n totals,\n asOf,\n };\n}\n\n/** Validates a portfolio lifetime read independently of its producing adapter. */\nexport function assertWalletPortfolioLifetime(\n lifetime: WalletPortfolioLifetimeV1,\n): void {\n const scope: WalletPortfolioReadScopeV1 = {\n schemaVersion: lifetime.schemaVersion,\n portfolioId: lifetime.portfolioId,\n subjectAccountId: lifetime.subjectAccountId,\n components: lifetime.components.map(\n ({ walletId, role, beneficiaryAccountId }) => ({\n walletId,\n role,\n ...(beneficiaryAccountId === undefined\n ? {}\n : { beneficiaryAccountId }),\n }),\n ),\n };\n const rebuilt = createWalletPortfolioLifetime(\n scope,\n lifetime.components,\n lifetime.asOf,\n );\n for (const field of [\n \"bought\",\n \"earned\",\n \"allocated\",\n \"reclaimed\",\n \"spent\",\n \"reversed\",\n ] as const) {\n economyAssert(\n lifetime.totals[field] === rebuilt.totals[field],\n \"INVALID_CONTRACT\",\n \"Portfolio lifetime totals must equal their component column sums\",\n );\n }\n}\n\n/** Validates the economic/workflow activity discriminant and safe display data. */\nexport function assertWalletActivityEntry(\n entry: WalletActivityEntryV1,\n): void {\n economyAssert(\n entry.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-activity contract version\",\n );\n assertEconomyIdentifier(entry.activityId, \"activityId\");\n assertEconomyIdentifier(entry.walletId, \"walletId\");\n economyAssert(\n ACTIVITY_TYPES.has(entry.activityType) &&\n ACTIVITY_STATUSES.has(entry.status) &&\n ACTIVITY_SOURCES.has(entry.source),\n \"INVALID_CONTRACT\",\n \"Wallet activity type, status, or source is unsupported\",\n );\n parseIsoTimestamp(entry.occurredAt);\n economyAssert(\n parseTokenSubunits(entry.amount) !== 0n,\n \"INVALID_AMOUNT\",\n \"Wallet activity amount cannot be zero\",\n );\n if (entry.beneficiaryAccountId !== undefined) {\n assertEconomyIdentifier(\n entry.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n }\n if (entry.maskedReference !== undefined) {\n assertSafeDisplayString(entry.maskedReference, \"Masked reference\");\n }\n assertSafeDisplayString(entry.sourceLabel, \"Source label\");\n economyAssert(\n entry.entryKind === \"economic\" || entry.entryKind === \"workflow\",\n \"INVALID_CONTRACT\",\n \"Wallet activity has an unsupported entry kind\",\n );\n if (entry.entryKind === \"economic\") {\n assertEconomyIdentifier(entry.transactionId, \"transactionId\");\n economyAssert(\n entry.status === \"held\" ||\n entry.status === \"settled\" ||\n entry.status === \"reversed\",\n \"INVALID_CONTRACT\",\n \"Economic activity cannot use a workflow status\",\n );\n } else {\n assertEconomyIdentifier(entry.commandId, \"commandId\");\n economyAssert(\n entry.status === \"pending\" || entry.status === \"failed\",\n \"INVALID_CONTRACT\",\n \"Workflow activity cannot use an economic status\",\n );\n }\n}\n\n/** Validates bounded filters and opaque cursor input. */\nexport function assertWalletActivityPageRequest(\n request: WalletActivityPageRequestV1,\n): void {\n economyAssert(\n Number.isSafeInteger(request.limit) &&\n request.limit >= 1 &&\n request.limit <= 100,\n \"INVALID_CONTRACT\",\n \"Activity page limit must be between one and 100\",\n );\n if (request.cursor !== undefined) {\n assertOpaqueCursor(request.cursor);\n }\n const filter = request.filter;\n if (filter === undefined) {\n return;\n }\n if (filter.activityTypes !== undefined) {\n assertUniqueValues(filter.activityTypes, ACTIVITY_TYPES, \"Activity types\");\n }\n if (filter.statuses !== undefined) {\n assertUniqueValues(filter.statuses, ACTIVITY_STATUSES, \"Activity statuses\");\n }\n if (filter.sources !== undefined) {\n assertUniqueValues(filter.sources, ACTIVITY_SOURCES, \"Activity sources\");\n }\n if (filter.beneficiaryAccountId !== undefined) {\n assertEconomyIdentifier(\n filter.beneficiaryAccountId,\n \"beneficiaryAccountId\",\n );\n }\n const from =\n filter.fromInclusive === undefined\n ? undefined\n : parseIsoTimestamp(filter.fromInclusive);\n const to =\n filter.toExclusive === undefined\n ? undefined\n : parseIsoTimestamp(filter.toExclusive);\n economyAssert(\n from === undefined || to === undefined || from < to,\n \"INVALID_TIME_WINDOW\",\n \"Activity filter start must precede its exclusive end\",\n );\n}\n\n/**\n * Validates stable descending `(occurredAt, activityId)` page order and cursor\n * presence. Cursors remain opaque to this provider-neutral package.\n */\nexport function assertWalletActivityPage(page: WalletActivityPageV1): void {\n economyAssert(\n page.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n typeof page.hasMore === \"boolean\",\n \"INVALID_CONTRACT\",\n \"Unsupported wallet-activity-page contract\",\n );\n economyAssert(\n page.hasMore === (page.nextCursor !== undefined),\n \"INVALID_CONTRACT\",\n \"Activity page cursor must be present exactly when more rows exist\",\n );\n economyAssert(\n page.entries.length <= 100 && (!page.hasMore || page.entries.length > 0),\n \"INVALID_CONTRACT\",\n \"Activity pages are bounded and cannot advertise more rows from an empty page\",\n );\n if (page.nextCursor !== undefined) {\n assertOpaqueCursor(page.nextCursor);\n }\n const activityIds = new Set<string>();\n let previous: WalletActivityEntryV1 | undefined;\n for (const entry of page.entries) {\n assertWalletActivityEntry(entry);\n economyAssert(\n !activityIds.has(entry.activityId),\n \"DUPLICATE_IDENTIFIER\",\n \"Activity page cannot repeat an activity ID\",\n );\n activityIds.add(entry.activityId);\n if (previous !== undefined) {\n const previousTime = parseIsoTimestamp(previous.occurredAt);\n const currentTime = parseIsoTimestamp(entry.occurredAt);\n economyAssert(\n previousTime > currentTime ||\n (previousTime === currentTime &&\n previous.activityId.localeCompare(entry.activityId) > 0),\n \"INVALID_CONTRACT\",\n \"Activity page must use stable descending time and ID order\",\n );\n }\n previous = entry;\n }\n}\n\n/** Prevents an activity cursor/result from expanding an authorized portfolio. */\nexport function assertWalletActivityPageForPortfolio(\n page: WalletActivityPageV1,\n scope: WalletPortfolioReadScopeV1,\n): void {\n assertWalletActivityPage(page);\n assertWalletPortfolioReadScope(scope);\n const walletIds = new Set(scope.components.map((item) => item.walletId));\n economyAssert(\n page.entries.every((entry) => walletIds.has(entry.walletId)),\n \"INVALID_CONTRACT\",\n \"Portfolio activity contains a wallet outside its authorized read scope\",\n );\n}\n\n/** Read-only adapter boundary; authorization must precede scope construction. */\nexport interface EconomyQueryPortV1 {\n getWalletSummary(walletId: WalletId): Promise<WalletBalanceSummaryV1 | null>;\n getWalletLifetime(\n walletId: WalletId,\n ): Promise<WalletLifetimeSnapshotV1 | null>;\n listWalletActivity(\n walletId: WalletId,\n request: WalletActivityPageRequestV1,\n ): Promise<WalletActivityPageV1>;\n getPortfolioSummary(\n scope: WalletPortfolioReadScopeV1,\n ): Promise<WalletPortfolioSummaryV1>;\n getPortfolioLifetime(\n scope: WalletPortfolioReadScopeV1,\n ): Promise<WalletPortfolioLifetimeV1>;\n listPortfolioActivity(\n scope: WalletPortfolioReadScopeV1,\n request: WalletActivityPageRequestV1,\n ): Promise<WalletActivityPageV1>;\n}\n","import {\n assertPurchaseLimitPolicy,\n type PurchaseLimitPolicyV1,\n} from \"./acquisition.js\";\nimport { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type HouseholdId,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { EconomyError, economyAssert } from \"./errors.js\";\n\ndeclare const gbpMinorUnitStringBrand: unique symbol;\n\n/** Canonical non-negative GBP minor-unit string used by cap contracts. */\nexport type GbpMinorUnitString = string & {\n readonly [gbpMinorUnitStringBrand]: \"GbpMinorUnitString\";\n};\n\nconst MAX_SIGNED_BIGINT = 2n ** 63n - 1n;\nconst CANONICAL_NON_NEGATIVE_INTEGER = /^(?:0|[1-9][0-9]*)$/u;\n\n/** Parses exact GBP minor units without floating point or coercion. */\nexport function parseGbpMinorUnits(value: string): bigint {\n economyAssert(\n typeof value === \"string\" && CANONICAL_NON_NEGATIVE_INTEGER.test(value),\n \"INVALID_AMOUNT\",\n \"GBP minor units must be a canonical non-negative integer string\",\n );\n try {\n const amount = BigInt(value);\n economyAssert(\n amount <= MAX_SIGNED_BIGINT,\n \"AMOUNT_OUT_OF_RANGE\",\n \"GBP minor units are outside the signed 64-bit range\",\n );\n return amount;\n } catch (error) {\n if (error instanceof EconomyError) {\n throw error;\n }\n throw new EconomyError(\"INVALID_AMOUNT\", \"GBP minor units are invalid\");\n }\n}\n\n/** Serializes exact GBP minor units using the canonical wire representation. */\nexport function serializeGbpMinorUnits(amount: bigint): GbpMinorUnitString {\n economyAssert(\n amount >= 0n && amount <= MAX_SIGNED_BIGINT,\n \"AMOUNT_OUT_OF_RANGE\",\n \"GBP minor units are outside the signed 64-bit range\",\n );\n return amount.toString(10) as GbpMinorUnitString;\n}\n\nexport type PurchaseCapScopeTypeV1 = \"payer\" | \"household\";\nexport type PurchaseCapReservationStatusV1 =\n | \"reserved\"\n | \"settled\"\n | \"released\"\n | \"expired\";\nexport type PurchaseCapReservationTransitionTypeV1 =\n | \"settle\"\n | \"release\"\n | \"expire\";\n\nexport interface PurchaseCapReservationTransitionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transitionId: string;\n readonly reservationId: string;\n readonly transitionType: PurchaseCapReservationTransitionTypeV1;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Append-only cap evidence; effectiveness is rebuilt from occurrence order. */\nexport interface PurchaseCapReservationTransitionReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transition: PurchaseCapReservationTransitionV1;\n}\n\n/** One purchase amount mirrored into payer and household cap aggregates. */\nexport interface PurchaseCapReservationV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly reservationId: string;\n readonly payerAccountId: AccountId;\n readonly householdId: HouseholdId;\n readonly priceMinorUnits: GbpMinorUnitString;\n readonly status: PurchaseCapReservationStatusV1;\n readonly reservedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n /** Derived winning transition; every delivery remains in `transitionReceipts`. */\n readonly finalTransitionId?: string;\n readonly finalizedAt?: IsoTimestamp;\n readonly transitionReceipts: readonly PurchaseCapReservationTransitionReceiptV1[];\n}\n\n/** Optimistic aggregate for exactly one payer or household rolling ceiling. */\nexport interface RollingPurchaseCapStateV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly scopeType: PurchaseCapScopeTypeV1;\n readonly scopeId: string;\n readonly version: number;\n readonly reservations: readonly PurchaseCapReservationV1[];\n}\n\nexport interface ReservePurchaseCapsCommandV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly reservationId: string;\n readonly payerAccountId: AccountId;\n readonly householdId: HouseholdId;\n readonly priceMinorUnits: GbpMinorUnitString;\n readonly reservedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n readonly expectedPayerVersion: number;\n readonly expectedHouseholdVersion: number;\n}\n\nexport interface PurchaseCapMutationResultV1 {\n readonly payerState: RollingPurchaseCapStateV1;\n readonly householdState: RollingPurchaseCapStateV1;\n readonly reservation: PurchaseCapReservationV1;\n /** True when a reservation or transition receipt was newly recorded. */\n readonly applied: boolean;\n readonly stateChanged: boolean;\n readonly payerUsageMinorUnits: GbpMinorUnitString;\n readonly householdUsageMinorUnits: GbpMinorUnitString;\n}\n\ninterface ReservationBinding {\n readonly schemaVersion: EconomyContractVersion;\n readonly reservationId: string;\n readonly payerAccountId: AccountId;\n readonly householdId: HouseholdId;\n readonly priceMinorUnits: GbpMinorUnitString;\n readonly reservedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n}\n\nconst RESERVATION_STATUSES: readonly PurchaseCapReservationStatusV1[] = [\n \"reserved\",\n \"settled\",\n \"released\",\n \"expired\",\n];\n\nconst TRANSITION_PRECEDENCE: Readonly<\n Record<PurchaseCapReservationTransitionTypeV1, number>\n> = {\n settle: 0,\n release: 1,\n expire: 2,\n};\n\n/** Validates one rolling-cap transition envelope. */\nexport function assertPurchaseCapReservationTransition(\n transition: PurchaseCapReservationTransitionV1,\n): void {\n economyAssert(\n transition.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-cap transition contract version\",\n );\n assertEconomyIdentifier(transition.transitionId, \"transitionId\");\n assertEconomyIdentifier(transition.reservationId, \"reservationId\");\n economyAssert(\n [\"settle\", \"release\", \"expire\"].includes(transition.transitionType),\n \"INVALID_CONTRACT\",\n \"Purchase-cap transition type is unsupported\",\n );\n parseIsoTimestamp(transition.occurredAt);\n}\n\nfunction sameTransition(\n left: PurchaseCapReservationTransitionV1,\n right: PurchaseCapReservationTransitionV1,\n): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.transitionId === right.transitionId &&\n left.reservationId === right.reservationId &&\n left.transitionType === right.transitionType &&\n left.occurredAt === right.occurredAt\n );\n}\n\nfunction compareTransitions(\n left: PurchaseCapReservationTransitionV1,\n right: PurchaseCapReservationTransitionV1,\n): number {\n const timeDifference =\n parseIsoTimestamp(left.occurredAt) - parseIsoTimestamp(right.occurredAt);\n if (timeDifference !== 0) {\n return timeDifference;\n }\n const precedenceDifference =\n TRANSITION_PRECEDENCE[left.transitionType] -\n TRANSITION_PRECEDENCE[right.transitionType];\n return precedenceDifference === 0\n ? compareUnicodeCodeUnits(left.transitionId, right.transitionId)\n : precedenceDifference;\n}\n\nfunction assertBinding(binding: ReservationBinding): void {\n economyAssert(\n binding.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-cap reservation contract version\",\n );\n assertEconomyIdentifier(binding.reservationId, \"reservationId\");\n assertEconomyIdentifier(binding.payerAccountId, \"payerAccountId\");\n assertEconomyIdentifier(binding.householdId, \"householdId\");\n economyAssert(\n parseGbpMinorUnits(binding.priceMinorUnits) > 0n,\n \"INVALID_AMOUNT\",\n \"Purchase-cap reservation amount must be positive\",\n );\n economyAssert(\n parseIsoTimestamp(binding.expiresAt) >\n parseIsoTimestamp(binding.reservedAt),\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap reservation expiry must follow its creation\",\n );\n}\n\nfunction bindingFromReservation(\n reservation: PurchaseCapReservationV1,\n): ReservationBinding {\n return {\n schemaVersion: reservation.schemaVersion,\n reservationId: reservation.reservationId,\n payerAccountId: reservation.payerAccountId,\n householdId: reservation.householdId,\n priceMinorUnits: reservation.priceMinorUnits,\n reservedAt: reservation.reservedAt,\n expiresAt: reservation.expiresAt,\n };\n}\n\nfunction projectReservation(\n binding: ReservationBinding,\n receipts: readonly PurchaseCapReservationTransitionReceiptV1[],\n): PurchaseCapReservationV1 {\n assertBinding(binding);\n const reservedAt = parseIsoTimestamp(binding.reservedAt);\n const expiresAt = parseIsoTimestamp(binding.expiresAt);\n const transitionIds = new Set<string>();\n for (const receipt of receipts) {\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-cap transition receipt version\",\n );\n assertPurchaseCapReservationTransition(receipt.transition);\n economyAssert(\n receipt.transition.reservationId === binding.reservationId &&\n !transitionIds.has(receipt.transition.transitionId),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap receipts must be unique and belong to the reservation\",\n );\n transitionIds.add(receipt.transition.transitionId);\n }\n\n let status: PurchaseCapReservationStatusV1 = \"reserved\";\n let finalTransitionId: string | undefined;\n let finalizedAt: IsoTimestamp | undefined;\n for (const receipt of [...receipts].sort((left, right) =>\n compareTransitions(left.transition, right.transition),\n )) {\n const transition = receipt.transition;\n const occurredAt = parseIsoTimestamp(transition.occurredAt);\n economyAssert(\n occurredAt >= reservedAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap transition cannot precede reservation\",\n );\n if (transition.transitionType === \"settle\") {\n economyAssert(\n occurredAt < expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap settlement must use payment time before expiry\",\n );\n } else if (transition.transitionType === \"release\") {\n economyAssert(\n occurredAt < expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap release must precede reservation expiry\",\n );\n } else {\n economyAssert(\n occurredAt >= expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-cap reservation cannot expire before its deadline\",\n );\n }\n if (status === \"reserved\") {\n status =\n transition.transitionType === \"settle\"\n ? \"settled\"\n : transition.transitionType === \"release\"\n ? \"released\"\n : \"expired\";\n finalTransitionId = transition.transitionId;\n finalizedAt = transition.occurredAt;\n }\n }\n\n return {\n ...binding,\n status,\n ...(finalTransitionId === undefined\n ? {}\n : { finalTransitionId, finalizedAt: finalizedAt! }),\n transitionReceipts: receipts,\n };\n}\n\nfunction sameReservationFacts(\n left: PurchaseCapReservationV1,\n right: PurchaseCapReservationV1,\n): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.reservationId === right.reservationId &&\n left.payerAccountId === right.payerAccountId &&\n left.householdId === right.householdId &&\n left.priceMinorUnits === right.priceMinorUnits &&\n left.status === right.status &&\n left.reservedAt === right.reservedAt &&\n left.expiresAt === right.expiresAt &&\n left.finalTransitionId === right.finalTransitionId &&\n left.finalizedAt === right.finalizedAt &&\n left.transitionReceipts.length === right.transitionReceipts.length &&\n left.transitionReceipts.every((receipt, index) => {\n const other = right.transitionReceipts[index];\n return (\n other !== undefined &&\n receipt.schemaVersion === other.schemaVersion &&\n sameTransition(receipt.transition, other.transition)\n );\n })\n );\n}\n\nfunction sameReservationBinding(\n reservation: PurchaseCapReservationV1,\n proposed: PurchaseCapReservationV1,\n): boolean {\n return (\n reservation.schemaVersion === proposed.schemaVersion &&\n reservation.reservationId === proposed.reservationId &&\n reservation.payerAccountId === proposed.payerAccountId &&\n reservation.householdId === proposed.householdId &&\n reservation.priceMinorUnits === proposed.priceMinorUnits &&\n reservation.reservedAt === proposed.reservedAt &&\n reservation.expiresAt === proposed.expiresAt\n );\n}\n\n/** Validates one mirrored rolling-cap reservation and its complete rebuild. */\nexport function assertPurchaseCapReservation(\n reservation: PurchaseCapReservationV1,\n): void {\n economyAssert(\n RESERVATION_STATUSES.includes(reservation.status),\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation status is unsupported\",\n );\n const projected = projectReservation(\n bindingFromReservation(reservation),\n reservation.transitionReceipts,\n );\n economyAssert(\n sameReservationFacts(projected, reservation),\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation does not match its immutable event rebuild\",\n );\n}\n\n/** Validates one payer or household rolling-cap aggregate. */\nexport function assertRollingPurchaseCapState(\n state: RollingPurchaseCapStateV1,\n): void {\n economyAssert(\n state.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported rolling purchase-cap contract version\",\n );\n economyAssert(\n state.scopeType === \"payer\" || state.scopeType === \"household\",\n \"INVALID_CONTRACT\",\n \"Purchase-cap scope type is unsupported\",\n );\n assertEconomyIdentifier(state.scopeId, \"scopeId\");\n const reservationIds = new Set<string>();\n const transitionIds = new Set<string>();\n let receiptCount = 0;\n for (const reservation of state.reservations) {\n assertPurchaseCapReservation(reservation);\n economyAssert(\n !reservationIds.has(reservation.reservationId),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap state cannot repeat a reservation\",\n );\n reservationIds.add(reservation.reservationId);\n economyAssert(\n state.scopeType === \"payer\"\n ? reservation.payerAccountId === state.scopeId\n : reservation.householdId === state.scopeId,\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation belongs to another aggregate scope\",\n );\n for (const receipt of reservation.transitionReceipts) {\n economyAssert(\n !transitionIds.has(receipt.transition.transitionId),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap state cannot repeat a transition ID\",\n );\n transitionIds.add(receipt.transition.transitionId);\n receiptCount += 1;\n }\n }\n economyAssert(\n Number.isSafeInteger(state.version) &&\n state.version === 1 + state.reservations.length + receiptCount,\n \"INVALID_CONTRACT\",\n \"Purchase-cap state version must match reservation and receipt counts\",\n );\n}\n\nfunction assertAggregatePair(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n payerAccountId: AccountId,\n householdId: HouseholdId,\n): void {\n assertRollingPurchaseCapState(payerState);\n assertRollingPurchaseCapState(householdState);\n economyAssert(\n payerState.scopeType === \"payer\" &&\n payerState.scopeId === payerAccountId &&\n householdState.scopeType === \"household\" &&\n householdState.scopeId === householdId,\n \"INVALID_CONTRACT\",\n \"Purchase-cap aggregate pair does not match payer and household\",\n );\n}\n\nfunction findMirroredReservation(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n reservationId: string,\n): PurchaseCapReservationV1 | undefined {\n const payerReservation = payerState.reservations.find(\n (reservation) => reservation.reservationId === reservationId,\n );\n const householdReservation = householdState.reservations.find(\n (reservation) => reservation.reservationId === reservationId,\n );\n economyAssert(\n (payerReservation === undefined) === (householdReservation === undefined),\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation must exist in both aggregate scopes atomically\",\n );\n if (payerReservation === undefined || householdReservation === undefined) {\n return undefined;\n }\n economyAssert(\n sameReservationFacts(payerReservation, householdReservation),\n \"INVALID_CONTRACT\",\n \"Payer and household purchase-cap reservations have diverged\",\n );\n return payerReservation;\n}\n\nfunction windowStart(checkedAt: number, rollingDays: number): number {\n return checkedAt - rollingDays * 24 * 60 * 60 * 1_000;\n}\n\n/** Returns the exact cap usage at one point in time. */\nexport function calculateRollingPurchaseCapUsage(\n state: RollingPurchaseCapStateV1,\n checkedAt: IsoTimestamp,\n policy: PurchaseLimitPolicyV1,\n): GbpMinorUnitString {\n assertRollingPurchaseCapState(state);\n assertPurchaseLimitPolicy(policy);\n const checkedAtValue = parseIsoTimestamp(checkedAt);\n const start = windowStart(checkedAtValue, policy.rollingDays);\n let total = 0n;\n for (const reservation of state.reservations) {\n if (\n reservation.status === \"reserved\" &&\n parseIsoTimestamp(reservation.reservedAt) <= checkedAtValue &&\n checkedAtValue < parseIsoTimestamp(reservation.expiresAt)\n ) {\n total += parseGbpMinorUnits(reservation.priceMinorUnits);\n } else if (\n reservation.status === \"settled\" &&\n reservation.finalizedAt !== undefined\n ) {\n const settledAt = parseIsoTimestamp(reservation.finalizedAt);\n if (settledAt >= start && settledAt <= checkedAtValue) {\n total += parseGbpMinorUnits(reservation.priceMinorUnits);\n }\n }\n economyAssert(\n total <= MAX_SIGNED_BIGINT,\n \"AMOUNT_OUT_OF_RANGE\",\n \"Rolling purchase-cap usage exceeds signed 64-bit range\",\n );\n }\n return serializeGbpMinorUnits(total);\n}\n\n/** Creates an empty compare-and-swap aggregate for one cap scope. */\nexport function createRollingPurchaseCapState(\n scopeType: PurchaseCapScopeTypeV1,\n scopeId: string,\n): RollingPurchaseCapStateV1 {\n economyAssert(\n scopeType === \"payer\" || scopeType === \"household\",\n \"INVALID_CONTRACT\",\n \"Purchase-cap scope type is unsupported\",\n );\n assertEconomyIdentifier(scopeId, \"scopeId\");\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n scopeType,\n scopeId,\n version: 1,\n reservations: [],\n };\n}\n\nfunction sortedWithReservation(\n state: RollingPurchaseCapStateV1,\n reservation: PurchaseCapReservationV1,\n): readonly PurchaseCapReservationV1[] {\n return [...state.reservations, reservation].sort((left, right) =>\n compareUnicodeCodeUnits(left.reservationId, right.reservationId),\n );\n}\n\nfunction resultWithUsage(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n reservation: PurchaseCapReservationV1,\n applied: boolean,\n stateChanged: boolean,\n checkedAt: IsoTimestamp,\n policy: PurchaseLimitPolicyV1,\n): PurchaseCapMutationResultV1 {\n return {\n payerState,\n householdState,\n reservation,\n applied,\n stateChanged,\n payerUsageMinorUnits: calculateRollingPurchaseCapUsage(\n payerState,\n checkedAt,\n policy,\n ),\n householdUsageMinorUnits: calculateRollingPurchaseCapUsage(\n householdState,\n checkedAt,\n policy,\n ),\n };\n}\n\n/**\n * Atomically reserves the same amount in payer and household aggregates.\n * Adapters must compare-and-swap both returned versions in one transaction.\n */\nexport function reserveRollingPurchaseCaps(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n command: ReservePurchaseCapsCommandV1,\n policy: PurchaseLimitPolicyV1,\n): PurchaseCapMutationResultV1 {\n economyAssert(\n command.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-cap reservation command version\",\n );\n const binding: ReservationBinding = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n reservationId: command.reservationId,\n payerAccountId: command.payerAccountId,\n householdId: command.householdId,\n priceMinorUnits: command.priceMinorUnits,\n reservedAt: command.reservedAt,\n expiresAt: command.expiresAt,\n };\n assertBinding(binding);\n assertAggregatePair(\n payerState,\n householdState,\n command.payerAccountId,\n command.householdId,\n );\n assertPurchaseLimitPolicy(policy);\n const proposed = projectReservation(binding, []);\n const replay = findMirroredReservation(\n payerState,\n householdState,\n command.reservationId,\n );\n if (replay !== undefined) {\n economyAssert(\n sameReservationBinding(replay, proposed),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap reservation ID was reused with different facts\",\n );\n return resultWithUsage(\n payerState,\n householdState,\n replay,\n false,\n false,\n replay.finalizedAt ?? command.reservedAt,\n policy,\n );\n }\n\n economyAssert(\n command.expectedPayerVersion === payerState.version &&\n command.expectedHouseholdVersion === householdState.version,\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation has a stale aggregate version\",\n );\n const amount = parseGbpMinorUnits(command.priceMinorUnits);\n economyAssert(\n amount <= parseGbpMinorUnits(policy.maxOrderPriceMinorUnits),\n \"INSUFFICIENT_BALANCE\",\n \"Purchase amount exceeds the per-order ceiling\",\n );\n const payerUsage = parseGbpMinorUnits(\n calculateRollingPurchaseCapUsage(payerState, command.reservedAt, policy),\n );\n const householdUsage = parseGbpMinorUnits(\n calculateRollingPurchaseCapUsage(\n householdState,\n command.reservedAt,\n policy,\n ),\n );\n economyAssert(\n payerUsage + amount <=\n parseGbpMinorUnits(policy.rollingPayerPriceMinorUnits),\n \"INSUFFICIENT_BALANCE\",\n \"Purchase amount exceeds the rolling payer ceiling\",\n );\n economyAssert(\n householdUsage + amount <=\n parseGbpMinorUnits(policy.rollingHouseholdPriceMinorUnits),\n \"INSUFFICIENT_BALANCE\",\n \"Purchase amount exceeds the rolling household ceiling\",\n );\n\n const nextPayer: RollingPurchaseCapStateV1 = {\n ...payerState,\n version: payerState.version + 1,\n reservations: sortedWithReservation(payerState, proposed),\n };\n const nextHousehold: RollingPurchaseCapStateV1 = {\n ...householdState,\n version: householdState.version + 1,\n reservations: sortedWithReservation(householdState, proposed),\n };\n return resultWithUsage(\n nextPayer,\n nextHousehold,\n proposed,\n true,\n true,\n command.reservedAt,\n policy,\n );\n}\n\nfunction replaceReservation(\n state: RollingPurchaseCapStateV1,\n replacement: PurchaseCapReservationV1,\n): RollingPurchaseCapStateV1 {\n return {\n ...state,\n version: state.version + 1,\n reservations: state.reservations.map((reservation) =>\n reservation.reservationId === replacement.reservationId\n ? replacement\n : reservation,\n ),\n };\n}\n\nfunction findTransitionById(\n state: RollingPurchaseCapStateV1,\n transitionId: string,\n): {\n readonly reservationId: string;\n readonly transition: PurchaseCapReservationTransitionV1;\n} | undefined {\n for (const reservation of state.reservations) {\n const receipt = reservation.transitionReceipts.find(\n (candidate) => candidate.transition.transitionId === transitionId,\n );\n if (receipt !== undefined) {\n return { reservationId: reservation.reservationId, transition: receipt.transition };\n }\n }\n return undefined;\n}\n\n/**\n * Appends a settle/release/expiry receipt and rebuilds authoritative order. A\n * late-delivered pre-expiry settlement corrects a stored expiry while retaining\n * both receipts. Payer and household versions still advance atomically.\n */\nexport function transitionRollingPurchaseCapReservation(\n payerState: RollingPurchaseCapStateV1,\n householdState: RollingPurchaseCapStateV1,\n transition: PurchaseCapReservationTransitionV1,\n expectedPayerVersion: number,\n expectedHouseholdVersion: number,\n policy: PurchaseLimitPolicyV1,\n): PurchaseCapMutationResultV1 {\n assertPurchaseCapReservationTransition(transition);\n assertRollingPurchaseCapState(payerState);\n assertRollingPurchaseCapState(householdState);\n const current = findMirroredReservation(\n payerState,\n householdState,\n transition.reservationId,\n );\n economyAssert(\n current !== undefined,\n \"INVALID_CONTRACT\",\n \"Purchase-cap reservation does not exist in both aggregate scopes\",\n );\n assertAggregatePair(\n payerState,\n householdState,\n current.payerAccountId,\n current.householdId,\n );\n assertPurchaseLimitPolicy(policy);\n\n const payerExisting = findTransitionById(\n payerState,\n transition.transitionId,\n );\n const householdExisting = findTransitionById(\n householdState,\n transition.transitionId,\n );\n economyAssert(\n (payerExisting === undefined) === (householdExisting === undefined),\n \"INVALID_CONTRACT\",\n \"Purchase-cap transition must exist in both scopes atomically\",\n );\n if (payerExisting !== undefined && householdExisting !== undefined) {\n economyAssert(\n payerExisting.reservationId === transition.reservationId &&\n householdExisting.reservationId === transition.reservationId &&\n sameTransition(payerExisting.transition, transition) &&\n sameTransition(householdExisting.transition, transition),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-cap transition ID was reused with different facts\",\n );\n return resultWithUsage(\n payerState,\n householdState,\n current,\n false,\n false,\n transition.occurredAt,\n policy,\n );\n }\n economyAssert(\n expectedPayerVersion === payerState.version &&\n expectedHouseholdVersion === householdState.version,\n \"INVALID_CONTRACT\",\n \"Purchase-cap transition has a stale aggregate version\",\n );\n\n const replacement = projectReservation(bindingFromReservation(current), [\n ...current.transitionReceipts,\n { schemaVersion: ECONOMY_CONTRACT_VERSION, transition },\n ]);\n const stateChanged =\n replacement.status !== current.status ||\n replacement.finalTransitionId !== current.finalTransitionId ||\n replacement.finalizedAt !== current.finalizedAt;\n const nextPayer = replaceReservation(payerState, replacement);\n const nextHousehold = replaceReservation(householdState, replacement);\n return resultWithUsage(\n nextPayer,\n nextHousehold,\n replacement,\n true,\n stateChanged,\n transition.occurredAt,\n policy,\n );\n}\n","import type { PurchaseIntentV1, TokenPackV1 } from \"./acquisition.js\";\nimport { assertPurchaseIntentBinding } from \"./acquisition.js\";\nimport { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type PurchaseIntentTransitionTypeV1 =\n | \"checkout-bound\"\n | \"payment-observed\"\n | \"credit-recorded\"\n | \"expire\"\n | \"cancel\"\n | \"dispute-opened\"\n | \"dispute-won\"\n | \"dispute-lost\";\n\nexport type PurchaseIntentDisputeDispositionV1 =\n | \"none\"\n | \"open\"\n | \"won\"\n | \"lost\";\n\n/** Provider-neutral evidence for one requested purchase-intent transition. */\nexport interface PurchaseIntentTransitionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transitionId: string;\n readonly intentId: string;\n readonly transitionType: PurchaseIntentTransitionTypeV1;\n readonly occurredAt: IsoTimestamp;\n /** Sanitized binding; raw provider checkout references are adapter concerns. */\n readonly providerCheckoutReferenceHash?: string;\n}\n\n/** Append-only receipt. Whether it is effective is a rebuildable projection. */\nexport interface PurchaseIntentTransitionReceiptV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly transition: PurchaseIntentTransitionV1;\n}\n\n/**\n * Versioned lifecycle projection. `initialIntent` never changes; every delivery\n * is rebuilt from its append-only receipts in authoritative occurrence order.\n */\nexport interface PurchaseIntentLifecycleV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly initialIntent: PurchaseIntentV1;\n readonly intent: PurchaseIntentV1;\n readonly version: number;\n readonly creditRecorded: boolean;\n readonly disputeDisposition: PurchaseIntentDisputeDispositionV1;\n readonly receipts: readonly PurchaseIntentTransitionReceiptV1[];\n readonly effectiveTransitionIds: readonly string[];\n}\n\n/** Stable instruction identity for the one permitted purchase credit. */\nexport interface PurchaseCreditInstructionV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly intentId: string;\n readonly transitionId: string;\n readonly idempotencyKey: string;\n}\n\nexport interface PurchaseIntentTransitionResultV1 {\n readonly lifecycle: PurchaseIntentLifecycleV1;\n /** False only for an exact transition-ID replay already in `receipts`. */\n readonly recorded: boolean;\n readonly stateChanged: boolean;\n readonly creditInstruction?: PurchaseCreditInstructionV1;\n}\n\nexport interface PurchaseIntentReductionV1 {\n readonly lifecycle: PurchaseIntentLifecycleV1;\n readonly creditInstructions: readonly PurchaseCreditInstructionV1[];\n}\n\ninterface PurchaseIntentProjection {\n readonly intent: PurchaseIntentV1;\n readonly disputeDisposition: PurchaseIntentDisputeDispositionV1;\n readonly effectiveTransitionIds: readonly string[];\n readonly creditTransitionId?: string;\n}\n\nconst TRANSITION_TYPES: readonly PurchaseIntentTransitionTypeV1[] = [\n \"checkout-bound\",\n \"payment-observed\",\n \"credit-recorded\",\n \"expire\",\n \"cancel\",\n \"dispute-opened\",\n \"dispute-won\",\n \"dispute-lost\",\n];\n\nconst TRANSITION_PRECEDENCE: Readonly<\n Record<PurchaseIntentTransitionTypeV1, number>\n> = {\n \"checkout-bound\": 0,\n \"payment-observed\": 1,\n \"credit-recorded\": 2,\n \"dispute-opened\": 3,\n \"dispute-won\": 4,\n \"dispute-lost\": 4,\n cancel: 5,\n expire: 6,\n};\n\nfunction assertCheckoutHash(value: string): void {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(value),\n \"INVALID_CONTRACT\",\n \"Checkout references must be stored as sanitized SHA-256 hashes\",\n );\n}\n\n/** Validates one provider-neutral purchase-intent transition envelope. */\nexport function assertPurchaseIntentTransition(\n transition: PurchaseIntentTransitionV1,\n): void {\n economyAssert(\n transition.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-intent transition contract version\",\n );\n assertEconomyIdentifier(transition.transitionId, \"transitionId\");\n assertEconomyIdentifier(transition.intentId, \"intentId\");\n economyAssert(\n TRANSITION_TYPES.includes(transition.transitionType),\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition type is unsupported\",\n );\n parseIsoTimestamp(transition.occurredAt);\n if (transition.providerCheckoutReferenceHash !== undefined) {\n assertCheckoutHash(transition.providerCheckoutReferenceHash);\n }\n const requiresCheckoutHash =\n transition.transitionType === \"checkout-bound\" ||\n transition.transitionType === \"payment-observed\";\n economyAssert(\n requiresCheckoutHash ===\n (transition.providerCheckoutReferenceHash !== undefined),\n \"INVALID_CONTRACT\",\n \"Only checkout and payment transitions must carry a checkout binding\",\n );\n}\n\nfunction sameTransition(\n left: PurchaseIntentTransitionV1,\n right: PurchaseIntentTransitionV1,\n): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.transitionId === right.transitionId &&\n left.intentId === right.intentId &&\n left.transitionType === right.transitionType &&\n left.occurredAt === right.occurredAt &&\n left.providerCheckoutReferenceHash ===\n right.providerCheckoutReferenceHash\n );\n}\n\nfunction sameIntent(left: PurchaseIntentV1, right: PurchaseIntentV1): boolean {\n return (\n left.schemaVersion === right.schemaVersion &&\n left.intentId === right.intentId &&\n left.payerAccountId === right.payerAccountId &&\n left.receivingHouseholdId === right.receivingHouseholdId &&\n left.receivingWalletId === right.receivingWalletId &&\n left.packId === right.packId &&\n left.catalogVersion === right.catalogVersion &&\n left.expectedCurrency === right.expectedCurrency &&\n left.expectedPriceMinorUnits === right.expectedPriceMinorUnits &&\n left.grantAmount === right.grantAmount &&\n left.status === right.status &&\n left.createdAt === right.createdAt &&\n left.expiresAt === right.expiresAt &&\n left.providerCheckoutReferenceHash ===\n right.providerCheckoutReferenceHash\n );\n}\n\nfunction compareTransitions(\n left: PurchaseIntentTransitionV1,\n right: PurchaseIntentTransitionV1,\n): number {\n const timeDifference =\n parseIsoTimestamp(left.occurredAt) - parseIsoTimestamp(right.occurredAt);\n if (timeDifference !== 0) {\n return timeDifference;\n }\n const precedenceDifference =\n TRANSITION_PRECEDENCE[left.transitionType] -\n TRANSITION_PRECEDENCE[right.transitionType];\n return precedenceDifference === 0\n ? compareUnicodeCodeUnits(left.transitionId, right.transitionId)\n : precedenceDifference;\n}\n\nfunction assertMatchingCheckoutBinding(\n intent: PurchaseIntentV1,\n checkoutHash: string,\n): void {\n economyAssert(\n intent.providerCheckoutReferenceHash === undefined ||\n intent.providerCheckoutReferenceHash === checkoutHash,\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition conflicts with its checkout binding\",\n );\n}\n\nfunction projectPurchaseIntent(\n initialIntent: PurchaseIntentV1,\n transitions: readonly PurchaseIntentTransitionV1[],\n pack: TokenPackV1,\n): PurchaseIntentProjection {\n assertPurchaseIntentBinding(initialIntent, pack);\n economyAssert(\n initialIntent.status === \"created\" &&\n initialIntent.providerCheckoutReferenceHash === undefined,\n \"INVALID_CONTRACT\",\n \"Purchase-intent lifecycle requires immutable created intent facts\",\n );\n const createdAt = parseIsoTimestamp(initialIntent.createdAt);\n const expiresAt = parseIsoTimestamp(initialIntent.expiresAt);\n let intent = initialIntent;\n let disputeDisposition: PurchaseIntentDisputeDispositionV1 = \"none\";\n let creditTransitionId: string | undefined;\n const effectiveTransitionIds: string[] = [];\n\n for (const transition of [...transitions].sort(compareTransitions)) {\n assertPurchaseIntentTransition(transition);\n economyAssert(\n transition.intentId === initialIntent.intentId,\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition belongs to another intent\",\n );\n const eventTime = parseIsoTimestamp(transition.occurredAt);\n economyAssert(\n eventTime >= createdAt,\n \"INVALID_TIME_WINDOW\",\n \"Purchase-intent transition cannot precede intent creation\",\n );\n let effective = false;\n\n if (transition.transitionType === \"checkout-bound\") {\n const checkoutHash = transition.providerCheckoutReferenceHash!;\n assertMatchingCheckoutBinding(intent, checkoutHash);\n if (intent.status === \"created\") {\n economyAssert(\n eventTime < expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Checkout cannot be bound after purchase-intent expiry\",\n );\n intent = {\n ...intent,\n status: \"checkout-created\",\n providerCheckoutReferenceHash: checkoutHash,\n };\n effective = true;\n } else {\n economyAssert(\n ![\"expired\", \"cancelled\"].includes(intent.status),\n \"INVALID_CONTRACT\",\n \"A terminal purchase intent cannot bind a checkout\",\n );\n }\n } else if (transition.transitionType === \"payment-observed\") {\n const checkoutHash = transition.providerCheckoutReferenceHash!;\n assertMatchingCheckoutBinding(intent, checkoutHash);\n economyAssert(\n eventTime < expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Authoritative payment time must precede purchase-intent expiry\",\n );\n if (intent.status === \"created\") {\n intent = {\n ...intent,\n status: \"paid-unreconciled\",\n providerCheckoutReferenceHash: checkoutHash,\n };\n effective = true;\n } else if (intent.status === \"checkout-created\") {\n intent = { ...intent, status: \"paid-unreconciled\" };\n effective = true;\n } else {\n economyAssert(\n ![\"expired\", \"cancelled\"].includes(intent.status),\n \"INVALID_CONTRACT\",\n \"A terminal purchase intent cannot observe payment\",\n );\n }\n } else if (transition.transitionType === \"credit-recorded\") {\n if (intent.status === \"paid-unreconciled\") {\n intent = { ...intent, status: \"credited\" };\n disputeDisposition = \"none\";\n creditTransitionId = transition.transitionId;\n effective = true;\n } else {\n economyAssert(\n intent.status === \"credited\" || intent.status === \"disputed\",\n \"INVALID_CONTRACT\",\n \"Purchase intent cannot be credited before authoritative payment\",\n );\n }\n } else if (transition.transitionType === \"dispute-opened\") {\n if (intent.status === \"credited\" && disputeDisposition === \"none\") {\n intent = { ...intent, status: \"disputed\" };\n disputeDisposition = \"open\";\n effective = true;\n } else {\n economyAssert(\n intent.status === \"disputed\" && disputeDisposition === \"open\",\n \"INVALID_CONTRACT\",\n \"Dispute can open only once after purchase credit\",\n );\n }\n } else if (transition.transitionType === \"dispute-won\") {\n if (intent.status === \"disputed\" && disputeDisposition === \"open\") {\n intent = { ...intent, status: \"credited\" };\n disputeDisposition = \"won\";\n effective = true;\n } else {\n economyAssert(\n intent.status === \"credited\" && disputeDisposition === \"won\",\n \"INVALID_CONTRACT\",\n \"Dispute-win transition requires one open dispute\",\n );\n }\n } else if (transition.transitionType === \"dispute-lost\") {\n if (intent.status === \"disputed\" && disputeDisposition === \"open\") {\n disputeDisposition = \"lost\";\n effective = true;\n } else {\n economyAssert(\n intent.status === \"disputed\" && disputeDisposition === \"lost\",\n \"INVALID_CONTRACT\",\n \"Dispute-loss transition requires one open dispute\",\n );\n }\n } else if (transition.transitionType === \"cancel\") {\n if (intent.status === \"created\" || intent.status === \"checkout-created\") {\n intent = { ...intent, status: \"cancelled\" };\n effective = true;\n }\n } else {\n economyAssert(\n eventTime >= expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Expiry transition cannot precede purchase-intent expiry\",\n );\n if (intent.status === \"created\" || intent.status === \"checkout-created\") {\n intent = { ...intent, status: \"expired\" };\n effective = true;\n }\n }\n\n if (effective) {\n effectiveTransitionIds.push(transition.transitionId);\n }\n }\n\n return {\n intent,\n disputeDisposition,\n effectiveTransitionIds,\n ...(creditTransitionId === undefined ? {} : { creditTransitionId }),\n };\n}\n\n/** Validates and deterministically rebuilds a lifecycle projection. */\nexport function assertPurchaseIntentLifecycle(\n lifecycle: PurchaseIntentLifecycleV1,\n pack: TokenPackV1,\n): void {\n economyAssert(\n lifecycle.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported purchase-intent lifecycle contract version\",\n );\n economyAssert(\n Number.isSafeInteger(lifecycle.version) &&\n lifecycle.version === lifecycle.receipts.length + 1,\n \"INVALID_CONTRACT\",\n \"Purchase-intent lifecycle version must match its receipt count\",\n );\n const transitionIds = new Set<string>();\n for (const receipt of lifecycle.receipts) {\n economyAssert(\n receipt.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Purchase-intent receipt is invalid\",\n );\n assertPurchaseIntentTransition(receipt.transition);\n economyAssert(\n receipt.transition.intentId === lifecycle.initialIntent.intentId &&\n !transitionIds.has(receipt.transition.transitionId),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-intent receipts must be unique and belong to the intent\",\n );\n transitionIds.add(receipt.transition.transitionId);\n }\n const projection = projectPurchaseIntent(\n lifecycle.initialIntent,\n lifecycle.receipts.map((receipt) => receipt.transition),\n pack,\n );\n economyAssert(\n sameIntent(projection.intent, lifecycle.intent) &&\n lifecycle.creditRecorded ===\n (projection.intent.status === \"credited\" ||\n projection.intent.status === \"disputed\") &&\n lifecycle.disputeDisposition === projection.disputeDisposition &&\n lifecycle.effectiveTransitionIds.length ===\n projection.effectiveTransitionIds.length &&\n lifecycle.effectiveTransitionIds.every(\n (transitionId, index) =>\n transitionId === projection.effectiveTransitionIds[index],\n ),\n \"INVALID_CONTRACT\",\n \"Purchase-intent lifecycle does not match its immutable event rebuild\",\n );\n}\n\n/** Creates a lifecycle from immutable, server-created purchase-intent facts. */\nexport function createPurchaseIntentLifecycle(\n initialIntent: PurchaseIntentV1,\n pack: TokenPackV1,\n): PurchaseIntentLifecycleV1 {\n const projection = projectPurchaseIntent(initialIntent, [], pack);\n return {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n initialIntent,\n intent: projection.intent,\n version: 1,\n creditRecorded: false,\n disputeDisposition: projection.disputeDisposition,\n receipts: [],\n effectiveTransitionIds: [],\n };\n}\n\nfunction sameProjection(\n lifecycle: PurchaseIntentLifecycleV1,\n projection: PurchaseIntentProjection,\n): boolean {\n return (\n sameIntent(lifecycle.intent, projection.intent) &&\n lifecycle.disputeDisposition === projection.disputeDisposition &&\n lifecycle.effectiveTransitionIds.length ===\n projection.effectiveTransitionIds.length &&\n lifecycle.effectiveTransitionIds.every(\n (transitionId, index) =>\n transitionId === projection.effectiveTransitionIds[index],\n )\n );\n}\n\n/**\n * Appends one event and rebuilds all receipts by authoritative occurrence time.\n * A late pre-expiry payment can therefore correct a stored expiry without\n * deleting the expiry receipt. Exact retries succeed before version checking.\n */\nexport function applyPurchaseIntentTransition(\n lifecycle: PurchaseIntentLifecycleV1,\n transition: PurchaseIntentTransitionV1,\n expectedVersion: number,\n pack: TokenPackV1,\n): PurchaseIntentTransitionResultV1 {\n assertPurchaseIntentLifecycle(lifecycle, pack);\n assertPurchaseIntentTransition(transition);\n economyAssert(\n transition.intentId === lifecycle.initialIntent.intentId,\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition belongs to another intent\",\n );\n const replay = lifecycle.receipts.find(\n (receipt) => receipt.transition.transitionId === transition.transitionId,\n );\n if (replay !== undefined) {\n economyAssert(\n sameTransition(replay.transition, transition),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-intent transition ID was reused with different facts\",\n );\n return { lifecycle, recorded: false, stateChanged: false };\n }\n economyAssert(\n expectedVersion === lifecycle.version,\n \"INVALID_CONTRACT\",\n \"Purchase-intent transition has a stale expected version\",\n );\n\n const receipts: readonly PurchaseIntentTransitionReceiptV1[] = [\n ...lifecycle.receipts,\n { schemaVersion: ECONOMY_CONTRACT_VERSION, transition },\n ];\n const projection = projectPurchaseIntent(\n lifecycle.initialIntent,\n receipts.map((receipt) => receipt.transition),\n pack,\n );\n const stateChanged = !sameProjection(lifecycle, projection);\n const nextLifecycle: PurchaseIntentLifecycleV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n initialIntent: lifecycle.initialIntent,\n intent: projection.intent,\n version: lifecycle.version + 1,\n creditRecorded:\n projection.intent.status === \"credited\" ||\n projection.intent.status === \"disputed\",\n disputeDisposition: projection.disputeDisposition,\n receipts,\n effectiveTransitionIds: projection.effectiveTransitionIds,\n };\n assertPurchaseIntentLifecycle(nextLifecycle, pack);\n\n const producesCredit =\n projection.creditTransitionId === transition.transitionId &&\n !lifecycle.creditRecorded &&\n nextLifecycle.creditRecorded;\n const creditInstruction: PurchaseCreditInstructionV1 | undefined =\n producesCredit\n ? {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n intentId: nextLifecycle.intent.intentId,\n transitionId: transition.transitionId,\n idempotencyKey: nextLifecycle.intent.intentId,\n }\n : undefined;\n return {\n lifecycle: nextLifecycle,\n recorded: true,\n stateChanged,\n ...(creditInstruction === undefined ? {} : { creditInstruction }),\n };\n}\n\n/**\n * Reduces an unordered delivery batch in canonical event-time/type/ID order.\n * Exact duplicate IDs collapse; conflicting duplicate facts are rejected.\n */\nexport function reducePurchaseIntentTransitions(\n initialIntent: PurchaseIntentV1,\n transitions: readonly PurchaseIntentTransitionV1[],\n pack: TokenPackV1,\n): PurchaseIntentReductionV1 {\n const unique = new Map<string, PurchaseIntentTransitionV1>();\n for (const transition of transitions) {\n assertPurchaseIntentTransition(transition);\n const existing = unique.get(transition.transitionId);\n if (existing !== undefined) {\n economyAssert(\n sameTransition(existing, transition),\n \"DUPLICATE_IDENTIFIER\",\n \"Purchase-intent transition ID was reused with different facts\",\n );\n } else {\n unique.set(transition.transitionId, transition);\n }\n }\n\n let lifecycle = createPurchaseIntentLifecycle(initialIntent, pack);\n const creditInstructions: PurchaseCreditInstructionV1[] = [];\n for (const transition of [...unique.values()].sort(compareTransitions)) {\n const result = applyPurchaseIntentTransition(\n lifecycle,\n transition,\n lifecycle.version,\n pack,\n );\n lifecycle = result.lifecycle;\n if (result.creditInstruction !== undefined) {\n creditInstructions.push(result.creditInstruction);\n }\n }\n economyAssert(\n creditInstructions.length <= 1,\n \"DUPLICATE_TRANSACTION\",\n \"Purchase-intent reduction produced more than one credit\",\n );\n return { lifecycle, creditInstructions };\n}\n","import {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport {\n isWholeTokenAmount,\n parseTokenSubunits,\n serializeTokenSubunits,\n type TokenSubunitString,\n} from \"./amount.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type RecurrenceInterval = \"daily\" | \"weekly\" | \"monthly\";\n\n/** Provider-neutral subscription contract. Site policy controls enablement. */\nexport interface TokenSubscriptionPlanV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly planId: string;\n readonly catalogVersion: string;\n readonly interval: RecurrenceInterval;\n readonly priceMinorUnits: string;\n readonly currency: \"GBP\";\n readonly grantAmount: TokenSubunitString;\n readonly enabled: boolean;\n readonly effectiveFrom: IsoTimestamp;\n}\n\n/** Future convenience plan contract; disabled until public spend is live. */\nexport const BASELINE_MONTHLY_SUBSCRIPTION_PLAN: TokenSubscriptionPlanV1 =\n Object.freeze({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n planId: \"monthly-10-100-v1\",\n catalogVersion: \"gbp-subscriptions-v1\",\n interval: \"monthly\",\n priceMinorUnits: \"1000\",\n currency: \"GBP\",\n grantAmount: serializeTokenSubunits(100_000n),\n enabled: false,\n effectiveFrom: \"2026-07-15T00:00:00.000Z\",\n });\n\n/** Validates future provider-neutral recurrence without enabling it. */\nexport function assertTokenSubscriptionPlan(\n plan: TokenSubscriptionPlanV1,\n): void {\n economyAssert(\n plan.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported subscription-plan contract version\",\n );\n assertEconomyIdentifier(plan.planId, \"planId\");\n assertEconomyIdentifier(plan.catalogVersion, \"catalogVersion\");\n economyAssert(\n [\"daily\", \"weekly\", \"monthly\"].includes(plan.interval) &&\n plan.currency === \"GBP\" &&\n typeof plan.enabled === \"boolean\",\n \"INVALID_CONTRACT\",\n \"Subscription recurrence, currency, or enabled state is invalid\",\n );\n economyAssert(\n /^(?:0|[1-9][0-9]*)$/u.test(plan.priceMinorUnits) &&\n BigInt(plan.priceMinorUnits) > 0n,\n \"INVALID_AMOUNT\",\n \"Subscription price must be a positive integer minor-unit string\",\n );\n const grantAmount = parseTokenSubunits(plan.grantAmount);\n economyAssert(\n grantAmount > 0n && isWholeTokenAmount(grantAmount),\n \"AMOUNT_NOT_WHOLE_TOKEN\",\n \"Subscription grants must contain whole Tokens\",\n );\n parseIsoTimestamp(plan.effectiveFrom);\n}\n","import { compareUnicodeCodeUnits } from \"./canonical-order.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { ActivityType } from \"./ledger.js\";\nimport { parseTokenSubunits, type TokenSubunitString } from \"./amount.js\";\nimport {\n assertEconomyHmacFingerprint,\n type EconomyCommandResultOutcomeV1,\n type EconomyHmacFingerprintV1,\n} from \"./audit.js\";\nimport {\n assertEconomyIntegrityAnchorManifest,\n canonicalEconomyIntegrityAnchorManifestPayload,\n type EconomyIntegrityAnchorManifestV1,\n} from \"./authority.js\";\nimport type { CanonicalPayloadHashFunctionV1 } from \"./integrity.js\";\n\nexport const ECONOMY_RECOVERY_PROTOCOL_VERSION = \"1\" as const;\nexport type EconomyRecoveryProtocolVersion =\n typeof ECONOMY_RECOVERY_PROTOCOL_VERSION;\n\nexport type EconomyRecoveryRecordKindV1 =\n | \"acceptance\"\n | \"committed-result\";\n\nexport type EconomyRecoveryDirectionV1 = \"credit\" | \"debit\";\n\nexport type EconomyEvidenceSignatureAlgorithmV1 =\n | \"ed25519\"\n | \"ecdsa-p256-sha256\"\n | \"rsa-pss-sha256\";\n\n/** Public, non-secret metadata selected before detached signing. */\nexport interface EconomyEvidenceSignatureMetadataV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly signatureVersion: \"1\";\n readonly algorithm: EconomyEvidenceSignatureAlgorithmV1;\n readonly keyId: string;\n readonly signedAt: IsoTimestamp;\n}\n\n/** Public metadata plus the final detached signature value. */\nexport interface EconomyEvidenceSignatureV1\n extends EconomyEvidenceSignatureMetadataV1 {\n readonly value: string;\n}\n\n/** Deterministic signing request safe to pass to an external key adapter. */\nexport interface EconomyPreparedEvidenceSignatureV1 {\n readonly contentAddressedId: string;\n readonly canonicalPayload: string;\n}\n\n/**\n * Encrypted reconstruction bytes stored outside the live authority.\n *\n * The plaintext must contain only the already-approved, privacy-minimized\n * authority records. Raw provider callbacks, signatures, payment data,\n * idempotency keys, email addresses, and exact birth data are forbidden.\n */\nexport interface EconomySealedRecoveryPayloadV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly payloadVersion: \"1\";\n readonly cipherSuite: \"AES-256-GCM\";\n readonly encoding: \"base64url\";\n readonly keyVersion: string;\n readonly nonce: string;\n readonly ciphertext: string;\n readonly authenticationTag: string;\n readonly plaintextContentHash: string;\n readonly encryptionContextHash: string;\n}\n\n/** Content-addressed body written identically to every evidence region. */\nexport interface EconomyRecoveryAcceptanceBodyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recoveryVersion: EconomyRecoveryProtocolVersion;\n readonly recordType: \"economy-recovery-acceptance\";\n readonly authorityId: string;\n readonly commandId: string;\n readonly correlationId: string;\n readonly idempotencyFingerprint: EconomyHmacFingerprintV1;\n readonly commandEnvelopeHash: string;\n readonly acceptedReceiptId: string;\n readonly acceptedReceiptHash: string;\n readonly sealedPayload: EconomySealedRecoveryPayloadV1;\n readonly preparedAt: IsoTimestamp;\n readonly acceptedAt: IsoTimestamp;\n}\n\n/**\n * Provider-neutral durable acceptance. The ID is SHA-256-addressed from the\n * canonical body and therefore remains identical in all evidence regions.\n */\nexport interface EconomyRecoveryAcceptanceEnvelopeV1\n extends EconomyRecoveryAcceptanceBodyV1 {\n readonly acceptanceEnvelopeId: string;\n}\n\n/** Content-addressed result body written after the authority commit. */\nexport interface EconomyRecoveryCommittedResultBodyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recoveryVersion: EconomyRecoveryProtocolVersion;\n readonly recordType: \"economy-recovery-committed-result\";\n readonly authorityId: string;\n readonly commandId: string;\n readonly correlationId: string;\n readonly acceptanceEnvelopeId: string;\n readonly acceptanceEnvelopeHash: string;\n readonly resultReceiptId: string;\n readonly resultReceiptHash: string;\n readonly outcome: EconomyCommandResultOutcomeV1;\n readonly authorityCommitId: string;\n readonly authorityCommitHash: string;\n readonly authoritySequence: string;\n readonly authorityHeadHashAfter: string;\n readonly transactionId?: TransactionId;\n readonly transactionCanonicalHash?: string;\n readonly sealedPayload: EconomySealedRecoveryPayloadV1;\n readonly committedAt: IsoTimestamp;\n}\n\n/**\n * Immutable reconstruction result for one command. Failed and no-op commands\n * are retained as facts but cannot carry transaction identity or value.\n */\nexport interface EconomyRecoveryCommittedResultV1\n extends EconomyRecoveryCommittedResultBodyV1 {\n readonly committedResultId: string;\n}\n\n/** Region-specific body proving one recovery record was durably retained. */\nexport interface EconomyRegionalEvidenceReceiptBodyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recoveryVersion: EconomyRecoveryProtocolVersion;\n readonly recordType: \"economy-regional-evidence-receipt\";\n readonly journalId: string;\n readonly region: string;\n readonly sequence: string;\n readonly previousReceiptHash?: string;\n readonly authorityId: string;\n readonly commandId: string;\n readonly recoveryRecordKind: EconomyRecoveryRecordKindV1;\n readonly recoveryRecordId: string;\n readonly recoveryRecordContentHash: string;\n readonly storedAt: IsoTimestamp;\n readonly retentionUntil: IsoTimestamp;\n}\n\n/**\n * Signed, content-addressed evidence-region acknowledgement.\n *\n * Its ID addresses the unsigned storage fact. Its detached signature covers\n * that ID, the exact canonical body, and the public signature metadata.\n */\nexport interface EconomyRegionalEvidenceReceiptV1\n extends EconomyRegionalEvidenceReceiptBodyV1 {\n readonly evidenceReceiptId: string;\n readonly signature: EconomyEvidenceSignatureV1;\n}\n\n/** One sibling in a duplicate-last, binary SHA-256 Merkle proof. */\nexport interface EconomyMerkleProofStepV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly side: \"left\" | \"right\";\n readonly hash: string;\n}\n\n/** Portable proof that an authority commit is covered by an hourly anchor. */\nexport interface EconomyMerkleInclusionProofV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly proofVersion: \"1\";\n readonly algorithm: \"duplicate-last-sha256-v1\";\n readonly anchorId: string;\n readonly anchorManifestHash: string;\n readonly leafHash: string;\n readonly leafIndex: string;\n readonly leafCount: string;\n readonly siblings: readonly EconomyMerkleProofStepV1[];\n}\n\n/** Privacy-safe link from a customer receipt to one regional evidence fact. */\nexport interface EconomyPortableEvidenceReferenceV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly region: string;\n readonly evidenceReceiptId: string;\n readonly evidenceReceiptHash: string;\n}\n\n/** Content-addressed customer-facing receipt body. */\nexport interface EconomyPortableCustomerReceiptBodyV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly recoveryVersion: EconomyRecoveryProtocolVersion;\n readonly recordType: \"economy-portable-customer-receipt\";\n readonly authorityId: string;\n readonly commandId: string;\n readonly activityType: ActivityType;\n readonly direction: EconomyRecoveryDirectionV1;\n readonly tokenAmount: TokenSubunitString;\n readonly transactionId: TransactionId;\n readonly transactionCanonicalHash: string;\n readonly resultReceiptId: string;\n readonly resultReceiptHash: string;\n readonly committedResultId: string;\n readonly committedResultContentHash: string;\n readonly authorityCommitId: string;\n readonly authorityCommitHash: string;\n readonly authoritySequence: string;\n readonly regionalEvidence: readonly EconomyPortableEvidenceReferenceV1[];\n readonly merkleInclusionProof?: EconomyMerkleInclusionProofV1;\n readonly tokenTermsVersion: string;\n readonly cashRedemptionAllowed: false;\n readonly committedAt: IsoTimestamp;\n readonly issuedAt: IsoTimestamp;\n}\n\n/**\n * Downloadable signed receipt containing no payer, household, provider,\n * payment, email, session, or exact-age data.\n */\nexport interface EconomyPortableCustomerReceiptV1\n extends EconomyPortableCustomerReceiptBodyV1 {\n readonly portableReceiptId: string;\n readonly signature: EconomyEvidenceSignatureV1;\n}\n\n/** Infrastructure-supplied signature verifier; this package owns no keys. */\nexport interface EconomyEvidenceSignatureVerificationInputV1 {\n readonly algorithm: EconomyEvidenceSignatureAlgorithmV1;\n readonly keyId: string;\n readonly signedAt: IsoTimestamp;\n readonly signature: string;\n readonly canonicalPayload: string;\n}\n\nexport type EconomyEvidenceSignatureVerifierV1 = (\n input: EconomyEvidenceSignatureVerificationInputV1,\n) => boolean;\n\nconst CANONICAL_HASH = /^sha256:[a-f0-9]{64}$/u;\nconst BASE64URL = /^[A-Za-z0-9_-]+$/u;\nconst UNSIGNED_INTEGER = /^(?:0|[1-9][0-9]{0,38})$/u;\nconst SIGNATURE_ALGORITHMS =\n new Set<EconomyEvidenceSignatureAlgorithmV1>([\n \"ed25519\",\n \"ecdsa-p256-sha256\",\n \"rsa-pss-sha256\",\n ]);\nconst RESULT_OUTCOMES = new Set<EconomyCommandResultOutcomeV1>([\n \"completed\",\n \"failed\",\n \"no-op\",\n]);\nconst ACTIVITY_TYPES = new Set<ActivityType>([\n \"purchase\",\n \"subscription\",\n \"rewarded-ad\",\n \"offerwall\",\n \"allocation\",\n \"boost\",\n \"reclaim\",\n \"spend\",\n \"hold\",\n \"refund\",\n \"chargeback\",\n \"adjustment\",\n \"reversal\",\n \"event\",\n \"competition\",\n]);\n\nconst ACCEPTANCE_BODY_KEYS = new Set([\n \"schemaVersion\",\n \"recoveryVersion\",\n \"recordType\",\n \"authorityId\",\n \"commandId\",\n \"correlationId\",\n \"idempotencyFingerprint\",\n \"commandEnvelopeHash\",\n \"acceptedReceiptId\",\n \"acceptedReceiptHash\",\n \"sealedPayload\",\n \"preparedAt\",\n \"acceptedAt\",\n]);\nconst ACCEPTANCE_KEYS = new Set([\n \"acceptanceEnvelopeId\",\n ...ACCEPTANCE_BODY_KEYS,\n]);\nconst COMMITTED_RESULT_BODY_KEYS = new Set([\n \"schemaVersion\",\n \"recoveryVersion\",\n \"recordType\",\n \"authorityId\",\n \"commandId\",\n \"correlationId\",\n \"acceptanceEnvelopeId\",\n \"acceptanceEnvelopeHash\",\n \"resultReceiptId\",\n \"resultReceiptHash\",\n \"outcome\",\n \"authorityCommitId\",\n \"authorityCommitHash\",\n \"authoritySequence\",\n \"authorityHeadHashAfter\",\n \"transactionId\",\n \"transactionCanonicalHash\",\n \"sealedPayload\",\n \"committedAt\",\n]);\nconst COMMITTED_RESULT_KEYS = new Set([\n \"committedResultId\",\n ...COMMITTED_RESULT_BODY_KEYS,\n]);\nconst REGIONAL_BODY_KEYS = new Set([\n \"schemaVersion\",\n \"recoveryVersion\",\n \"recordType\",\n \"journalId\",\n \"region\",\n \"sequence\",\n \"previousReceiptHash\",\n \"authorityId\",\n \"commandId\",\n \"recoveryRecordKind\",\n \"recoveryRecordId\",\n \"recoveryRecordContentHash\",\n \"storedAt\",\n \"retentionUntil\",\n]);\nconst REGIONAL_KEYS = new Set([\n \"evidenceReceiptId\",\n \"signature\",\n ...REGIONAL_BODY_KEYS,\n]);\nconst PORTABLE_BODY_KEYS = new Set([\n \"schemaVersion\",\n \"recoveryVersion\",\n \"recordType\",\n \"authorityId\",\n \"commandId\",\n \"activityType\",\n \"direction\",\n \"tokenAmount\",\n \"transactionId\",\n \"transactionCanonicalHash\",\n \"resultReceiptId\",\n \"resultReceiptHash\",\n \"committedResultId\",\n \"committedResultContentHash\",\n \"authorityCommitId\",\n \"authorityCommitHash\",\n \"authoritySequence\",\n \"regionalEvidence\",\n \"merkleInclusionProof\",\n \"tokenTermsVersion\",\n \"cashRedemptionAllowed\",\n \"committedAt\",\n \"issuedAt\",\n]);\nconst PORTABLE_KEYS = new Set([\n \"portableReceiptId\",\n \"signature\",\n ...PORTABLE_BODY_KEYS,\n]);\n\nfunction assertExactKeys(\n value: object,\n allowedKeys: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowedKeys.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported field`,\n );\n}\n\nfunction assertCanonicalHash(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && CANONICAL_HASH.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical SHA-256 reference`,\n );\n}\n\nfunction canonicalHash(\n payload: string,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n label: string,\n): string {\n const value = hashCanonicalPayload(payload);\n assertCanonicalHash(value, label);\n return value;\n}\n\nfunction assertUnsignedInteger(value: string, label: string): void {\n economyAssert(\n typeof value === \"string\" && UNSIGNED_INTEGER.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be a canonical unsigned integer`,\n );\n}\n\nfunction assertRecoveryVersion(\n schemaVersion: EconomyContractVersion,\n recoveryVersion: EconomyRecoveryProtocolVersion,\n recordType: string,\n expectedRecordType: string,\n label: string,\n): void {\n economyAssert(\n schemaVersion === ECONOMY_CONTRACT_VERSION &&\n recoveryVersion === ECONOMY_RECOVERY_PROTOCOL_VERSION &&\n recordType === expectedRecordType,\n \"INVALID_CONTRACT\",\n `Unsupported ${label} contract version`,\n );\n}\n\nfunction assertBase64url(\n value: string,\n label: string,\n minimumLength: number,\n maximumLength: number,\n): void {\n economyAssert(\n typeof value === \"string\" &&\n value.length >= minimumLength &&\n value.length <= maximumLength &&\n BASE64URL.test(value),\n \"INVALID_CONTRACT\",\n `${label} must be bounded unpadded base64url`,\n );\n}\n\nfunction canonicalFingerprint(\n fingerprint: EconomyHmacFingerprintV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: fingerprint.schemaVersion,\n fingerprintVersion: fingerprint.fingerprintVersion,\n algorithm: fingerprint.algorithm,\n domain: fingerprint.domain,\n keyVersion: fingerprint.keyVersion,\n digest: fingerprint.digest,\n };\n}\n\nfunction canonicalSealedPayload(\n payload: EconomySealedRecoveryPayloadV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: payload.schemaVersion,\n payloadVersion: payload.payloadVersion,\n cipherSuite: payload.cipherSuite,\n encoding: payload.encoding,\n keyVersion: payload.keyVersion,\n nonce: payload.nonce,\n ciphertext: payload.ciphertext,\n authenticationTag: payload.authenticationTag,\n plaintextContentHash: payload.plaintextContentHash,\n encryptionContextHash: payload.encryptionContextHash,\n };\n}\n\nfunction canonicalSignature(\n signature: EconomyEvidenceSignatureV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: signature.schemaVersion,\n signatureVersion: signature.signatureVersion,\n algorithm: signature.algorithm,\n keyId: signature.keyId,\n signedAt: signature.signedAt,\n value: signature.value,\n };\n}\n\nfunction canonicalSignatureMetadata(\n signature: EconomyEvidenceSignatureMetadataV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: signature.schemaVersion,\n signatureVersion: signature.signatureVersion,\n algorithm: signature.algorithm,\n keyId: signature.keyId,\n signedAt: signature.signedAt,\n };\n}\n\n/** Validates a bounded AES-GCM envelope without implementing cryptography. */\nexport function assertEconomySealedRecoveryPayload(\n payload: EconomySealedRecoveryPayloadV1,\n): void {\n assertExactKeys(\n payload,\n new Set([\n \"schemaVersion\",\n \"payloadVersion\",\n \"cipherSuite\",\n \"encoding\",\n \"keyVersion\",\n \"nonce\",\n \"ciphertext\",\n \"authenticationTag\",\n \"plaintextContentHash\",\n \"encryptionContextHash\",\n ]),\n \"Sealed recovery payload\",\n );\n economyAssert(\n payload.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n payload.payloadVersion === \"1\" &&\n payload.cipherSuite === \"AES-256-GCM\" &&\n payload.encoding === \"base64url\",\n \"INVALID_CONTRACT\",\n \"Unsupported sealed recovery-payload contract\",\n );\n assertEconomyIdentifier(payload.keyVersion, \"recovery keyVersion\");\n assertBase64url(payload.nonce, \"Recovery nonce\", 16, 16);\n assertBase64url(payload.ciphertext, \"Recovery ciphertext\", 1, 1_500_000);\n assertBase64url(\n payload.authenticationTag,\n \"Recovery authentication tag\",\n 22,\n 22,\n );\n assertCanonicalHash(\n payload.plaintextContentHash,\n \"Recovery plaintext-content hash\",\n );\n assertCanonicalHash(\n payload.encryptionContextHash,\n \"Recovery encryption-context hash\",\n );\n}\n\nfunction assertAcceptanceBody(\n body: EconomyRecoveryAcceptanceBodyV1,\n): void {\n assertExactKeys(\n body,\n \"acceptanceEnvelopeId\" in body\n ? ACCEPTANCE_KEYS\n : ACCEPTANCE_BODY_KEYS,\n \"Recovery acceptance body\",\n );\n assertRecoveryVersion(\n body.schemaVersion,\n body.recoveryVersion,\n body.recordType,\n \"economy-recovery-acceptance\",\n \"recovery acceptance\",\n );\n assertEconomyIdentifier(body.authorityId, \"authorityId\");\n assertEconomyIdentifier(body.commandId, \"commandId\");\n assertEconomyIdentifier(body.correlationId, \"correlationId\");\n assertEconomyHmacFingerprint(\n body.idempotencyFingerprint,\n \"economy.idempotency-key.v1\",\n );\n assertCanonicalHash(body.commandEnvelopeHash, \"Command-envelope hash\");\n assertEconomyIdentifier(body.acceptedReceiptId, \"acceptedReceiptId\");\n assertCanonicalHash(body.acceptedReceiptHash, \"Accepted-receipt hash\");\n assertEconomySealedRecoveryPayload(body.sealedPayload);\n const preparedAt = parseIsoTimestamp(body.preparedAt);\n const acceptedAt = parseIsoTimestamp(body.acceptedAt);\n economyAssert(\n preparedAt <= acceptedAt,\n \"INVALID_TIME_WINDOW\",\n \"Recovery acceptance cannot precede preparation\",\n );\n}\n\n/** Canonical body bytes used to derive an acceptance-envelope ID. */\nexport function canonicalEconomyRecoveryAcceptanceBodyPayload(\n body: EconomyRecoveryAcceptanceBodyV1,\n): string {\n assertAcceptanceBody(body);\n return JSON.stringify({\n schemaVersion: body.schemaVersion,\n recoveryVersion: body.recoveryVersion,\n recordType: body.recordType,\n authorityId: body.authorityId,\n commandId: body.commandId,\n correlationId: body.correlationId,\n idempotencyFingerprint: canonicalFingerprint(\n body.idempotencyFingerprint,\n ),\n commandEnvelopeHash: body.commandEnvelopeHash,\n acceptedReceiptId: body.acceptedReceiptId,\n acceptedReceiptHash: body.acceptedReceiptHash,\n sealedPayload: canonicalSealedPayload(body.sealedPayload),\n preparedAt: body.preparedAt,\n acceptedAt: body.acceptedAt,\n });\n}\n\nfunction deriveContentAddressedId(\n prefix: string,\n canonicalBodyPayload: string,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n return `${prefix}:${canonicalHash(\n canonicalBodyPayload,\n hashCanonicalPayload,\n \"Content-address hash\",\n )}`;\n}\n\n/** Creates an acceptance record whose ID addresses its exact canonical body. */\nexport function createEconomyRecoveryAcceptanceEnvelope(\n body: EconomyRecoveryAcceptanceBodyV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyRecoveryAcceptanceEnvelopeV1 {\n return {\n ...body,\n acceptanceEnvelopeId: deriveContentAddressedId(\n \"recovery-acceptance\",\n canonicalEconomyRecoveryAcceptanceBodyPayload(body),\n hashCanonicalPayload,\n ),\n };\n}\n\n/** Validates schema, privacy shape, and the acceptance content address. */\nexport function assertEconomyRecoveryAcceptanceEnvelope(\n envelope: EconomyRecoveryAcceptanceEnvelopeV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertExactKeys(envelope, ACCEPTANCE_KEYS, \"Recovery acceptance envelope\");\n assertAcceptanceBody(envelope);\n assertEconomyIdentifier(\n envelope.acceptanceEnvelopeId,\n \"acceptanceEnvelopeId\",\n );\n economyAssert(\n envelope.acceptanceEnvelopeId ===\n deriveContentAddressedId(\n \"recovery-acceptance\",\n canonicalEconomyRecoveryAcceptanceBodyPayload(envelope),\n hashCanonicalPayload,\n ),\n \"INVALID_CONTRACT\",\n \"Recovery acceptance content address does not match canonical bytes\",\n );\n}\n\n/** Canonical complete acceptance bytes written create-only in each region. */\nexport function canonicalEconomyRecoveryAcceptanceEnvelopePayload(\n envelope: EconomyRecoveryAcceptanceEnvelopeV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyRecoveryAcceptanceEnvelope(\n envelope,\n hashCanonicalPayload,\n );\n return JSON.stringify({\n schemaVersion: envelope.schemaVersion,\n recoveryVersion: envelope.recoveryVersion,\n recordType: envelope.recordType,\n acceptanceEnvelopeId: envelope.acceptanceEnvelopeId,\n authorityId: envelope.authorityId,\n commandId: envelope.commandId,\n correlationId: envelope.correlationId,\n idempotencyFingerprint: canonicalFingerprint(\n envelope.idempotencyFingerprint,\n ),\n commandEnvelopeHash: envelope.commandEnvelopeHash,\n acceptedReceiptId: envelope.acceptedReceiptId,\n acceptedReceiptHash: envelope.acceptedReceiptHash,\n sealedPayload: canonicalSealedPayload(envelope.sealedPayload),\n preparedAt: envelope.preparedAt,\n acceptedAt: envelope.acceptedAt,\n });\n}\n\nfunction assertCommittedResultBody(\n body: EconomyRecoveryCommittedResultBodyV1,\n): void {\n assertExactKeys(\n body,\n \"committedResultId\" in body\n ? COMMITTED_RESULT_KEYS\n : COMMITTED_RESULT_BODY_KEYS,\n \"Recovery committed-result body\",\n );\n assertRecoveryVersion(\n body.schemaVersion,\n body.recoveryVersion,\n body.recordType,\n \"economy-recovery-committed-result\",\n \"recovery committed result\",\n );\n for (const [value, label] of [\n [body.authorityId, \"authorityId\"],\n [body.commandId, \"commandId\"],\n [body.correlationId, \"correlationId\"],\n [body.acceptanceEnvelopeId, \"acceptanceEnvelopeId\"],\n [body.resultReceiptId, \"resultReceiptId\"],\n [body.authorityCommitId, \"authorityCommitId\"],\n ] as const) {\n assertEconomyIdentifier(value, label);\n }\n for (const [value, label] of [\n [body.acceptanceEnvelopeHash, \"Acceptance-envelope hash\"],\n [body.resultReceiptHash, \"Result-receipt hash\"],\n [body.authorityCommitHash, \"Authority-commit hash\"],\n [body.authorityHeadHashAfter, \"Authority-head hash\"],\n ] as const) {\n assertCanonicalHash(value, label);\n }\n economyAssert(\n RESULT_OUTCOMES.has(body.outcome),\n \"INVALID_CONTRACT\",\n \"Recovery committed result has an unsupported outcome\",\n );\n assertUnsignedInteger(body.authoritySequence, \"Authority sequence\");\n economyAssert(\n BigInt(body.authoritySequence) > 0n,\n \"INVALID_CONTRACT\",\n \"Authority sequence must be positive\",\n );\n const completed = body.outcome === \"completed\";\n economyAssert(\n completed ===\n (body.transactionId !== undefined &&\n body.transactionCanonicalHash !== undefined),\n \"INVALID_CONTRACT\",\n \"Only completed recovery results require transaction identity and hash\",\n );\n if (body.transactionId !== undefined) {\n assertEconomyIdentifier(body.transactionId, \"transactionId\");\n }\n if (body.transactionCanonicalHash !== undefined) {\n assertCanonicalHash(\n body.transactionCanonicalHash,\n \"Transaction canonical hash\",\n );\n }\n assertEconomySealedRecoveryPayload(body.sealedPayload);\n parseIsoTimestamp(body.committedAt);\n}\n\n/** Canonical body bytes used to derive a committed-result ID. */\nexport function canonicalEconomyRecoveryCommittedResultBodyPayload(\n body: EconomyRecoveryCommittedResultBodyV1,\n): string {\n assertCommittedResultBody(body);\n return JSON.stringify({\n schemaVersion: body.schemaVersion,\n recoveryVersion: body.recoveryVersion,\n recordType: body.recordType,\n authorityId: body.authorityId,\n commandId: body.commandId,\n correlationId: body.correlationId,\n acceptanceEnvelopeId: body.acceptanceEnvelopeId,\n acceptanceEnvelopeHash: body.acceptanceEnvelopeHash,\n resultReceiptId: body.resultReceiptId,\n resultReceiptHash: body.resultReceiptHash,\n outcome: body.outcome,\n authorityCommitId: body.authorityCommitId,\n authorityCommitHash: body.authorityCommitHash,\n authoritySequence: body.authoritySequence,\n authorityHeadHashAfter: body.authorityHeadHashAfter,\n ...(body.transactionId === undefined\n ? {}\n : { transactionId: body.transactionId }),\n ...(body.transactionCanonicalHash === undefined\n ? {}\n : { transactionCanonicalHash: body.transactionCanonicalHash }),\n sealedPayload: canonicalSealedPayload(body.sealedPayload),\n committedAt: body.committedAt,\n });\n}\n\n/** Creates a result record whose ID addresses its exact canonical body. */\nexport function createEconomyRecoveryCommittedResult(\n body: EconomyRecoveryCommittedResultBodyV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyRecoveryCommittedResultV1 {\n return {\n ...body,\n committedResultId: deriveContentAddressedId(\n \"recovery-result\",\n canonicalEconomyRecoveryCommittedResultBodyPayload(body),\n hashCanonicalPayload,\n ),\n };\n}\n\n/** Validates schema, privacy shape, and the committed-result content address. */\nexport function assertEconomyRecoveryCommittedResult(\n result: EconomyRecoveryCommittedResultV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertExactKeys(\n result,\n COMMITTED_RESULT_KEYS,\n \"Recovery committed result\",\n );\n assertCommittedResultBody(result);\n assertEconomyIdentifier(result.committedResultId, \"committedResultId\");\n economyAssert(\n result.committedResultId ===\n deriveContentAddressedId(\n \"recovery-result\",\n canonicalEconomyRecoveryCommittedResultBodyPayload(result),\n hashCanonicalPayload,\n ),\n \"INVALID_CONTRACT\",\n \"Recovery result content address does not match canonical bytes\",\n );\n}\n\n/** Canonical complete result bytes written create-only in each region. */\nexport function canonicalEconomyRecoveryCommittedResultPayload(\n result: EconomyRecoveryCommittedResultV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyRecoveryCommittedResult(result, hashCanonicalPayload);\n return JSON.stringify({\n schemaVersion: result.schemaVersion,\n recoveryVersion: result.recoveryVersion,\n recordType: result.recordType,\n committedResultId: result.committedResultId,\n authorityId: result.authorityId,\n commandId: result.commandId,\n correlationId: result.correlationId,\n acceptanceEnvelopeId: result.acceptanceEnvelopeId,\n acceptanceEnvelopeHash: result.acceptanceEnvelopeHash,\n resultReceiptId: result.resultReceiptId,\n resultReceiptHash: result.resultReceiptHash,\n outcome: result.outcome,\n authorityCommitId: result.authorityCommitId,\n authorityCommitHash: result.authorityCommitHash,\n authoritySequence: result.authoritySequence,\n authorityHeadHashAfter: result.authorityHeadHashAfter,\n ...(result.transactionId === undefined\n ? {}\n : { transactionId: result.transactionId }),\n ...(result.transactionCanonicalHash === undefined\n ? {}\n : { transactionCanonicalHash: result.transactionCanonicalHash }),\n sealedPayload: canonicalSealedPayload(result.sealedPayload),\n committedAt: result.committedAt,\n });\n}\n\n/**\n * Proves that a committed result is the terminal recovery record for the exact\n * accepted command. It also recomputes the acceptance record hash.\n */\nexport function assertEconomyRecoveryResultLink(\n acceptance: EconomyRecoveryAcceptanceEnvelopeV1,\n result: EconomyRecoveryCommittedResultV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n const acceptancePayload =\n canonicalEconomyRecoveryAcceptanceEnvelopePayload(\n acceptance,\n hashCanonicalPayload,\n );\n assertEconomyRecoveryCommittedResult(result, hashCanonicalPayload);\n economyAssert(\n result.authorityId === acceptance.authorityId &&\n result.commandId === acceptance.commandId &&\n result.correlationId === acceptance.correlationId &&\n result.acceptanceEnvelopeId === acceptance.acceptanceEnvelopeId &&\n result.acceptanceEnvelopeHash ===\n canonicalHash(\n acceptancePayload,\n hashCanonicalPayload,\n \"Acceptance-envelope hash\",\n ) &&\n parseIsoTimestamp(result.committedAt) >=\n parseIsoTimestamp(acceptance.acceptedAt),\n \"INVALID_CONTRACT\",\n \"Recovery committed result does not match its acceptance envelope\",\n );\n}\n\n/** Validates a detached evidence signature without owning signing keys. */\nexport function assertEconomyEvidenceSignatureMetadata(\n signature: EconomyEvidenceSignatureMetadataV1,\n): void {\n assertExactKeys(\n signature,\n new Set([\n \"schemaVersion\",\n \"signatureVersion\",\n \"algorithm\",\n \"keyId\",\n \"signedAt\",\n ]),\n \"Evidence signature metadata\",\n );\n economyAssert(\n signature.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n signature.signatureVersion === \"1\" &&\n SIGNATURE_ALGORITHMS.has(signature.algorithm),\n \"INVALID_CONTRACT\",\n \"Unsupported evidence signature\",\n );\n assertEconomyIdentifier(signature.keyId, \"signature keyId\");\n parseIsoTimestamp(signature.signedAt);\n}\n\n/** Validates a detached evidence signature without owning signing keys. */\nexport function assertEconomyEvidenceSignature(\n signature: EconomyEvidenceSignatureV1,\n): void {\n assertExactKeys(\n signature,\n new Set([\n \"schemaVersion\",\n \"signatureVersion\",\n \"algorithm\",\n \"keyId\",\n \"signedAt\",\n \"value\",\n ]),\n \"Evidence signature\",\n );\n assertEconomyEvidenceSignatureMetadata({\n schemaVersion: signature.schemaVersion,\n signatureVersion: signature.signatureVersion,\n algorithm: signature.algorithm,\n keyId: signature.keyId,\n signedAt: signature.signedAt,\n });\n assertBase64url(signature.value, \"Evidence signature value\", 32, 2_048);\n}\n\nfunction assertRegionalEvidenceBody(\n body: EconomyRegionalEvidenceReceiptBodyV1,\n): void {\n assertExactKeys(\n body,\n \"evidenceReceiptId\" in body ? REGIONAL_KEYS : REGIONAL_BODY_KEYS,\n \"Regional evidence-receipt body\",\n );\n assertRecoveryVersion(\n body.schemaVersion,\n body.recoveryVersion,\n body.recordType,\n \"economy-regional-evidence-receipt\",\n \"regional evidence receipt\",\n );\n for (const [value, label] of [\n [body.journalId, \"journalId\"],\n [body.region, \"region\"],\n [body.authorityId, \"authorityId\"],\n [body.commandId, \"commandId\"],\n [body.recoveryRecordId, \"recoveryRecordId\"],\n ] as const) {\n assertEconomyIdentifier(value, label);\n }\n assertUnsignedInteger(body.sequence, \"Regional evidence sequence\");\n economyAssert(\n BigInt(body.sequence) > 0n,\n \"INVALID_CONTRACT\",\n \"Regional evidence sequence must be positive\",\n );\n economyAssert(\n body.recoveryRecordKind === \"acceptance\" ||\n body.recoveryRecordKind === \"committed-result\",\n \"INVALID_CONTRACT\",\n \"Unsupported recovery record kind\",\n );\n assertCanonicalHash(\n body.recoveryRecordContentHash,\n \"Recovery-record content hash\",\n );\n if (BigInt(body.sequence) === 1n) {\n economyAssert(\n body.previousReceiptHash === undefined,\n \"INVALID_CONTRACT\",\n \"First regional evidence receipt cannot have a previous hash\",\n );\n } else {\n economyAssert(\n body.previousReceiptHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Non-genesis regional evidence receipt requires a previous hash\",\n );\n assertCanonicalHash(\n body.previousReceiptHash,\n \"Previous evidence-receipt hash\",\n );\n }\n const storedAt = parseIsoTimestamp(body.storedAt);\n const retentionUntil = parseIsoTimestamp(body.retentionUntil);\n economyAssert(\n storedAt < retentionUntil,\n \"INVALID_TIME_WINDOW\",\n \"Regional evidence retention must end after storage\",\n );\n}\n\n/** Canonical body bytes used to derive a regional evidence-receipt ID. */\nexport function canonicalEconomyRegionalEvidenceReceiptBodyPayload(\n body: EconomyRegionalEvidenceReceiptBodyV1,\n): string {\n assertRegionalEvidenceBody(body);\n return JSON.stringify({\n schemaVersion: body.schemaVersion,\n recoveryVersion: body.recoveryVersion,\n recordType: body.recordType,\n journalId: body.journalId,\n region: body.region,\n sequence: body.sequence,\n ...(body.previousReceiptHash === undefined\n ? {}\n : { previousReceiptHash: body.previousReceiptHash }),\n authorityId: body.authorityId,\n commandId: body.commandId,\n recoveryRecordKind: body.recoveryRecordKind,\n recoveryRecordId: body.recoveryRecordId,\n recoveryRecordContentHash: body.recoveryRecordContentHash,\n storedAt: body.storedAt,\n retentionUntil: body.retentionUntil,\n });\n}\n\n/** Creates a signed region receipt after the adapter has produced a signature. */\nexport function createEconomyRegionalEvidenceReceipt(\n body: EconomyRegionalEvidenceReceiptBodyV1,\n signature: EconomyEvidenceSignatureV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyRegionalEvidenceReceiptV1 {\n return {\n ...body,\n evidenceReceiptId: deriveContentAddressedId(\n \"regional-evidence\",\n canonicalEconomyRegionalEvidenceReceiptBodyPayload(body),\n hashCanonicalPayload,\n ),\n signature,\n };\n}\n\n/** Validates a region receipt and its content-addressed unsigned body. */\nexport function assertEconomyRegionalEvidenceReceipt(\n receipt: EconomyRegionalEvidenceReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertExactKeys(receipt, REGIONAL_KEYS, \"Regional evidence receipt\");\n assertRegionalEvidenceBody(receipt);\n assertEconomyIdentifier(receipt.evidenceReceiptId, \"evidenceReceiptId\");\n assertEconomyEvidenceSignature(receipt.signature);\n economyAssert(\n receipt.evidenceReceiptId ===\n deriveContentAddressedId(\n \"regional-evidence\",\n canonicalEconomyRegionalEvidenceReceiptBodyPayload(receipt),\n hashCanonicalPayload,\n ),\n \"INVALID_CONTRACT\",\n \"Regional evidence-receipt ID does not match canonical bytes\",\n );\n economyAssert(\n parseIsoTimestamp(receipt.signature.signedAt) >=\n parseIsoTimestamp(receipt.storedAt) &&\n parseIsoTimestamp(receipt.signature.signedAt) <\n parseIsoTimestamp(receipt.retentionUntil),\n \"INVALID_TIME_WINDOW\",\n \"Regional evidence signature time must fall within retention\",\n );\n}\n\n/**\n * Prepares the regional content address and exact bytes for an external signer.\n * No placeholder signature value is required or returned.\n */\nexport function prepareEconomyRegionalEvidenceReceiptSignature(\n body: EconomyRegionalEvidenceReceiptBodyV1,\n signature: EconomyEvidenceSignatureMetadataV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyPreparedEvidenceSignatureV1 {\n assertRegionalEvidenceBody(body);\n assertEconomyEvidenceSignatureMetadata(signature);\n economyAssert(\n parseIsoTimestamp(signature.signedAt) >=\n parseIsoTimestamp(body.storedAt) &&\n parseIsoTimestamp(signature.signedAt) <\n parseIsoTimestamp(body.retentionUntil),\n \"INVALID_TIME_WINDOW\",\n \"Regional evidence signature time must fall within retention\",\n );\n const contentAddressedId = deriveContentAddressedId(\n \"regional-evidence\",\n canonicalEconomyRegionalEvidenceReceiptBodyPayload(body),\n hashCanonicalPayload,\n );\n const canonicalPayload = JSON.stringify({\n domain: \"economy.regional-evidence-receipt.signature.v1\",\n evidenceReceiptId: contentAddressedId,\n body: JSON.parse(\n canonicalEconomyRegionalEvidenceReceiptBodyPayload(body),\n ) as unknown,\n signature: canonicalSignatureMetadata(signature),\n });\n return { contentAddressedId, canonicalPayload };\n}\n\n/** Exact bytes covered by a regional receipt's detached signature. */\nexport function canonicalEconomyRegionalEvidenceReceiptSigningPayload(\n receipt: EconomyRegionalEvidenceReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyRegionalEvidenceReceipt(receipt, hashCanonicalPayload);\n const prepared = prepareEconomyRegionalEvidenceReceiptSignature(\n receipt,\n {\n schemaVersion: receipt.signature.schemaVersion,\n signatureVersion: receipt.signature.signatureVersion,\n algorithm: receipt.signature.algorithm,\n keyId: receipt.signature.keyId,\n signedAt: receipt.signature.signedAt,\n },\n hashCanonicalPayload,\n );\n economyAssert(\n prepared.contentAddressedId === receipt.evidenceReceiptId,\n \"INVALID_CONTRACT\",\n \"Regional evidence signing ID does not match its receipt\",\n );\n return prepared.canonicalPayload;\n}\n\n/** Canonical complete region-receipt bytes, including its signature. */\nexport function canonicalEconomyRegionalEvidenceReceiptPayload(\n receipt: EconomyRegionalEvidenceReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyRegionalEvidenceReceipt(receipt, hashCanonicalPayload);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n recoveryVersion: receipt.recoveryVersion,\n recordType: receipt.recordType,\n evidenceReceiptId: receipt.evidenceReceiptId,\n journalId: receipt.journalId,\n region: receipt.region,\n sequence: receipt.sequence,\n ...(receipt.previousReceiptHash === undefined\n ? {}\n : { previousReceiptHash: receipt.previousReceiptHash }),\n authorityId: receipt.authorityId,\n commandId: receipt.commandId,\n recoveryRecordKind: receipt.recoveryRecordKind,\n recoveryRecordId: receipt.recoveryRecordId,\n recoveryRecordContentHash: receipt.recoveryRecordContentHash,\n storedAt: receipt.storedAt,\n retentionUntil: receipt.retentionUntil,\n signature: canonicalSignature(receipt.signature),\n });\n}\n\nfunction assertSignatureVerification(\n signature: EconomyEvidenceSignatureV1,\n canonicalPayload: string,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n label: string,\n): void {\n economyAssert(\n verifySignature({\n algorithm: signature.algorithm,\n keyId: signature.keyId,\n signedAt: signature.signedAt,\n signature: signature.value,\n canonicalPayload,\n }),\n \"INVALID_CONTRACT\",\n `${label} signature could not be verified`,\n );\n}\n\n/** Verifies one region receipt through an infrastructure-supplied key adapter. */\nexport function assertEconomyRegionalEvidenceReceiptSignature(\n receipt: EconomyRegionalEvidenceReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n): void {\n assertSignatureVerification(\n receipt.signature,\n canonicalEconomyRegionalEvidenceReceiptSigningPayload(\n receipt,\n hashCanonicalPayload,\n ),\n verifySignature,\n \"Regional evidence receipt\",\n );\n}\n\n/**\n * Verifies an ordered regional hash-chain segment. Segments beginning after\n * sequence one must supply the trusted preceding receipt hash.\n */\nexport function assertEconomyRegionalEvidenceChain(\n receipts: readonly EconomyRegionalEvidenceReceiptV1[],\n expectedPreviousReceiptHash: string | undefined,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n): void {\n economyAssert(\n receipts.length > 0,\n \"INVALID_CONTRACT\",\n \"Regional evidence chain cannot be empty\",\n );\n const first = receipts[0]!;\n assertEconomyRegionalEvidenceReceiptSignature(\n first,\n hashCanonicalPayload,\n verifySignature,\n );\n if (BigInt(first.sequence) === 1n) {\n economyAssert(\n expectedPreviousReceiptHash === undefined,\n \"INVALID_CONTRACT\",\n \"Genesis evidence chain cannot have a trusted preceding hash\",\n );\n } else {\n economyAssert(\n expectedPreviousReceiptHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Partial evidence chain requires its trusted preceding hash\",\n );\n assertCanonicalHash(\n expectedPreviousReceiptHash,\n \"Expected preceding evidence-receipt hash\",\n );\n economyAssert(\n first.previousReceiptHash === expectedPreviousReceiptHash,\n \"INVALID_CONTRACT\",\n \"Regional evidence chain does not start from the trusted hash\",\n );\n }\n\n let previous = first;\n for (const receipt of receipts.slice(1)) {\n assertEconomyRegionalEvidenceReceiptSignature(\n receipt,\n hashCanonicalPayload,\n verifySignature,\n );\n const previousHash = canonicalHash(\n canonicalEconomyRegionalEvidenceReceiptPayload(\n previous,\n hashCanonicalPayload,\n ),\n hashCanonicalPayload,\n \"Regional evidence-receipt chain hash\",\n );\n economyAssert(\n receipt.journalId === previous.journalId &&\n receipt.region === previous.region &&\n BigInt(receipt.sequence) === BigInt(previous.sequence) + 1n &&\n receipt.previousReceiptHash === previousHash &&\n parseIsoTimestamp(receipt.storedAt) >=\n parseIsoTimestamp(previous.storedAt),\n \"INVALID_CONTRACT\",\n \"Regional evidence receipts do not form one contiguous hash chain\",\n );\n previous = receipt;\n }\n}\n\n/**\n * Proves that at least two distinct regions retained byte-identical recovery\n * content. Region-specific receipt metadata and signatures may differ.\n */\nexport function assertEconomyRegionalEvidenceEquality(\n receipts: readonly EconomyRegionalEvidenceReceiptV1[],\n expectedRegions: readonly string[],\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n economyAssert(\n receipts.length >= 2 && expectedRegions.length >= 2,\n \"INVALID_CONTRACT\",\n \"Regional equality requires at least two evidence regions\",\n );\n const expected = new Set(expectedRegions);\n economyAssert(\n expected.size === expectedRegions.length,\n \"INVALID_CONTRACT\",\n \"Expected evidence regions must be unique\",\n );\n expectedRegions.forEach((region) =>\n assertEconomyIdentifier(region, \"expected region\"),\n );\n const observed = new Set<string>();\n const first = receipts[0]!;\n for (const receipt of receipts) {\n assertEconomyRegionalEvidenceReceipt(receipt, hashCanonicalPayload);\n economyAssert(\n expected.has(receipt.region) && !observed.has(receipt.region),\n \"INVALID_CONTRACT\",\n \"Regional evidence contains an unexpected or duplicate region\",\n );\n observed.add(receipt.region);\n economyAssert(\n receipt.authorityId === first.authorityId &&\n receipt.commandId === first.commandId &&\n receipt.recoveryRecordKind === first.recoveryRecordKind &&\n receipt.recoveryRecordId === first.recoveryRecordId &&\n receipt.recoveryRecordContentHash ===\n first.recoveryRecordContentHash,\n \"INVALID_CONTRACT\",\n \"Evidence regions do not bind byte-identical recovery content\",\n );\n }\n economyAssert(\n observed.size === expected.size,\n \"INVALID_CONTRACT\",\n \"Regional evidence does not cover the complete expected region set\",\n );\n}\n\n/** Validates the exact portable Merkle-proof shape. */\nexport function assertEconomyMerkleInclusionProof(\n proof: EconomyMerkleInclusionProofV1,\n): void {\n assertExactKeys(\n proof,\n new Set([\n \"schemaVersion\",\n \"proofVersion\",\n \"algorithm\",\n \"anchorId\",\n \"anchorManifestHash\",\n \"leafHash\",\n \"leafIndex\",\n \"leafCount\",\n \"siblings\",\n ]),\n \"Merkle inclusion proof\",\n );\n economyAssert(\n proof.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n proof.proofVersion === \"1\" &&\n proof.algorithm === \"duplicate-last-sha256-v1\",\n \"INVALID_CONTRACT\",\n \"Unsupported Merkle inclusion proof\",\n );\n assertEconomyIdentifier(proof.anchorId, \"anchorId\");\n assertCanonicalHash(proof.anchorManifestHash, \"Anchor-manifest hash\");\n assertCanonicalHash(proof.leafHash, \"Merkle leaf hash\");\n assertUnsignedInteger(proof.leafIndex, \"Merkle leaf index\");\n assertUnsignedInteger(proof.leafCount, \"Merkle leaf count\");\n economyAssert(\n BigInt(proof.leafCount) > 0n &&\n BigInt(proof.leafIndex) < BigInt(proof.leafCount) &&\n proof.siblings.length <= 128,\n \"INVALID_CONTRACT\",\n \"Merkle leaf position is outside its bounded tree\",\n );\n for (const step of proof.siblings) {\n assertExactKeys(\n step,\n new Set([\"schemaVersion\", \"side\", \"hash\"]),\n \"Merkle proof step\",\n );\n economyAssert(\n step.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n (step.side === \"left\" || step.side === \"right\"),\n \"INVALID_CONTRACT\",\n \"Unsupported Merkle proof step\",\n );\n assertCanonicalHash(step.hash, \"Merkle sibling hash\");\n }\n}\n\nfunction canonicalMerkleProof(\n proof: EconomyMerkleInclusionProofV1,\n): Readonly<Record<string, unknown>> {\n return {\n schemaVersion: proof.schemaVersion,\n proofVersion: proof.proofVersion,\n algorithm: proof.algorithm,\n anchorId: proof.anchorId,\n anchorManifestHash: proof.anchorManifestHash,\n leafHash: proof.leafHash,\n leafIndex: proof.leafIndex,\n leafCount: proof.leafCount,\n siblings: proof.siblings.map((step) => ({\n schemaVersion: step.schemaVersion,\n side: step.side,\n hash: step.hash,\n })),\n };\n}\n\n/**\n * Recomputes duplicate-last Merkle inclusion against a canonical hourly anchor.\n * The hash adapter receives only domain-separated canonical node bytes.\n */\nexport function assertEconomyMerkleInclusion(\n proof: EconomyMerkleInclusionProofV1,\n anchor: EconomyIntegrityAnchorManifestV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertEconomyMerkleInclusionProof(proof);\n assertEconomyIntegrityAnchorManifest(anchor);\n const anchorHash = canonicalHash(\n canonicalEconomyIntegrityAnchorManifestPayload(anchor),\n hashCanonicalPayload,\n \"Anchor-manifest hash\",\n );\n economyAssert(\n proof.anchorId === anchor.anchorId &&\n proof.anchorManifestHash === anchorHash &&\n proof.leafCount === anchor.leafCount,\n \"INVALID_CONTRACT\",\n \"Merkle proof does not match its authority anchor\",\n );\n\n let currentHash = proof.leafHash;\n let index = BigInt(proof.leafIndex);\n let width = BigInt(proof.leafCount);\n let consumed = 0;\n while (width > 1n) {\n const step = proof.siblings[consumed];\n economyAssert(\n step !== undefined,\n \"INVALID_CONTRACT\",\n \"Merkle proof is missing a tree level\",\n );\n const expectsLeft = index % 2n === 1n;\n economyAssert(\n step.side === (expectsLeft ? \"left\" : \"right\"),\n \"INVALID_CONTRACT\",\n \"Merkle proof sibling is on the wrong side\",\n );\n if (!expectsLeft && index + 1n === width) {\n economyAssert(\n step.hash === currentHash,\n \"INVALID_CONTRACT\",\n \"Odd Merkle levels must duplicate their final leaf\",\n );\n }\n const leftHash = expectsLeft ? step.hash : currentHash;\n const rightHash = expectsLeft ? currentHash : step.hash;\n currentHash = canonicalHash(\n JSON.stringify({\n domain: \"economy.merkle-node.v1\",\n leftHash,\n rightHash,\n }),\n hashCanonicalPayload,\n \"Merkle parent hash\",\n );\n consumed += 1;\n index /= 2n;\n width = (width + 1n) / 2n;\n }\n economyAssert(\n consumed === proof.siblings.length &&\n currentHash === anchor.merkleRootHash,\n \"INVALID_CONTRACT\",\n \"Merkle proof does not resolve to the anchor root\",\n );\n}\n\nfunction assertPortableEvidenceReference(\n reference: EconomyPortableEvidenceReferenceV1,\n): void {\n assertExactKeys(\n reference,\n new Set([\n \"schemaVersion\",\n \"region\",\n \"evidenceReceiptId\",\n \"evidenceReceiptHash\",\n ]),\n \"Portable evidence reference\",\n );\n economyAssert(\n reference.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported portable evidence-reference version\",\n );\n assertEconomyIdentifier(reference.region, \"evidence region\");\n assertEconomyIdentifier(\n reference.evidenceReceiptId,\n \"evidenceReceiptId\",\n );\n assertCanonicalHash(\n reference.evidenceReceiptHash,\n \"Evidence-receipt hash\",\n );\n}\n\nfunction evidenceReferenceOrder(\n left: EconomyPortableEvidenceReferenceV1,\n right: EconomyPortableEvidenceReferenceV1,\n): number {\n return compareUnicodeCodeUnits(left.region, right.region);\n}\n\nfunction canonicalPortableEvidenceReference(\n reference: EconomyPortableEvidenceReferenceV1,\n): Readonly<Record<string, string>> {\n return {\n schemaVersion: reference.schemaVersion,\n region: reference.region,\n evidenceReceiptId: reference.evidenceReceiptId,\n evidenceReceiptHash: reference.evidenceReceiptHash,\n };\n}\n\nfunction assertPortableBody(\n body: EconomyPortableCustomerReceiptBodyV1,\n): void {\n assertExactKeys(\n body,\n \"portableReceiptId\" in body ? PORTABLE_KEYS : PORTABLE_BODY_KEYS,\n \"Portable customer-receipt body\",\n );\n assertRecoveryVersion(\n body.schemaVersion,\n body.recoveryVersion,\n body.recordType,\n \"economy-portable-customer-receipt\",\n \"portable customer receipt\",\n );\n for (const [value, label] of [\n [body.authorityId, \"authorityId\"],\n [body.commandId, \"commandId\"],\n [body.transactionId, \"transactionId\"],\n [body.resultReceiptId, \"resultReceiptId\"],\n [body.committedResultId, \"committedResultId\"],\n [body.authorityCommitId, \"authorityCommitId\"],\n [body.tokenTermsVersion, \"tokenTermsVersion\"],\n ] as const) {\n assertEconomyIdentifier(value, label);\n }\n economyAssert(\n ACTIVITY_TYPES.has(body.activityType) &&\n (body.direction === \"credit\" || body.direction === \"debit\"),\n \"INVALID_CONTRACT\",\n \"Portable customer receipt has an unsupported activity or direction\",\n );\n economyAssert(\n parseTokenSubunits(body.tokenAmount) > 0n,\n \"INVALID_AMOUNT\",\n \"Portable customer receipt amount must be positive\",\n );\n for (const [value, label] of [\n [body.transactionCanonicalHash, \"Transaction canonical hash\"],\n [body.resultReceiptHash, \"Result-receipt hash\"],\n [body.committedResultContentHash, \"Committed-result content hash\"],\n [body.authorityCommitHash, \"Authority-commit hash\"],\n ] as const) {\n assertCanonicalHash(value, label);\n }\n assertUnsignedInteger(body.authoritySequence, \"Authority sequence\");\n economyAssert(\n BigInt(body.authoritySequence) > 0n &&\n body.cashRedemptionAllowed === false,\n \"INVALID_CONTRACT\",\n \"Portable receipt requires a positive sequence and no cash redemption\",\n );\n economyAssert(\n body.regionalEvidence.length >= 2,\n \"INVALID_CONTRACT\",\n \"Portable customer receipt requires at least two evidence regions\",\n );\n let previous: EconomyPortableEvidenceReferenceV1 | undefined;\n for (const reference of body.regionalEvidence) {\n assertPortableEvidenceReference(reference);\n economyAssert(\n previous === undefined ||\n evidenceReferenceOrder(previous, reference) < 0,\n \"INVALID_CONTRACT\",\n \"Portable evidence references must be unique and canonically ordered\",\n );\n previous = reference;\n }\n if (body.merkleInclusionProof !== undefined) {\n assertEconomyMerkleInclusionProof(body.merkleInclusionProof);\n economyAssert(\n body.merkleInclusionProof.leafHash === body.authorityCommitHash,\n \"INVALID_CONTRACT\",\n \"Portable receipt Merkle proof must cover its authority commit\",\n );\n }\n const committedAt = parseIsoTimestamp(body.committedAt);\n const issuedAt = parseIsoTimestamp(body.issuedAt);\n economyAssert(\n committedAt <= issuedAt,\n \"INVALID_TIME_WINDOW\",\n \"Portable receipt cannot be issued before its authority commit\",\n );\n}\n\n/** Canonical body bytes used to derive a portable receipt ID. */\nexport function canonicalEconomyPortableCustomerReceiptBodyPayload(\n body: EconomyPortableCustomerReceiptBodyV1,\n): string {\n assertPortableBody(body);\n return JSON.stringify({\n schemaVersion: body.schemaVersion,\n recoveryVersion: body.recoveryVersion,\n recordType: body.recordType,\n authorityId: body.authorityId,\n commandId: body.commandId,\n activityType: body.activityType,\n direction: body.direction,\n tokenAmount: body.tokenAmount,\n transactionId: body.transactionId,\n transactionCanonicalHash: body.transactionCanonicalHash,\n resultReceiptId: body.resultReceiptId,\n resultReceiptHash: body.resultReceiptHash,\n committedResultId: body.committedResultId,\n committedResultContentHash: body.committedResultContentHash,\n authorityCommitId: body.authorityCommitId,\n authorityCommitHash: body.authorityCommitHash,\n authoritySequence: body.authoritySequence,\n regionalEvidence: body.regionalEvidence.map(\n canonicalPortableEvidenceReference,\n ),\n ...(body.merkleInclusionProof === undefined\n ? {}\n : {\n merkleInclusionProof: canonicalMerkleProof(\n body.merkleInclusionProof,\n ),\n }),\n tokenTermsVersion: body.tokenTermsVersion,\n cashRedemptionAllowed: body.cashRedemptionAllowed,\n committedAt: body.committedAt,\n issuedAt: body.issuedAt,\n });\n}\n\n/** Creates a signed portable receipt from a canonical content-addressed body. */\nexport function createEconomyPortableCustomerReceipt(\n body: EconomyPortableCustomerReceiptBodyV1,\n signature: EconomyEvidenceSignatureV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyPortableCustomerReceiptV1 {\n return {\n ...body,\n portableReceiptId: deriveContentAddressedId(\n \"portable-token-receipt\",\n canonicalEconomyPortableCustomerReceiptBodyPayload(body),\n hashCanonicalPayload,\n ),\n signature,\n };\n}\n\n/** Validates schema, privacy shape, signature shape, and content address. */\nexport function assertEconomyPortableCustomerReceipt(\n receipt: EconomyPortableCustomerReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): void {\n assertExactKeys(receipt, PORTABLE_KEYS, \"Portable customer receipt\");\n assertPortableBody(receipt);\n assertEconomyIdentifier(receipt.portableReceiptId, \"portableReceiptId\");\n assertEconomyEvidenceSignature(receipt.signature);\n economyAssert(\n receipt.portableReceiptId ===\n deriveContentAddressedId(\n \"portable-token-receipt\",\n canonicalEconomyPortableCustomerReceiptBodyPayload(receipt),\n hashCanonicalPayload,\n ),\n \"INVALID_CONTRACT\",\n \"Portable customer-receipt ID does not match canonical bytes\",\n );\n economyAssert(\n parseIsoTimestamp(receipt.signature.signedAt) >=\n parseIsoTimestamp(receipt.issuedAt),\n \"INVALID_TIME_WINDOW\",\n \"Portable customer receipt cannot be signed before it is issued\",\n );\n}\n\n/**\n * Prepares the portable content address and exact bytes for an external signer.\n * No placeholder signature value is required or returned.\n */\nexport function prepareEconomyPortableCustomerReceiptSignature(\n body: EconomyPortableCustomerReceiptBodyV1,\n signature: EconomyEvidenceSignatureMetadataV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): EconomyPreparedEvidenceSignatureV1 {\n assertPortableBody(body);\n assertEconomyEvidenceSignatureMetadata(signature);\n economyAssert(\n parseIsoTimestamp(signature.signedAt) >=\n parseIsoTimestamp(body.issuedAt),\n \"INVALID_TIME_WINDOW\",\n \"Portable customer receipt cannot be signed before it is issued\",\n );\n const contentAddressedId = deriveContentAddressedId(\n \"portable-token-receipt\",\n canonicalEconomyPortableCustomerReceiptBodyPayload(body),\n hashCanonicalPayload,\n );\n const canonicalPayload = JSON.stringify({\n domain: \"economy.portable-customer-receipt.signature.v1\",\n portableReceiptId: contentAddressedId,\n body: JSON.parse(\n canonicalEconomyPortableCustomerReceiptBodyPayload(body),\n ) as unknown,\n signature: canonicalSignatureMetadata(signature),\n });\n return { contentAddressedId, canonicalPayload };\n}\n\n/** Exact bytes covered by a portable receipt's detached signature. */\nexport function canonicalEconomyPortableCustomerReceiptSigningPayload(\n receipt: EconomyPortableCustomerReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyPortableCustomerReceipt(receipt, hashCanonicalPayload);\n const prepared = prepareEconomyPortableCustomerReceiptSignature(\n receipt,\n {\n schemaVersion: receipt.signature.schemaVersion,\n signatureVersion: receipt.signature.signatureVersion,\n algorithm: receipt.signature.algorithm,\n keyId: receipt.signature.keyId,\n signedAt: receipt.signature.signedAt,\n },\n hashCanonicalPayload,\n );\n economyAssert(\n prepared.contentAddressedId === receipt.portableReceiptId,\n \"INVALID_CONTRACT\",\n \"Portable receipt signing ID does not match its receipt\",\n );\n return prepared.canonicalPayload;\n}\n\n/** Canonical complete portable-receipt bytes, including its signature. */\nexport function canonicalEconomyPortableCustomerReceiptPayload(\n receipt: EconomyPortableCustomerReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyPortableCustomerReceipt(receipt, hashCanonicalPayload);\n return JSON.stringify({\n schemaVersion: receipt.schemaVersion,\n recoveryVersion: receipt.recoveryVersion,\n recordType: receipt.recordType,\n portableReceiptId: receipt.portableReceiptId,\n authorityId: receipt.authorityId,\n commandId: receipt.commandId,\n activityType: receipt.activityType,\n direction: receipt.direction,\n tokenAmount: receipt.tokenAmount,\n transactionId: receipt.transactionId,\n transactionCanonicalHash: receipt.transactionCanonicalHash,\n resultReceiptId: receipt.resultReceiptId,\n resultReceiptHash: receipt.resultReceiptHash,\n committedResultId: receipt.committedResultId,\n committedResultContentHash: receipt.committedResultContentHash,\n authorityCommitId: receipt.authorityCommitId,\n authorityCommitHash: receipt.authorityCommitHash,\n authoritySequence: receipt.authoritySequence,\n regionalEvidence: receipt.regionalEvidence.map(\n canonicalPortableEvidenceReference,\n ),\n ...(receipt.merkleInclusionProof === undefined\n ? {}\n : {\n merkleInclusionProof: canonicalMerkleProof(\n receipt.merkleInclusionProof,\n ),\n }),\n tokenTermsVersion: receipt.tokenTermsVersion,\n cashRedemptionAllowed: receipt.cashRedemptionAllowed,\n committedAt: receipt.committedAt,\n issuedAt: receipt.issuedAt,\n signature: canonicalSignature(receipt.signature),\n });\n}\n\n/** Verifies a portable receipt through an infrastructure-supplied key adapter. */\nexport function assertEconomyPortableCustomerReceiptSignature(\n receipt: EconomyPortableCustomerReceiptV1,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n): void {\n assertSignatureVerification(\n receipt.signature,\n canonicalEconomyPortableCustomerReceiptSigningPayload(\n receipt,\n hashCanonicalPayload,\n ),\n verifySignature,\n \"Portable customer receipt\",\n );\n}\n\n/**\n * Cross-validates the complete portable proof graph without storage, identity,\n * key-vault, or cloud-SDK dependencies.\n */\nexport function assertEconomyPortableCustomerReceiptEvidence(\n receipt: EconomyPortableCustomerReceiptV1,\n regionalReceipts: readonly EconomyRegionalEvidenceReceiptV1[],\n expectedRegions: readonly string[],\n anchor: EconomyIntegrityAnchorManifestV1 | undefined,\n hashCanonicalPayload: CanonicalPayloadHashFunctionV1,\n verifySignature: EconomyEvidenceSignatureVerifierV1,\n): void {\n assertEconomyPortableCustomerReceiptSignature(\n receipt,\n hashCanonicalPayload,\n verifySignature,\n );\n assertEconomyRegionalEvidenceEquality(\n regionalReceipts,\n expectedRegions,\n hashCanonicalPayload,\n );\n economyAssert(\n regionalReceipts[0]?.recoveryRecordKind === \"committed-result\" &&\n regionalReceipts[0].recoveryRecordId === receipt.committedResultId &&\n regionalReceipts[0].recoveryRecordContentHash ===\n receipt.committedResultContentHash,\n \"INVALID_CONTRACT\",\n \"Portable receipt does not reference the retained committed result\",\n );\n\n const receiptByRegion = new Map(\n regionalReceipts.map((regionalReceipt) => [\n regionalReceipt.region,\n regionalReceipt,\n ]),\n );\n economyAssert(\n receipt.regionalEvidence.length === regionalReceipts.length,\n \"INVALID_CONTRACT\",\n \"Portable receipt does not cover the complete regional evidence set\",\n );\n for (const reference of receipt.regionalEvidence) {\n const regionalReceipt = receiptByRegion.get(reference.region);\n economyAssert(\n regionalReceipt !== undefined &&\n regionalReceipt.evidenceReceiptId === reference.evidenceReceiptId &&\n canonicalHash(\n canonicalEconomyRegionalEvidenceReceiptPayload(\n regionalReceipt,\n hashCanonicalPayload,\n ),\n hashCanonicalPayload,\n \"Regional evidence-receipt hash\",\n ) === reference.evidenceReceiptHash,\n \"INVALID_CONTRACT\",\n \"Portable receipt regional evidence reference does not match\",\n );\n assertEconomyRegionalEvidenceReceiptSignature(\n regionalReceipt,\n hashCanonicalPayload,\n verifySignature,\n );\n }\n\n if (receipt.merkleInclusionProof === undefined) {\n economyAssert(\n anchor === undefined,\n \"INVALID_CONTRACT\",\n \"An anchor cannot be supplied without a portable inclusion proof\",\n );\n } else {\n economyAssert(\n anchor !== undefined,\n \"INVALID_CONTRACT\",\n \"Portable inclusion proof requires its anchor manifest\",\n );\n assertEconomyMerkleInclusion(\n receipt.merkleInclusionProof,\n anchor,\n hashCanonicalPayload,\n );\n }\n}\n","import { parseTokenSubunits, type TokenSubunitString } from \"./amount.js\";\nimport {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type AllocationId,\n type EconomyContractVersion,\n type IsoTimestamp,\n type TransactionId,\n} from \"./contracts.js\";\nimport { economyAssert } from \"./errors.js\";\n\nexport type SpendRequestPurpose = \"gameplay-conversion\" | \"non-gameplay\";\nexport type SpendRequestStatus =\n | \"requested\"\n | \"approved\"\n | \"rejected\"\n | \"expired\"\n | \"executed\"\n | \"cancelled\";\n\n/** Future child request; baseline adapters must reject creation while disabled. */\nexport interface SpendRequestV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly requestId: string;\n readonly childAccountId: AccountId;\n readonly allocationId: AllocationId;\n readonly purpose: SpendRequestPurpose;\n readonly amount: TokenSubunitString;\n readonly status: SpendRequestStatus;\n readonly requestedAt: IsoTimestamp;\n readonly expiresAt: IsoTimestamp;\n readonly decidedByAccountId?: AccountId;\n readonly decidedAt?: IsoTimestamp;\n readonly approvalNonceHash?: string;\n readonly resultingTransactionId?: TransactionId;\n}\n\n/** Validates future child requests while creation remains policy-disabled. */\nexport function assertSpendRequest(request: SpendRequestV1): void {\n economyAssert(\n request.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported spend-request contract version\",\n );\n assertEconomyIdentifier(request.requestId, \"requestId\");\n assertEconomyIdentifier(request.childAccountId, \"childAccountId\");\n assertEconomyIdentifier(request.allocationId, \"allocationId\");\n economyAssert(\n request.purpose === \"gameplay-conversion\" ||\n request.purpose === \"non-gameplay\",\n \"INVALID_CONTRACT\",\n \"Spend request has an unsupported purpose\",\n );\n economyAssert(\n [\n \"requested\",\n \"approved\",\n \"rejected\",\n \"expired\",\n \"executed\",\n \"cancelled\",\n ].includes(request.status),\n \"INVALID_CONTRACT\",\n \"Spend request has an unsupported status\",\n );\n economyAssert(\n parseTokenSubunits(request.amount) > 0n,\n \"INVALID_AMOUNT\",\n \"Spend-request amount must be positive\",\n );\n const requestedAt = parseIsoTimestamp(request.requestedAt);\n const expiresAt = parseIsoTimestamp(request.expiresAt);\n economyAssert(\n expiresAt > requestedAt,\n \"INVALID_TIME_WINDOW\",\n \"Spend-request expiry must follow creation\",\n );\n\n const decisionRequired = [\"approved\", \"rejected\", \"executed\"].includes(\n request.status,\n );\n economyAssert(\n !decisionRequired ||\n (request.decidedByAccountId !== undefined &&\n request.decidedAt !== undefined),\n \"INVALID_CONTRACT\",\n \"Decided spend requests require a guardian actor and timestamp\",\n );\n if (request.decidedByAccountId !== undefined) {\n assertEconomyIdentifier(request.decidedByAccountId, \"decidedByAccountId\");\n }\n if (request.decidedAt !== undefined) {\n const decidedAt = parseIsoTimestamp(request.decidedAt);\n economyAssert(\n decidedAt >= requestedAt && decidedAt <= expiresAt,\n \"INVALID_TIME_WINDOW\",\n \"Spend-request decision must occur before expiry\",\n );\n }\n if (request.approvalNonceHash !== undefined) {\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(request.approvalNonceHash),\n \"INVALID_CONTRACT\",\n \"Approval nonces must be stored as SHA-256 hashes\",\n );\n }\n if (request.status === \"approved\" || request.status === \"executed\") {\n economyAssert(\n request.approvalNonceHash !== undefined,\n \"INVALID_CONTRACT\",\n \"Approved spend requests require a one-time approval nonce hash\",\n );\n }\n if (request.resultingTransactionId !== undefined) {\n assertEconomyIdentifier(\n request.resultingTransactionId,\n \"resultingTransactionId\",\n );\n economyAssert(\n request.status === \"executed\",\n \"INVALID_CONTRACT\",\n \"Only executed spend requests may reference a ledger transaction\",\n );\n }\n}\n","import {\n ECONOMY_CONTRACT_VERSION,\n assertEconomyIdentifier,\n parseIsoTimestamp,\n type AccountId,\n type EconomyContractVersion,\n type IsoTimestamp,\n} from \"./contracts.js\";\nimport { serializeTokenSubunits } from \"./amount.js\";\nimport { economyAssert } from \"./errors.js\";\nimport type { CanonicalPayloadHashFunctionV1 } from \"./integrity.js\";\nimport {\n assertWalletLifetimeSnapshot,\n assertWalletPortfolioReadScope,\n type WalletActivityEntryV1,\n type WalletLifetimeSnapshotV1,\n type WalletPortfolioReadScopeV1,\n} from \"./ports/query.js\";\nimport {\n assertWallet,\n assertWalletBalanceSummary,\n type WalletBalanceSummaryV1,\n type WalletV1,\n} from \"./wallets.js\";\n\nconst INITIALIZATION_IDENTITY_DOMAIN =\n \"economy.personal-wallet-initialization.identity.v1\";\nconst ZERO_TOKEN_SUBUNITS = serializeTokenSubunits(0n);\n\nexport type WalletInitializationNoOpCodeV1 =\n | \"WALLET_INITIALIZED\"\n | \"WALLET_ALREADY_INITIALIZED\";\n\n/** Deterministic storage identities for one self-owned personal wallet. */\nexport interface PersonalWalletInitializationDocumentIdsV1 {\n readonly walletDescriptorId: string;\n readonly accessProjectionId: string;\n readonly balanceProjectionId: string;\n readonly lifetimeProjectionId: string;\n readonly outboxEventId: string;\n}\n\n/** Privacy-minimized semantic payload bound by the audited command hash. */\nexport interface PersonalWalletInitializationCommandV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly commandType: \"initialize-wallet\";\n readonly walletKind: \"personal\";\n readonly subjectAccountId: AccountId;\n readonly walletId: string;\n readonly portfolioId: string;\n readonly initializedAt: IsoTimestamp;\n}\n\n/** Non-economic integration intent emitted in the same authority batch. */\nexport interface PersonalWalletInitializationOutboxIntentV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly eventType: \"wallet.initialized.v1\";\n readonly eventId: string;\n readonly subjectAccountId: AccountId;\n readonly walletId: string;\n readonly portfolioId: string;\n readonly occurredAt: IsoTimestamp;\n}\n\n/** Complete rebuildable baseline for one new self-owned personal wallet. */\nexport interface PersonalWalletInitializationStateV1 {\n readonly schemaVersion: EconomyContractVersion;\n readonly documentIds: PersonalWalletInitializationDocumentIdsV1;\n readonly command: PersonalWalletInitializationCommandV1;\n readonly wallet: WalletV1;\n readonly scope: WalletPortfolioReadScopeV1;\n readonly balance: WalletBalanceSummaryV1;\n readonly lifetime: WalletLifetimeSnapshotV1;\n /** Initialization itself is not an economic activity. */\n readonly activityEntries: readonly WalletActivityEntryV1[];\n readonly outboxIntent: PersonalWalletInitializationOutboxIntentV1;\n}\n\nexport interface CreatePersonalWalletInitializationStateInputV1 {\n readonly subjectAccountId: AccountId;\n readonly initializedAt: IsoTimestamp;\n}\n\nconst STATE_KEYS = new Set([\n \"schemaVersion\",\n \"documentIds\",\n \"command\",\n \"wallet\",\n \"scope\",\n \"balance\",\n \"lifetime\",\n \"activityEntries\",\n \"outboxIntent\",\n]);\nconst COMMAND_KEYS = new Set([\n \"schemaVersion\",\n \"commandType\",\n \"walletKind\",\n \"subjectAccountId\",\n \"walletId\",\n \"portfolioId\",\n \"initializedAt\",\n]);\nconst OUTBOX_KEYS = new Set([\n \"schemaVersion\",\n \"eventType\",\n \"eventId\",\n \"subjectAccountId\",\n \"walletId\",\n \"portfolioId\",\n \"occurredAt\",\n]);\nconst DOCUMENT_ID_KEYS = new Set([\n \"walletDescriptorId\",\n \"accessProjectionId\",\n \"balanceProjectionId\",\n \"lifetimeProjectionId\",\n \"outboxEventId\",\n]);\n\nfunction assertExactKeys(\n value: object,\n allowed: ReadonlySet<string>,\n label: string,\n): void {\n economyAssert(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"INVALID_CONTRACT\",\n `${label} must be an object`,\n );\n economyAssert(\n Object.keys(value).every((key) => allowed.has(key)),\n \"INVALID_CONTRACT\",\n `${label} contains an unsupported field`,\n );\n}\n\nfunction identityDigest(\n subjectAccountId: AccountId,\n hash: CanonicalPayloadHashFunctionV1,\n): string {\n assertEconomyIdentifier(subjectAccountId, \"subjectAccountId\");\n const canonicalIdentity = JSON.stringify({\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n domain: INITIALIZATION_IDENTITY_DOMAIN,\n subjectAccountId,\n });\n const canonicalHash = hash(canonicalIdentity);\n economyAssert(\n /^sha256:[a-f0-9]{64}$/u.test(canonicalHash),\n \"INVALID_CONTRACT\",\n \"Wallet initialization identity hash must be canonical SHA-256\",\n );\n return canonicalHash.slice(\"sha256:\".length);\n}\n\n/** Produces stable, non-guessable-by-sequence IDs without owning cryptography. */\nexport function createPersonalWalletInitializationDocumentIds(\n subjectAccountId: AccountId,\n hash: CanonicalPayloadHashFunctionV1,\n): PersonalWalletInitializationDocumentIdsV1 & {\n readonly walletId: string;\n readonly portfolioId: string;\n} {\n const digest = identityDigest(subjectAccountId, hash);\n return {\n walletId: `wallet:personal:${digest}`,\n portfolioId: `portfolio:self:${digest}`,\n walletDescriptorId: `wallet-descriptor:${digest}`,\n accessProjectionId: `wallet-access:${digest}`,\n balanceProjectionId: `wallet-balance:${digest}`,\n lifetimeProjectionId: `wallet-lifetime:${digest}`,\n outboxEventId: `outbox:wallet-initialized:${digest}`,\n };\n}\n\n/** Validates the exact semantic initialization payload before hashing it. */\nexport function assertPersonalWalletInitializationCommand(\n command: PersonalWalletInitializationCommandV1,\n): void {\n assertExactKeys(command, COMMAND_KEYS, \"Wallet initialization command\");\n economyAssert(\n command.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n command.commandType === \"initialize-wallet\" &&\n command.walletKind === \"personal\",\n \"INVALID_CONTRACT\",\n \"Unsupported personal-wallet initialization command\",\n );\n assertEconomyIdentifier(command.subjectAccountId, \"subjectAccountId\");\n assertEconomyIdentifier(command.walletId, \"walletId\");\n assertEconomyIdentifier(command.portfolioId, \"portfolioId\");\n parseIsoTimestamp(command.initializedAt);\n}\n\n/** Returns the exact UTF-8 JSON bytes an approved SHA-256 adapter must hash. */\nexport function canonicalPersonalWalletInitializationCommandPayload(\n command: PersonalWalletInitializationCommandV1,\n): string {\n assertPersonalWalletInitializationCommand(command);\n return JSON.stringify({\n schemaVersion: command.schemaVersion,\n commandType: command.commandType,\n walletKind: command.walletKind,\n subjectAccountId: command.subjectAccountId,\n walletId: command.walletId,\n portfolioId: command.portfolioId,\n initializedAt: command.initializedAt,\n });\n}\n\n/** Validates the privacy-minimized outbox intent. */\nexport function assertPersonalWalletInitializationOutboxIntent(\n intent: PersonalWalletInitializationOutboxIntentV1,\n): void {\n assertExactKeys(intent, OUTBOX_KEYS, \"Wallet initialization outbox intent\");\n economyAssert(\n intent.schemaVersion === ECONOMY_CONTRACT_VERSION &&\n intent.eventType === \"wallet.initialized.v1\",\n \"INVALID_CONTRACT\",\n \"Unsupported wallet initialization outbox intent\",\n );\n assertEconomyIdentifier(intent.eventId, \"eventId\");\n assertEconomyIdentifier(intent.subjectAccountId, \"subjectAccountId\");\n assertEconomyIdentifier(intent.walletId, \"walletId\");\n assertEconomyIdentifier(intent.portfolioId, \"portfolioId\");\n parseIsoTimestamp(intent.occurredAt);\n}\n\n/** Canonical bytes for the create-only initialization outbox fact. */\nexport function canonicalPersonalWalletInitializationOutboxPayload(\n intent: PersonalWalletInitializationOutboxIntentV1,\n): string {\n assertPersonalWalletInitializationOutboxIntent(intent);\n return JSON.stringify({\n schemaVersion: intent.schemaVersion,\n eventType: intent.eventType,\n eventId: intent.eventId,\n subjectAccountId: intent.subjectAccountId,\n walletId: intent.walletId,\n portfolioId: intent.portfolioId,\n occurredAt: intent.occurredAt,\n });\n}\n\n/**\n * Builds the complete exact-zero personal-wallet baseline. The caller supplies\n * SHA-256 and persists these records with receipts, idempotency, the authority\n * manifest, and the conditional head advance in one ACID boundary.\n */\nexport function createPersonalWalletInitializationState(\n input: CreatePersonalWalletInitializationStateInputV1,\n hash: CanonicalPayloadHashFunctionV1,\n): PersonalWalletInitializationStateV1 {\n parseIsoTimestamp(input.initializedAt);\n const { walletId, portfolioId, ...documentIds } =\n createPersonalWalletInitializationDocumentIds(\n input.subjectAccountId,\n hash,\n );\n const command: PersonalWalletInitializationCommandV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n commandType: \"initialize-wallet\",\n walletKind: \"personal\",\n subjectAccountId: input.subjectAccountId,\n walletId,\n portfolioId,\n initializedAt: input.initializedAt,\n };\n const state: PersonalWalletInitializationStateV1 = {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n documentIds,\n command,\n wallet: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n accountId: input.subjectAccountId,\n kind: \"personal\",\n ownerType: \"account\",\n ownerId: input.subjectAccountId,\n status: \"active\",\n version: 1,\n createdAt: input.initializedAt,\n },\n scope: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n portfolioId,\n subjectAccountId: input.subjectAccountId,\n components: [{ walletId, role: \"personal\" }],\n },\n balance: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n available: ZERO_TOKEN_SUBUNITS,\n reserved: ZERO_TOKEN_SUBUNITS,\n held: ZERO_TOKEN_SUBUNITS,\n rewardProgress: ZERO_TOKEN_SUBUNITS,\n version: 1,\n asOf: input.initializedAt,\n },\n lifetime: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n walletId,\n totals: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n bought: ZERO_TOKEN_SUBUNITS,\n earned: ZERO_TOKEN_SUBUNITS,\n allocated: ZERO_TOKEN_SUBUNITS,\n reclaimed: ZERO_TOKEN_SUBUNITS,\n spent: ZERO_TOKEN_SUBUNITS,\n reversed: ZERO_TOKEN_SUBUNITS,\n },\n version: 1,\n asOf: input.initializedAt,\n },\n activityEntries: [],\n outboxIntent: {\n schemaVersion: ECONOMY_CONTRACT_VERSION,\n eventType: \"wallet.initialized.v1\",\n eventId: documentIds.outboxEventId,\n subjectAccountId: input.subjectAccountId,\n walletId,\n portfolioId,\n occurredAt: input.initializedAt,\n },\n };\n assertPersonalWalletInitializationState(state);\n return state;\n}\n\n/** Proves the personal-wallet initialization state is complete and exact-zero. */\nexport function assertPersonalWalletInitializationState(\n state: PersonalWalletInitializationStateV1,\n): void {\n assertExactKeys(state, STATE_KEYS, \"Wallet initialization state\");\n assertExactKeys(\n state.documentIds,\n DOCUMENT_ID_KEYS,\n \"Wallet initialization document IDs\",\n );\n economyAssert(\n state.schemaVersion === ECONOMY_CONTRACT_VERSION,\n \"INVALID_CONTRACT\",\n \"Unsupported wallet initialization state\",\n );\n for (const identifier of Object.values(state.documentIds)) {\n assertEconomyIdentifier(identifier, \"wallet initialization document ID\");\n }\n economyAssert(\n new Set(Object.values(state.documentIds)).size ===\n Object.values(state.documentIds).length,\n \"INVALID_CONTRACT\",\n \"Wallet initialization document IDs must be unique\",\n );\n assertPersonalWalletInitializationCommand(state.command);\n assertWallet(state.wallet);\n assertWalletPortfolioReadScope(state.scope);\n assertWalletBalanceSummary(state.balance);\n assertWalletLifetimeSnapshot(state.lifetime);\n assertPersonalWalletInitializationOutboxIntent(state.outboxIntent);\n economyAssert(\n state.wallet.walletId === state.command.walletId &&\n state.wallet.accountId === state.command.subjectAccountId &&\n state.wallet.ownerId === state.command.subjectAccountId &&\n state.wallet.kind === \"personal\" &&\n state.wallet.ownerType === \"account\" &&\n state.wallet.createdAt === state.command.initializedAt &&\n state.scope.portfolioId === state.command.portfolioId &&\n state.scope.subjectAccountId === state.command.subjectAccountId &&\n state.scope.components.length === 1 &&\n state.scope.components[0]?.walletId === state.command.walletId &&\n state.scope.components[0]?.role === \"personal\" &&\n state.scope.components[0]?.beneficiaryAccountId === undefined &&\n state.balance.walletId === state.command.walletId &&\n state.balance.available === ZERO_TOKEN_SUBUNITS &&\n state.balance.reserved === ZERO_TOKEN_SUBUNITS &&\n state.balance.held === ZERO_TOKEN_SUBUNITS &&\n state.balance.rewardProgress === ZERO_TOKEN_SUBUNITS &&\n state.balance.version === 1 &&\n state.balance.asOf === state.command.initializedAt &&\n state.lifetime.walletId === state.command.walletId &&\n state.lifetime.version === 1 &&\n state.lifetime.asOf === state.command.initializedAt &&\n state.lifetime.totals.bought === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.earned === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.allocated === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.reclaimed === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.spent === ZERO_TOKEN_SUBUNITS &&\n state.lifetime.totals.reversed === ZERO_TOKEN_SUBUNITS &&\n state.activityEntries.length === 0 &&\n state.outboxIntent.eventId === state.documentIds.outboxEventId &&\n state.outboxIntent.subjectAccountId === state.command.subjectAccountId &&\n state.outboxIntent.walletId === state.command.walletId &&\n state.outboxIntent.portfolioId === state.command.portfolioId &&\n state.outboxIntent.occurredAt === state.command.initializedAt,\n \"INVALID_CONTRACT\",\n \"Personal-wallet initialization state is incomplete or inconsistent\",\n );\n}\n"],"mappings":"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","names":["assertExactKeys","assertExactKeys","assertCanonicalHash","hashCanonicalPayload","ACTIVITY_TYPES","ACTIVITY_STATUSES","ACTIVITY_SOURCES","assertCanonicalHash","assertCanonicalHash","canonicalHash","assertExactKeys","assertCanonicalHash","hashCanonicalPayload","assertWholePositive","assertExactKeys","assertCanonicalHash","ACTIVITY_TYPES","ACTIVITY_STATUSES","ACTIVITY_SOURCES","hasControlCharacters","assertOpaqueCursor","assertUniqueValues","TRANSITION_PRECEDENCE","sameTransition","compareTransitions","ACTIVITY_TYPES","assertExactKeys","assertCanonicalHash","hashCanonicalPayload","canonicalFingerprint","assertExactKeys","canonicalHash"]}
|