dexe-mcp 0.1.3 → 0.2.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 +48 -0
- package/FUTURE.md +26 -5
- package/README.md +80 -195
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +10 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -1
- package/dist/config.js.map +1 -1
- package/dist/hardhat.d.ts.map +1 -1
- package/dist/hardhat.js +10 -5
- package/dist/hardhat.js.map +1 -1
- package/dist/index.js +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 +167 -0
- package/dist/lib/ipfs.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/subgraph.d.ts +15 -0
- package/dist/lib/subgraph.d.ts.map +1 -0
- package/dist/lib/subgraph.js +37 -0
- package/dist/lib/subgraph.js.map +1 -0
- package/dist/runtime.d.ts +51 -13
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +149 -26
- package/dist/runtime.js.map +1 -1
- 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 +323 -0
- package/dist/tools/daoDeploy.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +24 -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 +310 -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 +199 -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 +357 -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 +700 -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 +211 -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 +436 -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 +386 -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 +353 -0
- package/dist/tools/read.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 +563 -0
- package/dist/tools/voteBuild.js.map +1 -0
- package/package.json +9 -4
- package/PLAN.md +0 -132
package/dist/hardhat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hardhat.d.ts","sourceRoot":"","sources":["../src/hardhat.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,sDAAsD;AACtD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAiBD,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAE/C;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"hardhat.d.ts","sourceRoot":"","sources":["../src/hardhat.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,sDAAsD;AACtD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAiBD,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAE/C;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IAchF;;;;;OAKG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IAqB7E,OAAO,CAAC,GAAG;CA+DZ"}
|
package/dist/hardhat.js
CHANGED
|
@@ -4,7 +4,7 @@ import { writeFileSync, mkdtempSync } from "node:fs";
|
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { ensureBuildReady } from "./bootstrap.js";
|
|
7
|
-
import { hardhatCommand, npmCommand } from "./runtime.js";
|
|
7
|
+
import { envWithNodeBinDir, hardhatCommand, npmCommand } from "./runtime.js";
|
|
8
8
|
const HARDHAT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
9
9
|
const STDOUT_TAIL_LINES = 200;
|
|
10
10
|
const STDERR_TAIL_LINES = 100;
|
|
@@ -35,7 +35,7 @@ export class HardhatRunner {
|
|
|
35
35
|
const args = [...npm.prefixArgs, "run", script];
|
|
36
36
|
if (extraArgs.length > 0)
|
|
37
37
|
args.push("--", ...extraArgs);
|
|
38
|
-
return this.run(npm.command, args, `npm-run-${script}
|
|
38
|
+
return this.run(npm.command, args, `npm-run-${script}`, npm.needsShell, envWithNodeBinDir(npm.binDir));
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
41
|
* Run `hardhat <subcommand> <args...>` in the protocol directory.
|
|
@@ -49,9 +49,13 @@ export class HardhatRunner {
|
|
|
49
49
|
if (!hh) {
|
|
50
50
|
throw new Error(`Hardhat is not installed inside ${this.config.protocolPath}. This should have been fixed by ensureBuildReady — did npm install fail?`);
|
|
51
51
|
}
|
|
52
|
-
|
|
52
|
+
// Hardhat is invoked via `node <cli.js>`, which has zero PATH dependency
|
|
53
|
+
// for the command itself, but the hardhat task may still spawn helpers
|
|
54
|
+
// that look for npx on PATH — keep the bin dir prepended to be safe.
|
|
55
|
+
const npm = npmCommand();
|
|
56
|
+
return this.run(hh.command, [...hh.prefixArgs, subcommand, ...args], `hardhat-${subcommand}`, false, envWithNodeBinDir(npm.binDir));
|
|
53
57
|
}
|
|
54
|
-
run(command, args, label) {
|
|
58
|
+
run(command, args, label, useShell, extraEnv) {
|
|
55
59
|
return limit(async () => {
|
|
56
60
|
const started = Date.now();
|
|
57
61
|
let timedOut = false;
|
|
@@ -60,7 +64,8 @@ export class HardhatRunner {
|
|
|
60
64
|
timeout: HARDHAT_TIMEOUT_MS,
|
|
61
65
|
reject: false,
|
|
62
66
|
all: true,
|
|
63
|
-
env: { ...
|
|
67
|
+
env: { ...extraEnv, FORCE_COLOR: "0", CI: "1" },
|
|
68
|
+
shell: useShell,
|
|
64
69
|
});
|
|
65
70
|
// Best-effort: mirror child stderr to ours in near-real-time so the
|
|
66
71
|
// user sees progress in the MCP's stderr logs. The return value still
|
package/dist/hardhat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hardhat.js","sourceRoot":"","sources":["../src/hardhat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAsB,MAAM,OAAO,CAAC;AAClD,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"hardhat.js","sourceRoot":"","sources":["../src/hardhat.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { loadConfig } from "./config.js";
|
|
|
5
5
|
import { registerAll } from "./tools/index.js";
|
|
6
6
|
async function main() {
|
|
7
7
|
const config = await loadConfig();
|
|
8
|
-
const server = new McpServer({ name: "dexe-mcp", version: "0.1.
|
|
8
|
+
const server = new McpServer({ name: "dexe-mcp", version: "0.1.5" }, {
|
|
9
9
|
instructions: "Tools for the DeXe Protocol governance-DAO codebase. Before calling any dexe_get_* / dexe_list_contracts / dexe_find_selector tool, ensure artifacts exist by calling dexe_compile once per session. dexe_decode_proposal and dexe_read_gov_state require DEXE_RPC_URL to be set.",
|
|
10
10
|
});
|
|
11
11
|
registerAll(server, config);
|
|
@@ -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: "0xB1795e79a095c1aa40BA754d74F145Dc07B2Faf5",
|
|
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,CAuC1B;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,167 @@
|
|
|
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 url = `${gw.replace(/\/$/, "")}/ipfs/${cidStr}`;
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
const t = setTimeout(() => controller.abort(), timeout);
|
|
27
|
+
try {
|
|
28
|
+
const res = await fetch(url, { signal: controller.signal });
|
|
29
|
+
if (!res.ok) {
|
|
30
|
+
errors.push(`${gw} → HTTP ${res.status}`);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const contentType = res.headers.get("content-type") ?? "application/octet-stream";
|
|
34
|
+
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
35
|
+
let parsedJson = null;
|
|
36
|
+
if (contentType.includes("json") || contentType.includes("text")) {
|
|
37
|
+
try {
|
|
38
|
+
parsedJson = JSON.parse(new TextDecoder().decode(bytes));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// not JSON — that's fine
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { cid: cidStr, gateway: gw, contentType, bytes, json: parsedJson, attempts };
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
errors.push(`${gw} → ${err instanceof Error ? err.message : String(err)}`);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
clearTimeout(t);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw new Error(`IPFS fetch failed for ${cidStr} across ${attempts} gateway(s): ${errors.join("; ")}`);
|
|
54
|
+
}
|
|
55
|
+
export function parseCid(input) {
|
|
56
|
+
const s = stripIpfsPrefix(input);
|
|
57
|
+
const cid = CID.parse(s);
|
|
58
|
+
const version = cid.version;
|
|
59
|
+
const codec = codecName(cid.code);
|
|
60
|
+
const multihash = base58btc.encode(cid.multihash.bytes).slice(1);
|
|
61
|
+
let alternate = null;
|
|
62
|
+
try {
|
|
63
|
+
if (version === 0) {
|
|
64
|
+
alternate = cid.toV1().toString(base32);
|
|
65
|
+
}
|
|
66
|
+
else if (version === 1 && cid.code === 0x70) {
|
|
67
|
+
// only dag-pb v1 is legal to downgrade to v0
|
|
68
|
+
alternate = cid.toV0().toString();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
alternate = null;
|
|
73
|
+
}
|
|
74
|
+
return { cid: cid.toString(), version, codec, multihash, alternate };
|
|
75
|
+
}
|
|
76
|
+
export function stripIpfsPrefix(s) {
|
|
77
|
+
return s.replace(/^ipfs:\/\//, "").replace(/^\/?ipfs\//, "");
|
|
78
|
+
}
|
|
79
|
+
/** Compute the CIDv1 for arbitrary JSON locally — no network. */
|
|
80
|
+
export async function cidForJson(value) {
|
|
81
|
+
const bytes = json.encode(value);
|
|
82
|
+
const hash = await sha256.digest(bytes);
|
|
83
|
+
return CID.create(1, json.code, hash).toString(base32);
|
|
84
|
+
}
|
|
85
|
+
/** Compute the CIDv1 (raw codec) for arbitrary bytes locally. */
|
|
86
|
+
export async function cidForBytes(bytes) {
|
|
87
|
+
const hash = await sha256.digest(bytes);
|
|
88
|
+
return CID.create(1, raw.code, hash).toString(base32);
|
|
89
|
+
}
|
|
90
|
+
function codecName(code) {
|
|
91
|
+
switch (code) {
|
|
92
|
+
case 0x55:
|
|
93
|
+
return "raw";
|
|
94
|
+
case 0x70:
|
|
95
|
+
return "dag-pb";
|
|
96
|
+
case 0x71:
|
|
97
|
+
return "dag-cbor";
|
|
98
|
+
case 0x0200:
|
|
99
|
+
return "json";
|
|
100
|
+
case 0x0129:
|
|
101
|
+
return "dag-json";
|
|
102
|
+
default:
|
|
103
|
+
return `0x${code.toString(16)}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ---------- Pinata upload ----------
|
|
107
|
+
const PINATA_PIN_JSON_URL = "https://api.pinata.cloud/pinning/pinJSONToIPFS";
|
|
108
|
+
const PINATA_PIN_FILE_URL = "https://api.pinata.cloud/pinning/pinFileToIPFS";
|
|
109
|
+
const PINATA_USER_URL = "https://api.pinata.cloud/data/testAuthentication";
|
|
110
|
+
export class PinataClient {
|
|
111
|
+
jwt;
|
|
112
|
+
constructor(jwt) {
|
|
113
|
+
this.jwt = jwt;
|
|
114
|
+
if (!jwt)
|
|
115
|
+
throw new Error("Pinata JWT is required");
|
|
116
|
+
}
|
|
117
|
+
/** Verify the JWT — cheap sanity check before an upload. */
|
|
118
|
+
async ping() {
|
|
119
|
+
const res = await fetch(PINATA_USER_URL, {
|
|
120
|
+
headers: { Authorization: `Bearer ${this.jwt}` },
|
|
121
|
+
});
|
|
122
|
+
if (!res.ok)
|
|
123
|
+
throw new Error(`Pinata auth failed: HTTP ${res.status} ${await res.text()}`);
|
|
124
|
+
}
|
|
125
|
+
async pinJson(payload, opts) {
|
|
126
|
+
const body = {
|
|
127
|
+
pinataContent: payload,
|
|
128
|
+
pinataMetadata: opts?.name || opts?.keyvalues
|
|
129
|
+
? { name: opts?.name, keyvalues: opts?.keyvalues }
|
|
130
|
+
: undefined,
|
|
131
|
+
};
|
|
132
|
+
const res = await fetch(PINATA_PIN_JSON_URL, {
|
|
133
|
+
method: "POST",
|
|
134
|
+
headers: {
|
|
135
|
+
Authorization: `Bearer ${this.jwt}`,
|
|
136
|
+
"Content-Type": "application/json",
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify(body),
|
|
139
|
+
});
|
|
140
|
+
if (!res.ok) {
|
|
141
|
+
throw new Error(`Pinata pinJSON failed: HTTP ${res.status} ${await res.text()}`);
|
|
142
|
+
}
|
|
143
|
+
const data = (await res.json());
|
|
144
|
+
return { cid: data.IpfsHash, size: data.PinSize, pinnedAt: data.Timestamp };
|
|
145
|
+
}
|
|
146
|
+
async pinFile(bytes, opts) {
|
|
147
|
+
const form = new FormData();
|
|
148
|
+
const blob = new Blob([bytes], {
|
|
149
|
+
type: opts?.contentType ?? "application/octet-stream",
|
|
150
|
+
});
|
|
151
|
+
form.append("file", blob, opts?.fileName ?? "file");
|
|
152
|
+
if (opts?.name) {
|
|
153
|
+
form.append("pinataMetadata", JSON.stringify({ name: opts.name }));
|
|
154
|
+
}
|
|
155
|
+
const res = await fetch(PINATA_PIN_FILE_URL, {
|
|
156
|
+
method: "POST",
|
|
157
|
+
headers: { Authorization: `Bearer ${this.jwt}` },
|
|
158
|
+
body: form,
|
|
159
|
+
});
|
|
160
|
+
if (!res.ok) {
|
|
161
|
+
throw new Error(`Pinata pinFile failed: HTTP ${res.status} ${await res.text()}`);
|
|
162
|
+
}
|
|
163
|
+
const data = (await res.json());
|
|
164
|
+
return { cid: data.IpfsHash, size: data.PinSize, pinnedAt: data.Timestamp };
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# 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,33 @@
|
|
|
1
|
+
import { Interface, JsonRpcProvider } from "ethers";
|
|
2
|
+
/**
|
|
3
|
+
* Multicall3 — deployed at the same address on ~every EVM chain.
|
|
4
|
+
* https://www.multicall3.com
|
|
5
|
+
*/
|
|
6
|
+
export declare const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
7
|
+
export interface Call {
|
|
8
|
+
/** Target contract address. */
|
|
9
|
+
target: string;
|
|
10
|
+
/** ABI fragment or full Interface covering `method`. */
|
|
11
|
+
iface: Interface;
|
|
12
|
+
/** Method name or full signature. */
|
|
13
|
+
method: string;
|
|
14
|
+
/** Positional args (empty array if none). */
|
|
15
|
+
args: readonly unknown[];
|
|
16
|
+
/** If true, failures don't revert the whole batch (decoded as `null`). */
|
|
17
|
+
allowFailure?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface CallResult<T = unknown> {
|
|
20
|
+
success: boolean;
|
|
21
|
+
value: T | null;
|
|
22
|
+
/** Hex-encoded raw return data. */
|
|
23
|
+
raw: string;
|
|
24
|
+
/** Error message if decoding failed or call reverted with allowFailure. */
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Batch `calls` into a single Multicall3 aggregate3 RPC round-trip. Each call
|
|
29
|
+
* is decoded via its own `iface`. Failed calls with `allowFailure: true`
|
|
30
|
+
* yield `{ success: false, value: null }` instead of throwing.
|
|
31
|
+
*/
|
|
32
|
+
export declare function multicall(provider: JsonRpcProvider, calls: Call[]): Promise<CallResult[]>;
|
|
33
|
+
//# sourceMappingURL=multicall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../../src/lib/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,+CAA+C,CAAC;AAM/E,MAAM,WAAW,IAAI;IACnB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,KAAK,EAAE,SAAS,CAAC;IACjB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IACzB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAChB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,UAAU,EAAE,CAAC,CAgCvB"}
|