dexe-mcp 0.1.5 → 0.3.0
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/.mcp.example.json +12 -2
- package/CHANGELOG.md +84 -0
- package/FUTURE.md +26 -5
- package/README.md +105 -197
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/addresses.d.ts +57 -0
- package/dist/lib/addresses.d.ts.map +1 -0
- package/dist/lib/addresses.js +83 -0
- package/dist/lib/addresses.js.map +1 -0
- package/dist/lib/calldata.d.ts +32 -0
- package/dist/lib/calldata.d.ts.map +1 -0
- package/dist/lib/calldata.js +28 -0
- package/dist/lib/calldata.js.map +1 -0
- package/dist/lib/govEnums.d.ts +12 -0
- package/dist/lib/govEnums.d.ts.map +1 -0
- package/dist/lib/govEnums.js +35 -0
- package/dist/lib/govEnums.js.map +1 -0
- package/dist/lib/ipfs.d.ts +60 -0
- package/dist/lib/ipfs.d.ts.map +1 -0
- package/dist/lib/ipfs.js +168 -0
- package/dist/lib/ipfs.js.map +1 -0
- package/dist/lib/markdownToSlate.d.ts +39 -0
- package/dist/lib/markdownToSlate.d.ts.map +1 -0
- package/dist/lib/markdownToSlate.js +203 -0
- package/dist/lib/markdownToSlate.js.map +1 -0
- package/dist/lib/multicall.d.ts +33 -0
- package/dist/lib/multicall.d.ts.map +1 -0
- package/dist/lib/multicall.js +46 -0
- package/dist/lib/multicall.js.map +1 -0
- package/dist/lib/proposalCatalog.d.ts +45 -0
- package/dist/lib/proposalCatalog.d.ts.map +1 -0
- package/dist/lib/proposalCatalog.js +416 -0
- package/dist/lib/proposalCatalog.js.map +1 -0
- package/dist/lib/signer.d.ts +12 -0
- package/dist/lib/signer.d.ts.map +1 -0
- package/dist/lib/signer.js +31 -0
- package/dist/lib/signer.js.map +1 -0
- package/dist/lib/subgraph.d.ts +15 -0
- package/dist/lib/subgraph.d.ts.map +1 -0
- package/dist/lib/subgraph.js +42 -0
- package/dist/lib/subgraph.js.map +1 -0
- package/dist/tools/dao.d.ts +4 -0
- package/dist/tools/dao.d.ts.map +1 -0
- package/dist/tools/dao.js +242 -0
- package/dist/tools/dao.js.map +1 -0
- package/dist/tools/daoDeploy.d.ts +4 -0
- package/dist/tools/daoDeploy.d.ts.map +1 -0
- package/dist/tools/daoDeploy.js +573 -0
- package/dist/tools/daoDeploy.js.map +1 -0
- package/dist/tools/flow.d.ts +5 -0
- package/dist/tools/flow.d.ts.map +1 -0
- package/dist/tools/flow.js +451 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/ipfs.d.ts +6 -0
- package/dist/tools/ipfs.d.ts.map +1 -0
- package/dist/tools/ipfs.js +376 -0
- package/dist/tools/ipfs.js.map +1 -0
- package/dist/tools/proposal.d.ts +4 -0
- package/dist/tools/proposal.d.ts.map +1 -0
- package/dist/tools/proposal.js +217 -0
- package/dist/tools/proposal.js.map +1 -0
- package/dist/tools/proposalBuild.d.ts +4 -0
- package/dist/tools/proposalBuild.d.ts.map +1 -0
- package/dist/tools/proposalBuild.js +372 -0
- package/dist/tools/proposalBuild.js.map +1 -0
- package/dist/tools/proposalBuildComplex.d.ts +4 -0
- package/dist/tools/proposalBuildComplex.d.ts.map +1 -0
- package/dist/tools/proposalBuildComplex.js +766 -0
- package/dist/tools/proposalBuildComplex.js.map +1 -0
- package/dist/tools/proposalBuildInternal.d.ts +4 -0
- package/dist/tools/proposalBuildInternal.d.ts.map +1 -0
- package/dist/tools/proposalBuildInternal.js +224 -0
- package/dist/tools/proposalBuildInternal.js.map +1 -0
- package/dist/tools/proposalBuildMore.d.ts +4 -0
- package/dist/tools/proposalBuildMore.d.ts.map +1 -0
- package/dist/tools/proposalBuildMore.js +457 -0
- package/dist/tools/proposalBuildMore.js.map +1 -0
- package/dist/tools/proposalBuildOffchain.d.ts +4 -0
- package/dist/tools/proposalBuildOffchain.d.ts.map +1 -0
- package/dist/tools/proposalBuildOffchain.js +389 -0
- package/dist/tools/proposalBuildOffchain.js.map +1 -0
- package/dist/tools/read.d.ts +4 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +580 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/subgraph.d.ts +4 -0
- package/dist/tools/subgraph.d.ts.map +1 -0
- package/dist/tools/subgraph.js +404 -0
- package/dist/tools/subgraph.js.map +1 -0
- package/dist/tools/txSend.d.ts +5 -0
- package/dist/tools/txSend.d.ts.map +1 -0
- package/dist/tools/txSend.js +87 -0
- package/dist/tools/txSend.js.map +1 -0
- package/dist/tools/vote.d.ts +4 -0
- package/dist/tools/vote.d.ts.map +1 -0
- package/dist/tools/vote.js +196 -0
- package/dist/tools/vote.js.map +1 -0
- package/dist/tools/voteBuild.d.ts +4 -0
- package/dist/tools/voteBuild.d.ts.map +1 -0
- package/dist/tools/voteBuild.js +983 -0
- package/dist/tools/voteBuild.js.map +1 -0
- package/package.json +18 -5
- package/PLAN.md +0 -132
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { resolve, dirname } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
2
5
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
6
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
7
|
import { loadConfig } from "./config.js";
|
|
5
8
|
import { registerAll } from "./tools/index.js";
|
|
9
|
+
// Load .env from project root if present — ensures env vars reach the process
|
|
10
|
+
// regardless of how the MCP host launches us (Claude Code drops most env vars
|
|
11
|
+
// from its settings.json "env" block on Windows).
|
|
12
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const dotenvPath = resolve(__dirname, "..", ".env");
|
|
14
|
+
if (existsSync(dotenvPath)) {
|
|
15
|
+
try {
|
|
16
|
+
process.loadEnvFile(dotenvPath);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Node < 21.7 or other issue — fall through to process.env as-is
|
|
20
|
+
}
|
|
21
|
+
}
|
|
6
22
|
async function main() {
|
|
7
23
|
const config = await loadConfig();
|
|
8
24
|
const server = new McpServer({ name: "dexe-mcp", version: "0.1.5" }, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EACtC;QACE,YAAY,EACV,mRAAmR;KACtR,CACF,CAAC;IAEF,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qDAAqD,MAAM,CAAC,YAAY,GACtE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACrC,IAAI,CACL,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,8EAA8E;AAC9E,8EAA8E;AAC9E,kDAAkD;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EACtC;QACE,YAAY,EACV,mRAAmR;KACtR,CACF,CAAC;IAEF,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qDAAqD,MAAM,CAAC,YAAY,GACtE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACrC,IAAI,CACL,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { JsonRpcProvider } from "ethers";
|
|
2
|
+
/**
|
|
3
|
+
* Per-chain `ContractsRegistry` root addresses. Every other DeXe protocol
|
|
4
|
+
* contract is resolved through `ContractsRegistry.getContract(name)` at
|
|
5
|
+
* runtime, so we only need to know the root per chain. Users can override with
|
|
6
|
+
* `DEXE_CONTRACTS_REGISTRY`.
|
|
7
|
+
*
|
|
8
|
+
* NOTE: the BSC mainnet address below matches the value shipped in the DeXe
|
|
9
|
+
* frontend env. Add more chains as they come online.
|
|
10
|
+
*/
|
|
11
|
+
export declare const CONTRACTS_REGISTRY_BY_CHAIN: Record<number, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Canonical contract names used as keys inside `ContractsRegistry`. Mirrors
|
|
14
|
+
* constants in `contracts/core/ContractsRegistry.sol` and
|
|
15
|
+
* `contracts/factory/PoolRegistry.sol` (DeXe-Protocol).
|
|
16
|
+
*/
|
|
17
|
+
export declare const CONTRACT_NAMES: {
|
|
18
|
+
readonly POOL_FACTORY: "POOL_FACTORY";
|
|
19
|
+
readonly POOL_REGISTRY: "POOL_REGISTRY";
|
|
20
|
+
readonly USER_REGISTRY: "USER_REGISTRY";
|
|
21
|
+
readonly CORE_PROPERTIES: "CORE_PROPERTIES";
|
|
22
|
+
readonly NETWORK_PROPERTIES: "NETWORK_PROPERTIES";
|
|
23
|
+
readonly PRICE_FEED: "PRICE_FEED";
|
|
24
|
+
readonly TREASURY: "TREASURY";
|
|
25
|
+
readonly DEXE: "DEXE";
|
|
26
|
+
readonly WETH: "WETH";
|
|
27
|
+
readonly USD: "USD";
|
|
28
|
+
readonly BABT: "BABT";
|
|
29
|
+
readonly DEXE_EXPERT_NFT: "DEXE_EXPERT_NFT";
|
|
30
|
+
readonly TOKEN_ALLOCATOR: "TOKEN_ALLOCATOR";
|
|
31
|
+
};
|
|
32
|
+
export type ContractName = (typeof CONTRACT_NAMES)[keyof typeof CONTRACT_NAMES];
|
|
33
|
+
export interface AddressBookConfig {
|
|
34
|
+
readonly provider: JsonRpcProvider;
|
|
35
|
+
readonly chainId: number;
|
|
36
|
+
/** Optional override for the `ContractsRegistry` root. */
|
|
37
|
+
readonly registryOverride?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Lazy, cached resolver for DeXe core contract addresses on a given chain.
|
|
41
|
+
* First call for each name hits RPC; subsequent calls return from the in-memory
|
|
42
|
+
* cache.
|
|
43
|
+
*/
|
|
44
|
+
export declare class AddressBook {
|
|
45
|
+
private readonly cfg;
|
|
46
|
+
private readonly cache;
|
|
47
|
+
private readonly registry;
|
|
48
|
+
readonly registryAddress: string;
|
|
49
|
+
readonly provider: JsonRpcProvider;
|
|
50
|
+
readonly chainId: number;
|
|
51
|
+
constructor(cfg: AddressBookConfig);
|
|
52
|
+
/** Resolve a canonical contract name to its deployed address on this chain. */
|
|
53
|
+
resolve(name: string): Promise<string>;
|
|
54
|
+
/** Resolve many at once (sequential — registry getContract is cheap). */
|
|
55
|
+
resolveMany(names: string[]): Promise<Record<string, string>>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=addresses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.d.ts","sourceRoot":"","sources":["../../src/lib/addresses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAe,MAAM,QAAQ,CAAC;AAEhE;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAcjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAOhF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;;;GAIG;AACH,qBAAa,WAAW;IAOV,OAAO,CAAC,QAAQ,CAAC,GAAG;IANhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEI,GAAG,EAAE,iBAAiB;IAgBnD,+EAA+E;IACzE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc5C,yEAAyE;IACnE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAKpE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Contract, ZeroAddress } from "ethers";
|
|
2
|
+
/**
|
|
3
|
+
* Per-chain `ContractsRegistry` root addresses. Every other DeXe protocol
|
|
4
|
+
* contract is resolved through `ContractsRegistry.getContract(name)` at
|
|
5
|
+
* runtime, so we only need to know the root per chain. Users can override with
|
|
6
|
+
* `DEXE_CONTRACTS_REGISTRY`.
|
|
7
|
+
*
|
|
8
|
+
* NOTE: the BSC mainnet address below matches the value shipped in the DeXe
|
|
9
|
+
* frontend env. Add more chains as they come online.
|
|
10
|
+
*/
|
|
11
|
+
export const CONTRACTS_REGISTRY_BY_CHAIN = {
|
|
12
|
+
56: "0x46B46629B674b4C0b48B111DEeB0eAfd9F84A1c0",
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Canonical contract names used as keys inside `ContractsRegistry`. Mirrors
|
|
16
|
+
* constants in `contracts/core/ContractsRegistry.sol` and
|
|
17
|
+
* `contracts/factory/PoolRegistry.sol` (DeXe-Protocol).
|
|
18
|
+
*/
|
|
19
|
+
export const CONTRACT_NAMES = {
|
|
20
|
+
POOL_FACTORY: "POOL_FACTORY",
|
|
21
|
+
POOL_REGISTRY: "POOL_REGISTRY",
|
|
22
|
+
USER_REGISTRY: "USER_REGISTRY",
|
|
23
|
+
CORE_PROPERTIES: "CORE_PROPERTIES",
|
|
24
|
+
NETWORK_PROPERTIES: "NETWORK_PROPERTIES",
|
|
25
|
+
PRICE_FEED: "PRICE_FEED",
|
|
26
|
+
TREASURY: "TREASURY",
|
|
27
|
+
DEXE: "DEXE",
|
|
28
|
+
WETH: "WETH",
|
|
29
|
+
USD: "USD",
|
|
30
|
+
BABT: "BABT",
|
|
31
|
+
DEXE_EXPERT_NFT: "DEXE_EXPERT_NFT",
|
|
32
|
+
TOKEN_ALLOCATOR: "TOKEN_ALLOCATOR",
|
|
33
|
+
};
|
|
34
|
+
const REGISTRY_ABI = [
|
|
35
|
+
"function getContract(string memory name) external view returns (address)",
|
|
36
|
+
"function hasContract(string memory name) external view returns (bool)",
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Lazy, cached resolver for DeXe core contract addresses on a given chain.
|
|
40
|
+
* First call for each name hits RPC; subsequent calls return from the in-memory
|
|
41
|
+
* cache.
|
|
42
|
+
*/
|
|
43
|
+
export class AddressBook {
|
|
44
|
+
cfg;
|
|
45
|
+
cache = new Map();
|
|
46
|
+
registry;
|
|
47
|
+
registryAddress;
|
|
48
|
+
provider;
|
|
49
|
+
chainId;
|
|
50
|
+
constructor(cfg) {
|
|
51
|
+
this.cfg = cfg;
|
|
52
|
+
this.provider = cfg.provider;
|
|
53
|
+
this.chainId = cfg.chainId;
|
|
54
|
+
const addr = cfg.registryOverride ?? CONTRACTS_REGISTRY_BY_CHAIN[cfg.chainId];
|
|
55
|
+
if (!addr) {
|
|
56
|
+
throw new Error(`No ContractsRegistry address known for chainId=${cfg.chainId}. ` +
|
|
57
|
+
`Set DEXE_CONTRACTS_REGISTRY or pick a supported chain (${Object.keys(CONTRACTS_REGISTRY_BY_CHAIN).join(", ")}).`);
|
|
58
|
+
}
|
|
59
|
+
this.registryAddress = addr;
|
|
60
|
+
this.registry = new Contract(addr, REGISTRY_ABI, cfg.provider);
|
|
61
|
+
}
|
|
62
|
+
/** Resolve a canonical contract name to its deployed address on this chain. */
|
|
63
|
+
async resolve(name) {
|
|
64
|
+
const hit = this.cache.get(name);
|
|
65
|
+
if (hit)
|
|
66
|
+
return hit;
|
|
67
|
+
const addr = await this.registry.getFunction("getContract").staticCall(name);
|
|
68
|
+
if (!addr || addr === ZeroAddress) {
|
|
69
|
+
throw new Error(`ContractsRegistry has no entry for "${name}" on chainId=${this.cfg.chainId}. ` +
|
|
70
|
+
`Double-check the name — see CONTRACT_NAMES in src/lib/addresses.ts.`);
|
|
71
|
+
}
|
|
72
|
+
this.cache.set(name, addr);
|
|
73
|
+
return addr;
|
|
74
|
+
}
|
|
75
|
+
/** Resolve many at once (sequential — registry getContract is cheap). */
|
|
76
|
+
async resolveMany(names) {
|
|
77
|
+
const out = {};
|
|
78
|
+
for (const n of names)
|
|
79
|
+
out[n] = await this.resolve(n);
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=addresses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../src/lib/addresses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEhE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAA2B;IACjE,EAAE,EAAE,4CAA4C;CACjD,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IACxC,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;CAC1B,CAAC;AAIX,MAAM,YAAY,GAAG;IACnB,0EAA0E;IAC1E,uEAAuE;CAC/D,CAAC;AASX;;;;GAIG;AACH,MAAM,OAAO,WAAW;IAOO;IANZ,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,QAAQ,CAAW;IAC3B,eAAe,CAAS;IACxB,QAAQ,CAAkB;IAC1B,OAAO,CAAS;IAEzB,YAA6B,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;QACjD,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,gBAAgB,IAAI,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,kDAAkD,GAAG,CAAC,OAAO,IAAI;gBAC/D,0DAA0D,MAAM,CAAC,IAAI,CACnE,2BAA2B,CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,MAAM,IAAI,GAAW,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrF,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,gBAAgB,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI;gBAC7E,qEAAqE,CACxE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,WAAW,CAAC,KAAe;QAC/B,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Interface } from "ethers";
|
|
2
|
+
/**
|
|
3
|
+
* Canonical signable payload shape returned by every `*_build_*` tool.
|
|
4
|
+
* Consumers (agent wallets, Safe, etc.) can feed this straight into
|
|
5
|
+
* `eth_sendTransaction` / `personal_signTypedData` flows.
|
|
6
|
+
*/
|
|
7
|
+
export interface TxPayload {
|
|
8
|
+
/** Destination contract address. */
|
|
9
|
+
to: string;
|
|
10
|
+
/** ABI-encoded call data (0x-prefixed hex). */
|
|
11
|
+
data: string;
|
|
12
|
+
/** Wei value as decimal string ("0" if none). */
|
|
13
|
+
value: string;
|
|
14
|
+
/** Target chain id. */
|
|
15
|
+
chainId: number;
|
|
16
|
+
/** Human-readable action label, e.g. "GovPool.vote(123, true, 1000000000000000000, [])". */
|
|
17
|
+
description: string;
|
|
18
|
+
}
|
|
19
|
+
export interface BuildPayloadOpts {
|
|
20
|
+
to: string;
|
|
21
|
+
iface: Interface;
|
|
22
|
+
method: string;
|
|
23
|
+
args: readonly unknown[];
|
|
24
|
+
chainId: number;
|
|
25
|
+
value?: bigint | string | number;
|
|
26
|
+
/** Optional override; otherwise we auto-generate `Contract.method(args…)`. */
|
|
27
|
+
description?: string;
|
|
28
|
+
/** Contract label used in auto-generated description. */
|
|
29
|
+
contractLabel?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function buildPayload(opts: BuildPayloadOpts): TxPayload;
|
|
32
|
+
//# sourceMappingURL=calldata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calldata.d.ts","sourceRoot":"","sources":["../../src/lib/calldata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAY9D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function buildPayload(opts) {
|
|
2
|
+
const data = opts.iface.encodeFunctionData(opts.method, opts.args);
|
|
3
|
+
const value = (opts.value ?? 0n).toString();
|
|
4
|
+
const description = opts.description ?? `${opts.contractLabel ?? "Contract"}.${opts.method}(${formatArgs(opts.args)})`;
|
|
5
|
+
return {
|
|
6
|
+
to: opts.to,
|
|
7
|
+
data,
|
|
8
|
+
value,
|
|
9
|
+
chainId: opts.chainId,
|
|
10
|
+
description,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function formatArgs(args) {
|
|
14
|
+
return args
|
|
15
|
+
.map((a) => {
|
|
16
|
+
if (typeof a === "bigint")
|
|
17
|
+
return a.toString();
|
|
18
|
+
if (typeof a === "string")
|
|
19
|
+
return a.length > 42 ? `${a.slice(0, 10)}…` : a;
|
|
20
|
+
if (Array.isArray(a))
|
|
21
|
+
return `[${a.length}]`;
|
|
22
|
+
if (a && typeof a === "object")
|
|
23
|
+
return "{…}";
|
|
24
|
+
return String(a);
|
|
25
|
+
})
|
|
26
|
+
.join(", ");
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=calldata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calldata.js","sourceRoot":"","sources":["../../src/lib/calldata.ts"],"names":[],"mappings":"AAiCA,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5C,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,IAAI,GAAG,IAAI,CAAC,aAAa,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACrG,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI;QACJ,KAAK;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAwB;IAC1C,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAC7C,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC7C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mirror of `IGovPool.ProposalState` (contracts/interfaces/gov/IGovPool.sol).
|
|
3
|
+
* Order must match the Solidity enum exactly.
|
|
4
|
+
*/
|
|
5
|
+
export declare const PROPOSAL_STATE_NAMES: readonly ["Voting", "WaitingForVotingTransfer", "ValidatorVoting", "Defeated", "SucceededFor", "SucceededAgainst", "Locked", "ExecutedFor", "ExecutedAgainst", "Undefined"];
|
|
6
|
+
export type ProposalStateName = (typeof PROPOSAL_STATE_NAMES)[number];
|
|
7
|
+
export declare function proposalStateLabel(n: bigint | number): ProposalStateName;
|
|
8
|
+
/** Mirror of `IGovPool.VoteType`. */
|
|
9
|
+
export declare const VOTE_TYPE_NAMES: readonly ["PersonalVote", "MicropoolVote", "DelegatedVote", "TreasuryVote"];
|
|
10
|
+
export type VoteTypeName = (typeof VOTE_TYPE_NAMES)[number];
|
|
11
|
+
export declare function voteTypeFromString(s: string): number;
|
|
12
|
+
//# sourceMappingURL=govEnums.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"govEnums.d.ts","sourceRoot":"","sources":["../../src/lib/govEnums.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,6KAWvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAGxE;AAED,qCAAqC;AACrC,eAAO,MAAM,eAAe,6EAKlB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mirror of `IGovPool.ProposalState` (contracts/interfaces/gov/IGovPool.sol).
|
|
3
|
+
* Order must match the Solidity enum exactly.
|
|
4
|
+
*/
|
|
5
|
+
export const PROPOSAL_STATE_NAMES = [
|
|
6
|
+
"Voting",
|
|
7
|
+
"WaitingForVotingTransfer",
|
|
8
|
+
"ValidatorVoting",
|
|
9
|
+
"Defeated",
|
|
10
|
+
"SucceededFor",
|
|
11
|
+
"SucceededAgainst",
|
|
12
|
+
"Locked",
|
|
13
|
+
"ExecutedFor",
|
|
14
|
+
"ExecutedAgainst",
|
|
15
|
+
"Undefined",
|
|
16
|
+
];
|
|
17
|
+
export function proposalStateLabel(n) {
|
|
18
|
+
const i = typeof n === "bigint" ? Number(n) : n;
|
|
19
|
+
return PROPOSAL_STATE_NAMES[i] ?? "Undefined";
|
|
20
|
+
}
|
|
21
|
+
/** Mirror of `IGovPool.VoteType`. */
|
|
22
|
+
export const VOTE_TYPE_NAMES = [
|
|
23
|
+
"PersonalVote",
|
|
24
|
+
"MicropoolVote",
|
|
25
|
+
"DelegatedVote",
|
|
26
|
+
"TreasuryVote",
|
|
27
|
+
];
|
|
28
|
+
export function voteTypeFromString(s) {
|
|
29
|
+
const i = VOTE_TYPE_NAMES.indexOf(s);
|
|
30
|
+
if (i < 0) {
|
|
31
|
+
throw new Error(`Unknown voteType "${s}". Valid: ${VOTE_TYPE_NAMES.join(", ")}`);
|
|
32
|
+
}
|
|
33
|
+
return i;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=govEnums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"govEnums.js","sourceRoot":"","sources":["../../src/lib/govEnums.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,QAAQ;IACR,0BAA0B;IAC1B,iBAAiB;IACjB,UAAU;IACV,cAAc;IACd,kBAAkB;IAClB,QAAQ;IACR,aAAa;IACb,iBAAiB;IACjB,WAAW;CACH,CAAC;AAIX,MAAM,UAAU,kBAAkB,CAAC,CAAkB;IACnD,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,oBAAoB,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AAChD,CAAC;AAED,qCAAqC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,cAAc;IACd,eAAe;IACf,eAAe;IACf,cAAc;CACN,CAAC;AAIX,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,MAAM,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAiB,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,qBAAqB,CAAC,aAAa,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public IPFS gateways (dweb.link, ipfs.io, cf-ipfs.com, …) are unreliable —
|
|
3
|
+
* frequent 502s, rate limits, and extended outages in 2025/2026. We do NOT
|
|
4
|
+
* ship a default public-gateway chain. Callers must configure a dedicated
|
|
5
|
+
* gateway via `DEXE_IPFS_GATEWAY` (e.g. the user's Pinata dedicated gateway,
|
|
6
|
+
* Filebase, Quicknode, or a self-hosted one). Public gateways may be
|
|
7
|
+
* opted-in as a best-effort fallback via `DEXE_IPFS_GATEWAYS_FALLBACK`.
|
|
8
|
+
*/
|
|
9
|
+
export declare const NO_DEFAULT_GATEWAYS: readonly string[];
|
|
10
|
+
export interface IpfsFetchConfig {
|
|
11
|
+
gateways: readonly string[];
|
|
12
|
+
/** Per-hop timeout in ms. Default 4000. */
|
|
13
|
+
perRequestTimeoutMs?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface IpfsFetchResult {
|
|
16
|
+
cid: string;
|
|
17
|
+
gateway: string;
|
|
18
|
+
contentType: string;
|
|
19
|
+
bytes: Uint8Array;
|
|
20
|
+
/** JSON-parsed body if content-type is JSON; null otherwise. */
|
|
21
|
+
json: unknown | null;
|
|
22
|
+
/** Total attempts made (including failures before success). */
|
|
23
|
+
attempts: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function fetchIpfs(cid: string, cfg: IpfsFetchConfig): Promise<IpfsFetchResult>;
|
|
26
|
+
export interface CidInfo {
|
|
27
|
+
cid: string;
|
|
28
|
+
version: 0 | 1;
|
|
29
|
+
codec: string;
|
|
30
|
+
multihash: string;
|
|
31
|
+
/** Same CID in the other version if conversion is legal (v1 ↔ v0 only for dag-pb/sha-256). */
|
|
32
|
+
alternate: string | null;
|
|
33
|
+
}
|
|
34
|
+
export declare function parseCid(input: string): CidInfo;
|
|
35
|
+
export declare function stripIpfsPrefix(s: string): string;
|
|
36
|
+
/** Compute the CIDv1 for arbitrary JSON locally — no network. */
|
|
37
|
+
export declare function cidForJson(value: unknown): Promise<string>;
|
|
38
|
+
/** Compute the CIDv1 (raw codec) for arbitrary bytes locally. */
|
|
39
|
+
export declare function cidForBytes(bytes: Uint8Array): Promise<string>;
|
|
40
|
+
export interface PinataPinResult {
|
|
41
|
+
cid: string;
|
|
42
|
+
size: number;
|
|
43
|
+
pinnedAt: string;
|
|
44
|
+
}
|
|
45
|
+
export declare class PinataClient {
|
|
46
|
+
private readonly jwt;
|
|
47
|
+
constructor(jwt: string);
|
|
48
|
+
/** Verify the JWT — cheap sanity check before an upload. */
|
|
49
|
+
ping(): Promise<void>;
|
|
50
|
+
pinJson(payload: unknown, opts?: {
|
|
51
|
+
name?: string;
|
|
52
|
+
keyvalues?: Record<string, string>;
|
|
53
|
+
}): Promise<PinataPinResult>;
|
|
54
|
+
pinFile(bytes: Uint8Array, opts?: {
|
|
55
|
+
fileName?: string;
|
|
56
|
+
contentType?: string;
|
|
57
|
+
name?: string;
|
|
58
|
+
}): Promise<PinataPinResult>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=ipfs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../src/lib/ipfs.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAO,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,gEAAgE;IAChE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,eAAe,CAAC,CAwC1B;AAID,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAoB/C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,iEAAiE;AACjE,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhE;AAED,iEAAiE;AACjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpE;AAyBD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAIxC,4DAA4D;IACtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC3D,OAAO,CAAC,eAAe,CAAC;IA0BrB,OAAO,CACX,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAChE,OAAO,CAAC,eAAe,CAAC;CAwB5B"}
|
package/dist/lib/ipfs.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { CID } from "multiformats/cid";
|
|
2
|
+
import * as json from "multiformats/codecs/json";
|
|
3
|
+
import * as raw from "multiformats/codecs/raw";
|
|
4
|
+
import { sha256 } from "multiformats/hashes/sha2";
|
|
5
|
+
import { base32 } from "multiformats/bases/base32";
|
|
6
|
+
import { base58btc } from "multiformats/bases/base58";
|
|
7
|
+
/**
|
|
8
|
+
* Public IPFS gateways (dweb.link, ipfs.io, cf-ipfs.com, …) are unreliable —
|
|
9
|
+
* frequent 502s, rate limits, and extended outages in 2025/2026. We do NOT
|
|
10
|
+
* ship a default public-gateway chain. Callers must configure a dedicated
|
|
11
|
+
* gateway via `DEXE_IPFS_GATEWAY` (e.g. the user's Pinata dedicated gateway,
|
|
12
|
+
* Filebase, Quicknode, or a self-hosted one). Public gateways may be
|
|
13
|
+
* opted-in as a best-effort fallback via `DEXE_IPFS_GATEWAYS_FALLBACK`.
|
|
14
|
+
*/
|
|
15
|
+
export const NO_DEFAULT_GATEWAYS = [];
|
|
16
|
+
export async function fetchIpfs(cid, cfg) {
|
|
17
|
+
const parsed = CID.parse(stripIpfsPrefix(cid));
|
|
18
|
+
const cidStr = parsed.toString();
|
|
19
|
+
const timeout = cfg.perRequestTimeoutMs ?? 4000;
|
|
20
|
+
const errors = [];
|
|
21
|
+
let attempts = 0;
|
|
22
|
+
for (const gw of cfg.gateways) {
|
|
23
|
+
attempts++;
|
|
24
|
+
const base = gw.replace(/\/+$/, "").replace(/\/ipfs$/, "");
|
|
25
|
+
const url = `${base}/ipfs/${cidStr}`;
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const t = setTimeout(() => controller.abort(), timeout);
|
|
28
|
+
try {
|
|
29
|
+
const res = await fetch(url, { signal: controller.signal });
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
errors.push(`${gw} → HTTP ${res.status}`);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const contentType = res.headers.get("content-type") ?? "application/octet-stream";
|
|
35
|
+
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
36
|
+
let parsedJson = null;
|
|
37
|
+
if (contentType.includes("json") || contentType.includes("text")) {
|
|
38
|
+
try {
|
|
39
|
+
parsedJson = JSON.parse(new TextDecoder().decode(bytes));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// not JSON — that's fine
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { cid: cidStr, gateway: gw, contentType, bytes, json: parsedJson, attempts };
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
errors.push(`${gw} → ${err instanceof Error ? err.message : String(err)}`);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
clearTimeout(t);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`IPFS fetch failed for ${cidStr} across ${attempts} gateway(s): ${errors.join("; ")}`);
|
|
55
|
+
}
|
|
56
|
+
export function parseCid(input) {
|
|
57
|
+
const s = stripIpfsPrefix(input);
|
|
58
|
+
const cid = CID.parse(s);
|
|
59
|
+
const version = cid.version;
|
|
60
|
+
const codec = codecName(cid.code);
|
|
61
|
+
const multihash = base58btc.encode(cid.multihash.bytes).slice(1);
|
|
62
|
+
let alternate = null;
|
|
63
|
+
try {
|
|
64
|
+
if (version === 0) {
|
|
65
|
+
alternate = cid.toV1().toString(base32);
|
|
66
|
+
}
|
|
67
|
+
else if (version === 1 && cid.code === 0x70) {
|
|
68
|
+
// only dag-pb v1 is legal to downgrade to v0
|
|
69
|
+
alternate = cid.toV0().toString();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
alternate = null;
|
|
74
|
+
}
|
|
75
|
+
return { cid: cid.toString(), version, codec, multihash, alternate };
|
|
76
|
+
}
|
|
77
|
+
export function stripIpfsPrefix(s) {
|
|
78
|
+
return s.replace(/^ipfs:\/\//, "").replace(/^\/?ipfs\//, "");
|
|
79
|
+
}
|
|
80
|
+
/** Compute the CIDv1 for arbitrary JSON locally — no network. */
|
|
81
|
+
export async function cidForJson(value) {
|
|
82
|
+
const bytes = json.encode(value);
|
|
83
|
+
const hash = await sha256.digest(bytes);
|
|
84
|
+
return CID.create(1, json.code, hash).toString(base32);
|
|
85
|
+
}
|
|
86
|
+
/** Compute the CIDv1 (raw codec) for arbitrary bytes locally. */
|
|
87
|
+
export async function cidForBytes(bytes) {
|
|
88
|
+
const hash = await sha256.digest(bytes);
|
|
89
|
+
return CID.create(1, raw.code, hash).toString(base32);
|
|
90
|
+
}
|
|
91
|
+
function codecName(code) {
|
|
92
|
+
switch (code) {
|
|
93
|
+
case 0x55:
|
|
94
|
+
return "raw";
|
|
95
|
+
case 0x70:
|
|
96
|
+
return "dag-pb";
|
|
97
|
+
case 0x71:
|
|
98
|
+
return "dag-cbor";
|
|
99
|
+
case 0x0200:
|
|
100
|
+
return "json";
|
|
101
|
+
case 0x0129:
|
|
102
|
+
return "dag-json";
|
|
103
|
+
default:
|
|
104
|
+
return `0x${code.toString(16)}`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// ---------- Pinata upload ----------
|
|
108
|
+
const PINATA_PIN_JSON_URL = "https://api.pinata.cloud/pinning/pinJSONToIPFS";
|
|
109
|
+
const PINATA_PIN_FILE_URL = "https://api.pinata.cloud/pinning/pinFileToIPFS";
|
|
110
|
+
const PINATA_USER_URL = "https://api.pinata.cloud/data/testAuthentication";
|
|
111
|
+
export class PinataClient {
|
|
112
|
+
jwt;
|
|
113
|
+
constructor(jwt) {
|
|
114
|
+
this.jwt = jwt;
|
|
115
|
+
if (!jwt)
|
|
116
|
+
throw new Error("Pinata JWT is required");
|
|
117
|
+
}
|
|
118
|
+
/** Verify the JWT — cheap sanity check before an upload. */
|
|
119
|
+
async ping() {
|
|
120
|
+
const res = await fetch(PINATA_USER_URL, {
|
|
121
|
+
headers: { Authorization: `Bearer ${this.jwt}` },
|
|
122
|
+
});
|
|
123
|
+
if (!res.ok)
|
|
124
|
+
throw new Error(`Pinata auth failed: HTTP ${res.status} ${await res.text()}`);
|
|
125
|
+
}
|
|
126
|
+
async pinJson(payload, opts) {
|
|
127
|
+
const body = {
|
|
128
|
+
pinataContent: payload,
|
|
129
|
+
pinataMetadata: opts?.name || opts?.keyvalues
|
|
130
|
+
? { name: opts?.name, keyvalues: opts?.keyvalues }
|
|
131
|
+
: undefined,
|
|
132
|
+
};
|
|
133
|
+
const res = await fetch(PINATA_PIN_JSON_URL, {
|
|
134
|
+
method: "POST",
|
|
135
|
+
headers: {
|
|
136
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
137
|
+
"Content-Type": "application/json",
|
|
138
|
+
},
|
|
139
|
+
body: JSON.stringify(body),
|
|
140
|
+
});
|
|
141
|
+
if (!res.ok) {
|
|
142
|
+
throw new Error(`Pinata pinJSON failed: HTTP ${res.status} ${await res.text()}`);
|
|
143
|
+
}
|
|
144
|
+
const data = (await res.json());
|
|
145
|
+
return { cid: data.IpfsHash, size: data.PinSize, pinnedAt: data.Timestamp };
|
|
146
|
+
}
|
|
147
|
+
async pinFile(bytes, opts) {
|
|
148
|
+
const form = new FormData();
|
|
149
|
+
const blob = new Blob([bytes], {
|
|
150
|
+
type: opts?.contentType ?? "application/octet-stream",
|
|
151
|
+
});
|
|
152
|
+
form.append("file", blob, opts?.fileName ?? "file");
|
|
153
|
+
if (opts?.name) {
|
|
154
|
+
form.append("pinataMetadata", JSON.stringify({ name: opts.name }));
|
|
155
|
+
}
|
|
156
|
+
const res = await fetch(PINATA_PIN_FILE_URL, {
|
|
157
|
+
method: "POST",
|
|
158
|
+
headers: { Authorization: `Bearer ${this.jwt}` },
|
|
159
|
+
body: form,
|
|
160
|
+
});
|
|
161
|
+
if (!res.ok) {
|
|
162
|
+
throw new Error(`Pinata pinFile failed: HTTP ${res.status} ${await res.text()}`);
|
|
163
|
+
}
|
|
164
|
+
const data = (await res.json());
|
|
165
|
+
return { cid: data.IpfsHash, size: data.PinSize, pinnedAt: data.Timestamp };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=ipfs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../src/lib/ipfs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a Markdown string to the Slate node format used by the DeXe
|
|
3
|
+
* investing-dashboard frontend.
|
|
4
|
+
*
|
|
5
|
+
* Uses `unified` + `remark-parse` + `remark-slate-transformer` with overrides
|
|
6
|
+
* that map remark's default node types to the frontend's ELEMENT_TYPES enum:
|
|
7
|
+
*
|
|
8
|
+
* Remark default → Frontend Slate type
|
|
9
|
+
* ─────────────────────────────────────────────
|
|
10
|
+
* heading depth=1 → "heading-one"
|
|
11
|
+
* heading depth=2 → "heading-two"
|
|
12
|
+
* heading depth=3 → "heading-three"
|
|
13
|
+
* paragraph → "paragraph" (same)
|
|
14
|
+
* list ordered=false → "bulleted-list"
|
|
15
|
+
* list ordered=true → "numbered-list"
|
|
16
|
+
* listItem → "list-item"
|
|
17
|
+
* code → "code-block"
|
|
18
|
+
* link → "link"
|
|
19
|
+
* image → "image"
|
|
20
|
+
* delete → "strikethrough" (~~text~~)
|
|
21
|
+
*
|
|
22
|
+
* Text marks:
|
|
23
|
+
* strong → { bold: true }
|
|
24
|
+
* emphasis → { italic: true }
|
|
25
|
+
* inlineCode → wrapped in code-inline element
|
|
26
|
+
* delete → { strikethrough: true }
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Convert a Markdown string to a Slate `SlateDescendant[]` array compatible
|
|
30
|
+
* with the DeXe investing-dashboard frontend.
|
|
31
|
+
*
|
|
32
|
+
* - Empty / whitespace-only input → default empty paragraph node
|
|
33
|
+
* - Plain text (no markdown syntax) → paragraph nodes split by newline
|
|
34
|
+
* - Rich markdown → full Slate tree with headings, lists, bold, etc.
|
|
35
|
+
*
|
|
36
|
+
* This function is synchronous (`processSync`).
|
|
37
|
+
*/
|
|
38
|
+
export declare function markdownToSlate(markdown: string): unknown[];
|
|
39
|
+
//# sourceMappingURL=markdownToSlate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownToSlate.d.ts","sourceRoot":"","sources":["../../src/lib/markdownToSlate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AA6IH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAuB3D"}
|