@dfm-fi/agent 0.2.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.
Files changed (59) hide show
  1. package/README.md +326 -0
  2. package/dist/api-client.d.ts +137 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +215 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/config.d.ts +56 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +55 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/create-flow.d.ts +62 -0
  11. package/dist/create-flow.d.ts.map +1 -0
  12. package/dist/create-flow.js +88 -0
  13. package/dist/create-flow.js.map +1 -0
  14. package/dist/examples/deposit-redeem-loop.d.ts +2 -0
  15. package/dist/examples/deposit-redeem-loop.d.ts.map +1 -0
  16. package/dist/examples/deposit-redeem-loop.js +67 -0
  17. package/dist/examples/deposit-redeem-loop.js.map +1 -0
  18. package/dist/examples/launch-deposit-redeem.d.ts +2 -0
  19. package/dist/examples/launch-deposit-redeem.d.ts.map +1 -0
  20. package/dist/examples/launch-deposit-redeem.js +166 -0
  21. package/dist/examples/launch-deposit-redeem.js.map +1 -0
  22. package/dist/examples/list-and-status.d.ts +2 -0
  23. package/dist/examples/list-and-status.d.ts.map +1 -0
  24. package/dist/examples/list-and-status.js +67 -0
  25. package/dist/examples/list-and-status.js.map +1 -0
  26. package/dist/manager-flow.d.ts +73 -0
  27. package/dist/manager-flow.d.ts.map +1 -0
  28. package/dist/manager-flow.js +110 -0
  29. package/dist/manager-flow.js.map +1 -0
  30. package/dist/mcp-server.d.ts +3 -0
  31. package/dist/mcp-server.d.ts.map +1 -0
  32. package/dist/mcp-server.js +529 -0
  33. package/dist/mcp-server.js.map +1 -0
  34. package/dist/recovery-flow.d.ts +81 -0
  35. package/dist/recovery-flow.d.ts.map +1 -0
  36. package/dist/recovery-flow.js +123 -0
  37. package/dist/recovery-flow.js.map +1 -0
  38. package/dist/session.d.ts +52 -0
  39. package/dist/session.d.ts.map +1 -0
  40. package/dist/session.js +107 -0
  41. package/dist/session.js.map +1 -0
  42. package/dist/signing.d.ts +30 -0
  43. package/dist/signing.d.ts.map +1 -0
  44. package/dist/signing.js +129 -0
  45. package/dist/signing.js.map +1 -0
  46. package/dist/submit.d.ts +31 -0
  47. package/dist/submit.d.ts.map +1 -0
  48. package/dist/submit.js +165 -0
  49. package/dist/submit.js.map +1 -0
  50. package/dist/types.d.ts +191 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +16 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/zap-v2-flow.d.ts +76 -0
  55. package/dist/zap-v2-flow.d.ts.map +1 -0
  56. package/dist/zap-v2-flow.js +176 -0
  57. package/dist/zap-v2-flow.js.map +1 -0
  58. package/package.json +60 -0
  59. package/skills.md +153 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Example: the FULL DTF lifecycle a tester runs programmatically —
3
+ * launch (create a vault) → deposit USDC → redeem back to USDC.
4
+ *
5
+ * SAFE WHEN WRITE IS OFF: with DFM_AGENT_WRITE_ENABLED unset, this script does
6
+ * the read-only parts (sign-in, access check, list vaults) and then PRINTS the
7
+ * exact launch/deposit/redeem calls it WOULD make, without moving any funds. Set
8
+ * DFM_AGENT_WRITE_ENABLED=true (+ an RPC + a funded, allowlisted keypair) to
9
+ * actually run the real-money flow.
10
+ *
11
+ * ⚠️ With write ON this MOVES REAL FUNDS on mainnet.
12
+ * REVIEW: real-money path — parent must review before relying on this.
13
+ *
14
+ * Usage (dry-run, default):
15
+ * DFM_API_URL=https://n2-api.dfm.finance \
16
+ * DFM_AGENT_KEYPAIR_PATH=/abs/path/test-wallet.json \
17
+ * npx tsx src/examples/launch-deposit-redeem.ts
18
+ *
19
+ * Usage (real-money, full loop):
20
+ * DFM_API_URL=https://n2-api.dfm.finance \
21
+ * HELIUS_RPC_URL=https://mainnet.helius-rpc.com/?api-key=… \
22
+ * DFM_AGENT_KEYPAIR_PATH=/abs/path/test-wallet.json \
23
+ * DFM_AGENT_WRITE_ENABLED=true \
24
+ * npx tsx src/examples/launch-deposit-redeem.ts
25
+ *
26
+ * Optional env:
27
+ * DEPOSIT_USDC_RAW default "12000000" ($12 — clears the $10 first-mint floor)
28
+ * REDEEM_SHARES_RAW if set, redeems exactly this many raw shares; if unset the
29
+ * script reads the share balance from the portfolio and
30
+ * redeems the full position.
31
+ */
32
+ import { loadConfig } from '../config.js';
33
+ import { SiwsSession } from '../session.js';
34
+ import { DfmApiClient } from '../api-client.js';
35
+ import { runLaunchVault } from '../create-flow.js';
36
+ import { runDeposit, runRedeem } from '../zap-v2-flow.js';
37
+ // A tiny 2-asset basket of mints that are ALREADY registered on-chain + Pyth-
38
+ // mapped (they appear in a live vault, so create_vault won't reject them). Adjust
39
+ // to taste — but each mint MUST be factory-registered + have a Pyth feed, and the
40
+ // weights MUST sum to 10000 bps.
41
+ const ETH = '7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs'; // Wormhole WETH (in TEST8)
42
+ const JUP = 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN'; // Jupiter (in TEST8)
43
+ const DEMO_BASKET = {
44
+ name: 'Agent Demo DTF',
45
+ symbol: 'AGTDEMO',
46
+ dtfType: 'index',
47
+ category: 255,
48
+ managementFeeBps: 100, // 1%/yr
49
+ exitFeeBps: 100, // 1%
50
+ assets: [
51
+ { mint: ETH, symbol: 'ETH', mintBps: 5000 },
52
+ { mint: JUP, symbol: 'JUP', mintBps: 5000 },
53
+ ],
54
+ };
55
+ async function main() {
56
+ const config = loadConfig();
57
+ const session = new SiwsSession(config);
58
+ const api = new DfmApiClient(config, session);
59
+ const depositRaw = process.env.DEPOSIT_USDC_RAW ?? '12000000';
60
+ console.log(`API: ${config.apiUrl} (${config.cluster})`);
61
+ console.log(`Write: ${config.writeEnabled ? 'ENABLED (real funds)' : 'OFF (dry-run)'}`);
62
+ // Load the wallet pubkey (needs a keypair). In dry-run we tolerate its absence
63
+ // so the plan still prints; the real-money path requires it.
64
+ let wallet = null;
65
+ try {
66
+ wallet = session.walletAddress; // loads the keypair, surfaces pubkey only
67
+ console.log(`Wallet: ${wallet}`);
68
+ }
69
+ catch (e) {
70
+ if (config.writeEnabled)
71
+ throw e;
72
+ console.log(`Wallet: (no keypair configured — ${e.message})`);
73
+ }
74
+ // Access-gate check (read-only) — the wallet must be allowlisted to sign in.
75
+ if (wallet) {
76
+ try {
77
+ const gate = await api.getAccessStatus(wallet);
78
+ console.log(`Access: enabled=${gate.enabled} allowed=${gate.allowed}`);
79
+ if (gate.enabled && !gate.allowed) {
80
+ console.log('→ This wallet is NOT allowlisted. Have an admin add it (POST /access/allowlist).');
81
+ }
82
+ }
83
+ catch (e) {
84
+ console.log(`(access check skipped: ${e.message})`);
85
+ }
86
+ }
87
+ // A read to prove the public API works (and show the current vault count).
88
+ const list = await api.listVaults({ limit: 5 });
89
+ console.log(`\nVaults visible: ${list.total}`);
90
+ if (!config.writeEnabled) {
91
+ console.log('\n── DRY-RUN (write OFF) — the real-money calls that WOULD run: ──');
92
+ console.log(`1. launch_vault ${JSON.stringify(DEMO_BASKET, null, 2)}`);
93
+ console.log(`2. deposit { vault: <new vault>, usdcAmount: "${depositRaw}" }`);
94
+ console.log(`3. redeem { vault: <new vault>, shares: "<full position>" }`);
95
+ console.log('\nSet DFM_AGENT_WRITE_ENABLED=true (+ HELIUS_RPC_URL + funded keypair) to execute.');
96
+ return;
97
+ }
98
+ if (!config.rpcUrl) {
99
+ console.error('\nRefusing: write is ON but no RPC. Set HELIUS_RPC_URL to submit transactions.');
100
+ process.exit(1);
101
+ }
102
+ if (!wallet) {
103
+ // Unreachable (write-enabled loads the keypair above, which throws if absent)
104
+ // — narrows the type for the deposit/redeem calls below.
105
+ console.error('\nRefusing: no test wallet loaded.');
106
+ process.exit(1);
107
+ }
108
+ // 1. LAUNCH.
109
+ console.log('\n→ LAUNCH (create DTF)…');
110
+ const launch = await runLaunchVault(config, api, DEMO_BASKET);
111
+ console.log(JSON.stringify(launch, null, 2));
112
+ if (!launch.ok) {
113
+ console.error('Launch did not fully complete — see message above. Stopping.');
114
+ process.exit(1);
115
+ }
116
+ const vault = launch.vault;
117
+ // 2. DEPOSIT.
118
+ console.log(`\n→ DEPOSIT ${depositRaw} raw USDC into ${vault}…`);
119
+ const dep = await runDeposit(config, api, wallet, vault, depositRaw);
120
+ console.log(JSON.stringify(dep, null, 2));
121
+ // Read the resulting position to size the redeem.
122
+ console.log('\n→ position after deposit…');
123
+ const positions = (await api.getPortfolioPositions());
124
+ console.log(JSON.stringify(positions, null, 2));
125
+ // 3. REDEEM. Prefer an explicit env; else try to read the share balance for
126
+ // this vault out of the portfolio payload (shape-tolerant).
127
+ const sharesRaw = process.env.REDEEM_SHARES_RAW ?? extractShareBalance(positions, vault);
128
+ if (!sharesRaw) {
129
+ console.log('\nCould not auto-determine the share balance to redeem. Set REDEEM_SHARES_RAW ' +
130
+ '(raw 6dp) to the amount to redeem and re-run, or call redeem manually.');
131
+ return;
132
+ }
133
+ console.log(`\n→ REDEEM ${sharesRaw} raw shares from ${vault}…`);
134
+ const red = await runRedeem(config, api, wallet, vault, sharesRaw);
135
+ console.log(JSON.stringify(red, null, 2));
136
+ console.log('\n✓ Full launch → deposit → redeem loop complete.');
137
+ }
138
+ /**
139
+ * Best-effort extraction of a raw 6dp share balance for `vault` from the
140
+ * /portfolio payload. The shape isn't strictly typed by the API, so we probe a
141
+ * few likely fields and fall back to null (caller then asks for an explicit env).
142
+ */
143
+ function extractShareBalance(positions, vault) {
144
+ const arr = Array.isArray(positions)
145
+ ? positions
146
+ : positions?.positions;
147
+ if (!Array.isArray(arr))
148
+ return null;
149
+ for (const p of arr) {
150
+ const row = p;
151
+ const addr = row.vault ?? row.vaultAddress ?? row.address;
152
+ if (addr !== vault)
153
+ continue;
154
+ const bal = row.sharesRaw ?? row.shareBalanceRaw ?? row.balanceRaw ?? row.shares ?? row.balance;
155
+ if (typeof bal === 'string' && /^[1-9]\d*$/.test(bal))
156
+ return bal;
157
+ if (typeof bal === 'number' && Number.isInteger(bal) && bal > 0)
158
+ return String(bal);
159
+ }
160
+ return null;
161
+ }
162
+ main().catch((e) => {
163
+ console.error(e);
164
+ process.exit(1);
165
+ });
166
+ //# sourceMappingURL=launch-deposit-redeem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-deposit-redeem.js","sourceRoot":"","sources":["../../src/examples/launch-deposit-redeem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list-and-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-and-status.d.ts","sourceRoot":"","sources":["../../src/examples/list-and-status.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Example (READ-ONLY): list vaults, read one vault's detail, and check the
3
+ * signed-in test wallet's zap-v2 escrow status + portfolio. Proves the live
4
+ * read path end-to-end without moving any funds.
5
+ *
6
+ * Usage:
7
+ * DFM_API_URL=https://n2-api.dfm.finance \
8
+ * DFM_AGENT_KEYPAIR_PATH=/abs/path/test-wallet.json \
9
+ * npx tsx src/examples/list-and-status.ts
10
+ *
11
+ * The keypair is only used to SIWS-sign in (so /portfolio + /zap-v2/status
12
+ * resolve). It is never logged. The wallet must be on the closed-alpha allowlist
13
+ * for the authed reads to succeed; the public /vaults reads work regardless.
14
+ */
15
+ import { loadConfig } from '../config.js';
16
+ import { SiwsSession } from '../session.js';
17
+ import { DfmApiClient } from '../api-client.js';
18
+ async function main() {
19
+ const config = loadConfig();
20
+ const session = new SiwsSession(config);
21
+ const api = new DfmApiClient(config, session);
22
+ console.log(`API: ${config.apiUrl} | cluster: ${config.cluster}`);
23
+ // 1. Public: list vaults.
24
+ const list = await api.listVaults({ limit: 10 });
25
+ console.log(`\n${list.total} vault(s):`);
26
+ for (const v of list.vaults) {
27
+ console.log(` ${v.address} ${v.vaultSymbol ?? '?'} tvl=${v.tvl ?? '0'} price=${v.sharePrice ?? '?'} ${v.status ?? (v.closed ? 'closed' : v.paused ? 'paused' : 'active')}`);
28
+ }
29
+ if (list.vaults.length === 0) {
30
+ console.log('No vaults — nothing more to show.');
31
+ return;
32
+ }
33
+ const target = list.vaults[0].address;
34
+ // 2. Public: vault detail.
35
+ const detail = await api.getVault(target);
36
+ console.log(`\nDetail for ${target}:`);
37
+ console.log(JSON.stringify(detail.feeStructure ?? {}, null, 2));
38
+ // 3. Authed reads — require SIWS sign-in (loads the test keypair).
39
+ let wallet;
40
+ try {
41
+ wallet = session.walletAddress;
42
+ }
43
+ catch (e) {
44
+ console.log(`\n(skipping authed reads — no test keypair configured: ${e.message})`);
45
+ return;
46
+ }
47
+ console.log(`\nSigned-in test wallet: ${wallet}`);
48
+ try {
49
+ const status = await api.getZapV2Status(target, wallet);
50
+ console.log(`zap-v2 escrow on ${target}:`, status ? JSON.stringify(status, null, 2) : 'none');
51
+ }
52
+ catch (e) {
53
+ console.log(`zap_status error: ${e.message}`);
54
+ }
55
+ try {
56
+ const positions = await api.getPortfolioPositions();
57
+ console.log('Portfolio positions:', JSON.stringify(positions, null, 2));
58
+ }
59
+ catch (e) {
60
+ console.log(`portfolio error: ${e.message}`);
61
+ }
62
+ }
63
+ main().catch((e) => {
64
+ console.error(e);
65
+ process.exit(1);
66
+ });
67
+ //# sourceMappingURL=list-and-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-and-status.js","sourceRoot":"","sources":["../../src/examples/list-and-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Vault MANAGER lifecycle drivers — rebalance the basket, update the management
3
+ * fee, initiate an admin transfer. These are the manager-side actions a human
4
+ * does in the web (AssetManagement page); exposing them lets an agent manage a
5
+ * vault it launched, not just trade it.
6
+ *
7
+ * ⚠️ GATED behind DFM_AGENT_WRITE_ENABLED. SECURITY MODEL:
8
+ * - Each action targets ONLY a vault the signed-in test wallet ADMINS — the API
9
+ * enforces `vault.vaultAdmin === caller` (403/400 otherwise), so an agent can
10
+ * only manage ITS OWN vaults, never another user's.
11
+ * - Every constraint is bounded by the on-chain program + the API (full-replace
12
+ * basket must sum to 10000 bps, ≤15 assets, no dupes, manual-mode + 24h
13
+ * timelock; fee ≤2000 bps; fees-immutable vaults reject a fee change).
14
+ * - `transfer_admin` is the one HIGH-SENSITIVITY action: it hands vault control
15
+ * to another key (the new admin must still ACCEPT to complete it). It only
16
+ * ever affects the agent's own vault, but a prompt-injected agent could be
17
+ * coaxed into starting a transfer — so the tool warns loudly + is write-gated,
18
+ * and a human reviewing the agent's actions is the final guard.
19
+ * REVIEW: real-money / control path — parent must review before enabling.
20
+ */
21
+ import type { AgentConfig } from './config.js';
22
+ import type { DfmApiClient } from './api-client.js';
23
+ import type { CreateAssetInput } from './types.js';
24
+ export interface UpdateAssetsResult {
25
+ ok: boolean;
26
+ vault: string;
27
+ signature: string;
28
+ /** Set when /assets/confirm failed AFTER the tx landed (cache lag, not a loss). */
29
+ confirmError?: string;
30
+ message: string;
31
+ }
32
+ export interface UpdateFeeResult {
33
+ ok: boolean;
34
+ vault: string;
35
+ signature: string;
36
+ managementFeeBps: number;
37
+ message: string;
38
+ }
39
+ export interface TransferAdminResult {
40
+ ok: boolean;
41
+ vault: string;
42
+ signature: string;
43
+ newAdmin: string;
44
+ message: string;
45
+ }
46
+ /**
47
+ * Validate a FULL-REPLACE basket client-side (mirrors the API + contract): 1..15
48
+ * assets, allocations sum to exactly 10000 bps, no duplicate mints, each weight
49
+ * 1..10000. Fast, clear failures before the network round-trip.
50
+ */
51
+ export declare function validateManagerBasket(assets: CreateAssetInput[]): void;
52
+ /**
53
+ * Rebalance the vault's basket — a FULL REPLACE with the new target weights.
54
+ * Only works on a vault the test wallet admins, in MANUAL rebalance mode, outside
55
+ * the 24h config timelock (the API returns a clear 4xx otherwise). prepare → sign
56
+ * → submit → confirm (confirm is bookkeeping: on failure the on-chain change still
57
+ * stands, surfaced as confirmError so it's never silently lost).
58
+ */
59
+ export declare function runUpdateVaultAssets(config: AgentConfig, api: DfmApiClient, vault: string, assets: CreateAssetInput[]): Promise<UpdateAssetsResult>;
60
+ /**
61
+ * Update the vault's management fee (bps, ≤2000 = 20%/yr). NOTE: vaults created by
62
+ * this agent are IMMUTABLE-fee by default, so this will revert "fees locked" on
63
+ * them — it only applies to a mutable-fee vault the test wallet admins.
64
+ */
65
+ export declare function runUpdateManagementFee(config: AgentConfig, api: DfmApiClient, vault: string, managementFeeBps: number): Promise<UpdateFeeResult>;
66
+ /**
67
+ * HIGH-SENSITIVITY: initiate transferring vault ADMIN control to `newAdmin`. This
68
+ * is a 2-step hand-off — the new admin must separately ACCEPT before it takes
69
+ * effect — but it starts giving away control of the vault. Only ever do this when
70
+ * the human explicitly asked. Only affects a vault the test wallet admins.
71
+ */
72
+ export declare function runTransferAdmin(config: AgentConfig, api: DfmApiClient, vault: string, newAdmin: string): Promise<TransferAdminResult>;
73
+ //# sourceMappingURL=manager-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-flow.d.ts","sourceRoot":"","sources":["../src/manager-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMnD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CA0BtE;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,EAAE,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAmC7B;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,eAAe,CAAC,CA0B1B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CAmB9B"}
@@ -0,0 +1,110 @@
1
+ import { signBase64Transaction } from './signing.js';
2
+ import { submitSignedTx } from './submit.js';
3
+ const MAX_ASSETS = 15; // mainnet basket cap (matches the API + create flow)
4
+ /**
5
+ * Validate a FULL-REPLACE basket client-side (mirrors the API + contract): 1..15
6
+ * assets, allocations sum to exactly 10000 bps, no duplicate mints, each weight
7
+ * 1..10000. Fast, clear failures before the network round-trip.
8
+ */
9
+ export function validateManagerBasket(assets) {
10
+ if (!assets || assets.length === 0) {
11
+ throw new Error('update_vault_assets needs at least 1 basket asset.');
12
+ }
13
+ if (assets.length > MAX_ASSETS) {
14
+ throw new Error(`Basket has ${assets.length} assets — the mainnet cap is ${MAX_ASSETS}.`);
15
+ }
16
+ const sum = assets.reduce((acc, a) => acc + a.mintBps, 0);
17
+ if (sum !== 10_000) {
18
+ throw new Error(`Basket allocations must sum to exactly 10000 bps; got ${sum}. ` +
19
+ `(${assets.map((a) => `${a.symbol}=${a.mintBps}`).join(', ')})`);
20
+ }
21
+ const seen = new Set();
22
+ for (const a of assets) {
23
+ if (!Number.isInteger(a.mintBps) || a.mintBps <= 0 || a.mintBps > 10_000) {
24
+ throw new Error(`Asset ${a.symbol} has invalid mintBps ${a.mintBps} (must be 1..10000).`);
25
+ }
26
+ if (seen.has(a.mint)) {
27
+ throw new Error(`Duplicate mint in the basket: ${a.mint}.`);
28
+ }
29
+ seen.add(a.mint);
30
+ }
31
+ }
32
+ /**
33
+ * Rebalance the vault's basket — a FULL REPLACE with the new target weights.
34
+ * Only works on a vault the test wallet admins, in MANUAL rebalance mode, outside
35
+ * the 24h config timelock (the API returns a clear 4xx otherwise). prepare → sign
36
+ * → submit → confirm (confirm is bookkeeping: on failure the on-chain change still
37
+ * stands, surfaced as confirmError so it's never silently lost).
38
+ */
39
+ export async function runUpdateVaultAssets(config, api, vault, assets) {
40
+ validateManagerBasket(assets);
41
+ const prepared = await api.prepareUpdateAssets(vault, assets);
42
+ const signed = signBase64Transaction(config, prepared.transaction);
43
+ const signature = await submitSignedTx(config, signed, prepared.blockhash, prepared.lastValidBlockHeight);
44
+ try {
45
+ await api.confirmUpdateAssets(vault, signature);
46
+ }
47
+ catch (e) {
48
+ return {
49
+ ok: true, // the on-chain change LANDED; only the cache refresh failed.
50
+ vault,
51
+ signature,
52
+ confirmError: e.message,
53
+ message: `Basket replaced on-chain (tx ${signature.slice(0, 16)}…) but /assets/confirm ` +
54
+ `failed: ${e.message}. The change IS live on-chain; the API cache ` +
55
+ `will reconcile shortly (or retry confirm).`,
56
+ };
57
+ }
58
+ return {
59
+ ok: true,
60
+ vault,
61
+ signature,
62
+ message: `Vault ${vault.slice(0, 8)}… basket replaced with ${assets.length} asset(s) ` +
63
+ `(${assets.map((a) => `${a.symbol}=${a.mintBps}`).join(', ')}). Tx ${signature.slice(0, 16)}….`,
64
+ };
65
+ }
66
+ /**
67
+ * Update the vault's management fee (bps, ≤2000 = 20%/yr). NOTE: vaults created by
68
+ * this agent are IMMUTABLE-fee by default, so this will revert "fees locked" on
69
+ * them — it only applies to a mutable-fee vault the test wallet admins.
70
+ */
71
+ export async function runUpdateManagementFee(config, api, vault, managementFeeBps) {
72
+ if (!Number.isInteger(managementFeeBps) ||
73
+ managementFeeBps < 0 ||
74
+ managementFeeBps > 2_000) {
75
+ throw new Error('managementFeeBps must be an integer 0..2000 (≤20%/yr).');
76
+ }
77
+ const prepared = await api.prepareUpdateManagementFee(vault, managementFeeBps);
78
+ const signed = signBase64Transaction(config, prepared.transaction);
79
+ const signature = await submitSignedTx(config, signed, prepared.blockhash, prepared.lastValidBlockHeight);
80
+ return {
81
+ ok: true,
82
+ vault,
83
+ signature,
84
+ managementFeeBps,
85
+ message: `Management fee set to ${managementFeeBps} bps on vault ${vault.slice(0, 8)}… ` +
86
+ `(tx ${signature.slice(0, 16)}…). If the vault's fees are immutable this reverts — ` +
87
+ `agent-created vaults are immutable by default.`,
88
+ };
89
+ }
90
+ /**
91
+ * HIGH-SENSITIVITY: initiate transferring vault ADMIN control to `newAdmin`. This
92
+ * is a 2-step hand-off — the new admin must separately ACCEPT before it takes
93
+ * effect — but it starts giving away control of the vault. Only ever do this when
94
+ * the human explicitly asked. Only affects a vault the test wallet admins.
95
+ */
96
+ export async function runTransferAdmin(config, api, vault, newAdmin) {
97
+ const prepared = await api.prepareTransferAdmin(vault, newAdmin);
98
+ const signed = signBase64Transaction(config, prepared.transaction);
99
+ const signature = await submitSignedTx(config, signed, prepared.blockhash, prepared.lastValidBlockHeight);
100
+ return {
101
+ ok: true,
102
+ vault,
103
+ signature,
104
+ newAdmin,
105
+ message: `INITIATED admin transfer of vault ${vault.slice(0, 8)}… to ${newAdmin.slice(0, 8)}… ` +
106
+ `(tx ${signature.slice(0, 16)}…). The NEW admin must ACCEPT to complete it. This hands ` +
107
+ `over control of the vault — confirm the human intended it.`,
108
+ };
109
+ }
110
+ //# sourceMappingURL=manager-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-flow.js","sourceRoot":"","sources":["../src/manager-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":""}