@dfm-fi/agent 0.2.1549 → 0.2.1551

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fund-app-wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fund-app-wallet.d.ts","sourceRoot":"","sources":["../../src/examples/fund-app-wallet.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Top up the app wallet from its owner — the ONE signature the app-wallet model
3
+ * cannot avoid, because it is the owner's money leaving the owner's wallet.
4
+ *
5
+ * The other direction (app wallet → owner) is `recover-app-wallet-assets.ts`.
6
+ *
7
+ * DFM_API_URL=https://n2-api.dfm.finance \
8
+ * DFM_AGENT_KEYPAIR_PATH=~/.config/dfm/test-6vch.json \
9
+ * USDC=11.1 [SOL=0.01] npx tsx src/examples/fund-app-wallet.ts
10
+ */
11
+ import { loadConfig } from '../config.js';
12
+ import { SiwsSession } from '../session.js';
13
+ import { DfmApiClient } from '../api-client.js';
14
+ import { signBase64Transaction } from '../signing.js';
15
+ import { submitSignedTx } from '../submit.js';
16
+ async function main() {
17
+ const config = loadConfig();
18
+ const api = new DfmApiClient(config, new SiwsSession(config));
19
+ const usdcMicros = Math.round(Number(process.env.USDC ?? '0') * 1e6);
20
+ const solLamports = Math.round(Number(process.env.SOL ?? '0') * 1e9);
21
+ if (usdcMicros <= 0 && solLamports <= 0)
22
+ throw new Error('set USDC and/or SOL');
23
+ const prepared = await api.prepareOperatingFund({
24
+ ...(usdcMicros > 0 ? { usdcMicros } : {}),
25
+ ...(solLamports > 0 ? { solLamports } : {}),
26
+ });
27
+ const signed = signBase64Transaction(config, prepared.transaction);
28
+ const signature = await submitSignedTx(config, signed, prepared.blockhash, prepared.lastValidBlockHeight,
29
+ // Backend broadcast: without `preparedTxId` this is the one write that
30
+ // demands a client RPC.
31
+ { api, preparedTxId: prepared.preparedTxId });
32
+ console.log(`funded ${prepared.operatingWalletAddress} with ${usdcMicros / 1e6} USDC ` +
33
+ `+ ${solLamports / 1e9} SOL — ${signature}`);
34
+ }
35
+ main().catch((e) => {
36
+ console.error('FAILED', e instanceof Error ? e.message : e);
37
+ process.exit(1);
38
+ });
39
+ //# sourceMappingURL=fund-app-wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fund-app-wallet.js","sourceRoot":"","sources":["../../src/examples/fund-app-wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,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,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,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,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACrE,IAAI,UAAU,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAEhF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC;QAC9C,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,cAAc,CACpC,MAAM,EACN,MAAM,EACN,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,oBAAoB;IAC7B,uEAAuE;IACvE,wBAAwB;IACxB,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAC7C,CAAC;IACF,OAAO,CAAC,GAAG,CACT,UAAU,QAAQ,CAAC,sBAAsB,SAAS,UAAU,GAAG,GAAG,QAAQ;QACxE,KAAK,WAAW,GAAG,GAAG,UAAU,SAAS,EAAE,CAC9C,CAAC;AACJ,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"}
@@ -24,16 +24,21 @@ async function main() {
24
24
  const execute = process.argv.includes('--execute');
25
25
  const config = loadConfig();
26
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.
27
30
  const dest = process.env.DEST;
28
- if (!dest)
29
- throw new Error('DEST (the receiving address) is required');
30
31
  const minUsd = Number(process.env.MIN_USD ?? '0.05');
32
+ const only = process.env.ONLY_MINT;
31
33
  const assets = (await api.authRequest('/agent/operating/assets', { method: 'GET' }));
32
34
  // Dust below the floor costs more in rent and fees than it returns; a fund
33
35
  // share is a CLAIM, not value in hand — it leaves through redeem, never here.
34
- const movable = assets.assets.filter((a) => a.mint !== USDC && !a.isFundShare && (a.valueUsd ?? 0) >= minUsd);
36
+ const movable = assets.assets.filter((a) => a.mint !== USDC &&
37
+ !a.isFundShare &&
38
+ (a.valueUsd ?? 0) >= minUsd &&
39
+ (!only || a.mint === only));
35
40
  const total = movable.reduce((sum, a) => sum + (a.valueUsd ?? 0), 0);
36
- console.log(`app wallet ${assets.operatingWalletAddress} → ${dest}`);
41
+ console.log(`app wallet ${assets.operatingWalletAddress} → ${dest ?? '(server-resolved destination)'}`);
37
42
  console.log(`${movable.length} tokens worth ~$${total.toFixed(2)} (floor $${minUsd})\n`);
38
43
  for (const a of movable)
39
44
  console.log(` ${a.mint.slice(0, 8)}… ${a.uiAmount} ≈ $${(a.valueUsd ?? 0).toFixed(3)}`);
@@ -51,7 +56,7 @@ async function main() {
51
56
  try {
52
57
  const r = await api.authRequest('/agent/operating/float/withdraw', {
53
58
  method: 'POST',
54
- body: JSON.stringify({ solLamports, destination: dest }),
59
+ body: JSON.stringify({ solLamports, ...(dest ? { destination: dest } : {}) }),
55
60
  });
56
61
  console.log(`sent ${(solLamports / 1e9).toFixed(4)} SOL for gas — ${r.signature}`);
57
62
  }
@@ -63,7 +68,7 @@ async function main() {
63
68
  try {
64
69
  const r = await api.authRequest('/agent/operating/assets/withdraw', {
65
70
  method: 'POST',
66
- body: JSON.stringify({ mint: a.mint, all: true, destination: dest }),
71
+ body: JSON.stringify({ mint: a.mint, all: true, ...(dest ? { destination: dest } : {}) }),
67
72
  });
68
73
  console.log(`sent ${a.mint.slice(0, 8)}… ${r.sentAmount} — ${r.signature}`);
69
74
  }
@@ -1 +1 @@
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
+ {"version":3,"file":"recover-app-wallet-assets.js","sourceRoot":"","sources":["../../src/examples/recover-app-wallet-assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=zap-cycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zap-cycle.d.ts","sourceRoot":"","sources":["../../src/examples/zap-cycle.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
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://n2-api.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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zap-cycle.js","sourceRoot":"","sources":["../../src/examples/zap-cycle.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dfm-fi/agent",
3
- "version": "0.2.1549",
3
+ "version": "0.2.1551",
4
4
  "description": "DFM v2 MCP server — drive the full DTF launch → deposit → redeem (+ manage) lifecycle from an AI agent against the live API.",
5
5
  "type": "module",
6
6
  "bin": {