@temporalabs/treasury 0.1.1 → 0.1.2
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/NOTICE +4 -2
- package/README.md +68 -44
- package/THIRD_PARTY_NOTICES.connect-page.md +7420 -0
- package/THIRD_PARTY_NOTICES.md +4 -196
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +220 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +224 -239
- package/dist/client.js +147 -25
- package/dist/client.js.map +1 -1
- package/dist/config/earn.d.ts +33 -12
- package/dist/config/earn.js +33 -12
- package/dist/config/earn.js.map +1 -1
- package/dist/connect/ack.d.ts +59 -0
- package/dist/connect/ack.js +111 -0
- package/dist/connect/ack.js.map +1 -0
- package/dist/connect/commands.d.ts +78 -0
- package/dist/connect/commands.js +411 -0
- package/dist/connect/commands.js.map +1 -0
- package/dist/connect/config.d.ts +22 -0
- package/dist/connect/config.js +33 -0
- package/dist/connect/config.js.map +1 -0
- package/dist/connect/gate.d.ts +37 -0
- package/dist/connect/gate.js +115 -0
- package/dist/connect/gate.js.map +1 -0
- package/dist/connect/http.d.ts +54 -0
- package/dist/connect/http.js +205 -0
- package/dist/connect/http.js.map +1 -0
- package/dist/connect/open.d.ts +2 -0
- package/dist/connect/open.js +35 -0
- package/dist/connect/open.js.map +1 -0
- package/dist/connect/page.d.ts +5 -0
- package/dist/connect/page.js +69 -0
- package/dist/connect/page.js.map +1 -0
- package/dist/connect/session.d.ts +16 -0
- package/dist/connect/session.js +73 -0
- package/dist/connect/session.js.map +1 -0
- package/dist/connect/verify.d.ts +37 -0
- package/dist/connect/verify.js +89 -0
- package/dist/connect/verify.js.map +1 -0
- package/dist/connect-page.js +5141 -0
- package/dist/disclosures.d.ts +21 -6
- package/dist/disclosures.js +32 -7
- package/dist/disclosures.js.map +1 -1
- package/dist/earn/commands.d.ts +46 -0
- package/dist/earn/commands.js +483 -0
- package/dist/earn/commands.js.map +1 -0
- package/dist/links.d.ts +2 -0
- package/dist/links.js +38 -14
- package/dist/links.js.map +1 -1
- package/dist/position.d.ts +7 -5
- package/dist/position.js +35 -18
- package/dist/position.js.map +1 -1
- package/dist/preflight.d.ts +9 -0
- package/dist/preflight.js +14 -3
- package/dist/preflight.js.map +1 -1
- package/dist/quote.js +24 -7
- package/dist/quote.js.map +1 -1
- package/dist/redact.d.ts +3 -3
- package/dist/redact.js +3 -3
- package/dist/redact.js.map +1 -1
- package/dist/registry-schema.d.ts +5 -5
- package/dist/registry-schema.js +30 -16
- package/dist/registry-schema.js.map +1 -1
- package/dist/registry.d.ts +29 -6
- package/dist/registry.js +76 -13
- package/dist/registry.js.map +1 -1
- package/dist/{mcp-server.mjs → treasury.mjs} +29276 -44702
- package/dist/version.js +1 -1
- package/package.json +5 -5
- package/registry/vaults.json +105 -4
- package/dist/mcp/server.d.ts +0 -8
- package/dist/mcp/server.js +0 -368
- package/dist/mcp/server.js.map +0 -1
package/dist/registry.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Registry, type VaultEntry } from "./registry-schema.js";
|
|
2
|
+
import { type ChainKey, type SupportedChainId } from "./client.js";
|
|
2
3
|
/** Parses and validates the shipped registry. Throws on any schema violation — a registry that does not parse is not a registry. */
|
|
3
4
|
export declare function loadRegistry(): Registry;
|
|
4
5
|
/**
|
|
@@ -11,14 +12,36 @@ export declare function loadRegistry(): Registry;
|
|
|
11
12
|
export declare function __setRegistryForTests(r: Registry | undefined): void;
|
|
12
13
|
export declare function listVaults(): VaultEntry[];
|
|
13
14
|
export declare function getVault(symbol: string): VaultEntry;
|
|
15
|
+
/** The chain used when a caller names neither a chain nor a vault: `EARN.defaultChain`. */
|
|
16
|
+
export declare function defaultChainId(): SupportedChainId;
|
|
14
17
|
/**
|
|
15
|
-
* The
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
+
* The chains a caller can name: every supported chain with at least one vault in the registry, the
|
|
19
|
+
* default chain first. A chain this client supports and the registry has no vault on is not
|
|
20
|
+
* offered — there is nothing to do there.
|
|
18
21
|
*/
|
|
19
|
-
export declare function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
export declare function offeredChains(): {
|
|
23
|
+
key: ChainKey;
|
|
24
|
+
chainId: SupportedChainId;
|
|
25
|
+
name: string;
|
|
26
|
+
}[];
|
|
27
|
+
/**
|
|
28
|
+
* The vault the tools use on a chain when the caller names none: `EARN.defaultVaultByChain`
|
|
29
|
+
* (config/earn.ts — the toggle), which the registry must also mark `isDefault` (the measurement; the
|
|
30
|
+
* schema guarantees exactly one per chain and that it is open or whitelist-gated). A disagreement
|
|
31
|
+
* between the two is refused, never resolved silently. With no argument: the default chain's.
|
|
32
|
+
*/
|
|
33
|
+
export declare function defaultVault(chainId?: SupportedChainId): VaultEntry;
|
|
34
|
+
/**
|
|
35
|
+
* Resolves an optional ticker and an optional chain to ONE vault:
|
|
36
|
+
*
|
|
37
|
+
* neither the default chain's default vault
|
|
38
|
+
* chain only that chain's default vault
|
|
39
|
+
* vault only that vault, on whatever chain it is on
|
|
40
|
+
* both that vault, and it must be on that chain — a disagreement is REFUSED, never
|
|
41
|
+
* resolved by picking one, because the two answers are different contracts on
|
|
42
|
+
* different chains and the caller meant exactly one of them.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveVault(symbol?: string, chain?: string): VaultEntry;
|
|
22
45
|
/**
|
|
23
46
|
* The vaults this client can put money into: ACTIVE, on an ERC-4626 chassis, and MEASURED open.
|
|
24
47
|
* This is the rule, not a list — the count moves as vaults are provisioned, gated, or retired.
|
package/dist/registry.js
CHANGED
|
@@ -2,6 +2,7 @@ import { readFileSync, realpathSync } from "node:fs";
|
|
|
2
2
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
3
3
|
import { registrySchema, erc4626Chassis } from "./registry-schema.js";
|
|
4
4
|
import { EARN } from "./config/earn.js";
|
|
5
|
+
import { CHAIN_INFO, chainIdForKey, supportedChainIds } from "./client.js";
|
|
5
6
|
// From this file's real path, not a symlink's: see PACKAGE_JSON_URL in version.ts.
|
|
6
7
|
const REGISTRY_URL = new URL("../registry/vaults.json", pathToFileURL(realpathSync(fileURLToPath(import.meta.url))));
|
|
7
8
|
let cached;
|
|
@@ -10,7 +11,15 @@ export function loadRegistry() {
|
|
|
10
11
|
if (cached)
|
|
11
12
|
return cached;
|
|
12
13
|
const raw = JSON.parse(readFileSync(fileURLToPath(REGISTRY_URL), "utf8"));
|
|
13
|
-
|
|
14
|
+
const parsed = registrySchema.parse(raw);
|
|
15
|
+
// The schema holds one default per chain THAT HAS A VAULT, so it cannot see a registry with no
|
|
16
|
+
// vault on the default chain at all — and then the discovery call itself is what fails, with an
|
|
17
|
+
// error about a chain nobody asked for. Refuse the file here, where the cause can be named.
|
|
18
|
+
const chainId = defaultChainId();
|
|
19
|
+
if (!parsed.vaults.some((v) => v.chainId === chainId)) {
|
|
20
|
+
throw new Error(`the registry has no vault on ${CHAIN_INFO[chainId].name}, which config/earn.ts names as the default chain; add one or change defaultChain`);
|
|
21
|
+
}
|
|
22
|
+
cached = parsed;
|
|
14
23
|
return cached;
|
|
15
24
|
}
|
|
16
25
|
/**
|
|
@@ -36,22 +45,76 @@ export function getVault(symbol) {
|
|
|
36
45
|
}
|
|
37
46
|
return v;
|
|
38
47
|
}
|
|
48
|
+
/** The chain used when a caller names neither a chain nor a vault: `EARN.defaultChain`. */
|
|
49
|
+
export function defaultChainId() {
|
|
50
|
+
const id = chainIdForKey(EARN.defaultChain);
|
|
51
|
+
if (id === undefined)
|
|
52
|
+
throw new Error(`config/earn.ts names "${EARN.defaultChain}" as the default chain, which this client does not support`);
|
|
53
|
+
return id;
|
|
54
|
+
}
|
|
39
55
|
/**
|
|
40
|
-
* The
|
|
41
|
-
*
|
|
42
|
-
*
|
|
56
|
+
* The chains a caller can name: every supported chain with at least one vault in the registry, the
|
|
57
|
+
* default chain first. A chain this client supports and the registry has no vault on is not
|
|
58
|
+
* offered — there is nothing to do there.
|
|
43
59
|
*/
|
|
44
|
-
export function
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
60
|
+
export function offeredChains() {
|
|
61
|
+
const present = new Set(loadRegistry().vaults.map((v) => v.chainId));
|
|
62
|
+
const first = defaultChainId();
|
|
63
|
+
return supportedChainIds
|
|
64
|
+
.filter((id) => present.has(id))
|
|
65
|
+
.sort((a, b) => (a === first ? -1 : b === first ? 1 : 0)) // stable: the rest keep `supportedChainIds` order
|
|
66
|
+
.map((id) => ({ key: CHAIN_INFO[id].key, chainId: id, name: CHAIN_INFO[id].name }));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The vault the tools use on a chain when the caller names none: `EARN.defaultVaultByChain`
|
|
70
|
+
* (config/earn.ts — the toggle), which the registry must also mark `isDefault` (the measurement; the
|
|
71
|
+
* schema guarantees exactly one per chain and that it is open or whitelist-gated). A disagreement
|
|
72
|
+
* between the two is refused, never resolved silently. With no argument: the default chain's.
|
|
73
|
+
*/
|
|
74
|
+
export function defaultVault(chainId = defaultChainId()) {
|
|
75
|
+
const key = CHAIN_INFO[chainId].key;
|
|
76
|
+
const named = EARN.defaultVaultByChain[key];
|
|
77
|
+
const marked = loadRegistry().vaults.find((x) => x.chainId === chainId && x.isDefault);
|
|
78
|
+
if (marked === undefined) {
|
|
79
|
+
throw new Error(`no vault is offered on ${CHAIN_INFO[chainId].name}; chains with a vault: ${offeredChains().map((c) => c.key).join(", ")}`);
|
|
49
80
|
}
|
|
50
|
-
|
|
81
|
+
if (marked.symbol !== named) {
|
|
82
|
+
throw new Error(`config/earn.ts names "${named}" as the default on ${key} but the registry marks "${marked.symbol}"; change both or neither`);
|
|
83
|
+
}
|
|
84
|
+
return marked;
|
|
51
85
|
}
|
|
52
|
-
/**
|
|
53
|
-
|
|
54
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Resolves an optional ticker and an optional chain to ONE vault:
|
|
88
|
+
*
|
|
89
|
+
* neither the default chain's default vault
|
|
90
|
+
* chain only that chain's default vault
|
|
91
|
+
* vault only that vault, on whatever chain it is on
|
|
92
|
+
* both that vault, and it must be on that chain — a disagreement is REFUSED, never
|
|
93
|
+
* resolved by picking one, because the two answers are different contracts on
|
|
94
|
+
* different chains and the caller meant exactly one of them.
|
|
95
|
+
*/
|
|
96
|
+
export function resolveVault(symbol, chain) {
|
|
97
|
+
let chainId;
|
|
98
|
+
// An EMPTY string is an omitted argument, for `chain` exactly as for `vault` (`!symbol` below):
|
|
99
|
+
// a host that sends "" for every optional it did not fill must get the default, not a refusal.
|
|
100
|
+
if (chain) {
|
|
101
|
+
chainId = chainIdForKey(chain);
|
|
102
|
+
const offered = offeredChains();
|
|
103
|
+
if (chainId === undefined || !offered.some((c) => c.chainId === chainId)) {
|
|
104
|
+
throw new Error(`unknown chain "${chain}"; chains with a vault: ${offered.map((c) => c.key).join(", ")}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (!symbol)
|
|
108
|
+
return defaultVault(chainId);
|
|
109
|
+
const v = getVault(symbol);
|
|
110
|
+
if (chainId !== undefined && v.chainId !== chainId) {
|
|
111
|
+
const on = loadRegistry()
|
|
112
|
+
.vaults.filter((x) => x.chainId === chainId)
|
|
113
|
+
.map((x) => x.symbol)
|
|
114
|
+
.join(", ");
|
|
115
|
+
throw new Error(`vault "${symbol}" is on ${CHAIN_INFO[v.chainId].key}, not ${chain}. Name one or the other: drop \`chain\` to use ${symbol} on ${CHAIN_INFO[v.chainId].key}, or pick a vault on ${chain} (${on}).`);
|
|
116
|
+
}
|
|
117
|
+
return v;
|
|
55
118
|
}
|
|
56
119
|
/**
|
|
57
120
|
* The vaults this client can put money into: ACTIVE, on an ERC-4626 chassis, and MEASURED open.
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAkC,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|