dexe-mcp 0.1.5 → 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 +33 -0
- package/FUTURE.md +26 -5
- package/README.md +80 -195
- 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/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/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
|
@@ -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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Contract } from "ethers";
|
|
2
|
+
/**
|
|
3
|
+
* Multicall3 — deployed at the same address on ~every EVM chain.
|
|
4
|
+
* https://www.multicall3.com
|
|
5
|
+
*/
|
|
6
|
+
export const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
7
|
+
const MULTICALL3_ABI = [
|
|
8
|
+
"function aggregate3((address target, bool allowFailure, bytes callData)[] calls) payable returns ((bool success, bytes returnData)[] returnData)",
|
|
9
|
+
];
|
|
10
|
+
/**
|
|
11
|
+
* Batch `calls` into a single Multicall3 aggregate3 RPC round-trip. Each call
|
|
12
|
+
* is decoded via its own `iface`. Failed calls with `allowFailure: true`
|
|
13
|
+
* yield `{ success: false, value: null }` instead of throwing.
|
|
14
|
+
*/
|
|
15
|
+
export async function multicall(provider, calls) {
|
|
16
|
+
if (calls.length === 0)
|
|
17
|
+
return [];
|
|
18
|
+
const mc = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
19
|
+
const payload = calls.map((c) => ({
|
|
20
|
+
target: c.target,
|
|
21
|
+
allowFailure: c.allowFailure ?? false,
|
|
22
|
+
callData: c.iface.encodeFunctionData(c.method, c.args),
|
|
23
|
+
}));
|
|
24
|
+
const results = await mc.getFunction("aggregate3").staticCall(payload);
|
|
25
|
+
return results.map((r, i) => {
|
|
26
|
+
const c = calls[i];
|
|
27
|
+
if (!r.success) {
|
|
28
|
+
return { success: false, value: null, raw: r.returnData, error: "call reverted" };
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const decoded = c.iface.decodeFunctionResult(c.method, r.returnData);
|
|
32
|
+
// Unwrap single-return-value tuples for ergonomic use.
|
|
33
|
+
const value = decoded.length === 1 ? decoded[0] : decoded;
|
|
34
|
+
return { success: true, value, raw: r.returnData };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
value: null,
|
|
40
|
+
raw: r.returnData,
|
|
41
|
+
error: err instanceof Error ? err.message : String(err),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=multicall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../../src/lib/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA8B,MAAM,QAAQ,CAAC;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,4CAA4C,CAAC;AAE/E,MAAM,cAAc,GAAG;IACrB,kJAAkJ;CAC1I,CAAC;AAwBX;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAyB,EACzB,KAAa;IAEb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,kBAAkB,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,KAAK;QACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;KACvD,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GACX,MAAM,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAEzD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACpF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YACrE,uDAAuD;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;gBACX,GAAG,EAAE,CAAC,CAAC,UAAU;gBACjB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static catalog of every proposal type the DeXe frontend exposes. Derived
|
|
3
|
+
* from a full audit of `C:/dev/investing-dashboard` forms + hooks
|
|
4
|
+
* (2026-04-15). Consumed by `dexe_proposal_catalog` so agents can discover
|
|
5
|
+
* which builder tool to call for a given user intent.
|
|
6
|
+
*
|
|
7
|
+
* `mcpTool` is the name of the dedicated MCP builder tool (when one exists)
|
|
8
|
+
* or `null` if agents must compose via primitives (`build_external` +
|
|
9
|
+
* `build_custom_abi`) — flip `implemented` to `true` as each ships.
|
|
10
|
+
*/
|
|
11
|
+
export type ProposalCategory = "external" | "internal" | "offchain";
|
|
12
|
+
export interface ProposalTypeEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
category: ProposalCategory;
|
|
15
|
+
name: string;
|
|
16
|
+
formPath: string;
|
|
17
|
+
/** High-level description of the on-chain effect or off-chain action. */
|
|
18
|
+
effect: string;
|
|
19
|
+
/** Target contract (on-chain) or backend endpoint (off-chain). */
|
|
20
|
+
target: string;
|
|
21
|
+
/** Does this type require an IPFS metadata upload? */
|
|
22
|
+
needsIpfs: boolean;
|
|
23
|
+
/** Gating tags: "expert", "validator", "babt", "dao-admin". */
|
|
24
|
+
gating: string[];
|
|
25
|
+
/** Dedicated MCP builder tool name, or null. */
|
|
26
|
+
mcpTool: string | null;
|
|
27
|
+
/** Shipped? */
|
|
28
|
+
implemented: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare const PROPOSAL_CATALOG: ProposalTypeEntry[];
|
|
31
|
+
/** Metadata JSON shape used by the frontend for every external proposal. */
|
|
32
|
+
export declare const EXTERNAL_METADATA_SHAPE: {
|
|
33
|
+
readonly proposalName: "string (required)";
|
|
34
|
+
readonly proposalDescription: "string (required, markdown/slate)";
|
|
35
|
+
readonly category: "string (e.g. 'Token Transfer', 'Manage Validators')";
|
|
36
|
+
readonly isMeta: "boolean (default false)";
|
|
37
|
+
readonly changes: "object (type-specific structured payload for indexing, optional)";
|
|
38
|
+
};
|
|
39
|
+
export declare const INTERNAL_METADATA_SHAPE: {
|
|
40
|
+
readonly proposalName: "string (required)";
|
|
41
|
+
readonly proposalDescription: "string";
|
|
42
|
+
readonly category: "string (ValidatorBalances | ValidatorSettings | MonthlyWithdraw | Offchain)";
|
|
43
|
+
readonly changes: "object (type-specific)";
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=proposalCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposalCatalog.d.ts","sourceRoot":"","sources":["../../src/lib/proposalCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAkZ/C,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;;;;CAM1B,CAAC;AAEX,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC"}
|