@dfm-fi/agent 0.2.1846 → 0.2.1856

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 (97) hide show
  1. package/README.md +77 -400
  2. package/dist/mcp-server.js +4 -4
  3. package/package.json +4 -6
  4. package/dist/api-client.d.ts.map +0 -1
  5. package/dist/api-client.js.map +0 -1
  6. package/dist/cli.d.ts.map +0 -1
  7. package/dist/cli.js.map +0 -1
  8. package/dist/config.d.ts.map +0 -1
  9. package/dist/config.js.map +0 -1
  10. package/dist/control-flow.test.d.ts +0 -2
  11. package/dist/control-flow.test.d.ts.map +0 -1
  12. package/dist/control-flow.test.js +0 -259
  13. package/dist/control-flow.test.js.map +0 -1
  14. package/dist/create-flow.d.ts.map +0 -1
  15. package/dist/create-flow.js.map +0 -1
  16. package/dist/create-flow.metadata.test.d.ts +0 -2
  17. package/dist/create-flow.metadata.test.d.ts.map +0 -1
  18. package/dist/create-flow.metadata.test.js +0 -100
  19. package/dist/create-flow.metadata.test.js.map +0 -1
  20. package/dist/examples/fund-app-wallet.d.ts +0 -2
  21. package/dist/examples/fund-app-wallet.d.ts.map +0 -1
  22. package/dist/examples/fund-app-wallet.js +0 -39
  23. package/dist/examples/fund-app-wallet.js.map +0 -1
  24. package/dist/examples/launch-deposit-redeem.d.ts +0 -2
  25. package/dist/examples/launch-deposit-redeem.d.ts.map +0 -1
  26. package/dist/examples/launch-deposit-redeem.js +0 -150
  27. package/dist/examples/launch-deposit-redeem.js.map +0 -1
  28. package/dist/examples/list-and-status.d.ts +0 -2
  29. package/dist/examples/list-and-status.d.ts.map +0 -1
  30. package/dist/examples/list-and-status.js +0 -66
  31. package/dist/examples/list-and-status.js.map +0 -1
  32. package/dist/examples/rebalance-drill.d.ts +0 -2
  33. package/dist/examples/rebalance-drill.d.ts.map +0 -1
  34. package/dist/examples/rebalance-drill.js +0 -20
  35. package/dist/examples/rebalance-drill.js.map +0 -1
  36. package/dist/examples/recover-app-wallet-assets.d.ts +0 -2
  37. package/dist/examples/recover-app-wallet-assets.d.ts.map +0 -1
  38. package/dist/examples/recover-app-wallet-assets.js +0 -86
  39. package/dist/examples/recover-app-wallet-assets.js.map +0 -1
  40. package/dist/examples/zap-cycle.d.ts +0 -2
  41. package/dist/examples/zap-cycle.d.ts.map +0 -1
  42. package/dist/examples/zap-cycle.js +0 -56
  43. package/dist/examples/zap-cycle.js.map +0 -1
  44. package/dist/examples/zap-soak.d.ts +0 -2
  45. package/dist/examples/zap-soak.d.ts.map +0 -1
  46. package/dist/examples/zap-soak.js +0 -164
  47. package/dist/examples/zap-soak.js.map +0 -1
  48. package/dist/install.d.ts.map +0 -1
  49. package/dist/install.js.map +0 -1
  50. package/dist/keyless.d.ts.map +0 -1
  51. package/dist/keyless.js.map +0 -1
  52. package/dist/manager-flow.d.ts.map +0 -1
  53. package/dist/manager-flow.js.map +0 -1
  54. package/dist/manager-flow.reconfigure.test.d.ts +0 -2
  55. package/dist/manager-flow.reconfigure.test.d.ts.map +0 -1
  56. package/dist/manager-flow.reconfigure.test.js +0 -210
  57. package/dist/manager-flow.reconfigure.test.js.map +0 -1
  58. package/dist/mcp-server.confirm-gate.test.d.ts +0 -2
  59. package/dist/mcp-server.confirm-gate.test.d.ts.map +0 -1
  60. package/dist/mcp-server.confirm-gate.test.js +0 -222
  61. package/dist/mcp-server.confirm-gate.test.js.map +0 -1
  62. package/dist/mcp-server.d.ts.map +0 -1
  63. package/dist/mcp-server.js.map +0 -1
  64. package/dist/money-path.test.d.ts +0 -2
  65. package/dist/money-path.test.d.ts.map +0 -1
  66. package/dist/money-path.test.js +0 -193
  67. package/dist/money-path.test.js.map +0 -1
  68. package/dist/recovery-flow.d.ts.map +0 -1
  69. package/dist/recovery-flow.deadleg.test.d.ts +0 -2
  70. package/dist/recovery-flow.deadleg.test.d.ts.map +0 -1
  71. package/dist/recovery-flow.deadleg.test.js +0 -143
  72. package/dist/recovery-flow.deadleg.test.js.map +0 -1
  73. package/dist/recovery-flow.js.map +0 -1
  74. package/dist/session.d.ts.map +0 -1
  75. package/dist/session.js.map +0 -1
  76. package/dist/signing.d.ts.map +0 -1
  77. package/dist/signing.js.map +0 -1
  78. package/dist/submit.d.ts.map +0 -1
  79. package/dist/submit.js.map +0 -1
  80. package/dist/types.d.ts.map +0 -1
  81. package/dist/types.js.map +0 -1
  82. package/dist/wallet-identity.d.ts.map +0 -1
  83. package/dist/wallet-identity.js.map +0 -1
  84. package/dist/wallet-identity.test.d.ts +0 -2
  85. package/dist/wallet-identity.test.d.ts.map +0 -1
  86. package/dist/wallet-identity.test.js +0 -56
  87. package/dist/wallet-identity.test.js.map +0 -1
  88. package/dist/who-pays.test.d.ts +0 -2
  89. package/dist/who-pays.test.d.ts.map +0 -1
  90. package/dist/who-pays.test.js +0 -56
  91. package/dist/who-pays.test.js.map +0 -1
  92. package/dist/zap-v2-flow.d.ts.map +0 -1
  93. package/dist/zap-v2-flow.js.map +0 -1
  94. package/dist/zap-v2-flow.pending.test.d.ts +0 -2
  95. package/dist/zap-v2-flow.pending.test.d.ts.map +0 -1
  96. package/dist/zap-v2-flow.pending.test.js +0 -147
  97. package/dist/zap-v2-flow.pending.test.js.map +0 -1
@@ -1,150 +0,0 @@
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, 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 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://app.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://app.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 established mints (open universe — no pre-registration
38
- // or Pyth feed). Listing is validated inline against the live factory/fund-tier
39
- // rules; freeze authority is a disclosed risk and not a v1 hard block. Weights sum to
40
- // 10000 bps. Fees are read from the factory; callers cannot override them.
41
- const ETH = '7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs'; // Wormhole WETH
42
- const JUP = 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN'; // Jupiter
43
- const DEMO_BASKET = {
44
- name: 'Agent Demo Fund',
45
- symbol: 'AGTDEMO',
46
- category: 255,
47
- assets: [
48
- { mint: ETH, symbol: 'ETH', mintBps: 5000 },
49
- { mint: JUP, symbol: 'JUP', mintBps: 5000 },
50
- ],
51
- };
52
- async function main() {
53
- const config = loadConfig();
54
- const session = new SiwsSession(config);
55
- const api = new DfmApiClient(config, session);
56
- const depositRaw = process.env.DEPOSIT_USDC_RAW ?? '12000000';
57
- console.log(`API: ${config.apiUrl} (${config.cluster})`);
58
- console.log(`Write: ${config.writeEnabled ? 'ENABLED (real funds)' : 'OFF (dry-run)'}`);
59
- // Load the wallet pubkey (needs a keypair). In dry-run we tolerate its absence
60
- // so the plan still prints; the real-money path requires it.
61
- let wallet = null;
62
- try {
63
- wallet = session.walletAddress; // loads the keypair, surfaces pubkey only
64
- console.log(`Wallet: ${wallet}`);
65
- }
66
- catch (e) {
67
- if (config.writeEnabled)
68
- throw e;
69
- console.log(`Wallet: (no keypair configured — ${e.message})`);
70
- }
71
- // A read to prove the public API works (and show the current vault count).
72
- const list = await api.listVaults({ limit: 5 });
73
- console.log(`\nVaults visible: ${list.total}`);
74
- if (!config.writeEnabled) {
75
- console.log('\n── DRY-RUN (write OFF) — the real-money calls that WOULD run: ──');
76
- console.log(`1. launch_vault ${JSON.stringify(DEMO_BASKET, null, 2)}`);
77
- console.log(`2. deposit { vault: <new vault>, usdcAmount: "${depositRaw}" }`);
78
- console.log(`3. redeem { vault: <new vault>, shares: "<full position>" }`);
79
- console.log('\nSet DFM_AGENT_WRITE_ENABLED=true (+ HELIUS_RPC_URL + funded keypair) to execute.');
80
- return;
81
- }
82
- if (!config.rpcUrl) {
83
- console.error('\nRefusing: write is ON but no RPC. Set HELIUS_RPC_URL to submit transactions.');
84
- process.exit(1);
85
- }
86
- if (!wallet) {
87
- // Unreachable (write-enabled loads the keypair above, which throws if absent)
88
- // — narrows the type for the deposit/redeem calls below.
89
- console.error('\nRefusing: no test wallet loaded.');
90
- process.exit(1);
91
- }
92
- // 1. LAUNCH.
93
- console.log('\n→ LAUNCH (create fund)…');
94
- const launch = await runLaunchVault(config, api, DEMO_BASKET);
95
- console.log(JSON.stringify(launch, null, 2));
96
- if (!launch.ok) {
97
- console.error('Launch did not fully complete — see message above. Stopping.');
98
- process.exit(1);
99
- }
100
- const vault = launch.vault;
101
- // 2. DEPOSIT.
102
- console.log(`\n→ DEPOSIT ${depositRaw} raw USDC into ${vault}…`);
103
- const dep = await runDeposit(config, api, wallet, vault, depositRaw);
104
- console.log(JSON.stringify(dep, null, 2));
105
- // Read the resulting position to size the redeem.
106
- console.log('\n→ position after deposit…');
107
- const positions = (await api.getPortfolioPositions());
108
- console.log(JSON.stringify(positions, null, 2));
109
- // 3. REDEEM. Prefer an explicit env; else try to read the share balance for
110
- // this vault out of the portfolio payload (shape-tolerant).
111
- const sharesRaw = process.env.REDEEM_SHARES_RAW ?? extractShareBalance(positions, vault);
112
- if (!sharesRaw) {
113
- console.log('\nCould not auto-determine the share balance to redeem. Set REDEEM_SHARES_RAW ' +
114
- '(raw 6dp) to the amount to redeem and re-run, or call redeem manually.');
115
- return;
116
- }
117
- console.log(`\n→ REDEEM ${sharesRaw} raw shares from ${vault}…`);
118
- const red = await runRedeem(config, api, wallet, vault, sharesRaw);
119
- console.log(JSON.stringify(red, null, 2));
120
- console.log('\n✓ Full launch → deposit → redeem loop complete.');
121
- }
122
- /**
123
- * Best-effort extraction of a raw 6dp share balance for `vault` from the
124
- * /portfolio payload. The shape isn't strictly typed by the API, so we probe a
125
- * few likely fields and fall back to null (caller then asks for an explicit env).
126
- */
127
- function extractShareBalance(positions, vault) {
128
- const arr = Array.isArray(positions)
129
- ? positions
130
- : positions?.positions;
131
- if (!Array.isArray(arr))
132
- return null;
133
- for (const p of arr) {
134
- const row = p;
135
- const addr = row.vault ?? row.vaultAddress ?? row.address;
136
- if (addr !== vault)
137
- continue;
138
- const bal = row.sharesRaw ?? row.shareBalanceRaw ?? row.balanceRaw ?? row.shares ?? row.balance;
139
- if (typeof bal === 'string' && /^[1-9]\d*$/.test(bal))
140
- return bal;
141
- if (typeof bal === 'number' && Number.isInteger(bal) && bal > 0)
142
- return String(bal);
143
- }
144
- return null;
145
- }
146
- main().catch((e) => {
147
- console.error(e);
148
- process.exit(1);
149
- });
150
- //# sourceMappingURL=launch-deposit-redeem.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"launch-deposit-redeem.js","sourceRoot":"","sources":["../../src/examples/launch-deposit-redeem.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=list-and-status.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-and-status.d.ts","sourceRoot":"","sources":["../../src/examples/list-and-status.ts"],"names":[],"mappings":""}
@@ -1,66 +0,0 @@
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://app.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 public /vaults reads work without it.
13
- */
14
- import { loadConfig } from '../config.js';
15
- import { SiwsSession } from '../session.js';
16
- import { DfmApiClient } from '../api-client.js';
17
- async function main() {
18
- const config = loadConfig();
19
- const session = new SiwsSession(config);
20
- const api = new DfmApiClient(config, session);
21
- console.log(`API: ${config.apiUrl} | cluster: ${config.cluster}`);
22
- // 1. Public: list vaults.
23
- const list = await api.listVaults({ limit: 10 });
24
- console.log(`\n${list.total} vault(s):`);
25
- for (const v of list.vaults) {
26
- console.log(` ${v.address} ${v.vaultSymbol ?? '?'} tvl=${v.tvl ?? '0'} price=${v.sharePrice ?? '?'} ${v.status ?? (v.closed ? 'closed' : v.paused ? 'paused' : 'active')}`);
27
- }
28
- if (list.vaults.length === 0) {
29
- console.log('No vaults — nothing more to show.');
30
- return;
31
- }
32
- const target = list.vaults[0].address;
33
- // 2. Public: vault detail.
34
- const detail = await api.getVault(target);
35
- console.log(`\nDetail for ${target}:`);
36
- console.log(JSON.stringify(detail.feeStructure ?? {}, null, 2));
37
- // 3. Authed reads — require SIWS sign-in (loads the test keypair).
38
- let wallet;
39
- try {
40
- wallet = session.walletAddress;
41
- }
42
- catch (e) {
43
- console.log(`\n(skipping authed reads — no test keypair configured: ${e.message})`);
44
- return;
45
- }
46
- console.log(`\nSigned-in test wallet: ${wallet}`);
47
- try {
48
- const status = await api.getZapV2Status(target, wallet);
49
- console.log(`zap-v2 escrow on ${target}:`, status ? JSON.stringify(status, null, 2) : 'none');
50
- }
51
- catch (e) {
52
- console.log(`zap_status error: ${e.message}`);
53
- }
54
- try {
55
- const positions = await api.getPortfolioPositions();
56
- console.log('Portfolio positions:', JSON.stringify(positions, null, 2));
57
- }
58
- catch (e) {
59
- console.log(`portfolio error: ${e.message}`);
60
- }
61
- }
62
- main().catch((e) => {
63
- console.error(e);
64
- process.exit(1);
65
- });
66
- //# sourceMappingURL=list-and-status.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-and-status.js","sourceRoot":"","sources":["../../src/examples/list-and-status.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=rebalance-drill.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rebalance-drill.d.ts","sourceRoot":"","sources":["../../src/examples/rebalance-drill.ts"],"names":[],"mappings":""}
@@ -1,20 +0,0 @@
1
- /**
2
- * Rebalance drill: converge a vault to its config and report what landed.
3
- *
4
- * DFM_API_URL=… DFM_AGENT_KEYPAIR_PATH=… VAULT=<pda> [SLIPPAGE_BPS=100]
5
- * npx tsx src/examples/rebalance-drill.ts
6
- */
7
- import { loadConfig } from '../config.js';
8
- import { SiwsSession } from '../session.js';
9
- import { DfmApiClient } from '../api-client.js';
10
- const config = loadConfig();
11
- const api = new DfmApiClient(config, new SiwsSession(config));
12
- const vault = process.env.VAULT;
13
- if (!vault)
14
- throw new Error('VAULT is required');
15
- const r = await api.executeViaOperatingWallet('rebalance_to_targets', {
16
- vault,
17
- slippageBps: Number(process.env.SLIPPAGE_BPS ?? '100'),
18
- });
19
- console.log('REBALANCE', JSON.stringify(r, null, 2));
20
- //# sourceMappingURL=rebalance-drill.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rebalance-drill.js","sourceRoot":"","sources":["../../src/examples/rebalance-drill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,IAAI,CAAC,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACjD,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,yBAAyB,CAAC,sBAAsB,EAAE;IACpE,KAAK;IACL,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC;CACvD,CAAC,CAAC;AACH,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=recover-app-wallet-assets.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recover-app-wallet-assets.d.ts","sourceRoot":"","sources":["../../src/examples/recover-app-wallet-assets.ts"],"names":[],"mappings":""}
@@ -1,86 +0,0 @@
1
- /**
2
- * Recover what a test cycle stranded in the app wallet: every non-USDC, non-share
3
- * token goes OUT to one destination, in one pass, so it can be swapped back to
4
- * USDC from a wallet whose key is local (`contracts/scripts/swap-wallet-tokens-to-usdc.js`).
5
- *
6
- * An in-kind cancel and the per-leg surplus refunds pay the user in BASKET TOKENS,
7
- * and the app wallet has no swap surface — so the value sits there until it is
8
- * moved. This is the move.
9
- *
10
- * Dry-run by default; `--execute` sends. Fund shares are skipped (redeem them, do
11
- * not transfer them) and so is USDC (it is already the thing we want).
12
- *
13
- * DFM_API_URL=https://app.dfm.finance \
14
- * DFM_AGENT_KEYPAIR_PATH=~/.config/dfm/test-6vch.json \
15
- * DEST=<address> MIN_USD=0.05 npx tsx src/examples/recover-app-wallet-assets.ts [--execute]
16
- *
17
- * Prints the `MINTS=` line the swap script takes, so the two steps chain.
18
- */
19
- import { loadConfig } from '../config.js';
20
- import { SiwsSession } from '../session.js';
21
- import { DfmApiClient } from '../api-client.js';
22
- const USDC = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
23
- async function main() {
24
- const execute = process.argv.includes('--execute');
25
- const config = loadConfig();
26
- const api = new DfmApiClient(config, new SiwsSession(config));
27
- // No DEST = let the server resolve it (saved withdrawal wallet, else the
28
- // owner). NAMING the sign-in wallet is refused ("it only identifies you"),
29
- // so for a wallet whose owner IS its sign-in identity this is the only way out.
30
- const dest = process.env.DEST;
31
- const minUsd = Number(process.env.MIN_USD ?? '0.05');
32
- const only = process.env.ONLY_MINT;
33
- const assets = (await api.authRequest('/agent/operating/assets', { method: 'GET' }));
34
- // Dust below the floor costs more in rent and fees than it returns; a fund
35
- // share is a CLAIM, not value in hand — it leaves through redeem, never here.
36
- const movable = assets.assets.filter((a) => a.mint !== USDC &&
37
- !a.isFundShare &&
38
- (a.valueUsd ?? 0) >= minUsd &&
39
- (!only || a.mint === only));
40
- const total = movable.reduce((sum, a) => sum + (a.valueUsd ?? 0), 0);
41
- console.log(`app wallet ${assets.operatingWalletAddress} → ${dest ?? '(server-resolved destination)'}`);
42
- console.log(`${movable.length} tokens worth ~$${total.toFixed(2)} (floor $${minUsd})\n`);
43
- for (const a of movable)
44
- console.log(` ${a.mint.slice(0, 8)}… ${a.uiAmount} ≈ $${(a.valueUsd ?? 0).toFixed(3)}`);
45
- // The destination has to pay for its own swaps afterwards, and a test wallet
46
- // that just spent its SOL on rent cannot. Move gas in the same pass.
47
- const solLamports = Number(process.env.SOL_LAMPORTS ?? '0');
48
- if (!execute) {
49
- if (solLamports > 0)
50
- console.log(`\nwould also send ${(solLamports / 1e9).toFixed(4)} SOL for gas`);
51
- console.log('\nDRY-RUN — nothing sent. Re-run with --execute.');
52
- }
53
- else {
54
- console.log('');
55
- if (solLamports > 0) {
56
- try {
57
- const r = await api.authRequest('/agent/operating/float/withdraw', {
58
- method: 'POST',
59
- body: JSON.stringify({ solLamports, ...(dest ? { destination: dest } : {}) }),
60
- });
61
- console.log(`sent ${(solLamports / 1e9).toFixed(4)} SOL for gas — ${r.signature}`);
62
- }
63
- catch (e) {
64
- console.log(`FAILED SOL gas — ${e.message.slice(0, 140)}`);
65
- }
66
- }
67
- for (const a of movable) {
68
- try {
69
- const r = await api.authRequest('/agent/operating/assets/withdraw', {
70
- method: 'POST',
71
- body: JSON.stringify({ mint: a.mint, all: true, ...(dest ? { destination: dest } : {}) }),
72
- });
73
- console.log(`sent ${a.mint.slice(0, 8)}… ${r.sentAmount} — ${r.signature}`);
74
- }
75
- catch (e) {
76
- console.log(`FAILED ${a.mint.slice(0, 8)}… ${e.message.slice(0, 140)}`);
77
- }
78
- }
79
- }
80
- console.log(`\nMINTS="${movable.map((a) => `${a.label ?? a.mint.slice(0, 4)}:${a.mint}`).join(',')}"`);
81
- }
82
- main().catch((e) => {
83
- console.error('FAILED', e instanceof Error ? e.message : e);
84
- process.exit(1);
85
- });
86
- //# sourceMappingURL=recover-app-wallet-assets.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recover-app-wallet-assets.js","sourceRoot":"","sources":["../../src/examples/recover-app-wallet-assets.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=zap-cycle.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zap-cycle.d.ts","sourceRoot":"","sources":["../../src/examples/zap-cycle.ts"],"names":[],"mappings":""}
@@ -1,56 +0,0 @@
1
- /**
2
- * One full retail cycle on an EXISTING vault, through the app wallet (keyless:
3
- * the server signs, exactly as the web UI does): deposit USDC → legs → mint,
4
- * then redeem the whole position back to USDC.
5
- *
6
- * This is the acceptance harness for the #80 sandwich: every leg is a plain user
7
- * swap from a throwaway wallet, so the run is only a pass if EVERY transaction
8
- * lands (`err: null`) and the wallets end empty.
9
- *
10
- * DFM_API_URL=https://app.dfm.finance \
11
- * DFM_AGENT_KEYPAIR_PATH=~/.config/dfm/test-6vch.json \
12
- * VAULT=<pda> DEPOSIT_USDC=10 [REDEEM=false] npx tsx src/examples/zap-cycle.ts
13
- */
14
- import { loadConfig } from '../config.js';
15
- import { SiwsSession } from '../session.js';
16
- import { DfmApiClient } from '../api-client.js';
17
- async function main() {
18
- const config = loadConfig();
19
- const api = new DfmApiClient(config, new SiwsSession(config));
20
- const vault = process.env.VAULT;
21
- if (!vault)
22
- throw new Error('VAULT is required');
23
- const usdcAmount = String(Math.round(Number(process.env.DEPOSIT_USDC ?? '10') * 1e6));
24
- const before = await api.getOperatingFloatBalance();
25
- console.log(`float before: ${JSON.stringify(before)}`);
26
- if (Number(usdcAmount) > 0) {
27
- const dep = await api.executeViaOperatingWallet('deposit', { vault, usdcAmount });
28
- console.log(`DEPOSIT ${JSON.stringify(dep)}`);
29
- }
30
- if (process.env.REDEEM === 'false')
31
- return;
32
- // The deposit answers as soon as it is submitted; the shares appear when the
33
- // close mints them, so read the position instead of trusting the response.
34
- const shares = await pollShares(api, vault);
35
- console.log(`shares: ${shares ?? '(none)'}`);
36
- if (!shares || shares === '0')
37
- throw new Error('no shares to redeem');
38
- const red = await api.executeViaOperatingWallet('redeem', { vault, shares });
39
- console.log(`REDEEM ${JSON.stringify(red)}`);
40
- console.log(`float after: ${JSON.stringify(await api.getOperatingFloatBalance())}`);
41
- }
42
- async function pollShares(api, vault) {
43
- for (let i = 0; i < 40; i++) {
44
- const positions = (await api.getPortfolioPositions());
45
- const row = Array.isArray(positions) ? positions.find((p) => p.vaultAddress === vault) : undefined;
46
- if (row?.shares && row.shares !== '0')
47
- return row.shares;
48
- await new Promise((r) => setTimeout(r, 5_000));
49
- }
50
- return null;
51
- }
52
- main().catch((e) => {
53
- console.error('FAILED', e instanceof Error ? e.message : e);
54
- process.exit(1);
55
- });
56
- //# sourceMappingURL=zap-cycle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zap-cycle.js","sourceRoot":"","sources":["../../src/examples/zap-cycle.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=zap-soak.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zap-soak.d.ts","sourceRoot":"","sources":["../../src/examples/zap-soak.ts"],"names":[],"mappings":""}
@@ -1,164 +0,0 @@
1
- /**
2
- * Soak test: deposit + redeem, over and over, across several vaults, through the
3
- * app wallet (the same public API a user's browser calls).
4
- *
5
- * It exists to answer one question with numbers instead of opinions: what
6
- * fraction of mints and redeems land, and when one does not, which leg, which
7
- * venue, which error. Every transaction it touches is appended to a JSONL
8
- * ledger, so a failure is reproducible after the fact.
9
- *
10
- * SPEND BUDGET — the loop stops when ANY cap is reached, checked before each
11
- * cycle against the balances it started from. A soak that drains the wallet it
12
- * tests with is not a soak, it is an outage.
13
- *
14
- * THE KEEPER IS A BUDGET TOO, and forgetting that cost real money: on
15
- * 2026-09-20 this harness capped the app wallet at 0.05 SOL and capped the
16
- * KEEPER at nothing, so 30 cycles ran happily while 9GjE paid 0.0131 SOL for
17
- * every HumidiFi leg (the venue spends the leg wallet's float as swap input).
18
- * ~0.196 SOL left the treasury before anyone looked. `MAX_KEEPER_SOL_SPEND`
19
- * now stops the loop the same way the others do — the keeper pays per LEG, so
20
- * it is the budget that moves fastest, not the one that moves least.
21
- *
22
- * DFM_API_URL=https://app.dfm.finance \
23
- * DFM_AGENT_KEYPAIR_PATH=~/.config/dfm/test-6vch.json \
24
- * HELIUS_RPC_URL=… VAULTS=<pda,pda> USDC_PER_CYCLE=1 CYCLES=20 \
25
- * MAX_SOL_SPEND=0.05 MAX_USDC_SPEND=0.5 LEDGER=/path/soak.jsonl \
26
- * npx tsx src/examples/zap-soak.ts
27
- */
28
- import { Connection, PublicKey } from '@solana/web3.js';
29
- import { loadConfig } from '../config.js';
30
- import { SiwsSession } from '../session.js';
31
- import { DfmApiClient } from '../api-client.js';
32
- import { appendFileSync } from 'node:fs';
33
- const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
34
- async function balances(conn, owner) {
35
- const [lamports, accounts] = await Promise.all([
36
- conn.getBalance(owner, 'confirmed'),
37
- conn.getParsedTokenAccountsByOwner(owner, { mint: new PublicKey(USDC_MINT) }, 'confirmed'),
38
- ]);
39
- const usdc = accounts.value.reduce((sum, a) => sum + Number(a.account.data.parsed.info.tokenAmount.uiAmount ?? 0), 0);
40
- return { sol: lamports / 1e9, usdc };
41
- }
42
- async function main() {
43
- const config = loadConfig();
44
- const api = new DfmApiClient(config, new SiwsSession(config));
45
- const conn = new Connection(config.rpcUrl, 'confirmed');
46
- const vaults = (process.env.VAULTS ?? '').split(',').map((v) => v.trim()).filter(Boolean);
47
- if (vaults.length === 0)
48
- throw new Error('VAULTS is required (comma-separated vault PDAs)');
49
- const usdcPerCycle = Number(process.env.USDC_PER_CYCLE ?? '1');
50
- const cycles = Number(process.env.CYCLES ?? '10');
51
- const maxSol = Number(process.env.MAX_SOL_SPEND ?? '0.05');
52
- const maxUsdc = Number(process.env.MAX_USDC_SPEND ?? '0.5');
53
- // The keeper signs every leg and pays for every leg. Default deliberately
54
- // tight: a soak should notice an expensive route in one cycle, not in thirty.
55
- const maxKeeperSol = Number(process.env.MAX_KEEPER_SOL_SPEND ?? '0.02');
56
- const keeper = new PublicKey(process.env.KEEPER ?? '9GjEBsZ1Cos2J6inmgwhBKv9pXGNtLSJ7xQ9xZb29bET');
57
- const ledger = process.env.LEDGER ?? 'zap-soak.jsonl';
58
- const float = await api.getOperatingFloatBalance();
59
- if (!float?.operatingWalletAddress)
60
- throw new Error('no app wallet for this identity');
61
- const app = new PublicKey(float.operatingWalletAddress);
62
- const start = await balances(conn, app);
63
- const keeperStart = (await conn.getBalance(keeper, 'confirmed')) / 1e9;
64
- console.log(`soak: ${vaults.length} vault(s) × ${cycles} cycles, ${usdcPerCycle} USDC each`);
65
- console.log(`start: ${start.sol.toFixed(6)} SOL / ${start.usdc.toFixed(6)} USDC`);
66
- console.log(`budget: ${maxSol} SOL / ${maxUsdc} USDC · ledger ${ledger}\n`);
67
- const record = (row) => appendFileSync(ledger, `${JSON.stringify({ at: new Date().toISOString(), ...row })}\n`);
68
- let ok = 0;
69
- let failed = 0;
70
- for (let i = 0; i < cycles; i++) {
71
- const vault = vaults[i % vaults.length];
72
- const now = await balances(conn, app);
73
- const keeperNow = (await conn.getBalance(keeper, 'confirmed')) / 1e9;
74
- const spentSol = start.sol - now.sol;
75
- const spentUsdc = start.usdc - now.usdc;
76
- const keeperSpent = keeperStart - keeperNow;
77
- if (spentSol >= maxSol || spentUsdc >= maxUsdc || keeperSpent >= maxKeeperSol) {
78
- console.log(`\nBUDGET REACHED after ${i} cycles — app ${spentSol.toFixed(6)} SOL / ` +
79
- `${spentUsdc.toFixed(6)} USDC · KEEPER ${keeperSpent.toFixed(6)} SOL`);
80
- record({ event: 'budget_stop', cycles: i, spentSol, spentUsdc, keeperSpent });
81
- break;
82
- }
83
- const label = `cycle ${i + 1}/${cycles} ${vault.slice(0, 8)}…`;
84
- try {
85
- const dep = await api.executeViaOperatingWallet('deposit', {
86
- vault,
87
- usdcAmount: String(Math.round(usdcPerCycle * 1e6)),
88
- });
89
- record({ event: 'deposit', vault, cycle: i, ...dep });
90
- // The deposit answers on submit. Shares exist only after the close mints
91
- // them, and the orchestrator refuses a second open while one is pending —
92
- // so wait for the escrow to be GONE, not merely for a share balance.
93
- await waitForSettled(api, vault, float.operatingWalletAddress);
94
- const shares = await pollShares(api, vault);
95
- if (!shares)
96
- throw new Error('no shares minted');
97
- const red = await withRetry(() => api.executeViaOperatingWallet('redeem', { vault, shares }));
98
- record({ event: 'redeem', vault, cycle: i, shares, ...red });
99
- await waitForSettled(api, vault, float.operatingWalletAddress);
100
- ok++;
101
- console.log(`${label} OK (${shares} shares)`);
102
- }
103
- catch (e) {
104
- failed++;
105
- const message = e.message.slice(0, 300);
106
- record({ event: 'cycle_failed', vault, cycle: i, error: message });
107
- console.log(`${label} FAILED — ${message}`);
108
- }
109
- }
110
- const end = await balances(conn, app);
111
- const keeperEnd = (await conn.getBalance(keeper, 'confirmed')) / 1e9;
112
- console.log(`\n${ok} ok · ${failed} failed`);
113
- console.log(`app wallet: ${(start.sol - end.sol).toFixed(6)} SOL / ${(start.usdc - end.usdc).toFixed(6)} USDC`);
114
- console.log(`KEEPER: ${(keeperStart - keeperEnd).toFixed(6)} SOL — this is the one that pays per leg`);
115
- record({
116
- event: 'summary',
117
- ok,
118
- failed,
119
- solSpent: start.sol - end.sol,
120
- usdcSpent: start.usdc - end.usdc,
121
- keeperSolSpent: keeperStart - keeperEnd,
122
- });
123
- }
124
- /** No escrow for this (user, vault) = the last operation finished settling. */
125
- async function waitForSettled(api, vault, user) {
126
- for (let i = 0; i < 60; i++) {
127
- if (!(await api.getZapV2Status(vault, user)))
128
- return;
129
- await new Promise((r) => setTimeout(r, 5_000));
130
- }
131
- throw new Error('escrow still open after 5 minutes');
132
- }
133
- /** A 409 means "one is already opening", not "this failed" — back off and retry. */
134
- async function withRetry(fn) {
135
- let last;
136
- for (let i = 0; i < 6; i++) {
137
- try {
138
- return await fn();
139
- }
140
- catch (e) {
141
- last = e;
142
- if (!/409|already opening|could not build a complete/i.test(e.message))
143
- throw e;
144
- await new Promise((r) => setTimeout(r, 20_000));
145
- }
146
- }
147
- throw last instanceof Error ? last : new Error(String(last));
148
- }
149
- /** The deposit returns as soon as it is submitted; shares appear at the mint. */
150
- async function pollShares(api, vault) {
151
- for (let i = 0; i < 40; i++) {
152
- const positions = (await api.getPortfolioPositions());
153
- const row = Array.isArray(positions) ? positions.find((p) => p.vaultAddress === vault) : undefined;
154
- if (row?.shares && row.shares !== '0')
155
- return row.shares;
156
- await new Promise((r) => setTimeout(r, 5_000));
157
- }
158
- return null;
159
- }
160
- main().catch((e) => {
161
- console.error('FAILED', e instanceof Error ? e.message : e);
162
- process.exit(1);
163
- });
164
- //# sourceMappingURL=zap-soak.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zap-soak.js","sourceRoot":"","sources":["../../src/examples/zap-soak.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,SAAS,GAAG,8CAA8C,CAAC;AAKjE,KAAK,UAAU,QAAQ,CAAC,IAAgB,EAAE,KAAgB;IACxD,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC;QACnC,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC;KAC3F,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAChC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,CAAC,EAC9E,CAAC,CACF,CAAC;IACF,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAO,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC5F,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC;IAC5D,0EAA0E;IAC1E,8EAA8E;IAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,MAAM,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,8CAA8C,CAAC,CAAC;IACnG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,gBAAgB,CAAC;IAEtD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,wBAAwB,EAAE,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,sBAAsB;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACvF,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,MAAM,eAAe,MAAM,YAAY,YAAY,YAAY,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,UAAU,OAAO,kBAAkB,MAAM,IAAI,CAAC,CAAC;IAE5E,MAAM,MAAM,GAAG,CAAC,GAA4B,EAAE,EAAE,CAC9C,cAAc,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAE1F,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC;QACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACxC,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;QAC5C,IAAI,QAAQ,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;YAC9E,OAAO,CAAC,GAAG,CACT,0BAA0B,CAAC,iBAAiB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBACtE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CACxE,CAAC;YACF,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;YAC9E,MAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,yBAAyB,CAAC,SAAS,EAAE;gBACzD,KAAK;gBACL,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;aACnD,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YACtD,yEAAyE;YACzE,0EAA0E;YAC1E,qEAAqE;YACrE,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACjD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,yBAAyB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9F,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAC7D,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC/D,EAAE,EAAE,CAAC;YACL,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,QAAQ,MAAM,UAAU,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,EAAE,CAAC;YACT,MAAM,OAAO,GAAI,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,aAAa,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,MAAM,SAAS,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAChH,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;IACvG,MAAM,CAAC;QACL,KAAK,EAAE,SAAS;QAChB,EAAE;QACF,MAAM;QACN,QAAQ,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG;QAC7B,SAAS,EAAE,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI;QAChC,cAAc,EAAE,WAAW,GAAG,SAAS;KACxC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,cAAc,CAAC,GAAiB,EAAE,KAAa,EAAE,IAAY;IAC1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO;QACrD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACvD,CAAC;AAED,oFAAoF;AACpF,KAAK,UAAU,SAAS,CAAI,EAAoB;IAC9C,IAAI,IAAa,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,GAAG,CAAC,CAAC;YACT,IAAI,CAAC,iDAAiD,CAAC,IAAI,CAAE,CAAW,CAAC,OAAO,CAAC;gBAAE,MAAM,CAAC,CAAC;YAC3F,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,iFAAiF;AACjF,KAAK,UAAU,UAAU,CAAC,GAAiB,EAAE,KAAa;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,qBAAqB,EAAE,CAA0B,CAAC;QAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnG,IAAI,GAAG,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC;QACzD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}