dexe-mcp 0.3.0 → 0.4.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/CHANGELOG.md +192 -136
- package/dist/lib/merkleTree.d.ts +38 -0
- package/dist/lib/merkleTree.d.ts.map +1 -0
- package/dist/lib/merkleTree.js +83 -0
- package/dist/lib/merkleTree.js.map +1 -0
- package/dist/tools/flow.d.ts +57 -0
- package/dist/tools/flow.d.ts.map +1 -1
- package/dist/tools/flow.js +204 -176
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/merkle.d.ts +4 -0
- package/dist/tools/merkle.d.ts.map +1 -0
- package/dist/tools/merkle.js +174 -0
- package/dist/tools/merkle.js.map +1 -0
- package/dist/tools/otc.d.ts +5 -0
- package/dist/tools/otc.d.ts.map +1 -0
- package/dist/tools/otc.js +481 -0
- package/dist/tools/otc.js.map +1 -0
- package/dist/tools/proposalBuildComplex.d.ts +222 -0
- package/dist/tools/proposalBuildComplex.d.ts.map +1 -1
- package/dist/tools/proposalBuildComplex.js +373 -66
- package/dist/tools/proposalBuildComplex.js.map +1 -1
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/package.json +83 -83
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Interface, ZeroAddress, MaxUint256, isAddress, getAddress } from "ethers";
|
|
3
|
+
import { RpcProvider } from "../rpc.js";
|
|
4
|
+
import { multicall } from "../lib/multicall.js";
|
|
5
|
+
import { runProposalCreate, sendOrCollect } from "./flow.js";
|
|
6
|
+
import { buildTokenSaleMultiActions, tierSchema, } from "./proposalBuildComplex.js";
|
|
7
|
+
import { buildAddressMerkleTree, computeLeafHash, verifyProof, } from "../lib/merkleTree.js";
|
|
8
|
+
// ---------- ABI fragments ----------
|
|
9
|
+
const ERC20_ABI = new Interface([
|
|
10
|
+
"function balanceOf(address) view returns (uint256)",
|
|
11
|
+
"function allowance(address owner, address spender) view returns (uint256)",
|
|
12
|
+
"function approve(address spender, uint256 amount) returns (bool)",
|
|
13
|
+
]);
|
|
14
|
+
const TOKEN_SALE_ABI = new Interface([
|
|
15
|
+
"function latestTierId() view returns (uint256)",
|
|
16
|
+
"function getTierViews(uint256 offset, uint256 limit) view returns (tuple(tuple(string name, string description) metadata, uint256 totalTokenProvided, uint256 saleStartTime, uint256 saleEndTime, address saleTokenAddress, uint256 claimLockDuration, address[] purchaseTokenAddresses, uint256[] exchangeRates, uint256 minAllocationPerUser, uint256 maxAllocationPerUser, tuple(uint256 cliffPeriod, uint256 unlockStep, uint256 vestingDuration, uint256 vestingPercentage) vestingSettings, tuple(uint8 participationType, bytes data)[] participationDetails)[] tiers)",
|
|
17
|
+
"function getUserViews(address user, uint256[] tierIds, bytes32[][] proofs) view returns (tuple(bool canParticipate, tuple(bool isClaimed, bool canClaim, uint64 claimUnlockTime, uint256 claimTotalAmount, uint256 boughtTotalAmount, address[] lockedTokenAddresses, uint256[] lockedTokenAmounts, address[] lockedNftAddresses, uint256[][] lockedNftIds, address[] purchaseTokenAddresses, uint256[] purchaseTokenAmounts) purchaseView, tuple(uint64 latestVestingWithdraw, uint64 nextUnlockTime, uint256 nextUnlockAmount, uint256 vestingTotalAmount, uint256 vestingWithdrawnAmount, uint256 amountToWithdraw, uint256 lockedAmount) vestingUserView)[] userViews)",
|
|
18
|
+
"function buy(uint256 tierId, address tokenToBuyWith, uint256 amount, bytes32[] proof) payable",
|
|
19
|
+
"function claim(uint256[] tierIds)",
|
|
20
|
+
"function vestingWithdraw(uint256[] tierIds)",
|
|
21
|
+
]);
|
|
22
|
+
const PARTICIPATION_TYPE_NAMES = [
|
|
23
|
+
"DAOVotes",
|
|
24
|
+
"Whitelist",
|
|
25
|
+
"BABT",
|
|
26
|
+
"TokenLock",
|
|
27
|
+
"NftLock",
|
|
28
|
+
"MerkleWhitelist",
|
|
29
|
+
];
|
|
30
|
+
// ---------- helpers ----------
|
|
31
|
+
function err(message) {
|
|
32
|
+
return { content: [{ type: "text", text: message }], isError: true };
|
|
33
|
+
}
|
|
34
|
+
function ok(data) {
|
|
35
|
+
return {
|
|
36
|
+
content: [{ type: "text", text: JSON.stringify(data, bigintReplacer, 2) }],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function bigintReplacer(_k, v) {
|
|
40
|
+
return typeof v === "bigint" ? v.toString() : v;
|
|
41
|
+
}
|
|
42
|
+
function isNativeSentinel(addr) {
|
|
43
|
+
return addr.toLowerCase() === ZeroAddress.toLowerCase();
|
|
44
|
+
}
|
|
45
|
+
// ---------- register ----------
|
|
46
|
+
export function registerOtcTools(server, ctx, signer) {
|
|
47
|
+
const rpc = new RpcProvider(ctx.config);
|
|
48
|
+
// =============================================
|
|
49
|
+
// dexe_otc_dao_open_sale
|
|
50
|
+
// =============================================
|
|
51
|
+
server.tool("dexe_otc_dao_open_sale", "OTC composite — propose to open a multi-tier token sale on a deployed OTC DAO. " +
|
|
52
|
+
"Builds the multi-tier `createTiers` envelope (deduped/summed approves, auto-merkle, " +
|
|
53
|
+
"auto-addToWhitelist for plain Whitelist tiers), then runs the full proposal_create " +
|
|
54
|
+
"flow: balance + threshold check, ERC20 approve to UserKeeper if needed, deposit, " +
|
|
55
|
+
"IPFS proposal-metadata upload, `createProposalAndVote`. " +
|
|
56
|
+
"When DEXE_PRIVATE_KEY is set, signs and broadcasts each tx; otherwise returns " +
|
|
57
|
+
"an ordered TxPayload list. The DAO must already have TokenSaleProposal wired as " +
|
|
58
|
+
"an executor (set at deploy time via `dexe_dao_build_deploy`).", {
|
|
59
|
+
govPool: z.string().describe("GovPool address"),
|
|
60
|
+
tokenSaleProposal: z.string().describe("TokenSaleProposal helper address"),
|
|
61
|
+
tiers: z.array(tierSchema).min(1),
|
|
62
|
+
latestTierId: z.string().default("0"),
|
|
63
|
+
proposalName: z.string().default("Open OTC Token Sale"),
|
|
64
|
+
proposalDescription: z.string().default(""),
|
|
65
|
+
voteAmount: z.string().optional(),
|
|
66
|
+
voteNftIds: z.array(z.string()).default([]),
|
|
67
|
+
user: z.string().optional(),
|
|
68
|
+
dryRun: z.boolean().default(false).describe("If true, return ordered TxPayloads even when DEXE_PRIVATE_KEY is set."),
|
|
69
|
+
buildOnly: z.boolean().default(false).describe("If true, return just the envelope (actions + metadata + merkle roots) without running the proposal_create flow. Skips IPFS upload and DAO state reads."),
|
|
70
|
+
}, async (input) => {
|
|
71
|
+
try {
|
|
72
|
+
const built = buildTokenSaleMultiActions({
|
|
73
|
+
tokenSaleProposal: input.tokenSaleProposal,
|
|
74
|
+
tiers: input.tiers,
|
|
75
|
+
latestTierId: input.latestTierId,
|
|
76
|
+
proposalName: input.proposalName,
|
|
77
|
+
proposalDescription: input.proposalDescription,
|
|
78
|
+
});
|
|
79
|
+
if (input.buildOnly) {
|
|
80
|
+
return ok({
|
|
81
|
+
mode: "buildOnly",
|
|
82
|
+
otc: {
|
|
83
|
+
tokenSaleProposal: input.tokenSaleProposal,
|
|
84
|
+
tierCount: input.tiers.length,
|
|
85
|
+
tierNames: built.tierNames,
|
|
86
|
+
derivedMerkleRoots: built.derivedMerkleRoots,
|
|
87
|
+
whitelistRequests: built.whitelistRequests,
|
|
88
|
+
tierIdsAfterExecute: input.tiers.map((_, i) => (BigInt(input.latestTierId) + 1n + BigInt(i)).toString()),
|
|
89
|
+
},
|
|
90
|
+
metadata: built.metadata,
|
|
91
|
+
actions: built.actions,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Forward to runProposalCreate with the tier-sale envelope's
|
|
95
|
+
// metadata.changes preserved (frontend expects `changes` wrapper +
|
|
96
|
+
// category=tokenSale per Bug #24 / Bug #19).
|
|
97
|
+
const builtChanges = built.metadata.changes;
|
|
98
|
+
const proposalInput = {
|
|
99
|
+
govPool: input.govPool,
|
|
100
|
+
proposalType: "custom",
|
|
101
|
+
title: input.proposalName,
|
|
102
|
+
description: input.proposalDescription,
|
|
103
|
+
actionsOnFor: built.actions,
|
|
104
|
+
category: "tokenSale",
|
|
105
|
+
proposalMetadataExtra: {
|
|
106
|
+
isMeta: false,
|
|
107
|
+
...(builtChanges ? { changes: builtChanges } : {}),
|
|
108
|
+
},
|
|
109
|
+
voteAmount: input.voteAmount,
|
|
110
|
+
voteNftIds: input.voteNftIds,
|
|
111
|
+
user: input.user,
|
|
112
|
+
dryRun: input.dryRun,
|
|
113
|
+
};
|
|
114
|
+
const result = await runProposalCreate(proposalInput, { ctx, signer, rpc });
|
|
115
|
+
// Surface the OTC-specific extras alongside the proposal_create body.
|
|
116
|
+
// Tool result already carries content[0].text → JSON; we wrap with an
|
|
117
|
+
// augmented response that prepends the OTC extras into the same JSON.
|
|
118
|
+
let resultJson = {};
|
|
119
|
+
try {
|
|
120
|
+
const txt = result.content?.[0]?.text ?? "{}";
|
|
121
|
+
resultJson = JSON.parse(txt);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// proposal_create returned an error string — pass through unchanged.
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
return ok({
|
|
128
|
+
...resultJson,
|
|
129
|
+
otc: {
|
|
130
|
+
tokenSaleProposal: input.tokenSaleProposal,
|
|
131
|
+
tierCount: input.tiers.length,
|
|
132
|
+
tierNames: built.tierNames,
|
|
133
|
+
derivedMerkleRoots: built.derivedMerkleRoots,
|
|
134
|
+
whitelistRequests: built.whitelistRequests,
|
|
135
|
+
tierIdsAfterExecute: input.tiers.map((_, i) => (BigInt(input.latestTierId) + 1n + BigInt(i)).toString()),
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// =============================================
|
|
144
|
+
// dexe_otc_buyer_status
|
|
145
|
+
// =============================================
|
|
146
|
+
server.tool("dexe_otc_buyer_status", "OTC buyer aggregator — reads tier params + user state across N tiers and returns a " +
|
|
147
|
+
"render-ready summary (purchasable status, claimable amount, vesting withdrawable, " +
|
|
148
|
+
"lockup ETA). When `whitelistUsers` is supplied per tier, computes the merkle proof " +
|
|
149
|
+
"for the user against that list. Read-only.", {
|
|
150
|
+
tokenSaleProposal: z.string(),
|
|
151
|
+
tierIds: z.array(z.string()).min(1),
|
|
152
|
+
user: z.string(),
|
|
153
|
+
whitelists: z
|
|
154
|
+
.array(z.object({
|
|
155
|
+
tierId: z.string(),
|
|
156
|
+
users: z.array(z.string()).min(1),
|
|
157
|
+
}))
|
|
158
|
+
.default([])
|
|
159
|
+
.describe("Optional per-tier whitelist (for MerkleWhitelist proof generation)."),
|
|
160
|
+
}, async ({ tokenSaleProposal, tierIds, user, whitelists }) => {
|
|
161
|
+
if (!isAddress(tokenSaleProposal))
|
|
162
|
+
return err(`Invalid tokenSaleProposal: ${tokenSaleProposal}`);
|
|
163
|
+
if (!isAddress(user))
|
|
164
|
+
return err(`Invalid user: ${user}`);
|
|
165
|
+
const provider = rpc.requireProvider();
|
|
166
|
+
const userAddr = getAddress(user);
|
|
167
|
+
// For tier params we need an offset-based getTierViews. The cheapest
|
|
168
|
+
// path is a single batch query with offset=min(tierIds)-1 and limit=range,
|
|
169
|
+
// then index into the result by (tierId - offset - 1).
|
|
170
|
+
const tierIdNums = tierIds.map((s) => BigInt(s));
|
|
171
|
+
const minTier = tierIdNums.reduce((a, b) => (a < b ? a : b));
|
|
172
|
+
const maxTier = tierIdNums.reduce((a, b) => (a > b ? a : b));
|
|
173
|
+
const offset = (minTier - 1n).toString();
|
|
174
|
+
const limit = (maxTier - minTier + 1n).toString();
|
|
175
|
+
const calls = [
|
|
176
|
+
{
|
|
177
|
+
target: tokenSaleProposal,
|
|
178
|
+
iface: TOKEN_SALE_ABI,
|
|
179
|
+
method: "getTierViews",
|
|
180
|
+
args: [BigInt(offset), BigInt(limit)],
|
|
181
|
+
allowFailure: true,
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
target: tokenSaleProposal,
|
|
185
|
+
iface: TOKEN_SALE_ABI,
|
|
186
|
+
method: "getUserViews",
|
|
187
|
+
args: [userAddr, tierIdNums, tierIdNums.map(() => [])],
|
|
188
|
+
allowFailure: true,
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
try {
|
|
192
|
+
const res = await multicall(provider, calls);
|
|
193
|
+
if (!res[0].success)
|
|
194
|
+
return err(`getTierViews failed: ${res[0].error}`);
|
|
195
|
+
if (!res[1].success)
|
|
196
|
+
return err(`getUserViews failed: ${res[1].error}`);
|
|
197
|
+
const tierViewsRange = res[0].value;
|
|
198
|
+
const userViews = res[1].value;
|
|
199
|
+
const whitelistByTier = new Map(whitelists.map((w) => [w.tierId, w.users]));
|
|
200
|
+
const summaries = tierIds.map((tierIdStr, i) => {
|
|
201
|
+
const tierIdx = Number(BigInt(tierIdStr) - minTier);
|
|
202
|
+
const tier = tierViewsRange[tierIdx];
|
|
203
|
+
if (!tier) {
|
|
204
|
+
return { tierId: tierIdStr, error: "tier not found in range" };
|
|
205
|
+
}
|
|
206
|
+
const uv = userViews[i];
|
|
207
|
+
if (!uv) {
|
|
208
|
+
return { tierId: tierIdStr, error: "user view missing" };
|
|
209
|
+
}
|
|
210
|
+
// Surface participation requirements + compute merkle proof for user
|
|
211
|
+
// when caller supplied a whitelist.
|
|
212
|
+
const participation = tier.participationDetails.map((p) => ({
|
|
213
|
+
type: PARTICIPATION_TYPE_NAMES[p.participationType] ?? `Unknown(${p.participationType})`,
|
|
214
|
+
data: p.data,
|
|
215
|
+
}));
|
|
216
|
+
const wlList = whitelistByTier.get(tierIdStr);
|
|
217
|
+
let merkle;
|
|
218
|
+
if (wlList && wlList.length > 0) {
|
|
219
|
+
const checksummed = wlList.map((u) => {
|
|
220
|
+
if (!isAddress(u))
|
|
221
|
+
throw new Error(`whitelist user invalid: ${u}`);
|
|
222
|
+
return getAddress(u);
|
|
223
|
+
});
|
|
224
|
+
const tree = buildAddressMerkleTree(checksummed);
|
|
225
|
+
const idx = checksummed.findIndex((a) => a.toLowerCase() === userAddr.toLowerCase());
|
|
226
|
+
if (idx >= 0) {
|
|
227
|
+
const leaf = computeLeafHash([userAddr], ["address"]);
|
|
228
|
+
const proof = tree.proofs[idx];
|
|
229
|
+
merkle = { root: tree.root, proof, included: verifyProof(proof, tree.root, leaf) };
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
merkle = { root: tree.root, proof: [], included: false };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
tierId: tierIdStr,
|
|
237
|
+
metadata: tier.metadata,
|
|
238
|
+
saleTokenAddress: tier.saleTokenAddress,
|
|
239
|
+
saleStartTime: tier.saleStartTime,
|
|
240
|
+
saleEndTime: tier.saleEndTime,
|
|
241
|
+
totalTokenProvided: tier.totalTokenProvided,
|
|
242
|
+
purchaseTokenAddresses: tier.purchaseTokenAddresses,
|
|
243
|
+
exchangeRates: tier.exchangeRates,
|
|
244
|
+
minAllocationPerUser: tier.minAllocationPerUser,
|
|
245
|
+
maxAllocationPerUser: tier.maxAllocationPerUser,
|
|
246
|
+
claimLockDuration: tier.claimLockDuration,
|
|
247
|
+
vestingSettings: tier.vestingSettings,
|
|
248
|
+
participation,
|
|
249
|
+
user: {
|
|
250
|
+
canParticipate: uv.canParticipate,
|
|
251
|
+
purchase: uv.purchaseView,
|
|
252
|
+
vesting: uv.vestingUserView,
|
|
253
|
+
claimable: uv.purchaseView.canClaim && !uv.purchaseView.isClaimed
|
|
254
|
+
? uv.purchaseView.claimTotalAmount
|
|
255
|
+
: 0n,
|
|
256
|
+
vestingWithdrawable: uv.vestingUserView.amountToWithdraw,
|
|
257
|
+
},
|
|
258
|
+
...(merkle ? { merkle } : {}),
|
|
259
|
+
};
|
|
260
|
+
});
|
|
261
|
+
return ok({ tokenSaleProposal, user: userAddr, tiers: summaries });
|
|
262
|
+
}
|
|
263
|
+
catch (e) {
|
|
264
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
// =============================================
|
|
268
|
+
// dexe_otc_buyer_buy
|
|
269
|
+
// =============================================
|
|
270
|
+
server.tool("dexe_otc_buyer_buy", "OTC buyer composite — preflights balance + allowance on the payment token, builds an " +
|
|
271
|
+
"ERC20 approve when needed, then builds `TokenSaleProposal.buy(tierId, paymentToken, amount, proof)`. " +
|
|
272
|
+
"Native-coin path (paymentToken == 0x000...000) skips approve and sets `value`. " +
|
|
273
|
+
"If `whitelistUsers` is supplied, computes the merkle proof against that list. " +
|
|
274
|
+
"When DEXE_PRIVATE_KEY is set, signs and broadcasts both txs; otherwise returns the ordered " +
|
|
275
|
+
"TxPayload list.", {
|
|
276
|
+
tokenSaleProposal: z.string(),
|
|
277
|
+
tierId: z.string(),
|
|
278
|
+
tokenToBuyWith: z.string().describe("Payment token; use 0x000...000 for native BNB"),
|
|
279
|
+
amount: z.string().describe("Amount to spend in payment-token wei"),
|
|
280
|
+
proof: z.array(z.string()).default([]),
|
|
281
|
+
whitelistUsers: z.array(z.string()).default([]).describe("Optional whitelist for proof gen"),
|
|
282
|
+
user: z.string().optional(),
|
|
283
|
+
dryRun: z.boolean().default(false).describe("If true, return ordered TxPayloads even when DEXE_PRIVATE_KEY is set."),
|
|
284
|
+
}, async (input) => {
|
|
285
|
+
if (!isAddress(input.tokenSaleProposal))
|
|
286
|
+
return err(`Invalid tokenSaleProposal`);
|
|
287
|
+
if (!isAddress(input.tokenToBuyWith))
|
|
288
|
+
return err(`Invalid tokenToBuyWith`);
|
|
289
|
+
const userResolved = input.user ?? (signer.hasSigner() ? signer.getAddress() : undefined);
|
|
290
|
+
if (!userResolved)
|
|
291
|
+
return err(`Provide 'user' or set DEXE_PRIVATE_KEY.`);
|
|
292
|
+
const userAddr = getAddress(userResolved);
|
|
293
|
+
const tierIdBn = BigInt(input.tierId);
|
|
294
|
+
const amountBn = BigInt(input.amount);
|
|
295
|
+
const native = isNativeSentinel(input.tokenToBuyWith);
|
|
296
|
+
// Compute proof from whitelistUsers if needed.
|
|
297
|
+
let proof = input.proof;
|
|
298
|
+
if (proof.length === 0 && input.whitelistUsers.length > 0) {
|
|
299
|
+
const checksummed = input.whitelistUsers.map((u) => {
|
|
300
|
+
if (!isAddress(u))
|
|
301
|
+
throw new Error(`whitelist user invalid: ${u}`);
|
|
302
|
+
return getAddress(u);
|
|
303
|
+
});
|
|
304
|
+
const tree = buildAddressMerkleTree(checksummed);
|
|
305
|
+
const idx = checksummed.findIndex((a) => a.toLowerCase() === userAddr.toLowerCase());
|
|
306
|
+
if (idx < 0)
|
|
307
|
+
return err(`User ${userAddr} not in whitelist (${checksummed.length} entries).`);
|
|
308
|
+
proof = tree.proofs[idx];
|
|
309
|
+
}
|
|
310
|
+
const provider = rpc.requireProvider();
|
|
311
|
+
const chainId = ctx.config.chainId;
|
|
312
|
+
const payloads = [];
|
|
313
|
+
const skipped = [];
|
|
314
|
+
// Balance + allowance preflight (ERC20 path only). In dryRun the
|
|
315
|
+
// values are still surfaced for diagnostics but never block the build.
|
|
316
|
+
let balance = 0n;
|
|
317
|
+
let allowance = 0n;
|
|
318
|
+
if (!native) {
|
|
319
|
+
const calls = [
|
|
320
|
+
{
|
|
321
|
+
target: input.tokenToBuyWith,
|
|
322
|
+
iface: ERC20_ABI,
|
|
323
|
+
method: "balanceOf",
|
|
324
|
+
args: [userAddr],
|
|
325
|
+
allowFailure: true,
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
target: input.tokenToBuyWith,
|
|
329
|
+
iface: ERC20_ABI,
|
|
330
|
+
method: "allowance",
|
|
331
|
+
args: [userAddr, input.tokenSaleProposal],
|
|
332
|
+
allowFailure: true,
|
|
333
|
+
},
|
|
334
|
+
];
|
|
335
|
+
const res = await multicall(provider, calls);
|
|
336
|
+
balance = res[0].success ? res[0].value : 0n;
|
|
337
|
+
allowance = res[1].success ? res[1].value : 0n;
|
|
338
|
+
if (!input.dryRun && balance < amountBn) {
|
|
339
|
+
return err(`Insufficient ${input.tokenToBuyWith} balance: have ${balance}, need ${amountBn}.`);
|
|
340
|
+
}
|
|
341
|
+
if (allowance < amountBn) {
|
|
342
|
+
payloads.push({
|
|
343
|
+
to: input.tokenToBuyWith,
|
|
344
|
+
data: ERC20_ABI.encodeFunctionData("approve", [
|
|
345
|
+
input.tokenSaleProposal,
|
|
346
|
+
MaxUint256,
|
|
347
|
+
]),
|
|
348
|
+
value: "0",
|
|
349
|
+
chainId,
|
|
350
|
+
description: `ERC20.approve(${input.tokenSaleProposal}, MAX_UINT256)`,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
skipped.push({ label: "ERC20.approve", reason: "Allowance sufficient" });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// buy()
|
|
358
|
+
payloads.push({
|
|
359
|
+
to: input.tokenSaleProposal,
|
|
360
|
+
data: TOKEN_SALE_ABI.encodeFunctionData("buy", [
|
|
361
|
+
tierIdBn,
|
|
362
|
+
input.tokenToBuyWith,
|
|
363
|
+
amountBn,
|
|
364
|
+
proof,
|
|
365
|
+
]),
|
|
366
|
+
value: native ? amountBn.toString() : "0",
|
|
367
|
+
chainId,
|
|
368
|
+
description: `TokenSaleProposal.buy(tier=${tierIdBn}, ${native ? "native" : input.tokenToBuyWith}, ${amountBn})`,
|
|
369
|
+
});
|
|
370
|
+
const result = await sendOrCollect(signer, payloads, { dryRun: input.dryRun });
|
|
371
|
+
return ok({
|
|
372
|
+
mode: result.mode,
|
|
373
|
+
tierId: input.tierId,
|
|
374
|
+
user: userAddr,
|
|
375
|
+
native,
|
|
376
|
+
amount: amountBn.toString(),
|
|
377
|
+
proofLength: proof.length,
|
|
378
|
+
preflight: native ? null : { balance: balance.toString(), allowance: allowance.toString() },
|
|
379
|
+
steps: [...skipped, ...result.steps],
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
// =============================================
|
|
383
|
+
// dexe_otc_buyer_claim_all
|
|
384
|
+
// =============================================
|
|
385
|
+
server.tool("dexe_otc_buyer_claim_all", "OTC buyer composite — reads `getUserViews(user, tierIds)`, picks tier ids with " +
|
|
386
|
+
"`claimableAmount > 0` and broadcasts `claim`, then picks tier ids with " +
|
|
387
|
+
"`vestingWithdrawAmount > 0` and broadcasts `vestingWithdraw`. When DEXE_PRIVATE_KEY " +
|
|
388
|
+
"is unset, returns ordered TxPayloads. Skips silently if no tiers have anything claimable.", {
|
|
389
|
+
tokenSaleProposal: z.string(),
|
|
390
|
+
tierIds: z.array(z.string()).min(1),
|
|
391
|
+
user: z.string().optional(),
|
|
392
|
+
dryRun: z.boolean().default(false).describe("If true, return ordered TxPayloads even when DEXE_PRIVATE_KEY is set."),
|
|
393
|
+
}, async (input) => {
|
|
394
|
+
if (!isAddress(input.tokenSaleProposal))
|
|
395
|
+
return err(`Invalid tokenSaleProposal`);
|
|
396
|
+
const userResolved = input.user ?? (signer.hasSigner() ? signer.getAddress() : undefined);
|
|
397
|
+
if (!userResolved)
|
|
398
|
+
return err(`Provide 'user' or set DEXE_PRIVATE_KEY.`);
|
|
399
|
+
const userAddr = getAddress(userResolved);
|
|
400
|
+
const tierIdBns = input.tierIds.map((s) => BigInt(s));
|
|
401
|
+
const provider = rpc.requireProvider();
|
|
402
|
+
const chainId = ctx.config.chainId;
|
|
403
|
+
const res = await multicall(provider, [
|
|
404
|
+
{
|
|
405
|
+
target: input.tokenSaleProposal,
|
|
406
|
+
iface: TOKEN_SALE_ABI,
|
|
407
|
+
method: "getUserViews",
|
|
408
|
+
args: [userAddr, tierIdBns, tierIdBns.map(() => [])],
|
|
409
|
+
allowFailure: true,
|
|
410
|
+
},
|
|
411
|
+
]);
|
|
412
|
+
if (!res[0].success)
|
|
413
|
+
return err(`getUserViews failed: ${res[0].error}`);
|
|
414
|
+
const userViews = res[0].value;
|
|
415
|
+
const claimable = [];
|
|
416
|
+
const vestingReady = [];
|
|
417
|
+
const summary = input.tierIds.map((tierId, i) => {
|
|
418
|
+
const uv = userViews[i];
|
|
419
|
+
const c = uv?.purchaseView?.canClaim && !uv?.purchaseView?.isClaimed
|
|
420
|
+
? uv.purchaseView.claimTotalAmount
|
|
421
|
+
: 0n;
|
|
422
|
+
const v = uv?.vestingUserView?.amountToWithdraw ?? 0n;
|
|
423
|
+
if (c > 0n)
|
|
424
|
+
claimable.push(tierId);
|
|
425
|
+
if (v > 0n)
|
|
426
|
+
vestingReady.push(tierId);
|
|
427
|
+
return { tierId, claimable: c.toString(), vestingWithdrawable: v.toString() };
|
|
428
|
+
});
|
|
429
|
+
const payloads = [];
|
|
430
|
+
const skipped = [];
|
|
431
|
+
if (claimable.length === 0) {
|
|
432
|
+
skipped.push({ label: "TokenSaleProposal.claim", reason: "No tiers have claimableAmount > 0" });
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
payloads.push({
|
|
436
|
+
to: input.tokenSaleProposal,
|
|
437
|
+
data: TOKEN_SALE_ABI.encodeFunctionData("claim", [claimable.map((s) => BigInt(s))]),
|
|
438
|
+
value: "0",
|
|
439
|
+
chainId,
|
|
440
|
+
description: `TokenSaleProposal.claim([${claimable.join(",")}])`,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
if (vestingReady.length === 0) {
|
|
444
|
+
skipped.push({
|
|
445
|
+
label: "TokenSaleProposal.vestingWithdraw",
|
|
446
|
+
reason: "No tiers have vestingWithdrawAmount > 0",
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
payloads.push({
|
|
451
|
+
to: input.tokenSaleProposal,
|
|
452
|
+
data: TOKEN_SALE_ABI.encodeFunctionData("vestingWithdraw", [
|
|
453
|
+
vestingReady.map((s) => BigInt(s)),
|
|
454
|
+
]),
|
|
455
|
+
value: "0",
|
|
456
|
+
chainId,
|
|
457
|
+
description: `TokenSaleProposal.vestingWithdraw([${vestingReady.join(",")}])`,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
if (payloads.length === 0) {
|
|
461
|
+
return ok({
|
|
462
|
+
mode: "noop",
|
|
463
|
+
user: userAddr,
|
|
464
|
+
tokenSaleProposal: input.tokenSaleProposal,
|
|
465
|
+
summary,
|
|
466
|
+
steps: skipped,
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
const result = await sendOrCollect(signer, payloads, { dryRun: input.dryRun });
|
|
470
|
+
return ok({
|
|
471
|
+
mode: result.mode,
|
|
472
|
+
user: userAddr,
|
|
473
|
+
tokenSaleProposal: input.tokenSaleProposal,
|
|
474
|
+
claimedTierIds: claimable,
|
|
475
|
+
vestingWithdrawTierIds: vestingReady,
|
|
476
|
+
summary,
|
|
477
|
+
steps: [...skipped, ...result.steps],
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=otc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otc.js","sourceRoot":"","sources":["../../src/tools/otc.ts"],"names":[],"mappings":"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"}
|