@dfm-fi/agent 0.2.707 → 0.2.730
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create-flow.d.ts +25 -0
- package/dist/create-flow.d.ts.map +1 -1
- package/dist/create-flow.js +59 -19
- package/dist/create-flow.js.map +1 -1
- package/dist/create-flow.metadata.test.d.ts +2 -0
- package/dist/create-flow.metadata.test.d.ts.map +1 -0
- package/dist/create-flow.metadata.test.js +100 -0
- package/dist/create-flow.metadata.test.js.map +1 -0
- package/dist/manager-flow.d.ts +12 -2
- package/dist/manager-flow.d.ts.map +1 -1
- package/dist/manager-flow.js +48 -5
- package/dist/manager-flow.js.map +1 -1
- package/dist/manager-flow.reconfigure.test.d.ts +2 -0
- package/dist/manager-flow.reconfigure.test.d.ts.map +1 -0
- package/dist/manager-flow.reconfigure.test.js +153 -0
- package/dist/manager-flow.reconfigure.test.js.map +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +8 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/recovery-flow.d.ts.map +1 -1
- package/dist/recovery-flow.deadleg.test.d.ts +2 -0
- package/dist/recovery-flow.deadleg.test.d.ts.map +1 -0
- package/dist/recovery-flow.deadleg.test.js +143 -0
- package/dist/recovery-flow.deadleg.test.js.map +1 -0
- package/dist/recovery-flow.js +50 -1
- package/dist/recovery-flow.js.map +1 -1
- package/dist/zap-v2-flow.d.ts +13 -0
- package/dist/zap-v2-flow.d.ts.map +1 -1
- package/dist/zap-v2-flow.js +71 -18
- package/dist/zap-v2-flow.js.map +1 -1
- package/dist/zap-v2-flow.pending.test.d.ts +2 -0
- package/dist/zap-v2-flow.pending.test.d.ts.map +1 -0
- package/dist/zap-v2-flow.pending.test.js +119 -0
- package/dist/zap-v2-flow.pending.test.js.map +1 -0
- package/package.json +1 -1
package/dist/create-flow.d.ts
CHANGED
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
import type { AgentConfig } from './config.js';
|
|
24
24
|
import type { DfmApiClient } from './api-client.js';
|
|
25
25
|
import type { CreateAssetInput } from './types.js';
|
|
26
|
+
import { signBase64Transaction } from './signing.js';
|
|
27
|
+
import { submitSignedTx, submitViaBackendConfirmed } from './submit.js';
|
|
26
28
|
export interface LaunchVaultParams {
|
|
27
29
|
name: string;
|
|
28
30
|
symbol: string;
|
|
@@ -44,8 +46,31 @@ export interface LaunchVaultResult {
|
|
|
44
46
|
confirmError?: string;
|
|
45
47
|
/** board #47: tx sig of the share-mint Metaplex metadata attach (undefined if it was skipped/failed — non-fatal). */
|
|
46
48
|
metadataSignature?: string;
|
|
49
|
+
/** board #47: the reason the metadata attach failed (surfaced, not swallowed) so the operator can retry. */
|
|
50
|
+
metadataError?: string;
|
|
47
51
|
message: string;
|
|
48
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* #47 — attach Metaplex name/symbol/uri to a vault's share mint so explorers/
|
|
55
|
+
* wallets show the DTF instead of "SPL Token". Uses the SAME dual submit path as
|
|
56
|
+
* the create tx (backend-confirmed when no client RPC, else direct).
|
|
57
|
+
*
|
|
58
|
+
* 🐛 THE BUG this fixes: the prior inline version called `submitSignedTx` directly,
|
|
59
|
+
* which THROWS when `config.rpcUrl` is unset — but the MCP's DEFAULT is backend
|
|
60
|
+
* mode (no RPC) — and the throw was swallowed, so EVERY agent-launched vault's
|
|
61
|
+
* share token shipped with no name/ticker. Now it backend-submits via the
|
|
62
|
+
* `preparedTxId`, retries transient failures, and SURFACES the error. Idempotent
|
|
63
|
+
* (a re-attach reverts "already in use" = already attached). Non-fatal to launch.
|
|
64
|
+
* `_deps` injects sign/submit for tests; real defaults → production unchanged.
|
|
65
|
+
*/
|
|
66
|
+
export declare function attachShareMintMetadata(config: AgentConfig, api: DfmApiClient, vaultAddress: string, _deps?: {
|
|
67
|
+
signBase64Transaction?: typeof signBase64Transaction;
|
|
68
|
+
submitViaBackendConfirmed?: typeof submitViaBackendConfirmed;
|
|
69
|
+
submitSignedTx?: typeof submitSignedTx;
|
|
70
|
+
}): Promise<{
|
|
71
|
+
signature?: string;
|
|
72
|
+
error?: string;
|
|
73
|
+
}>;
|
|
49
74
|
/**
|
|
50
75
|
* Validate the basket client-side BEFORE hitting the network — fast, clear
|
|
51
76
|
* failures the agent can fix without a round-trip. (The API re-validates
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-flow.d.ts","sourceRoot":"","sources":["../src/create-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;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;
|
|
1
|
+
{"version":3,"file":"create-flow.d.ts","sourceRoot":"","sources":["../src/create-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;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;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qHAAqH;IACrH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4GAA4G;IAC5G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,YAAY,EACjB,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE;IACN,qBAAqB,CAAC,EAAE,OAAO,qBAAqB,CAAC;IACrD,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,CAAC;IAC7D,cAAc,CAAC,EAAE,OAAO,cAAc,CAAC;CACxC,GACA,OAAO,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0CjD;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAsBpE;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAoG5B"}
|
package/dist/create-flow.js
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
import { signBase64Transaction } from './signing.js';
|
|
2
2
|
import { submitSignedTx, submitViaBackendConfirmed } from './submit.js';
|
|
3
|
+
/**
|
|
4
|
+
* #47 — attach Metaplex name/symbol/uri to a vault's share mint so explorers/
|
|
5
|
+
* wallets show the DTF instead of "SPL Token". Uses the SAME dual submit path as
|
|
6
|
+
* the create tx (backend-confirmed when no client RPC, else direct).
|
|
7
|
+
*
|
|
8
|
+
* 🐛 THE BUG this fixes: the prior inline version called `submitSignedTx` directly,
|
|
9
|
+
* which THROWS when `config.rpcUrl` is unset — but the MCP's DEFAULT is backend
|
|
10
|
+
* mode (no RPC) — and the throw was swallowed, so EVERY agent-launched vault's
|
|
11
|
+
* share token shipped with no name/ticker. Now it backend-submits via the
|
|
12
|
+
* `preparedTxId`, retries transient failures, and SURFACES the error. Idempotent
|
|
13
|
+
* (a re-attach reverts "already in use" = already attached). Non-fatal to launch.
|
|
14
|
+
* `_deps` injects sign/submit for tests; real defaults → production unchanged.
|
|
15
|
+
*/
|
|
16
|
+
export async function attachShareMintMetadata(config, api, vaultAddress, _deps) {
|
|
17
|
+
const sign = _deps?.signBase64Transaction ?? signBase64Transaction;
|
|
18
|
+
const backendSubmit = _deps?.submitViaBackendConfirmed ?? submitViaBackendConfirmed;
|
|
19
|
+
const directSubmit = _deps?.submitSignedTx ?? submitSignedTx;
|
|
20
|
+
let signature;
|
|
21
|
+
let error;
|
|
22
|
+
for (let attempt = 1; attempt <= 3 && !signature; attempt++) {
|
|
23
|
+
try {
|
|
24
|
+
const metaPrepared = await api.prepareCreateVaultMetadata(vaultAddress);
|
|
25
|
+
const metaSigned = sign(config, metaPrepared.transaction);
|
|
26
|
+
if (!config.rpcUrl) {
|
|
27
|
+
if (!metaPrepared.preparedTxId) {
|
|
28
|
+
throw new Error('No preparedTxId on metadata/prepare — cannot backend-submit (set HELIUS_RPC_URL for direct submit).');
|
|
29
|
+
}
|
|
30
|
+
const { signature: sig, confirmed } = await backendSubmit({ api, preparedTxId: metaPrepared.preparedTxId }, metaSigned);
|
|
31
|
+
if (!confirmed)
|
|
32
|
+
throw new Error(`metadata tx ${sig} broadcast but did not confirm`);
|
|
33
|
+
signature = sig;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
signature = await directSubmit(config, metaSigned, metaPrepared.blockhash, metaPrepared.lastValidBlockHeight);
|
|
37
|
+
}
|
|
38
|
+
error = undefined;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
error = e.message;
|
|
42
|
+
// Idempotent: a re-attach onto an existing metadata account reverts "already
|
|
43
|
+
// in use" — treat that as already-attached (clear the error, stop).
|
|
44
|
+
if (/already in use|already initialized|0x0\b|custom program error: 0x0/i.test(error)) {
|
|
45
|
+
error = undefined;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { signature, error };
|
|
51
|
+
}
|
|
3
52
|
const MAX_ASSETS = 15; // mainnet basket cap (zap-v2 OPEN tx ceiling)
|
|
4
53
|
/**
|
|
5
54
|
* Validate the basket client-side BEFORE hitting the network — fast, clear
|
|
@@ -92,23 +141,11 @@ export async function runLaunchVault(config, api, params) {
|
|
|
92
141
|
`or it will need a chain reconcile.`,
|
|
93
142
|
};
|
|
94
143
|
}
|
|
95
|
-
// 5. METADATA (board #47) — attach Metaplex name/symbol/uri to the share mint
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
// operator can re-run POST /vaults/:address/metadata/prepare later.
|
|
101
|
-
let metadataSignature;
|
|
102
|
-
try {
|
|
103
|
-
const metaPrepared = await api.prepareCreateVaultMetadata(prepared.vaultAddress);
|
|
104
|
-
const metaSigned = signBase64Transaction(config, metaPrepared.transaction);
|
|
105
|
-
metadataSignature = await submitSignedTx(config, metaSigned, metaPrepared.blockhash, metaPrepared.lastValidBlockHeight);
|
|
106
|
-
}
|
|
107
|
-
catch (e) {
|
|
108
|
-
// Swallow: metadata is cosmetic, the launch already succeeded.
|
|
109
|
-
metadataSignature = undefined;
|
|
110
|
-
void e;
|
|
111
|
-
}
|
|
144
|
+
// 5. METADATA (board #47) — attach Metaplex name/symbol/uri to the share mint
|
|
145
|
+
// (the dual-submit fix lives in attachShareMintMetadata; non-fatal + surfaced).
|
|
146
|
+
const meta = await attachShareMintMetadata(config, api, prepared.vaultAddress);
|
|
147
|
+
const metadataSignature = meta.signature;
|
|
148
|
+
const metadataError = meta.error;
|
|
112
149
|
return {
|
|
113
150
|
ok: true,
|
|
114
151
|
vault: prepared.vaultAddress,
|
|
@@ -116,11 +153,14 @@ export async function runLaunchVault(config, api, params) {
|
|
|
116
153
|
vaultMint: prepared.vaultMint,
|
|
117
154
|
vaultIndex: prepared.vaultIndex,
|
|
118
155
|
metadataSignature,
|
|
156
|
+
metadataError,
|
|
119
157
|
message: `Vault "${params.name}" (${params.symbol}) launched: ${prepared.vaultAddress} ` +
|
|
120
158
|
`(index ${prepared.vaultIndex}). Recorded. ` +
|
|
121
159
|
(metadataSignature
|
|
122
|
-
? `Share-mint metadata attached (#47). `
|
|
123
|
-
:
|
|
160
|
+
? `Share-mint metadata attached (#47, tx ${metadataSignature.slice(0, 16)}…). `
|
|
161
|
+
: `⚠️ Share-mint metadata NOT attached${metadataError ? ` (${metadataError})` : ''} — ` +
|
|
162
|
+
`the share token will show no name/ticker. Retry by calling launch_vault's metadata step ` +
|
|
163
|
+
`again or POST /vaults/${prepared.vaultAddress}/metadata/prepare. `) +
|
|
124
164
|
`Fund the first deposit ≥ ~$12 to clear the $10 floor.`,
|
|
125
165
|
};
|
|
126
166
|
}
|
package/dist/create-flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-flow.js","sourceRoot":"","sources":["../src/create-flow.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"create-flow.js","sourceRoot":"","sources":["../src/create-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-flow.metadata.test.d.ts","sourceRoot":"","sources":["../src/create-flow.metadata.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-flow.metadata.test.js","sourceRoot":"","sources":["../src/create-flow.metadata.test.ts"],"names":[],"mappings":"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"}
|
package/dist/manager-flow.d.ts
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import type { AgentConfig } from './config.js';
|
|
22
22
|
import type { DfmApiClient } from './api-client.js';
|
|
23
|
-
import type { CreateAssetInput, ReconfigureTargetInput } from './types.js';
|
|
23
|
+
import type { CreateAssetInput, ConvergeLegTx, ReconfigureTargetInput } from './types.js';
|
|
24
24
|
export interface UpdateAssetsResult {
|
|
25
25
|
ok: boolean;
|
|
26
26
|
vault: string;
|
|
@@ -127,5 +127,15 @@ export declare function runRebalanceToTargets(config: AgentConfig, api: DfmApiCl
|
|
|
127
127
|
* passes (`VaultAssetsNotDecommissioned`/`MintNotInBasket` avoided). A config
|
|
128
128
|
* change ALWAYS converges — never config-only.
|
|
129
129
|
*/
|
|
130
|
-
export declare function runReconfigure(config: AgentConfig, api: DfmApiClient, vault: string, targets: ReconfigureTargetInput[], maxSlippageBps?: number
|
|
130
|
+
export declare function runReconfigure(config: AgentConfig, api: DfmApiClient, vault: string, targets: ReconfigureTargetInput[], maxSlippageBps?: number, _deps?: {
|
|
131
|
+
submitConvergeLegs?: typeof submitConvergeLegs;
|
|
132
|
+
runUpdateVaultAssets?: typeof runUpdateVaultAssets;
|
|
133
|
+
}): Promise<ReconfigureResult>;
|
|
134
|
+
/**
|
|
135
|
+
* Sign + submit a list of pre-prepared converge legs (each its OWN blockhash)
|
|
136
|
+
* IN ORDER, sleeping the 5s on-chain rebalance cooldown between legs. Each leg is
|
|
137
|
+
* an admin-signed `execute_rebalance` (on-chain velocity-ceiling + min_out guarded, oracle-free).
|
|
138
|
+
*/
|
|
139
|
+
declare function submitConvergeLegs(config: AgentConfig, api: DfmApiClient, legs: ConvergeLegTx[], preparedTxIds?: string[]): Promise<string[]>;
|
|
140
|
+
export {};
|
|
131
141
|
//# sourceMappingURL=manager-flow.d.ts.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"manager-flow.d.ts","sourceRoot":"","sources":["../src/manager-flow.ts"],"names":[],"mappings":"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"}
|
package/dist/manager-flow.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { signBase64Transaction } from './signing.js';
|
|
2
|
-
import { submitSignedTx } from './submit.js';
|
|
2
|
+
import { submitSignedTx, BlockhashExpiredError } from './submit.js';
|
|
3
3
|
/** On-chain rebalance cooldown (5s) — keep a small margin so back-to-back legs
|
|
4
4
|
* never trip `HARD_MIN_REBALANCE_INTERVAL_SECS`. */
|
|
5
5
|
const REBALANCE_COOLDOWN_MS = 6_000;
|
|
@@ -168,12 +168,55 @@ export async function runRebalanceToTargets(config, api, vault, maxSlippageBps)
|
|
|
168
168
|
* passes (`VaultAssetsNotDecommissioned`/`MintNotInBasket` avoided). A config
|
|
169
169
|
* change ALWAYS converges — never config-only.
|
|
170
170
|
*/
|
|
171
|
-
export async function runReconfigure(config, api, vault, targets, maxSlippageBps
|
|
171
|
+
export async function runReconfigure(config, api, vault, targets, maxSlippageBps,
|
|
172
|
+
// TEST SEAM (production-unaffected): the two sub-steps that touch the real
|
|
173
|
+
// signing/RPC stack are injectable so the resumable-drain control flow can be
|
|
174
|
+
// unit-tested without a wallet or a validator. Both default to the real
|
|
175
|
+
// functions, so every production caller is byte-identical.
|
|
176
|
+
_deps) {
|
|
177
|
+
const submitLegs = _deps?.submitConvergeLegs ?? submitConvergeLegs;
|
|
178
|
+
const updateAssets = _deps?.runUpdateVaultAssets ?? runUpdateVaultAssets;
|
|
172
179
|
// Client-side guard mirrors the API + contract (Σ bps == 10000, ≤15, no dupes).
|
|
173
180
|
validateManagerBasket(targets.map((t) => ({ mint: t.mint, symbol: t.symbol, mintBps: t.allocationBps })));
|
|
174
181
|
const prepared = await api.prepareReconfigure(vault, targets, maxSlippageBps);
|
|
175
|
-
// (1) Drain the removed assets to ~0
|
|
176
|
-
|
|
182
|
+
// (1) Drain the removed assets to ~0, RESILIENT to mid-sequence blockhash expiry
|
|
183
|
+
// (#57 repro 3). The drain legs are pre-prepared with blockhashes from the
|
|
184
|
+
// same instant, but submit sequentially over ~50s+, so late legs could expire
|
|
185
|
+
// ("Blockhash not found") leaving a PARTIAL drain. That partial state is
|
|
186
|
+
// CONSISTENT + RESUMABLE — `update_vault_assets` (step 2) hasn't run, so the
|
|
187
|
+
// config is still the OLD basket — and `prepareReconfigure` is IDEMPOTENT
|
|
188
|
+
// (it recomputes drains from CURRENT holdings, skipping already-drained ~0
|
|
189
|
+
// legs). So on a transient expiry we re-prepare the REMAINING drains afresh
|
|
190
|
+
// and continue, instead of throwing a half-done reconfigure. A non-transient
|
|
191
|
+
// error (a real revert) is NOT retried — it surfaces the resumable guidance.
|
|
192
|
+
const drainSignatures = [];
|
|
193
|
+
let drainTxs = prepared.drainTxs;
|
|
194
|
+
let drainTxIds = prepared.preparedTxIds;
|
|
195
|
+
const MAX_DRAIN_ROUNDS = 4;
|
|
196
|
+
for (let round = 1; drainTxs.length > 0; round++) {
|
|
197
|
+
try {
|
|
198
|
+
const sigs = await submitLegs(config, api, drainTxs, drainTxIds);
|
|
199
|
+
drainSignatures.push(...sigs);
|
|
200
|
+
break; // all remaining drains landed
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
204
|
+
const transient = e instanceof BlockhashExpiredError ||
|
|
205
|
+
/blockhash.*not found|block height exceeded|was not confirmed|expired/i.test(msg);
|
|
206
|
+
if (!transient || round >= MAX_DRAIN_ROUNDS) {
|
|
207
|
+
throw new Error(`${msg}\nReconfigure drain did not finish — but the basket CONFIG was NOT changed ` +
|
|
208
|
+
`(update_vault_assets runs only AFTER all drains), so holdings are consistent and this ` +
|
|
209
|
+
`is RESUMABLE: call reconfigure again (same targets) to drain the remainder, then it ` +
|
|
210
|
+
`proceeds. No rollback needed; no value left the basket.`);
|
|
211
|
+
}
|
|
212
|
+
// Transient expiry mid-sequence — re-prepare the REMAINING drains (fresh
|
|
213
|
+
// blockhashes) from current holdings and retry. Already-drained legs are ~0
|
|
214
|
+
// now, so the recomputed plan skips them.
|
|
215
|
+
const reprepared = await api.prepareReconfigure(vault, targets, maxSlippageBps);
|
|
216
|
+
drainTxs = reprepared.drainTxs;
|
|
217
|
+
drainTxIds = reprepared.preparedTxIds;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
177
220
|
// (2) Full-replace the basket targets. After the drains confirm, the removed
|
|
178
221
|
// mints hold ~0 so update_vault_assets accepts dropping them. Reuse the
|
|
179
222
|
// existing assets-prepare → sign → submit → confirm path.
|
|
@@ -182,7 +225,7 @@ export async function runReconfigure(config, api, vault, targets, maxSlippageBps
|
|
|
182
225
|
symbol: t.symbol,
|
|
183
226
|
mintBps: t.allocationBps,
|
|
184
227
|
}));
|
|
185
|
-
const updateRes = await
|
|
228
|
+
const updateRes = await updateAssets(config, api, vault, newAssets);
|
|
186
229
|
return {
|
|
187
230
|
ok: true,
|
|
188
231
|
vault,
|
package/dist/manager-flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager-flow.js","sourceRoot":"","sources":["../src/manager-flow.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"manager-flow.js","sourceRoot":"","sources":["../src/manager-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager-flow.reconfigure.test.d.ts","sourceRoot":"","sources":["../src/manager-flow.reconfigure.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #57 reconfigure-drain resilience regression
|
|
3
|
+
* (runnable: `npx tsx agent/src/manager-flow.reconfigure.test.ts`).
|
|
4
|
+
*
|
|
5
|
+
* The agent package has no jest runner — this is a self-contained assertion
|
|
6
|
+
* script (exit 1 on failure), same pattern as `zap-v2-flow.pending.test.ts`.
|
|
7
|
+
*
|
|
8
|
+
* Locks the #57 (commit f99b870) `runReconfigure` drain control flow that shipped
|
|
9
|
+
* WITHOUT a named regression test. The fix makes the removed-asset DRAIN phase
|
|
10
|
+
* resilient to a mid-sequence blockhash expiry:
|
|
11
|
+
*
|
|
12
|
+
* CASE A (TRANSIENT → re-prep): a `BlockhashExpiredError` from `submitConvergeLegs`
|
|
13
|
+
* mid-sequence is RECOVERABLE — `update_vault_assets` (the basket drop) has NOT
|
|
14
|
+
* run yet, so holdings are consistent and `prepareReconfigure` is idempotent.
|
|
15
|
+
* The driver re-calls `prepareReconfigure` for the REMAINING drains (≤4 rounds)
|
|
16
|
+
* and continues. `update_vault_assets` runs exactly ONCE, only AFTER all drains.
|
|
17
|
+
*
|
|
18
|
+
* CASE B (NON-TRANSIENT → NO retry): a real revert (e.g. `0x1793`) is NOT retried
|
|
19
|
+
* — `prepareReconfigure` is called exactly ONCE (no double-drain), `runReconfigure`
|
|
20
|
+
* rejects, and the error message contains "RESUMABLE" guidance.
|
|
21
|
+
*
|
|
22
|
+
* To drive `submitConvergeLegs`'s outcome without the real signing/RPC stack, the
|
|
23
|
+
* test uses the minimal `_deps` seam added to `runReconfigure` (injectable
|
|
24
|
+
* `submitConvergeLegs` + `runUpdateVaultAssets`, both defaulting to the real fns so
|
|
25
|
+
* production is byte-identical).
|
|
26
|
+
*/
|
|
27
|
+
import { runReconfigure } from './manager-flow.js';
|
|
28
|
+
import { BlockhashExpiredError } from './submit.js';
|
|
29
|
+
const VAULT = 'Vau1t1111111111111111111111111111111111111';
|
|
30
|
+
// Two real-ish mints; allocations must sum to 10000 (validateManagerBasket).
|
|
31
|
+
const MINT_KEEP = 'So11111111111111111111111111111111111111112';
|
|
32
|
+
const MINT_ADD = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
|
|
33
|
+
const TARGETS = [
|
|
34
|
+
{ mint: MINT_KEEP, symbol: 'SOL', allocationBps: 6000 },
|
|
35
|
+
{ mint: MINT_ADD, symbol: 'USDC', allocationBps: 4000 },
|
|
36
|
+
];
|
|
37
|
+
function drainLeg(i) {
|
|
38
|
+
return {
|
|
39
|
+
kind: 'drain',
|
|
40
|
+
inputMint: `Drain${i}1111111111111111111111111111111111111`.slice(0, 43),
|
|
41
|
+
outputMint: MINT_ADD,
|
|
42
|
+
amountIn: '1000000',
|
|
43
|
+
minOut: '0',
|
|
44
|
+
valueUsdc: 1,
|
|
45
|
+
slippageBps: 300,
|
|
46
|
+
transaction: 'AA==',
|
|
47
|
+
blockhash: '11111111111111111111111111111111',
|
|
48
|
+
lastValidBlockHeight: 1,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function reconfigureResponse(drainTxs) {
|
|
52
|
+
return {
|
|
53
|
+
vaultAddress: VAULT,
|
|
54
|
+
gavUsdc: 100,
|
|
55
|
+
plan: {
|
|
56
|
+
diff: { reweight: [], add: [MINT_ADD], remove: ['DriX'], isCompositionChange: true },
|
|
57
|
+
steps: [],
|
|
58
|
+
reweight: [],
|
|
59
|
+
maxSlippageBps: 300,
|
|
60
|
+
gavUsdc: 100,
|
|
61
|
+
},
|
|
62
|
+
drainTxs,
|
|
63
|
+
transactions: drainTxs.map((d) => d.transaction),
|
|
64
|
+
preparedTxIds: drainTxs.map((_, i) => `prep-${i}`),
|
|
65
|
+
note: '',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
let failures = 0;
|
|
69
|
+
function assert(cond, msg) {
|
|
70
|
+
if (!cond) {
|
|
71
|
+
console.error(` ✗ ${msg}`);
|
|
72
|
+
failures++;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.log(` ✓ ${msg}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function caseTransient() {
|
|
79
|
+
console.log('case A: TRANSIENT blockhash expiry mid-drain → re-prep remaining + continue');
|
|
80
|
+
let prepareCalls = 0;
|
|
81
|
+
// Round 1: two drain legs. Round 2 (after the transient): one remaining leg.
|
|
82
|
+
const api = {
|
|
83
|
+
prepareReconfigure: async () => {
|
|
84
|
+
prepareCalls++;
|
|
85
|
+
return prepareCalls === 1
|
|
86
|
+
? reconfigureResponse([drainLeg(1), drainLeg(2)])
|
|
87
|
+
: reconfigureResponse([drainLeg(2)]); // one leg left
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
let submitCalls = 0;
|
|
91
|
+
let updateCalls = 0;
|
|
92
|
+
const submitConvergeLegs = async (_c, _a, legs) => {
|
|
93
|
+
submitCalls++;
|
|
94
|
+
if (submitCalls === 1) {
|
|
95
|
+
// First call: expire mid-sequence (a transient, recoverable failure).
|
|
96
|
+
throw new BlockhashExpiredError('Blockhash not found / window expired');
|
|
97
|
+
}
|
|
98
|
+
// Second call (round 2): the remaining drains land.
|
|
99
|
+
return legs.map((_, i) => `drainSig-${submitCalls}-${i}`);
|
|
100
|
+
};
|
|
101
|
+
const runUpdateVaultAssets = async () => {
|
|
102
|
+
updateCalls++;
|
|
103
|
+
return { ok: true, vault: VAULT, signature: 'updateSig111', message: 'updated' };
|
|
104
|
+
};
|
|
105
|
+
const res = await runReconfigure({}, api, VAULT, TARGETS, 300, { submitConvergeLegs: submitConvergeLegs, runUpdateVaultAssets: runUpdateVaultAssets });
|
|
106
|
+
assert(prepareCalls === 2, `prepareReconfigure called 2× (re-prepped remaining drains) — got ${prepareCalls}`);
|
|
107
|
+
assert(submitCalls === 2, `submitConvergeLegs called 2× (retry after transient) — got ${submitCalls}`);
|
|
108
|
+
assert(updateCalls === 1, `update_vault_assets ran exactly 1× — got ${updateCalls}`);
|
|
109
|
+
assert(res.ok === true, `result.ok === true — got ${res.ok}`);
|
|
110
|
+
// The basket drop ran AFTER the drains completed (1 update, both drain rounds done).
|
|
111
|
+
assert(res.drainSignatures.length === 1, `drain signatures from the successful round — got ${res.drainSignatures.length}`);
|
|
112
|
+
}
|
|
113
|
+
async function caseNonTransient() {
|
|
114
|
+
console.log('case B: NON-TRANSIENT revert mid-drain → NO retry, reject with RESUMABLE guidance');
|
|
115
|
+
let prepareCalls = 0;
|
|
116
|
+
const api = {
|
|
117
|
+
prepareReconfigure: async () => {
|
|
118
|
+
prepareCalls++;
|
|
119
|
+
return reconfigureResponse([drainLeg(1), drainLeg(2)]);
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
let updateCalls = 0;
|
|
123
|
+
const submitConvergeLegs = async () => {
|
|
124
|
+
// A real on-chain revert — NOT transient. Must NOT be retried.
|
|
125
|
+
throw new Error('custom program error: 0x1793');
|
|
126
|
+
};
|
|
127
|
+
const runUpdateVaultAssets = async () => {
|
|
128
|
+
updateCalls++;
|
|
129
|
+
throw new Error('update_vault_assets MUST NOT run after a failed drain');
|
|
130
|
+
};
|
|
131
|
+
let caught;
|
|
132
|
+
try {
|
|
133
|
+
await runReconfigure({}, api, VAULT, TARGETS, 300, { submitConvergeLegs: submitConvergeLegs, runUpdateVaultAssets: runUpdateVaultAssets });
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
caught = e;
|
|
137
|
+
}
|
|
138
|
+
assert(caught !== undefined, 'runReconfigure rejected (did not silently succeed)');
|
|
139
|
+
assert(prepareCalls === 1, `prepareReconfigure called exactly 1× (NO retry → no double-drain) — got ${prepareCalls}`);
|
|
140
|
+
assert(updateCalls === 0, `update_vault_assets did NOT run (basket config unchanged) — got ${updateCalls}`);
|
|
141
|
+
assert(!!caught && /RESUMABLE/.test(caught.message), `error message carries "RESUMABLE" guidance — got: ${caught?.message?.slice(0, 60)}…`);
|
|
142
|
+
assert(!!caught && /0x1793/.test(caught.message), 'error message preserves the original on-chain revert');
|
|
143
|
+
}
|
|
144
|
+
(async () => {
|
|
145
|
+
await caseTransient();
|
|
146
|
+
await caseNonTransient();
|
|
147
|
+
if (failures > 0) {
|
|
148
|
+
console.error(`\n#57 reconfigure-drain regression FAILED (${failures} assertion(s))`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
console.log('\n#57 reconfigure-drain regression PASSED');
|
|
152
|
+
})();
|
|
153
|
+
//# sourceMappingURL=manager-flow.reconfigure.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager-flow.reconfigure.test.js","sourceRoot":"","sources":["../src/manager-flow.reconfigure.test.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AA2uBA;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD"}
|