@dfm-fi/agent 0.2.1812 → 0.2.1849
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -400
- package/dist/api-client.d.ts +9 -0
- package/dist/api-client.js +18 -0
- package/dist/mcp-server.js +67 -3
- package/package.json +4 -6
- package/skills.md +6 -2
- package/dist/api-client.d.ts.map +0 -1
- package/dist/api-client.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/control-flow.test.d.ts +0 -2
- package/dist/control-flow.test.d.ts.map +0 -1
- package/dist/control-flow.test.js +0 -259
- package/dist/control-flow.test.js.map +0 -1
- package/dist/create-flow.d.ts.map +0 -1
- package/dist/create-flow.js.map +0 -1
- package/dist/create-flow.metadata.test.d.ts +0 -2
- package/dist/create-flow.metadata.test.d.ts.map +0 -1
- package/dist/create-flow.metadata.test.js +0 -100
- package/dist/create-flow.metadata.test.js.map +0 -1
- package/dist/examples/fund-app-wallet.d.ts +0 -2
- package/dist/examples/fund-app-wallet.d.ts.map +0 -1
- package/dist/examples/fund-app-wallet.js +0 -39
- package/dist/examples/fund-app-wallet.js.map +0 -1
- package/dist/examples/launch-deposit-redeem.d.ts +0 -2
- package/dist/examples/launch-deposit-redeem.d.ts.map +0 -1
- package/dist/examples/launch-deposit-redeem.js +0 -150
- package/dist/examples/launch-deposit-redeem.js.map +0 -1
- package/dist/examples/list-and-status.d.ts +0 -2
- package/dist/examples/list-and-status.d.ts.map +0 -1
- package/dist/examples/list-and-status.js +0 -66
- package/dist/examples/list-and-status.js.map +0 -1
- package/dist/examples/rebalance-drill.d.ts +0 -2
- package/dist/examples/rebalance-drill.d.ts.map +0 -1
- package/dist/examples/rebalance-drill.js +0 -20
- package/dist/examples/rebalance-drill.js.map +0 -1
- package/dist/examples/recover-app-wallet-assets.d.ts +0 -2
- package/dist/examples/recover-app-wallet-assets.d.ts.map +0 -1
- package/dist/examples/recover-app-wallet-assets.js +0 -86
- package/dist/examples/recover-app-wallet-assets.js.map +0 -1
- package/dist/examples/zap-cycle.d.ts +0 -2
- package/dist/examples/zap-cycle.d.ts.map +0 -1
- package/dist/examples/zap-cycle.js +0 -56
- package/dist/examples/zap-cycle.js.map +0 -1
- package/dist/examples/zap-soak.d.ts +0 -2
- package/dist/examples/zap-soak.d.ts.map +0 -1
- package/dist/examples/zap-soak.js +0 -164
- package/dist/examples/zap-soak.js.map +0 -1
- package/dist/install.d.ts.map +0 -1
- package/dist/install.js.map +0 -1
- package/dist/keyless.d.ts.map +0 -1
- package/dist/keyless.js.map +0 -1
- package/dist/manager-flow.d.ts.map +0 -1
- package/dist/manager-flow.js.map +0 -1
- package/dist/manager-flow.reconfigure.test.d.ts +0 -2
- package/dist/manager-flow.reconfigure.test.d.ts.map +0 -1
- package/dist/manager-flow.reconfigure.test.js +0 -210
- package/dist/manager-flow.reconfigure.test.js.map +0 -1
- package/dist/mcp-server.confirm-gate.test.d.ts +0 -2
- package/dist/mcp-server.confirm-gate.test.d.ts.map +0 -1
- package/dist/mcp-server.confirm-gate.test.js +0 -222
- package/dist/mcp-server.confirm-gate.test.js.map +0 -1
- package/dist/mcp-server.d.ts.map +0 -1
- package/dist/mcp-server.js.map +0 -1
- package/dist/money-path.test.d.ts +0 -2
- package/dist/money-path.test.d.ts.map +0 -1
- package/dist/money-path.test.js +0 -193
- package/dist/money-path.test.js.map +0 -1
- package/dist/recovery-flow.d.ts.map +0 -1
- package/dist/recovery-flow.deadleg.test.d.ts +0 -2
- package/dist/recovery-flow.deadleg.test.d.ts.map +0 -1
- package/dist/recovery-flow.deadleg.test.js +0 -143
- package/dist/recovery-flow.deadleg.test.js.map +0 -1
- package/dist/recovery-flow.js.map +0 -1
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js.map +0 -1
- package/dist/signing.d.ts.map +0 -1
- package/dist/signing.js.map +0 -1
- package/dist/submit.d.ts.map +0 -1
- package/dist/submit.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/wallet-identity.d.ts.map +0 -1
- package/dist/wallet-identity.js.map +0 -1
- package/dist/wallet-identity.test.d.ts +0 -2
- package/dist/wallet-identity.test.d.ts.map +0 -1
- package/dist/wallet-identity.test.js +0 -56
- package/dist/wallet-identity.test.js.map +0 -1
- package/dist/who-pays.test.d.ts +0 -2
- package/dist/who-pays.test.d.ts.map +0 -1
- package/dist/who-pays.test.js +0 -56
- package/dist/who-pays.test.js.map +0 -1
- package/dist/zap-v2-flow.d.ts.map +0 -1
- package/dist/zap-v2-flow.js.map +0 -1
- package/dist/zap-v2-flow.pending.test.d.ts +0 -2
- package/dist/zap-v2-flow.pending.test.d.ts.map +0 -1
- package/dist/zap-v2-flow.pending.test.js +0 -147
- package/dist/zap-v2-flow.pending.test.js.map +0 -1
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* #47 regression (runnable: `npx tsx agent/src/create-flow.metadata.test.ts`).
|
|
3
|
-
*
|
|
4
|
-
* THE BUG: a vault launched via the MCP shipped with NO share-mint metadata
|
|
5
|
-
* ("SPL Token", no name/ticker). Root cause: the metadata attach called
|
|
6
|
-
* `submitSignedTx` directly, which THROWS when `config.rpcUrl` is unset — and the
|
|
7
|
-
* MCP's DEFAULT is backend-broadcast mode (no RPC) — and the throw was swallowed.
|
|
8
|
-
* So in backend mode the metadata tx could NEVER be submitted.
|
|
9
|
-
*
|
|
10
|
-
* This locks the fix: with no client RPC, `attachShareMintMetadata` must submit via
|
|
11
|
-
* the BACKEND path (the `preparedTxId`), NOT `submitSignedTx`; it must surface a
|
|
12
|
-
* missing-preparedTxId as an error (not silently lose it); and an "already in use"
|
|
13
|
-
* revert is idempotent (treated as already-attached, no error). sign/submit are
|
|
14
|
-
* injected so no real keypair/RPC is needed.
|
|
15
|
-
*/
|
|
16
|
-
import { attachShareMintMetadata } from './create-flow.js';
|
|
17
|
-
let failures = 0;
|
|
18
|
-
function assert(cond, msg) {
|
|
19
|
-
if (!cond) {
|
|
20
|
-
console.error(` ✗ ${msg}`);
|
|
21
|
-
failures++;
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
console.log(` ✓ ${msg}`);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
const VAULT = 'Vau1t1111111111111111111111111111111111111';
|
|
28
|
-
const sign = (_c, t) => t; // no real keypair
|
|
29
|
-
async function caseBackendPath() {
|
|
30
|
-
console.log('case: no client RPC → backend-submit via preparedTxId (NOT submitSignedTx)');
|
|
31
|
-
let directCalled = 0;
|
|
32
|
-
let backendCalled = 0;
|
|
33
|
-
const api = {
|
|
34
|
-
prepareCreateVaultMetadata: async () => ({
|
|
35
|
-
transaction: 'BASE64TX',
|
|
36
|
-
blockhash: 'bh',
|
|
37
|
-
lastValidBlockHeight: 1,
|
|
38
|
-
preparedTxId: 'pid-123',
|
|
39
|
-
}),
|
|
40
|
-
};
|
|
41
|
-
const res = await attachShareMintMetadata({ rpcUrl: undefined }, api, VAULT, {
|
|
42
|
-
signBase64Transaction: sign,
|
|
43
|
-
submitViaBackendConfirmed: (async (opts) => {
|
|
44
|
-
backendCalled++;
|
|
45
|
-
assert(opts.preparedTxId === 'pid-123', 'backend got the preparedTxId');
|
|
46
|
-
return { signature: 'metaSig', confirmed: true };
|
|
47
|
-
}),
|
|
48
|
-
submitSignedTx: (async () => {
|
|
49
|
-
directCalled++;
|
|
50
|
-
throw new Error('submitSignedTx must NOT be called in backend mode (the old bug)');
|
|
51
|
-
}),
|
|
52
|
-
});
|
|
53
|
-
assert(res.signature === 'metaSig', `returns the metadata signature (got '${res.signature}')`);
|
|
54
|
-
assert(res.error === undefined, 'no error');
|
|
55
|
-
assert(backendCalled === 1, 'backend submit called once');
|
|
56
|
-
assert(directCalled === 0, 'submitSignedTx was NOT called');
|
|
57
|
-
}
|
|
58
|
-
async function caseNoPreparedTxId() {
|
|
59
|
-
console.log('case: no RPC + no preparedTxId → surfaced error, not a silent loss');
|
|
60
|
-
const api = {
|
|
61
|
-
prepareCreateVaultMetadata: async () => ({
|
|
62
|
-
transaction: 'BASE64TX',
|
|
63
|
-
blockhash: 'bh',
|
|
64
|
-
lastValidBlockHeight: 1,
|
|
65
|
-
// preparedTxId missing
|
|
66
|
-
}),
|
|
67
|
-
};
|
|
68
|
-
const res = await attachShareMintMetadata({ rpcUrl: undefined }, api, VAULT, { signBase64Transaction: sign });
|
|
69
|
-
assert(res.signature === undefined, 'no signature');
|
|
70
|
-
assert(!!res.error && /preparedTxId/i.test(res.error), `error mentions preparedTxId (got '${res.error}')`);
|
|
71
|
-
}
|
|
72
|
-
async function caseIdempotent() {
|
|
73
|
-
console.log('case: "already in use" revert → treated as already-attached (no error)');
|
|
74
|
-
const api = {
|
|
75
|
-
prepareCreateVaultMetadata: async () => ({
|
|
76
|
-
transaction: 'BASE64TX',
|
|
77
|
-
blockhash: 'bh',
|
|
78
|
-
lastValidBlockHeight: 1,
|
|
79
|
-
preparedTxId: 'pid-123',
|
|
80
|
-
}),
|
|
81
|
-
};
|
|
82
|
-
const res = await attachShareMintMetadata({ rpcUrl: undefined }, api, VAULT, {
|
|
83
|
-
signBase64Transaction: sign,
|
|
84
|
-
submitViaBackendConfirmed: (async () => {
|
|
85
|
-
throw new Error('Allocate: account Address already in use');
|
|
86
|
-
}),
|
|
87
|
-
});
|
|
88
|
-
assert(res.error === undefined, `idempotent revert cleared the error (got '${res.error}')`);
|
|
89
|
-
}
|
|
90
|
-
(async () => {
|
|
91
|
-
await caseBackendPath();
|
|
92
|
-
await caseNoPreparedTxId();
|
|
93
|
-
await caseIdempotent();
|
|
94
|
-
if (failures > 0) {
|
|
95
|
-
console.error(`\n#47 regression FAILED (${failures} assertion(s))`);
|
|
96
|
-
process.exit(1);
|
|
97
|
-
}
|
|
98
|
-
console.log('\n#47 regression PASSED');
|
|
99
|
-
})();
|
|
100
|
-
//# sourceMappingURL=create-flow.metadata.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-flow.metadata.test.js","sourceRoot":"","sources":["../src/create-flow.metadata.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fund-app-wallet.d.ts","sourceRoot":"","sources":["../../src/examples/fund-app-wallet.ts"],"names":[],"mappings":""}
|
|
@@ -1,39 +0,0 @@
|
|
|
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://app.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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch-deposit-redeem.d.ts","sourceRoot":"","sources":["../../src/examples/launch-deposit-redeem.ts"],"names":[],"mappings":""}
|
|
@@ -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 +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 +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 +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 +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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zap-soak.d.ts","sourceRoot":"","sources":["../../src/examples/zap-soak.ts"],"names":[],"mappings":""}
|