@usesigil/kit 0.13.0 → 0.16.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/dist/advanced-analytics.d.ts +3 -1
- package/dist/advanced-analytics.d.ts.map +1 -1
- package/dist/advanced-analytics.js +4 -6
- package/dist/advanced-analytics.js.map +1 -1
- package/dist/agent-bootstrap.d.ts +118 -0
- package/dist/agent-bootstrap.d.ts.map +1 -0
- package/dist/agent-bootstrap.js +211 -0
- package/dist/agent-bootstrap.js.map +1 -0
- package/dist/agent-errors.d.ts +3 -3
- package/dist/agent-errors.d.ts.map +1 -1
- package/dist/agent-errors.js +230 -206
- package/dist/agent-errors.js.map +1 -1
- package/dist/build-unsigned.d.ts +152 -0
- package/dist/build-unsigned.d.ts.map +1 -0
- package/dist/build-unsigned.js +152 -0
- package/dist/build-unsigned.js.map +1 -0
- package/dist/constraints/index.d.ts +23 -0
- package/dist/constraints/index.d.ts.map +1 -0
- package/dist/constraints/index.js +24 -0
- package/dist/constraints/index.js.map +1 -0
- package/dist/create-vault.d.ts +10 -2
- package/dist/create-vault.d.ts.map +1 -1
- package/dist/create-vault.js +10 -3
- package/dist/create-vault.js.map +1 -1
- package/dist/dashboard/constraint-builders.d.ts +82 -0
- package/dist/dashboard/constraint-builders.d.ts.map +1 -0
- package/dist/dashboard/constraint-builders.js +204 -0
- package/dist/dashboard/constraint-builders.js.map +1 -0
- package/dist/dashboard/errors.d.ts +37 -0
- package/dist/dashboard/errors.d.ts.map +1 -1
- package/dist/dashboard/errors.js +76 -0
- package/dist/dashboard/errors.js.map +1 -1
- package/dist/dashboard/from-json.d.ts.map +1 -1
- package/dist/dashboard/from-json.js +1 -5
- package/dist/dashboard/from-json.js.map +1 -1
- package/dist/dashboard/index.d.ts +31 -10
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +40 -10
- package/dist/dashboard/index.js.map +1 -1
- package/dist/dashboard/mutations.d.ts +60 -3
- package/dist/dashboard/mutations.d.ts.map +1 -1
- package/dist/dashboard/mutations.js +129 -32
- package/dist/dashboard/mutations.js.map +1 -1
- package/dist/dashboard/post-assertion-validation.d.ts +88 -0
- package/dist/dashboard/post-assertion-validation.d.ts.map +1 -0
- package/dist/dashboard/post-assertion-validation.js +191 -0
- package/dist/dashboard/post-assertion-validation.js.map +1 -0
- package/dist/dashboard/reads.d.ts +93 -1
- package/dist/dashboard/reads.d.ts.map +1 -1
- package/dist/dashboard/reads.js +244 -40
- package/dist/dashboard/reads.js.map +1 -1
- package/dist/dashboard/types.d.ts +149 -21
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/errors/codes.js +1 -1
- package/dist/event-analytics.d.ts +1 -3
- package/dist/event-analytics.d.ts.map +1 -1
- package/dist/event-analytics.js +4 -9
- package/dist/event-analytics.js.map +1 -1
- package/dist/events.js +2 -2
- package/dist/events.js.map +1 -1
- package/dist/generated/accounts/agentVault.d.ts +0 -20
- package/dist/generated/accounts/agentVault.d.ts.map +1 -1
- package/dist/generated/accounts/agentVault.js +0 -2
- package/dist/generated/accounts/agentVault.js.map +1 -1
- package/dist/generated/accounts/pendingAgentPermissionsUpdate.d.ts +12 -0
- package/dist/generated/accounts/pendingAgentPermissionsUpdate.d.ts.map +1 -1
- package/dist/generated/accounts/pendingAgentPermissionsUpdate.js +3 -1
- package/dist/generated/accounts/pendingAgentPermissionsUpdate.js.map +1 -1
- package/dist/generated/accounts/pendingCloseConstraints.d.ts +12 -0
- package/dist/generated/accounts/pendingCloseConstraints.d.ts.map +1 -1
- package/dist/generated/accounts/pendingCloseConstraints.js +4 -2
- package/dist/generated/accounts/pendingCloseConstraints.js.map +1 -1
- package/dist/generated/accounts/pendingConstraintsUpdate.d.ts +14 -0
- package/dist/generated/accounts/pendingConstraintsUpdate.d.ts.map +1 -1
- package/dist/generated/accounts/pendingConstraintsUpdate.js +4 -2
- package/dist/generated/accounts/pendingConstraintsUpdate.js.map +1 -1
- package/dist/generated/accounts/pendingPolicyUpdate.d.ts +24 -8
- package/dist/generated/accounts/pendingPolicyUpdate.d.ts.map +1 -1
- package/dist/generated/accounts/pendingPolicyUpdate.js +6 -8
- package/dist/generated/accounts/pendingPolicyUpdate.js.map +1 -1
- package/dist/generated/accounts/policyConfig.d.ts +28 -18
- package/dist/generated/accounts/policyConfig.d.ts.map +1 -1
- package/dist/generated/accounts/policyConfig.js +4 -8
- package/dist/generated/accounts/policyConfig.js.map +1 -1
- package/dist/generated/accounts/sessionAuthority.d.ts +18 -8
- package/dist/generated/accounts/sessionAuthority.d.ts.map +1 -1
- package/dist/generated/accounts/sessionAuthority.js +4 -6
- package/dist/generated/accounts/sessionAuthority.js.map +1 -1
- package/dist/generated/errors/sigil.d.ts +95 -89
- package/dist/generated/errors/sigil.d.ts.map +1 -1
- package/dist/generated/errors/sigil.js +107 -98
- package/dist/generated/errors/sigil.js.map +1 -1
- package/dist/generated/event-discriminators.js +1 -1
- package/dist/generated/event-discriminators.js.map +1 -1
- package/dist/generated/instructions/cleanupOrphanConstraintsPda.d.ts +67 -0
- package/dist/generated/instructions/cleanupOrphanConstraintsPda.d.ts.map +1 -0
- package/dist/generated/instructions/cleanupOrphanConstraintsPda.js +120 -0
- package/dist/generated/instructions/cleanupOrphanConstraintsPda.js.map +1 -0
- package/dist/generated/instructions/freezeVault.d.ts +8 -5
- package/dist/generated/instructions/freezeVault.d.ts.map +1 -1
- package/dist/generated/instructions/freezeVault.js +14 -3
- package/dist/generated/instructions/freezeVault.js.map +1 -1
- package/dist/generated/instructions/index.d.ts +1 -1
- package/dist/generated/instructions/index.d.ts.map +1 -1
- package/dist/generated/instructions/index.js +1 -1
- package/dist/generated/instructions/index.js.map +1 -1
- package/dist/generated/instructions/initializeVault.d.ts +0 -8
- package/dist/generated/instructions/initializeVault.d.ts.map +1 -1
- package/dist/generated/instructions/initializeVault.js +0 -4
- package/dist/generated/instructions/initializeVault.js.map +1 -1
- package/dist/generated/instructions/queuePolicyUpdate.d.ts +8 -16
- package/dist/generated/instructions/queuePolicyUpdate.d.ts.map +1 -1
- package/dist/generated/instructions/queuePolicyUpdate.js +4 -8
- package/dist/generated/instructions/queuePolicyUpdate.js.map +1 -1
- package/dist/generated/programs/sigil.d.ts +26 -26
- package/dist/generated/programs/sigil.d.ts.map +1 -1
- package/dist/generated/programs/sigil.js +34 -34
- package/dist/generated/programs/sigil.js.map +1 -1
- package/dist/generated/types/accountConstraint.d.ts +16 -1
- package/dist/generated/types/accountConstraint.d.ts.map +1 -1
- package/dist/generated/types/accountConstraint.js +2 -0
- package/dist/generated/types/accountConstraint.js.map +1 -1
- package/dist/generated/types/accountConstraintZC.d.ts +7 -0
- package/dist/generated/types/accountConstraintZC.d.ts.map +1 -1
- package/dist/generated/types/accountConstraintZC.js +4 -2
- package/dist/generated/types/accountConstraintZC.js.map +1 -1
- package/dist/generated/types/constraintEntry.d.ts +0 -8
- package/dist/generated/types/constraintEntry.d.ts.map +1 -1
- package/dist/generated/types/constraintEntry.js +1 -5
- package/dist/generated/types/constraintEntry.js.map +1 -1
- package/dist/generated/types/constraintEntryZC.d.ts +22 -27
- package/dist/generated/types/constraintEntryZC.d.ts.map +1 -1
- package/dist/generated/types/constraintEntryZC.js +4 -6
- package/dist/generated/types/constraintEntryZC.js.map +1 -1
- package/dist/generated/types/index.d.ts +1 -1
- package/dist/generated/types/index.d.ts.map +1 -1
- package/dist/generated/types/index.js +1 -1
- package/dist/generated/types/index.js.map +1 -1
- package/dist/generated/types/orphanConstraintsPdaCleaned.d.ts +22 -0
- package/dist/generated/types/orphanConstraintsPdaCleaned.d.ts.map +1 -0
- package/dist/generated/types/{positionsSynced.js → orphanConstraintsPdaCleaned.js} +8 -10
- package/dist/generated/types/orphanConstraintsPdaCleaned.js.map +1 -0
- package/dist/generated/types/sessionFinalized.d.ts +0 -4
- package/dist/generated/types/sessionFinalized.d.ts.map +1 -1
- package/dist/generated/types/sessionFinalized.js +1 -3
- package/dist/generated/types/sessionFinalized.js.map +1 -1
- package/dist/generated/types/vaultFrozen.d.ts +12 -0
- package/dist/generated/types/vaultFrozen.d.ts.map +1 -1
- package/dist/generated/types/vaultFrozen.js +3 -1
- package/dist/generated/types/vaultFrozen.js.map +1 -1
- package/dist/index.d.ts +13 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -2
- package/dist/index.js.map +1 -1
- package/dist/inscribe.d.ts +0 -8
- package/dist/inscribe.d.ts.map +1 -1
- package/dist/inscribe.js +0 -2
- package/dist/inscribe.js.map +1 -1
- package/dist/kit-adapter.d.ts +1 -1
- package/dist/kit-adapter.d.ts.map +1 -1
- package/dist/kit-adapter.js +1 -1
- package/dist/kit-adapter.js.map +1 -1
- package/dist/logger.d.ts +48 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +36 -0
- package/dist/logger.js.map +1 -1
- package/dist/owner-transaction.d.ts +8 -0
- package/dist/owner-transaction.d.ts.map +1 -1
- package/dist/owner-transaction.js +1 -0
- package/dist/owner-transaction.js.map +1 -1
- package/dist/post-assertions/cross-field-lte.d.ts +134 -0
- package/dist/post-assertions/cross-field-lte.d.ts.map +1 -0
- package/dist/post-assertions/cross-field-lte.js +129 -0
- package/dist/post-assertions/cross-field-lte.js.map +1 -0
- package/dist/post-assertions/index.d.ts +28 -0
- package/dist/post-assertions/index.d.ts.map +1 -0
- package/dist/post-assertions/index.js +28 -0
- package/dist/post-assertions/index.js.map +1 -0
- package/dist/post-assertions/presets/flash-trade.d.ts +139 -0
- package/dist/post-assertions/presets/flash-trade.d.ts.map +1 -0
- package/dist/post-assertions/presets/flash-trade.js +154 -0
- package/dist/post-assertions/presets/flash-trade.js.map +1 -0
- package/dist/presets.d.ts +1 -13
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +0 -10
- package/dist/presets.js.map +1 -1
- package/dist/preview-create-vault.d.ts +280 -0
- package/dist/preview-create-vault.d.ts.map +1 -0
- package/dist/preview-create-vault.js +477 -0
- package/dist/preview-create-vault.js.map +1 -0
- package/dist/protocol-registry/annotations/drift.json +7 -0
- package/dist/protocol-registry/annotations/flash-trade.json +7 -0
- package/dist/protocol-registry/annotations/jupiter-borrow.json +7 -0
- package/dist/protocol-registry/annotations/jupiter-earn.json +7 -0
- package/dist/protocol-registry/annotations/jupiter-lend.json +7 -0
- package/dist/protocol-registry/annotations/jupiter.json +7 -0
- package/dist/protocol-registry/annotations/kamino.json +7 -0
- package/dist/protocol-registry/index.d.ts +45 -0
- package/dist/protocol-registry/index.d.ts.map +1 -0
- package/dist/protocol-registry/index.js +76 -0
- package/dist/protocol-registry/index.js.map +1 -0
- package/dist/protocol-tier.d.ts +157 -0
- package/dist/protocol-tier.d.ts.map +1 -0
- package/dist/protocol-tier.js +104 -0
- package/dist/protocol-tier.js.map +1 -0
- package/dist/seal.d.ts.map +1 -1
- package/dist/seal.js +30 -12
- package/dist/seal.js.map +1 -1
- package/dist/sigil.d.ts +0 -8
- package/dist/sigil.d.ts.map +1 -1
- package/dist/simulation.d.ts.map +1 -1
- package/dist/simulation.js +131 -82
- package/dist/simulation.js.map +1 -1
- package/dist/testing/devnet.d.ts.map +1 -1
- package/dist/testing/devnet.js +0 -2
- package/dist/testing/devnet.js.map +1 -1
- package/dist/testing/errors/expect.d.ts +137 -0
- package/dist/testing/errors/expect.d.ts.map +1 -0
- package/dist/testing/errors/expect.js +372 -0
- package/dist/testing/errors/expect.js.map +1 -0
- package/dist/testing/errors/index.d.ts +3 -0
- package/dist/testing/errors/index.d.ts.map +1 -0
- package/dist/testing/errors/index.js +8 -0
- package/dist/testing/errors/index.js.map +1 -0
- package/dist/testing/errors/names.generated.d.ts +188 -0
- package/dist/testing/errors/names.generated.d.ts.map +1 -0
- package/dist/testing/errors/names.generated.js +183 -0
- package/dist/testing/errors/names.generated.js.map +1 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +8 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/mock-rpc.d.ts +8 -0
- package/dist/testing/mock-rpc.d.ts.map +1 -1
- package/dist/testing/mock-rpc.js +14 -0
- package/dist/testing/mock-rpc.js.map +1 -1
- package/dist/testing/mock-state.d.ts +0 -2
- package/dist/testing/mock-state.d.ts.map +1 -1
- package/dist/testing/mock-state.js +2 -5
- package/dist/testing/mock-state.js.map +1 -1
- package/dist/types.d.ts +1 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -9
- package/dist/types.js.map +1 -1
- package/dist/vault-analytics.d.ts +0 -1
- package/dist/vault-analytics.d.ts.map +1 -1
- package/dist/vault-analytics.js +0 -1
- package/dist/vault-analytics.js.map +1 -1
- package/package.json +15 -3
- package/dist/generated/instructions/syncPositions.d.ts +0 -44
- package/dist/generated/instructions/syncPositions.d.ts.map +0 -1
- package/dist/generated/instructions/syncPositions.js +0 -72
- package/dist/generated/instructions/syncPositions.js.map +0 -1
- package/dist/generated/types/positionsSynced.d.ts +0 -24
- package/dist/generated/types/positionsSynced.d.ts.map +0 -1
- package/dist/generated/types/positionsSynced.js.map +0 -1
- package/dist/integrations/protocol-handler.d.ts +0 -59
- package/dist/integrations/protocol-handler.d.ts.map +0 -1
- package/dist/integrations/protocol-handler.js +0 -9
- package/dist/integrations/protocol-handler.js.map +0 -1
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@usesigil/kit/previewCreateVault`.
|
|
3
|
+
*
|
|
4
|
+
* Builds a `CreateVaultPreview` that the dashboard split-screen `/onboard`
|
|
5
|
+
* page renders BEFORE the user signs. Wraps the existing `createVault()`
|
|
6
|
+
* + `buildOwnerTransaction()` primitives — does not reinvent PDA derivation,
|
|
7
|
+
* compute-budget construction, or transaction compilation.
|
|
8
|
+
*
|
|
9
|
+
* ## Algorithm
|
|
10
|
+
*
|
|
11
|
+
* 1. **Validate** the config at the API edge. Negative bigints throw
|
|
12
|
+
* `RangeError`; on-chain hard limits (`MIN_TIMELOCK_DURATION`,
|
|
13
|
+
* `MAX_DEVELOPER_FEE_RATE`, `MAX_ALLOWED_PROTOCOLS`,
|
|
14
|
+
* `MAX_ALLOWED_DESTINATIONS`) are mirrored as early throws so the FE
|
|
15
|
+
* surfaces "your config will be rejected" before signing.
|
|
16
|
+
* `validateNetwork()` propagates as-is.
|
|
17
|
+
* 2. **Derive 4 PDAs.** `vault` first (it's the seed for the others),
|
|
18
|
+
* then `policy` / `tracker` / `agent_spend_overlay` in parallel.
|
|
19
|
+
* 3. **Fetch rent** for each PDA size in parallel via
|
|
20
|
+
* `getMinimumBalanceForRentExemption(size)`. The 4 sizes are pinned to
|
|
21
|
+
* the on-chain `<account>::SIZE` constants — drift between Rust and TS
|
|
22
|
+
* is regression-tested.
|
|
23
|
+
* 4. **Build instructions** via `createVault()` (which validates
|
|
24
|
+
* aggregate caps and rejects owner==agent).
|
|
25
|
+
* 5. **Compile transaction** via `buildOwnerTransaction()` with
|
|
26
|
+
* `CU_VAULT_CREATION` (400_000) and the caller's optional priority fee.
|
|
27
|
+
* 6. **Compute totalCostUsd** via BigInt-safe math with explicit
|
|
28
|
+
* mul-before-divide:
|
|
29
|
+
* `(rentLamports + feeLamports) * solPriceUsd / 1_000_000_000n`.
|
|
30
|
+
* Units: lamports × (6-decimal-USD per SOL) ÷ (lamports per SOL)
|
|
31
|
+
* = 6-decimal USD.
|
|
32
|
+
* 7. **Build warnings** for soft-signal issues (cap=0, cap>$1M, allowlist
|
|
33
|
+
* with no protocols, max-tx > daily-cap). Sorted by `code` ascending so
|
|
34
|
+
* React keys don't thrash on re-type.
|
|
35
|
+
* 8. **Freeze + return.** The returned object is `Object.freeze`d; the
|
|
36
|
+
* `pdaList` and `warnings` arrays are also frozen.
|
|
37
|
+
*
|
|
38
|
+
* ## What this does NOT do
|
|
39
|
+
*
|
|
40
|
+
* - **Submit any transaction.** Preview is read-only RPC: rent + blockhash
|
|
41
|
+
* + ALT lookup. No `sendTransaction`, no `simulateTransaction`.
|
|
42
|
+
* - **Sign.** Internally constructs `createNoopSigner(address)` instances
|
|
43
|
+
* so `buildOwnerTransaction` can compile a fee-payer-bound message.
|
|
44
|
+
* Wallet adapter signs the returned `unsignedTxBytes` later.
|
|
45
|
+
* - **Fetch SOL price.** Kit has no oracle. Caller passes
|
|
46
|
+
* `solPriceUsd: bigint` (6-decimal USD per SOL). Without it, the kit
|
|
47
|
+
* would have to either pin a default (silent lie) or take an RPC
|
|
48
|
+
* dependency on a price feed (scope creep).
|
|
49
|
+
*/
|
|
50
|
+
import { createNoopSigner } from "./kit-adapter.js";
|
|
51
|
+
import { getVaultPDA, getPolicyPDA, getTrackerPDA, getAgentOverlayPDA, } from "./resolve-accounts.js";
|
|
52
|
+
import { createVault } from "./create-vault.js";
|
|
53
|
+
import { buildOwnerTransaction } from "./owner-transaction.js";
|
|
54
|
+
import { CU_VAULT_CREATION } from "./priority-fees.js";
|
|
55
|
+
import { validateNetwork, SYSTEM_PROGRAM_ADDRESS, MAX_DEVELOPER_FEE_RATE, MAX_ALLOWED_PROTOCOLS, U64_MAX, } from "./types.js";
|
|
56
|
+
import { SigilSdkDomainError } from "./errors/sdk.js";
|
|
57
|
+
import { SIGIL_ERROR__SDK__INVALID_PARAMS } from "./errors/codes.js";
|
|
58
|
+
// ─── On-chain account sizes (verified against programs/sigil/src/state/*.rs) ─
|
|
59
|
+
/**
|
|
60
|
+
* `AgentVault::SIZE` from `programs/sigil/src/state/vault.rs`.
|
|
61
|
+
* Layout: 8 disc + 32 owner + 8 vault_id + 4 vec_prefix + (49 * 10) agents
|
|
62
|
+
* + 32 fee_destination + 1 status + 1 bump + 8 created_at
|
|
63
|
+
* + 8 total_transactions + 8 total_volume + 1 active_escrow_count
|
|
64
|
+
* + 8 total_fees_collected + 8 total_deposited_usd + 8 total_withdrawn_usd
|
|
65
|
+
* + 8 total_failed_transactions + 1 active_sessions = 634.
|
|
66
|
+
*/
|
|
67
|
+
const AGENT_VAULT_SIZE = 634;
|
|
68
|
+
/**
|
|
69
|
+
* `PolicyConfig::SIZE` from `programs/sigil/src/state/policy.rs`.
|
|
70
|
+
* Layout: 8 disc + 32 vault + 8 daily_cap + 8 max_tx + 1 protocol_mode
|
|
71
|
+
* + (4 + 32*10) protocols + 2 dev_fee + 2 slippage + 8 timelock
|
|
72
|
+
* + (4 + 32*10) allowed_destinations + 1 has_constraints
|
|
73
|
+
* + 1 has_pending_policy + 1 has_protocol_caps
|
|
74
|
+
* + (4 + 8*10) protocol_caps + 8 session_expiry + 1 bump
|
|
75
|
+
* + 8 policy_version + 1 has_post_assertions = 822.
|
|
76
|
+
*/
|
|
77
|
+
const POLICY_CONFIG_SIZE = 822;
|
|
78
|
+
/**
|
|
79
|
+
* `SpendTracker::SIZE` from `programs/sigil/src/state/tracker.rs`.
|
|
80
|
+
* Layout: 8 disc + 32 vault + (16 * 144) buckets + (48 * 10) protocol_counters
|
|
81
|
+
* + 8 last_write_epoch + 1 bump + 7 padding = 2840.
|
|
82
|
+
*/
|
|
83
|
+
const SPEND_TRACKER_SIZE = 2_840;
|
|
84
|
+
/**
|
|
85
|
+
* `AgentSpendOverlay::SIZE` from `programs/sigil/src/state/agent_spend_overlay.rs`.
|
|
86
|
+
* Layout: 8 disc + 32 vault + (232 * 10) entries + 1 bump + 7 padding
|
|
87
|
+
* + (8 * 10) lifetime_spend + (8 * 10) lifetime_tx_count = 2528.
|
|
88
|
+
*/
|
|
89
|
+
const AGENT_SPEND_OVERLAY_SIZE = 2_528;
|
|
90
|
+
/** Default priority fee when caller doesn't supply one. Conservative. */
|
|
91
|
+
const DEFAULT_PRIORITY_FEE_MICRO_LAMPORTS = 10_000;
|
|
92
|
+
/** `1_000_000_000` lamports per SOL. */
|
|
93
|
+
const LAMPORTS_PER_SOL = 1000000000n;
|
|
94
|
+
/** Microlamports per lamport. */
|
|
95
|
+
const MICRO_LAMPORTS_PER_LAMPORT = 1000000n;
|
|
96
|
+
/** Heuristic: dailyCapUsd above $1,000,000 (6-decimal base units) → warn. */
|
|
97
|
+
const DAILY_CAP_HIGH_THRESHOLD = 1000000000000n;
|
|
98
|
+
/**
|
|
99
|
+
* Upper bound for any 6-decimal USD bigint at the public API edge.
|
|
100
|
+
* Re-exported from `types.U64_MAX` (`18_446_744_073_709_551_615n`). The
|
|
101
|
+
* on-chain program stores these as `u64`; values above overflow there. We
|
|
102
|
+
* reject at the kit edge rather than ship a tx the program will reject.
|
|
103
|
+
*/
|
|
104
|
+
const MAX_USD_BASE_UNITS = U64_MAX;
|
|
105
|
+
/** Mirror of `MIN_TIMELOCK_DURATION` (1800) from `state/mod.rs`. */
|
|
106
|
+
const MIN_TIMELOCK_DURATION_SECONDS = 1800n;
|
|
107
|
+
/** Mirror of `MAX_ALLOWED_DESTINATIONS` (10) from `state/mod.rs`. */
|
|
108
|
+
const MAX_ALLOWED_DESTINATIONS_COUNT = 10;
|
|
109
|
+
// ─── Implementation ──────────────────────────────────────────────────────────
|
|
110
|
+
/**
|
|
111
|
+
* Generate a `CreateVaultPreview` for the dashboard split-screen `/onboard`
|
|
112
|
+
* flow. See module JSDoc for the algorithm and design rationale.
|
|
113
|
+
*
|
|
114
|
+
* @throws {RangeError} If any bigint config field is negative or any count
|
|
115
|
+
* exceeds its on-chain maximum, or if `timelockDuration < 1800n`,
|
|
116
|
+
* or if `developerFeeRate > 500`.
|
|
117
|
+
* @throws {SigilSdkDomainError} If `validateNetwork(config.network)` fails,
|
|
118
|
+
* if `getMinimumBalanceForRentExemption` returns 0n / undefined,
|
|
119
|
+
* or if `createVault()` rejects the config (e.g., owner == agent,
|
|
120
|
+
* spendingLimit > dailyCap aggregate).
|
|
121
|
+
*/
|
|
122
|
+
export async function previewCreateVault(config) {
|
|
123
|
+
// 1. Validate config at the API edge (fail fast, descriptive errors).
|
|
124
|
+
validateConfig(config);
|
|
125
|
+
// Normalize "mainnet-beta" → "mainnet" for createVault / buildOwnerTransaction
|
|
126
|
+
// (which use the short literal type) while still accepting either form.
|
|
127
|
+
const buildNetwork = toBuildNetwork(config.network);
|
|
128
|
+
// 2 + 3. Derive PDAs and fetch rent concurrently.
|
|
129
|
+
//
|
|
130
|
+
// Rent depends on size only, not address — fire all 4 rent RPC fetches
|
|
131
|
+
// in parallel with PDA derivation. PDA derivation is pure CPU (sha256
|
|
132
|
+
// in a 0..255 bump search loop) so overlapping it with network latency
|
|
133
|
+
// removes the serial CPU step from the wall-clock path on hot
|
|
134
|
+
// dashboard re-types.
|
|
135
|
+
//
|
|
136
|
+
// `vault` is the seed for the other three PDAs, so we wrap the
|
|
137
|
+
// dependent chain (`getVaultPDA` → policy/tracker/overlay) in a single
|
|
138
|
+
// async IIFE and `Promise.all` it alongside the rent fetches. Wrapping
|
|
139
|
+
// (rather than `await`-ing the vault PDA up front) keeps the rent
|
|
140
|
+
// promises in a Promise.all from the moment they're created, so a
|
|
141
|
+
// rejecting RPC never produces a transient
|
|
142
|
+
// `PromiseRejectionHandledWarning`.
|
|
143
|
+
const vaultChain = (async () => {
|
|
144
|
+
const [vAddr, vBump] = await getVaultPDA(config.owner, config.vaultId);
|
|
145
|
+
const [policy, tracker, overlay] = await Promise.all([
|
|
146
|
+
getPolicyPDA(vAddr),
|
|
147
|
+
getTrackerPDA(vAddr),
|
|
148
|
+
getAgentOverlayPDA(vAddr, 0),
|
|
149
|
+
]);
|
|
150
|
+
return { vAddr, vBump, policy, tracker, overlay };
|
|
151
|
+
})();
|
|
152
|
+
const [{ vAddr, vBump, policy, tracker, overlay }, vaultRent, policyRent, trackerRent, overlayRent,] = await Promise.all([
|
|
153
|
+
vaultChain,
|
|
154
|
+
fetchRentForSize(config.rpc, AGENT_VAULT_SIZE, "AgentVault"),
|
|
155
|
+
fetchRentForSize(config.rpc, POLICY_CONFIG_SIZE, "PolicyConfig"),
|
|
156
|
+
fetchRentForSize(config.rpc, SPEND_TRACKER_SIZE, "SpendTracker"),
|
|
157
|
+
fetchRentForSize(config.rpc, AGENT_SPEND_OVERLAY_SIZE, "AgentSpendOverlay"),
|
|
158
|
+
]);
|
|
159
|
+
const vaultAddress = vAddr;
|
|
160
|
+
const vaultBump = vBump;
|
|
161
|
+
const [policyAddress, policyBump] = policy;
|
|
162
|
+
const [trackerAddress, trackerBump] = tracker;
|
|
163
|
+
const [overlayAddress, overlayBump] = overlay;
|
|
164
|
+
// 4. Build the pdaList tuple in deterministic on-chain `init` order.
|
|
165
|
+
const pdaList = Object.freeze([
|
|
166
|
+
makePdaInfo("AgentVault", vaultAddress, vaultBump, AGENT_VAULT_SIZE, vaultRent),
|
|
167
|
+
makePdaInfo("PolicyConfig", policyAddress, policyBump, POLICY_CONFIG_SIZE, policyRent),
|
|
168
|
+
makePdaInfo("SpendTracker", trackerAddress, trackerBump, SPEND_TRACKER_SIZE, trackerRent),
|
|
169
|
+
makePdaInfo("AgentSpendOverlay", overlayAddress, overlayBump, AGENT_SPEND_OVERLAY_SIZE, overlayRent),
|
|
170
|
+
]);
|
|
171
|
+
const rentLamports = vaultRent + policyRent + trackerRent + overlayRent;
|
|
172
|
+
// 5. Build the create-vault instructions. `createVault` validates aggregate
|
|
173
|
+
// caps and owner≠agent for us; we propagate its throws.
|
|
174
|
+
const ownerSigner = createNoopSigner(config.owner);
|
|
175
|
+
const agentSigner = createNoopSigner(config.agentAddress);
|
|
176
|
+
const createResult = await createVault({
|
|
177
|
+
rpc: config.rpc,
|
|
178
|
+
network: buildNetwork,
|
|
179
|
+
owner: ownerSigner,
|
|
180
|
+
agent: agentSigner,
|
|
181
|
+
permissions: config.capabilityTier !== undefined
|
|
182
|
+
? config.capabilityTier
|
|
183
|
+
: undefined,
|
|
184
|
+
spendingLimitUsd: config.spendingLimitUsd,
|
|
185
|
+
dailySpendingCapUsd: config.dailyCapUsd,
|
|
186
|
+
maxTransactionSizeUsd: config.maxTxSizeUsd,
|
|
187
|
+
feeDestination: config.feeDestination,
|
|
188
|
+
developerFeeRate: config.developerFeeRate,
|
|
189
|
+
protocols: [...config.protocols],
|
|
190
|
+
protocolMode: config.protocolMode,
|
|
191
|
+
maxSlippageBps: config.maxSlippageBps,
|
|
192
|
+
timelockDuration: Number(config.timelockDuration),
|
|
193
|
+
allowedDestinations: [...config.allowedDestinations],
|
|
194
|
+
vaultId: config.vaultId,
|
|
195
|
+
protocolCaps: config.protocolCaps.length > 0 ? [...config.protocolCaps] : undefined,
|
|
196
|
+
});
|
|
197
|
+
// 6. Compile the unsigned transaction.
|
|
198
|
+
const computeUnits = config.computeUnits ?? CU_VAULT_CREATION;
|
|
199
|
+
const priorityFeeMicroLamports = config.priorityFeeMicroLamports ?? DEFAULT_PRIORITY_FEE_MICRO_LAMPORTS;
|
|
200
|
+
const ownerTx = await buildOwnerTransaction({
|
|
201
|
+
rpc: config.rpc,
|
|
202
|
+
owner: ownerSigner,
|
|
203
|
+
instructions: [
|
|
204
|
+
createResult.initializeVaultIx,
|
|
205
|
+
createResult.registerAgentIx,
|
|
206
|
+
],
|
|
207
|
+
network: buildNetwork,
|
|
208
|
+
computeUnits,
|
|
209
|
+
priorityFeeMicroLamports,
|
|
210
|
+
...(config.blockhash !== undefined ? { blockhash: config.blockhash } : {}),
|
|
211
|
+
...(config.addressLookupTables !== undefined
|
|
212
|
+
? { addressLookupTables: config.addressLookupTables }
|
|
213
|
+
: {}),
|
|
214
|
+
});
|
|
215
|
+
// 7. feeLamports: microLamports per CU * CU / 1_000_000. Mul-before-divide
|
|
216
|
+
// in BigInt to avoid number/bigint mixing.
|
|
217
|
+
const feeLamports = (BigInt(priorityFeeMicroLamports) * BigInt(computeUnits)) /
|
|
218
|
+
MICRO_LAMPORTS_PER_LAMPORT;
|
|
219
|
+
// 8. totalCostUsd: mul-before-divide preserves precision down to 1 unit of
|
|
220
|
+
// 6-decimal USD.
|
|
221
|
+
const totalCostUsd = ((rentLamports + feeLamports) * config.solPriceUsd) / LAMPORTS_PER_SOL;
|
|
222
|
+
const unsignedTxBytes = base64ToUint8Array(ownerTx.wireBase64);
|
|
223
|
+
// 9. lastValidBlockHeight is sourced from the same blockhash baked into the
|
|
224
|
+
// wire bytes — never re-read the cache (TTL refresh would race the bytes
|
|
225
|
+
// the user is about to sign).
|
|
226
|
+
const blockhash = ownerTx.blockhash;
|
|
227
|
+
// 10. Warnings (sorted by code) → undefined when empty so the FE skips
|
|
228
|
+
// rendering the panel.
|
|
229
|
+
const warningsRaw = buildWarnings(config);
|
|
230
|
+
const warnings = warningsRaw.length > 0
|
|
231
|
+
? Object.freeze(warningsRaw)
|
|
232
|
+
: undefined;
|
|
233
|
+
const preview = {
|
|
234
|
+
pdaList,
|
|
235
|
+
rentLamports,
|
|
236
|
+
computeUnits,
|
|
237
|
+
feeLamports,
|
|
238
|
+
totalCostUsd,
|
|
239
|
+
vaultAddress,
|
|
240
|
+
unsignedTxBytes,
|
|
241
|
+
txSizeBytes: ownerTx.txSizeBytes,
|
|
242
|
+
lastValidBlockHeight: blockhash.lastValidBlockHeight,
|
|
243
|
+
...(warnings !== undefined ? { warnings } : {}),
|
|
244
|
+
};
|
|
245
|
+
return Object.freeze(preview);
|
|
246
|
+
}
|
|
247
|
+
// ─── Private helpers ─────────────────────────────────────────────────────────
|
|
248
|
+
/**
|
|
249
|
+
* Build one frozen `VaultPdaInfo` entry for `pdaList`. The literal `name`
|
|
250
|
+
* type is preserved so each tuple slot narrows to its specific account class
|
|
251
|
+
* (e.g. `pdaList[0].name === "AgentVault"`).
|
|
252
|
+
*/
|
|
253
|
+
function makePdaInfo(name, address, bump, sizeBytes, rentLamports) {
|
|
254
|
+
return Object.freeze({
|
|
255
|
+
name,
|
|
256
|
+
address,
|
|
257
|
+
bump,
|
|
258
|
+
sizeBytes,
|
|
259
|
+
rentLamports,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Validate config at the API edge. Throws `RangeError` for value-out-of-range
|
|
264
|
+
* (matches the `composeAgentBootstrap` convention) and lets `validateNetwork`
|
|
265
|
+
* propagate its `SigilSdkDomainError`.
|
|
266
|
+
*/
|
|
267
|
+
function validateConfig(config) {
|
|
268
|
+
// Network — propagates SigilSdkDomainError if invalid.
|
|
269
|
+
validateNetwork(config.network);
|
|
270
|
+
// Negative bigints. `solPriceUsd` rejects 0n too — kit has no oracle, and
|
|
271
|
+
// a price of 0 silently produces `totalCostUsd === 0n` which the FE
|
|
272
|
+
// would render as "Free". Fail loud.
|
|
273
|
+
if (config.vaultId < 0n) {
|
|
274
|
+
throw new RangeError(`vaultId must be >= 0; received ${config.vaultId}`);
|
|
275
|
+
}
|
|
276
|
+
if (config.dailyCapUsd < 0n) {
|
|
277
|
+
throw new RangeError(`dailyCapUsd must be >= 0; received ${config.dailyCapUsd}`);
|
|
278
|
+
}
|
|
279
|
+
if (config.maxTxSizeUsd < 0n) {
|
|
280
|
+
throw new RangeError(`maxTxSizeUsd must be >= 0; received ${config.maxTxSizeUsd}`);
|
|
281
|
+
}
|
|
282
|
+
if (config.spendingLimitUsd < 0n) {
|
|
283
|
+
throw new RangeError(`spendingLimitUsd must be >= 0; received ${config.spendingLimitUsd}`);
|
|
284
|
+
}
|
|
285
|
+
if (config.solPriceUsd <= 0n) {
|
|
286
|
+
throw new RangeError(`solPriceUsd must be > 0n; received ${config.solPriceUsd}. ` +
|
|
287
|
+
`The kit has no oracle — caller must supply a fresh, positive price.`);
|
|
288
|
+
}
|
|
289
|
+
if (config.timelockDuration < 0n) {
|
|
290
|
+
throw new RangeError(`timelockDuration must be >= 0; received ${config.timelockDuration}`);
|
|
291
|
+
}
|
|
292
|
+
// Upper bounds — `u64::MAX` overflow guards. The on-chain program stores
|
|
293
|
+
// these as `u64`; values above `(1 << 64) - 1` overflow there. Reject at
|
|
294
|
+
// the kit edge.
|
|
295
|
+
if (config.dailyCapUsd > MAX_USD_BASE_UNITS) {
|
|
296
|
+
throw new RangeError(`dailyCapUsd must be <= u64::MAX (${MAX_USD_BASE_UNITS}); received ${config.dailyCapUsd}`);
|
|
297
|
+
}
|
|
298
|
+
if (config.maxTxSizeUsd > MAX_USD_BASE_UNITS) {
|
|
299
|
+
throw new RangeError(`maxTxSizeUsd must be <= u64::MAX; received ${config.maxTxSizeUsd}`);
|
|
300
|
+
}
|
|
301
|
+
if (config.spendingLimitUsd > MAX_USD_BASE_UNITS) {
|
|
302
|
+
throw new RangeError(`spendingLimitUsd must be <= u64::MAX; received ${config.spendingLimitUsd}`);
|
|
303
|
+
}
|
|
304
|
+
if (config.solPriceUsd > MAX_USD_BASE_UNITS) {
|
|
305
|
+
throw new RangeError(`solPriceUsd must be <= u64::MAX; received ${config.solPriceUsd}`);
|
|
306
|
+
}
|
|
307
|
+
// `timelockDuration` is a bigint at the API but createVault takes a
|
|
308
|
+
// number. Number can lose precision above 2^53. Reject silently-lossy
|
|
309
|
+
// values rather than ship a tx with a different timelock than the user
|
|
310
|
+
// typed.
|
|
311
|
+
if (config.timelockDuration > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
312
|
+
throw new RangeError(`timelockDuration must be <= Number.MAX_SAFE_INTEGER (${Number.MAX_SAFE_INTEGER}); ` +
|
|
313
|
+
`received ${config.timelockDuration}. Larger values lose precision in the bigint→number cast.`);
|
|
314
|
+
}
|
|
315
|
+
// On-chain hard limits — mirror as early throws.
|
|
316
|
+
if (config.timelockDuration < MIN_TIMELOCK_DURATION_SECONDS) {
|
|
317
|
+
throw new RangeError(`timelockDuration must be >= ${MIN_TIMELOCK_DURATION_SECONDS}n (MIN_TIMELOCK_DURATION); ` +
|
|
318
|
+
`the on-chain program rejects shorter timelocks. Received ${config.timelockDuration}.`);
|
|
319
|
+
}
|
|
320
|
+
if (!Number.isInteger(config.developerFeeRate) ||
|
|
321
|
+
config.developerFeeRate < 0) {
|
|
322
|
+
throw new RangeError(`developerFeeRate must be a non-negative integer; received ${config.developerFeeRate}`);
|
|
323
|
+
}
|
|
324
|
+
if (config.developerFeeRate > MAX_DEVELOPER_FEE_RATE) {
|
|
325
|
+
throw new RangeError(`developerFeeRate must be <= ${MAX_DEVELOPER_FEE_RATE} BPS (MAX_DEVELOPER_FEE_RATE); ` +
|
|
326
|
+
`received ${config.developerFeeRate}`);
|
|
327
|
+
}
|
|
328
|
+
if (!Number.isInteger(config.maxSlippageBps) || config.maxSlippageBps < 0) {
|
|
329
|
+
throw new RangeError(`maxSlippageBps must be a non-negative integer; received ${config.maxSlippageBps}`);
|
|
330
|
+
}
|
|
331
|
+
if (config.protocols.length > MAX_ALLOWED_PROTOCOLS) {
|
|
332
|
+
throw new RangeError(`protocols.length must be <= ${MAX_ALLOWED_PROTOCOLS} (MAX_ALLOWED_PROTOCOLS); ` +
|
|
333
|
+
`received ${config.protocols.length}`);
|
|
334
|
+
}
|
|
335
|
+
if (config.allowedDestinations.length > MAX_ALLOWED_DESTINATIONS_COUNT) {
|
|
336
|
+
throw new RangeError(`allowedDestinations.length must be <= ${MAX_ALLOWED_DESTINATIONS_COUNT} (MAX_ALLOWED_DESTINATIONS); ` +
|
|
337
|
+
`received ${config.allowedDestinations.length}`);
|
|
338
|
+
}
|
|
339
|
+
// protocol_caps when non-empty must align with allowlist mode and length.
|
|
340
|
+
if (config.protocolCaps.length > 0) {
|
|
341
|
+
if (config.protocolMode !== 1) {
|
|
342
|
+
throw new RangeError(`protocolCaps requires protocolMode === 1 (ALLOWLIST); received ${config.protocolMode}`);
|
|
343
|
+
}
|
|
344
|
+
if (config.protocolCaps.length !== config.protocols.length) {
|
|
345
|
+
throw new RangeError(`protocolCaps.length (${config.protocolCaps.length}) must equal protocols.length (${config.protocols.length})`);
|
|
346
|
+
}
|
|
347
|
+
for (const cap of config.protocolCaps) {
|
|
348
|
+
if (cap < 0n) {
|
|
349
|
+
throw new RangeError(`each protocolCaps entry must be >= 0; received ${cap}`);
|
|
350
|
+
}
|
|
351
|
+
if (cap > MAX_USD_BASE_UNITS) {
|
|
352
|
+
throw new RangeError(`each protocolCaps entry must be <= u64::MAX; received ${cap}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// `feeDestination` cannot be the system program (Pubkey::default = all-1s
|
|
357
|
+
// base58); the on-chain program rejects it at line 91-93 of
|
|
358
|
+
// initialize_vault.rs with `InvalidFeeDestination`.
|
|
359
|
+
if (config.feeDestination === SYSTEM_PROGRAM_ADDRESS) {
|
|
360
|
+
throw new RangeError(`feeDestination must not be the system program ` +
|
|
361
|
+
`(${SYSTEM_PROGRAM_ADDRESS}); the on-chain program rejects it as ` +
|
|
362
|
+
`InvalidFeeDestination`);
|
|
363
|
+
}
|
|
364
|
+
// Optional numeric overrides — must be non-negative integers. Negatives
|
|
365
|
+
// and NaN both produce silent drift (negative fee in preview but skipped
|
|
366
|
+
// on-chain; non-integer throws deep in BigInt(...)).
|
|
367
|
+
if (config.priorityFeeMicroLamports !== undefined) {
|
|
368
|
+
if (!Number.isInteger(config.priorityFeeMicroLamports) ||
|
|
369
|
+
config.priorityFeeMicroLamports < 0) {
|
|
370
|
+
throw new RangeError(`priorityFeeMicroLamports must be a non-negative integer; received ${config.priorityFeeMicroLamports}`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (config.computeUnits !== undefined) {
|
|
374
|
+
if (!Number.isInteger(config.computeUnits) || config.computeUnits <= 0) {
|
|
375
|
+
throw new RangeError(`computeUnits must be a positive integer; received ${config.computeUnits}`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Resolve a `NetworkInput` to the `"devnet" | "mainnet"` shape that
|
|
381
|
+
* `createVault` and `buildOwnerTransaction` accept. `validateNetwork` has
|
|
382
|
+
* already gated the input by the time this runs.
|
|
383
|
+
*/
|
|
384
|
+
function toBuildNetwork(network) {
|
|
385
|
+
// After validateNetwork, network is one of "devnet", "mainnet", "mainnet-beta".
|
|
386
|
+
// createVault accepts only the short literal; "mainnet-beta" → "mainnet".
|
|
387
|
+
return network === "devnet" ? "devnet" : "mainnet";
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Wrap `getMinimumBalanceForRentExemption` with explicit defensive checks.
|
|
391
|
+
* If the RPC returns `0n` or anything non-bigint, we surface a typed
|
|
392
|
+
* `SigilSdkDomainError` instead of producing a preview that lies about
|
|
393
|
+
* cost. Caller errors propagate with cause attached.
|
|
394
|
+
*/
|
|
395
|
+
async function fetchRentForSize(rpc, size, pdaName) {
|
|
396
|
+
const rent = await rpc.getMinimumBalanceForRentExemption(BigInt(size)).send();
|
|
397
|
+
if (typeof rent !== "bigint") {
|
|
398
|
+
throw new SigilSdkDomainError(SIGIL_ERROR__SDK__INVALID_PARAMS, `getMinimumBalanceForRentExemption returned non-bigint for ${pdaName} (size=${size})`, { context: { field: pdaName, received: typeof rent } });
|
|
399
|
+
}
|
|
400
|
+
// Reject 0n AND negatives. Rent must always be positive — a "free" PDA
|
|
401
|
+
// doesn't exist on Solana, and a negative rent is non-physical and would
|
|
402
|
+
// produce a negative `totalCostUsd` (FE displays "you'll be paid to
|
|
403
|
+
// create this vault"). Both indicate a misbehaving RPC; surface as a
|
|
404
|
+
// typed throw so the caller can retry / switch RPC.
|
|
405
|
+
if (rent <= 0n) {
|
|
406
|
+
throw new SigilSdkDomainError(SIGIL_ERROR__SDK__INVALID_PARAMS, `getMinimumBalanceForRentExemption returned ${rent} for ${pdaName} (size=${size}); ` +
|
|
407
|
+
`expected a positive lamport value. RPC may be misconfigured or returning stale data.`, { context: { field: pdaName, received: rent } });
|
|
408
|
+
}
|
|
409
|
+
return rent;
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Build the warnings array. Sorted by `code` ascending so the FE's React
|
|
413
|
+
* keys are stable across re-types (no banner flicker). Returns an empty
|
|
414
|
+
* array when nothing fires; the caller converts to `undefined` for the
|
|
415
|
+
* preview shape.
|
|
416
|
+
*/
|
|
417
|
+
function buildWarnings(config) {
|
|
418
|
+
const warnings = [];
|
|
419
|
+
if (config.dailyCapUsd === 0n) {
|
|
420
|
+
warnings.push({
|
|
421
|
+
code: "daily_cap_zero",
|
|
422
|
+
severity: "info",
|
|
423
|
+
message: "Daily spending cap is 0. The vault will accept deposits but the " +
|
|
424
|
+
"agent cannot execute any spending action until the cap is raised.",
|
|
425
|
+
field: "dailyCapUsd",
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
if (config.dailyCapUsd > DAILY_CAP_HIGH_THRESHOLD) {
|
|
429
|
+
warnings.push({
|
|
430
|
+
code: "daily_cap_unusually_high",
|
|
431
|
+
severity: "warning",
|
|
432
|
+
message: "Daily spending cap exceeds $1,000,000 — confirm this matches the " +
|
|
433
|
+
"intended risk tolerance.",
|
|
434
|
+
field: "dailyCapUsd",
|
|
435
|
+
suggestedValue: DAILY_CAP_HIGH_THRESHOLD,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
if (config.protocolMode === 1 && config.protocols.length === 0) {
|
|
439
|
+
warnings.push({
|
|
440
|
+
code: "no_protocols_approved",
|
|
441
|
+
severity: "warning",
|
|
442
|
+
message: "Protocol mode is ALLOWLIST but no protocols are listed; the agent " +
|
|
443
|
+
"cannot reach any DeFi protocol with this policy.",
|
|
444
|
+
field: "protocols",
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
if (config.maxTxSizeUsd > config.dailyCapUsd) {
|
|
448
|
+
warnings.push({
|
|
449
|
+
code: "max_tx_exceeds_daily_cap",
|
|
450
|
+
severity: "warning",
|
|
451
|
+
message: "Max transaction size exceeds daily cap; a single transaction can " +
|
|
452
|
+
"consume the entire 24h budget.",
|
|
453
|
+
field: "maxTxSizeUsd",
|
|
454
|
+
suggestedValue: config.dailyCapUsd,
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
// Sort by code ascending so the FE's React keys stay stable.
|
|
458
|
+
warnings.sort((a, b) => (a.code < b.code ? -1 : a.code > b.code ? 1 : 0));
|
|
459
|
+
// Freeze each warning so callers can't mutate after return. The cast
|
|
460
|
+
// preserves the discriminated-union type Object.freeze would erase to
|
|
461
|
+
// `Readonly<PreviewWarning>`.
|
|
462
|
+
return warnings.map((w) => Object.freeze(w));
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Decode a base64 string to `Uint8Array`. Uses `atob` (built-in in browser
|
|
466
|
+
* and Node ≥ 16) so the kit stays Node-only-free. Validates input shape
|
|
467
|
+
* defensively — `atob` will throw `InvalidCharacterError` on non-base64.
|
|
468
|
+
*/
|
|
469
|
+
function base64ToUint8Array(b64) {
|
|
470
|
+
const binary = atob(b64);
|
|
471
|
+
const bytes = new Uint8Array(binary.length);
|
|
472
|
+
for (let i = 0; i < binary.length; i++) {
|
|
473
|
+
bytes[i] = binary.charCodeAt(i);
|
|
474
|
+
}
|
|
475
|
+
return bytes;
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=preview-create-vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-create-vault.js","sourceRoot":"","sources":["../src/preview-create-vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single Verified-tier annotation shape. Byte-identical to the dashboard's
|
|
3
|
+
* pre-migration interface at `sigil-dashboard/src/lib/protocol-registry/index.ts`
|
|
4
|
+
* so consumers switching from local imports to `@usesigil/kit` see zero
|
|
5
|
+
* behavioral drift.
|
|
6
|
+
*/
|
|
7
|
+
export interface ProtocolAnnotation {
|
|
8
|
+
/** Canonical base58 programId. Hand-verified against the deployed program. */
|
|
9
|
+
readonly programId: string;
|
|
10
|
+
/** Human-readable display name, e.g. "Jupiter V6". */
|
|
11
|
+
readonly name: string;
|
|
12
|
+
/** Always `true` for annotations shipped in this registry. */
|
|
13
|
+
readonly verified: boolean;
|
|
14
|
+
/** Bucket for UI grouping, e.g. "swap-aggregator", "perps", "lending". */
|
|
15
|
+
readonly category: string;
|
|
16
|
+
/** Optional free-form context (CU budget, known quirks, caveats). */
|
|
17
|
+
readonly notes?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* All registered annotations in display order (most-used first). Consumers
|
|
21
|
+
* should NOT mutate — the array is `readonly` at the type level; the
|
|
22
|
+
* underlying data is also `as const` below to guard against runtime edits.
|
|
23
|
+
*/
|
|
24
|
+
export declare const PROTOCOL_ANNOTATIONS: readonly ProtocolAnnotation[];
|
|
25
|
+
/**
|
|
26
|
+
* The set of programIds in the Verified tier. Computed once at module
|
|
27
|
+
* load. `VERIFIED_PROGRAMS.has(programId)` is the canonical synchronous
|
|
28
|
+
* check for "does Sigil have hand-curated metadata for this program."
|
|
29
|
+
*
|
|
30
|
+
* Consumers (dashboard `/api/resolve-protocol`, mobile tier UI, MCP)
|
|
31
|
+
* should query this set — NOT filter PROTOCOL_ANNOTATIONS linearly on the
|
|
32
|
+
* hot path. Use `lookupProtocolAnnotation()` when metadata is also needed.
|
|
33
|
+
*/
|
|
34
|
+
export declare const VERIFIED_PROGRAMS: ReadonlySet<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Look up a protocol annotation by programId. Returns `null` if the
|
|
37
|
+
* programId is NOT in the Verified registry.
|
|
38
|
+
*
|
|
39
|
+
* Currently an O(n) linear search across 7 entries — fast enough that a
|
|
40
|
+
* `Map` lookup would be premature optimization. If the registry grows
|
|
41
|
+
* past ~50 entries, swap to a `Map<string, ProtocolAnnotation>` built
|
|
42
|
+
* once at module load.
|
|
43
|
+
*/
|
|
44
|
+
export declare function lookupProtocolAnnotation(programId: string): ProtocolAnnotation | null;
|
|
45
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocol-registry/index.ts"],"names":[],"mappings":"AAwCA;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,kBAAkB,EAQpD,CAAC;AAEX;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAEjD,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,GAChB,kBAAkB,GAAG,IAAI,CAE3B"}
|