@latticexyz/common 2.2.22-fdb727e847024560315c10ebf32c1f924755ffe9 → 2.2.22
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/dist/chains.d.ts +21 -317
- package/dist/chains.js +17 -54
- package/dist/chains.js.map +1 -1
- package/dist/{chunk-NFWCLD5I.js → chunk-ETXWXV5T.js} +14 -1
- package/dist/chunk-ETXWXV5T.js.map +1 -0
- package/dist/codegen.d.ts +2 -2
- package/dist/codegen.js +9 -5
- package/dist/codegen.js.map +1 -1
- package/dist/internal.d.ts +11 -1
- package/dist/internal.js +387 -2
- package/dist/internal.js.map +1 -1
- package/dist/utils.js +2 -4
- package/package.json +3 -3
- package/dist/chunk-CHXZROA7.js +0 -16
- package/dist/chunk-CHXZROA7.js.map +0 -1
- package/dist/chunk-NFWCLD5I.js.map +0 -1
package/dist/internal.js
CHANGED
|
@@ -5,8 +5,9 @@ import {
|
|
|
5
5
|
debug
|
|
6
6
|
} from "./chunk-73UWXFXB.js";
|
|
7
7
|
import {
|
|
8
|
+
bigIntMax,
|
|
8
9
|
uniqueBy
|
|
9
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ETXWXV5T.js";
|
|
10
11
|
|
|
11
12
|
// src/waitForTransactions.ts
|
|
12
13
|
import { waitForTransactionReceipt } from "viem/actions";
|
|
@@ -201,12 +202,396 @@ function getContractAddress({
|
|
|
201
202
|
}) {
|
|
202
203
|
return getCreate2Address2({ from: deployerAddress, bytecode, salt });
|
|
203
204
|
}
|
|
205
|
+
|
|
206
|
+
// src/transports/wiresaw.ts
|
|
207
|
+
import { http as http2 } from "viem";
|
|
208
|
+
|
|
209
|
+
// src/transports/methods/estimateUserOperationGas.ts
|
|
210
|
+
import {
|
|
211
|
+
decodeFunctionResult,
|
|
212
|
+
encodeFunctionData,
|
|
213
|
+
zeroAddress
|
|
214
|
+
} from "viem";
|
|
215
|
+
import {
|
|
216
|
+
entryPoint07Address,
|
|
217
|
+
formatUserOperation,
|
|
218
|
+
formatUserOperationRequest,
|
|
219
|
+
toPackedUserOperation
|
|
220
|
+
} from "viem/account-abstraction";
|
|
221
|
+
|
|
222
|
+
// src/transports/entryPointGasSimulations.ts
|
|
223
|
+
var entryPointGasSimulationsAbi = [
|
|
224
|
+
{
|
|
225
|
+
inputs: [
|
|
226
|
+
{
|
|
227
|
+
components: [
|
|
228
|
+
{
|
|
229
|
+
internalType: "address",
|
|
230
|
+
name: "sender",
|
|
231
|
+
type: "address"
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
internalType: "uint256",
|
|
235
|
+
name: "nonce",
|
|
236
|
+
type: "uint256"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
internalType: "bytes",
|
|
240
|
+
name: "initCode",
|
|
241
|
+
type: "bytes"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
internalType: "bytes",
|
|
245
|
+
name: "callData",
|
|
246
|
+
type: "bytes"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
internalType: "bytes32",
|
|
250
|
+
name: "accountGasLimits",
|
|
251
|
+
type: "bytes32"
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
internalType: "uint256",
|
|
255
|
+
name: "preVerificationGas",
|
|
256
|
+
type: "uint256"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
internalType: "bytes32",
|
|
260
|
+
name: "gasFees",
|
|
261
|
+
type: "bytes32"
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
internalType: "bytes",
|
|
265
|
+
name: "paymasterAndData",
|
|
266
|
+
type: "bytes"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
internalType: "bytes",
|
|
270
|
+
name: "signature",
|
|
271
|
+
type: "bytes"
|
|
272
|
+
}
|
|
273
|
+
],
|
|
274
|
+
internalType: "struct PackedUserOperation",
|
|
275
|
+
name: "op",
|
|
276
|
+
type: "tuple"
|
|
277
|
+
}
|
|
278
|
+
],
|
|
279
|
+
name: "estimateGas",
|
|
280
|
+
outputs: [
|
|
281
|
+
{
|
|
282
|
+
components: [
|
|
283
|
+
{
|
|
284
|
+
internalType: "uint256",
|
|
285
|
+
name: "verificationGas",
|
|
286
|
+
type: "uint256"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
internalType: "uint256",
|
|
290
|
+
name: "callGas",
|
|
291
|
+
type: "uint256"
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
internalType: "uint256",
|
|
295
|
+
name: "paymasterVerificationGas",
|
|
296
|
+
type: "uint256"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
internalType: "uint256",
|
|
300
|
+
name: "paymasterPostOpGas",
|
|
301
|
+
type: "uint256"
|
|
302
|
+
}
|
|
303
|
+
],
|
|
304
|
+
internalType: "struct EntryPoint.GasInfo",
|
|
305
|
+
name: "",
|
|
306
|
+
type: "tuple"
|
|
307
|
+
}
|
|
308
|
+
],
|
|
309
|
+
stateMutability: "nonpayable",
|
|
310
|
+
type: "function"
|
|
311
|
+
}
|
|
312
|
+
];
|
|
313
|
+
|
|
314
|
+
// src/transports/methods/estimateUserOperationGas.ts
|
|
315
|
+
async function estimateUserOperationGas({
|
|
316
|
+
request,
|
|
317
|
+
params
|
|
318
|
+
}) {
|
|
319
|
+
const userOp = formatUserOperation(params[0]);
|
|
320
|
+
const gasSimulation = await simulateGas({ userOp, request });
|
|
321
|
+
const gasLimits = {
|
|
322
|
+
verificationGasLimit: gasSimulation.verificationGas * 2n,
|
|
323
|
+
callGasLimit: bigIntMax(gasSimulation.callGas * 2n, 9000n),
|
|
324
|
+
paymasterVerificationGasLimit: gasSimulation.paymasterVerificationGas * 2n,
|
|
325
|
+
paymasterPostOpGasLimit: gasSimulation.paymasterPostOpGas * 2n,
|
|
326
|
+
preVerificationGas: 20000n
|
|
327
|
+
};
|
|
328
|
+
return formatUserOperationRequest({
|
|
329
|
+
...gasLimits
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
async function simulateGas({ request, userOp }) {
|
|
333
|
+
const simulationUserOp = {
|
|
334
|
+
...userOp,
|
|
335
|
+
preVerificationGas: 0n,
|
|
336
|
+
callGasLimit: 10000000n,
|
|
337
|
+
verificationGasLimit: 10000000n,
|
|
338
|
+
// https://github.com/pimlicolabs/alto/blob/471998695e5ec75ef88dda3f8a534f47c24bcd1a/src/rpc/methods/eth_estimateUserOperationGas.ts#L117
|
|
339
|
+
maxPriorityFeePerGas: userOp.maxFeePerGas,
|
|
340
|
+
paymasterPostOpGasLimit: 2000000n,
|
|
341
|
+
paymasterVerificationGasLimit: 5000000n
|
|
342
|
+
};
|
|
343
|
+
const packedUserOp = toPackedUserOperation(simulationUserOp);
|
|
344
|
+
const simulationData = encodeFunctionData({
|
|
345
|
+
abi: entryPointGasSimulationsAbi,
|
|
346
|
+
functionName: "estimateGas",
|
|
347
|
+
args: [packedUserOp]
|
|
348
|
+
});
|
|
349
|
+
const hasPaymaster = userOp.paymaster != null && userOp.paymaster !== zeroAddress;
|
|
350
|
+
const senderBalanceOverride = hasPaymaster ? {} : { [userOp.sender]: { balance: "0xFFFFFFFFFFFFFFFFFFFF" } };
|
|
351
|
+
const simulationParams = [
|
|
352
|
+
{
|
|
353
|
+
to: entryPoint07Address,
|
|
354
|
+
data: simulationData
|
|
355
|
+
},
|
|
356
|
+
"pending",
|
|
357
|
+
{
|
|
358
|
+
...senderBalanceOverride
|
|
359
|
+
}
|
|
360
|
+
];
|
|
361
|
+
const encodedSimulationResult = await request({
|
|
362
|
+
method: "wiresaw_callEntryPointSimulations",
|
|
363
|
+
params: simulationParams
|
|
364
|
+
});
|
|
365
|
+
return decodeFunctionResult({
|
|
366
|
+
abi: entryPointGasSimulationsAbi,
|
|
367
|
+
functionName: "estimateGas",
|
|
368
|
+
data: encodedSimulationResult
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// src/transports/methods/getUserOperationReceipt.ts
|
|
373
|
+
import {
|
|
374
|
+
decodeEventLog,
|
|
375
|
+
encodeEventTopics,
|
|
376
|
+
numberToHex,
|
|
377
|
+
parseEventLogs,
|
|
378
|
+
zeroAddress as zeroAddress2
|
|
379
|
+
} from "viem";
|
|
380
|
+
import { entryPoint07Abi } from "viem/account-abstraction";
|
|
381
|
+
var userOperationRevertReasonAbi = [
|
|
382
|
+
entryPoint07Abi.find(
|
|
383
|
+
(item) => item.type === "event" && item.name === "UserOperationRevertReason"
|
|
384
|
+
)
|
|
385
|
+
];
|
|
386
|
+
var userOperationEventTopic = encodeEventTopics({
|
|
387
|
+
abi: entryPoint07Abi,
|
|
388
|
+
eventName: "UserOperationEvent"
|
|
389
|
+
});
|
|
390
|
+
function getUserOperationReceipt(userOpHash, receipt) {
|
|
391
|
+
const userOperationRevertReasonTopicEvent = encodeEventTopics({
|
|
392
|
+
abi: userOperationRevertReasonAbi
|
|
393
|
+
})[0];
|
|
394
|
+
let entryPoint = zeroAddress2;
|
|
395
|
+
let revertReason = void 0;
|
|
396
|
+
let startIndex = -1;
|
|
397
|
+
let endIndex = -1;
|
|
398
|
+
receipt.logs.forEach((log, index) => {
|
|
399
|
+
if (log?.topics[0] === userOperationEventTopic[0]) {
|
|
400
|
+
if (log.topics[1] === userOpHash) {
|
|
401
|
+
endIndex = index;
|
|
402
|
+
entryPoint = log.address;
|
|
403
|
+
} else if (endIndex === -1) {
|
|
404
|
+
startIndex = index;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (log?.topics[0] === userOperationRevertReasonTopicEvent) {
|
|
408
|
+
if (log.topics[1] === userOpHash) {
|
|
409
|
+
const decodedLog = decodeEventLog({
|
|
410
|
+
abi: userOperationRevertReasonAbi,
|
|
411
|
+
data: log.data,
|
|
412
|
+
topics: log.topics
|
|
413
|
+
});
|
|
414
|
+
revertReason = decodedLog.args.revertReason;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
if (endIndex === -1) {
|
|
419
|
+
throw new Error("fatal: no UserOperationEvent in logs");
|
|
420
|
+
}
|
|
421
|
+
const logs = receipt.logs.slice(startIndex + 1, endIndex);
|
|
422
|
+
const userOperationEvent = parseEventLogs({
|
|
423
|
+
abi: entryPoint07Abi,
|
|
424
|
+
eventName: "UserOperationEvent",
|
|
425
|
+
args: {
|
|
426
|
+
userOpHash
|
|
427
|
+
},
|
|
428
|
+
logs: receipt.logs
|
|
429
|
+
})[0];
|
|
430
|
+
let paymaster = userOperationEvent.args.paymaster;
|
|
431
|
+
paymaster = paymaster === zeroAddress2 ? void 0 : paymaster;
|
|
432
|
+
return {
|
|
433
|
+
userOpHash,
|
|
434
|
+
entryPoint,
|
|
435
|
+
sender: userOperationEvent.args.sender,
|
|
436
|
+
nonce: numberToHex(userOperationEvent.args.nonce),
|
|
437
|
+
paymaster,
|
|
438
|
+
actualGasUsed: numberToHex(userOperationEvent.args.actualGasUsed),
|
|
439
|
+
actualGasCost: numberToHex(userOperationEvent.args.actualGasCost),
|
|
440
|
+
success: userOperationEvent.args.success,
|
|
441
|
+
reason: revertReason,
|
|
442
|
+
logs,
|
|
443
|
+
receipt
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// src/transports/chainTransport.ts
|
|
448
|
+
import { fallback, http, webSocket } from "viem";
|
|
449
|
+
function chainTransport(rpcUrls) {
|
|
450
|
+
const webSocketUrl = rpcUrls?.webSocket?.[0];
|
|
451
|
+
const httpUrl = rpcUrls?.http[0];
|
|
452
|
+
if (webSocketUrl) {
|
|
453
|
+
return httpUrl ? fallback([webSocket(webSocketUrl), http(httpUrl)]) : webSocket(webSocketUrl);
|
|
454
|
+
}
|
|
455
|
+
if (httpUrl) {
|
|
456
|
+
return http(httpUrl);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// src/transports/wiresaw.ts
|
|
461
|
+
function wiresaw(transports) {
|
|
462
|
+
return (opts) => {
|
|
463
|
+
const { wiresawTransport, fallbackBundlerTransport, fallbackDefaultTransport } = transports ?? getDefaultTransports(opts.chain);
|
|
464
|
+
const { request: wiresawRequest, ...rest } = wiresawTransport(opts);
|
|
465
|
+
let chainId = null;
|
|
466
|
+
const transactionHashes = {};
|
|
467
|
+
const transactionReceipts = {};
|
|
468
|
+
return {
|
|
469
|
+
...rest,
|
|
470
|
+
// TODO: type `request` so we don't have to cast
|
|
471
|
+
async request(req) {
|
|
472
|
+
try {
|
|
473
|
+
if (req.method === "eth_chainId") {
|
|
474
|
+
if (chainId != null) return chainId;
|
|
475
|
+
if (fallbackDefaultTransport) {
|
|
476
|
+
const { request: fallbackRequest } = fallbackDefaultTransport(opts);
|
|
477
|
+
return chainId = await fallbackRequest(req);
|
|
478
|
+
}
|
|
479
|
+
return chainId = await wiresawRequest(req);
|
|
480
|
+
}
|
|
481
|
+
if (req.method === "eth_estimateGas") {
|
|
482
|
+
return await wiresawRequest({ ...req, method: "wiresaw_estimateGas" });
|
|
483
|
+
}
|
|
484
|
+
if (req.method === "eth_call") {
|
|
485
|
+
return await wiresawRequest({ ...req, method: "wiresaw_call" });
|
|
486
|
+
}
|
|
487
|
+
if (req.method === "eth_getTransactionCount") {
|
|
488
|
+
return await wiresawRequest({ ...req, method: "wiresaw_getTransactionCount" });
|
|
489
|
+
}
|
|
490
|
+
if (req.method === "eth_getTransactionReceipt") {
|
|
491
|
+
return await getTransactionReceipt(req.params[0]);
|
|
492
|
+
}
|
|
493
|
+
if (req.method === "eth_sendUserOperation") {
|
|
494
|
+
const { userOpHash, txHash } = await wiresawRequest({
|
|
495
|
+
...req,
|
|
496
|
+
method: "wiresaw_sendUserOperation"
|
|
497
|
+
});
|
|
498
|
+
transactionHashes[userOpHash] = txHash;
|
|
499
|
+
return userOpHash;
|
|
500
|
+
}
|
|
501
|
+
if (req.method === "eth_getUserOperationReceipt") {
|
|
502
|
+
const userOpHash = req.params[0];
|
|
503
|
+
const knownTransactionHash = transactionHashes[userOpHash];
|
|
504
|
+
if (!knownTransactionHash) {
|
|
505
|
+
throw new Error(`eth_getUserOperationReceipt only supported for own user operations`);
|
|
506
|
+
}
|
|
507
|
+
const transactionReceipt = await getTransactionReceipt(knownTransactionHash);
|
|
508
|
+
return transactionReceipt && getUserOperationReceipt(userOpHash, transactionReceipt);
|
|
509
|
+
}
|
|
510
|
+
if (req.method === "eth_estimateUserOperationGas") {
|
|
511
|
+
return await estimateUserOperationGas({
|
|
512
|
+
request: wiresawRequest,
|
|
513
|
+
params: req.params
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
if (req.method === "eth_blockNumber" || req.method === "eth_getBlockByNumber" || req.method === "eth_maxPriorityFeePerGas") {
|
|
517
|
+
if (fallbackDefaultTransport) {
|
|
518
|
+
const { request: fallbackRequest } = fallbackDefaultTransport(opts);
|
|
519
|
+
return await fallbackRequest(req);
|
|
520
|
+
}
|
|
521
|
+
return await wiresawRequest(req);
|
|
522
|
+
}
|
|
523
|
+
return await wiresawRequest(req);
|
|
524
|
+
} catch (e) {
|
|
525
|
+
console.warn("[wiresaw] request failed", e);
|
|
526
|
+
const bundlerMethods = [
|
|
527
|
+
"eth_estimateUserOperationGas",
|
|
528
|
+
"eth_sendUserOperation",
|
|
529
|
+
"eth_getUserOperationReceipt"
|
|
530
|
+
];
|
|
531
|
+
if (bundlerMethods.includes(req.method)) {
|
|
532
|
+
if (fallbackBundlerTransport) {
|
|
533
|
+
const { request: fallbackRequest } = fallbackBundlerTransport(opts);
|
|
534
|
+
console.warn("[wiresaw] falling back to bundler rpc", req);
|
|
535
|
+
return fallbackRequest(req);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
if (fallbackDefaultTransport) {
|
|
539
|
+
const { request: fallbackRequest } = fallbackDefaultTransport(opts);
|
|
540
|
+
console.warn("[wiresaw] falling back to eth rpc", req);
|
|
541
|
+
return fallbackRequest(req);
|
|
542
|
+
}
|
|
543
|
+
throw e;
|
|
544
|
+
}
|
|
545
|
+
async function getTransactionReceipt(hash) {
|
|
546
|
+
if (transactionReceipts[hash]) return transactionReceipts[hash];
|
|
547
|
+
const pendingReceipt = await wiresawRequest({
|
|
548
|
+
...req,
|
|
549
|
+
method: "wiresaw_getTransactionReceipt",
|
|
550
|
+
params: [hash]
|
|
551
|
+
});
|
|
552
|
+
if (pendingReceipt) {
|
|
553
|
+
transactionReceipts[hash] = pendingReceipt;
|
|
554
|
+
return pendingReceipt;
|
|
555
|
+
}
|
|
556
|
+
if (fallbackDefaultTransport) {
|
|
557
|
+
const { request: fallbackRequest } = fallbackDefaultTransport(opts);
|
|
558
|
+
const receipt = await fallbackRequest({
|
|
559
|
+
...req,
|
|
560
|
+
method: "eth_getTransactionReceipt",
|
|
561
|
+
params: [hash]
|
|
562
|
+
});
|
|
563
|
+
if (receipt) {
|
|
564
|
+
transactionReceipts[hash] = receipt;
|
|
565
|
+
return receipt;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
};
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
function getDefaultTransports(chain) {
|
|
574
|
+
if (!chain) {
|
|
575
|
+
throw new Error("No chain or transports provided");
|
|
576
|
+
}
|
|
577
|
+
const wiresawTransport = chainTransport(chain.rpcUrls.wiresaw);
|
|
578
|
+
if (!wiresawTransport) {
|
|
579
|
+
throw new Error("Provided chain does not support wiresaw");
|
|
580
|
+
}
|
|
581
|
+
const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];
|
|
582
|
+
return {
|
|
583
|
+
wiresawTransport,
|
|
584
|
+
fallbackBundlerTransport: bundlerHttpUrl ? http2(bundlerHttpUrl) : void 0,
|
|
585
|
+
fallbackDefaultTransport: http2()
|
|
586
|
+
};
|
|
587
|
+
}
|
|
204
588
|
export {
|
|
205
589
|
ensureContract,
|
|
206
590
|
ensureContractsDeployed,
|
|
207
591
|
ensureDeployer,
|
|
208
592
|
getContractAddress,
|
|
209
593
|
getDeployer,
|
|
210
|
-
waitForTransactions
|
|
594
|
+
waitForTransactions,
|
|
595
|
+
wiresaw
|
|
211
596
|
};
|
|
212
597
|
//# sourceMappingURL=internal.js.map
|
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/waitForTransactions.ts","../src/deploy/ensureContract.ts","../src/deploy/common.ts","../src/deploy/debug.ts","../src/deploy/ensureContractsDeployed.ts","../src/deploy/ensureDeployer.ts","../src/deploy/create2/deployment.json","../src/deploy/getDeployer.ts","../src/deploy/getContractAddress.ts"],"sourcesContent":["import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { debug } from \"./debug\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\n\nexport async function waitForTransactions({\n client,\n hashes,\n debugLabel = \"transactions\",\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly hashes: readonly Hex[];\n readonly debugLabel?: string;\n}): Promise<void> {\n if (!hashes.length) return;\n\n debug(`waiting for ${debugLabel} to confirm`);\n // wait for each tx separately/serially, because parallelizing results in RPC errors\n for (const hash of hashes) {\n const receipt = await waitForTransactionReceipt(client, { hash });\n // TODO: handle user op failures?\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted: ${hash}`);\n }\n }\n}\n","import { Client, Transport, Chain, Account, concatHex, getCreate2Address, Hex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport { contractSizeLimit, singletonSalt } from \"./common\";\nimport { debug } from \"./debug\";\nimport { sendTransaction } from \"../sendTransaction\";\n\nexport type Contract = {\n bytecode: Hex;\n deployedBytecodeSize?: number;\n debugLabel?: string;\n salt?: Hex;\n};\n\nexport async function ensureContract({\n client,\n deployerAddress,\n bytecode,\n deployedBytecodeSize,\n debugLabel = \"contract\",\n salt = singletonSalt,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n} & Contract): Promise<readonly Hex[]> {\n if (bytecode.includes(\"__$\")) {\n throw new Error(`Found unlinked public library in ${debugLabel} bytecode`);\n }\n\n const address = getCreate2Address({ from: deployerAddress, salt, bytecode });\n\n const contractCode = await getCode(client, { address, blockTag: \"pending\" });\n if (contractCode) {\n debug(\"found\", debugLabel, \"at\", address);\n return [];\n }\n\n if (deployedBytecodeSize != null) {\n if (deployedBytecodeSize === 0) {\n throw new Error(`Empty bytecode for ${debugLabel}`);\n }\n\n if (deployedBytecodeSize > contractSizeLimit) {\n console.warn(\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n } else if (deployedBytecodeSize > contractSizeLimit * 0.95) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is almost over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n }\n }\n\n debug(\"deploying\", debugLabel, \"at\", address);\n return [\n await sendTransaction(client, {\n chain: client.chain ?? null,\n to: deployerAddress,\n data: concatHex([salt, bytecode]),\n }),\n ];\n}\n","import { stringToHex } from \"viem\";\n\n// salt for deterministic deploys of singleton contracts\nexport const singletonSalt = stringToHex(\"\", { size: 32 });\n\n// https://eips.ethereum.org/EIPS/eip-170\nexport const contractSizeLimit = parseInt(\"6000\", 16);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"deploy\");\nexport const error = parentDebug.extend(\"deploy\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { Contract, ensureContract } from \"./ensureContract\";\nimport { waitForTransactions } from \"../waitForTransactions\";\nimport { uniqueBy } from \"../utils/uniqueBy\";\n\nexport async function ensureContractsDeployed({\n client,\n deployerAddress,\n contracts,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n readonly contracts: readonly Contract[];\n}): Promise<readonly Hex[]> {\n // Deployments assume a deterministic deployer, so we only need to deploy the unique bytecode\n const uniqueContracts = uniqueBy(contracts, (contract) => contract.bytecode);\n\n const txs = (\n await Promise.all(uniqueContracts.map((contract) => ensureContract({ client, deployerAddress, ...contract })))\n ).flat();\n\n await waitForTransactions({\n client,\n hashes: txs,\n debugLabel: \"contract deploys\",\n });\n\n return txs;\n}\n","import { Account, Address, Chain, Client, Transport } from \"viem\";\nimport { getBalance, sendRawTransaction, sendTransaction, waitForTransactionReceipt } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\nimport { getDeployer } from \"./getDeployer\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function ensureDeployer(client: Client<Transport, Chain | undefined, Account>): Promise<Address> {\n const existingDeployer = await getDeployer(client);\n if (existingDeployer !== undefined) {\n return existingDeployer;\n }\n\n // There's not really a way to simulate a pre-EIP-155 (no chain ID) transaction,\n // so we have to attempt to create the deployer first and, if it fails, fall back\n // to a regular deploy.\n\n // Send gas to deployment signer\n const gasRequired = BigInt(deployment.gasLimit) * BigInt(deployment.gasPrice);\n const currentBalance = await getBalance(client, { address: `0x${deployment.signerAddress}` });\n const gasNeeded = gasRequired - currentBalance;\n if (gasNeeded > 0) {\n debug(\"sending gas for CREATE2 deployer to signer at\", deployment.signerAddress);\n const gasTx = await sendTransaction(client, {\n chain: client.chain ?? null,\n to: `0x${deployment.signerAddress}`,\n value: gasNeeded,\n });\n const gasReceipt = await waitForTransactionReceipt(client, { hash: gasTx });\n if (gasReceipt.status !== \"success\") {\n console.error(\"failed to send gas to deployer signer\", gasReceipt);\n throw new Error(\"failed to send gas to deployer signer\");\n }\n }\n\n // Deploy the deployer\n debug(\"deploying CREATE2 deployer at\", deployer);\n const deployTx = await sendRawTransaction(client, { serializedTransaction: `0x${deployment.transaction}` }).catch(\n (error) => {\n // Do a regular contract create if the presigned transaction doesn't work due to replay protection\n if (String(error).includes(\"only replay-protected (EIP-155) transactions allowed over RPC\")) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\n ⚠️ Your chain or RPC does not allow for non EIP-155 signed transactions, so your deploys will not be determinstic and contract addresses may change between deploys.\\n\\n We recommend running your chain's node with \\`--rpc.allow-unprotected-txs\\` to enable determinstic deployments.\\n`,\n );\n debug(\"deploying CREATE2 deployer\");\n return sendTransaction(client, {\n chain: client.chain ?? null,\n data: `0x${deployment.creationCode}`,\n });\n }\n throw error;\n },\n );\n\n const deployReceipt = await waitForTransactionReceipt(client, { hash: deployTx });\n if (!deployReceipt.contractAddress) {\n throw new Error(\"Deploy receipt did not have contract address, was the deployer not deployed?\");\n }\n\n if (deployReceipt.contractAddress !== deployer) {\n console.warn(\n `\\n ⚠️ CREATE2 deployer created at ${deployReceipt.contractAddress} does not match the CREATE2 determinstic deployer we expected (${deployer})`,\n );\n }\n\n return deployReceipt.contractAddress;\n}\n","{\n \"gasPrice\": 100000000000,\n \"gasLimit\": 100000,\n \"signerAddress\": \"3fab184622dc19b6109349b94811493bf2a45362\",\n \"transaction\": \"f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222\",\n \"address\": \"4e59b44847b379578588920ca78fbf26c0b4956c\",\n \"creationCode\": \"604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3\"\n}\n","import { Address, Chain, Client, Transport, sliceHex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function getDeployer(client: Client<Transport, Chain | undefined>): Promise<Address | undefined> {\n const bytecode = await getCode(client, { address: deployer });\n if (bytecode) {\n debug(\"found deployer bytecode at\", deployer);\n // check if deployed bytecode is the same as the expected bytecode (minus 14-bytes creation code prefix)\n if (bytecode !== sliceHex(`0x${deployment.creationCode}`, 14)) {\n console.warn(\n `\\n ⚠️ Bytecode for deployer at ${deployer} did not match the expected CREATE2 bytecode. You may have unexpected results.\\n`,\n );\n }\n return deployer;\n }\n}\n","import { Hex, getCreate2Address } from \"viem\";\nimport { singletonSalt } from \"./common\";\n\nexport function getContractAddress({\n deployerAddress,\n bytecode,\n salt = singletonSalt,\n}: {\n readonly deployerAddress: Hex;\n readonly bytecode: Hex;\n readonly salt?: Hex;\n}): Hex {\n return getCreate2Address({ from: deployerAddress, bytecode, salt });\n}\n"],"mappings":"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","names":["debug","debug","sendTransaction","waitForTransactionReceipt","getCode","getCode","debug","deployer","debug","sendTransaction","waitForTransactionReceipt","error","getCreate2Address","getCreate2Address"]}
|
|
1
|
+
{"version":3,"sources":["../src/waitForTransactions.ts","../src/deploy/ensureContract.ts","../src/deploy/common.ts","../src/deploy/debug.ts","../src/deploy/ensureContractsDeployed.ts","../src/deploy/ensureDeployer.ts","../src/deploy/create2/deployment.json","../src/deploy/getDeployer.ts","../src/deploy/getContractAddress.ts","../src/transports/wiresaw.ts","../src/transports/methods/estimateUserOperationGas.ts","../src/transports/entryPointGasSimulations.ts","../src/transports/methods/getUserOperationReceipt.ts","../src/transports/chainTransport.ts"],"sourcesContent":["import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { debug } from \"./debug\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\n\nexport async function waitForTransactions({\n client,\n hashes,\n debugLabel = \"transactions\",\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly hashes: readonly Hex[];\n readonly debugLabel?: string;\n}): Promise<void> {\n if (!hashes.length) return;\n\n debug(`waiting for ${debugLabel} to confirm`);\n // wait for each tx separately/serially, because parallelizing results in RPC errors\n for (const hash of hashes) {\n const receipt = await waitForTransactionReceipt(client, { hash });\n // TODO: handle user op failures?\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted: ${hash}`);\n }\n }\n}\n","import { Client, Transport, Chain, Account, concatHex, getCreate2Address, Hex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport { contractSizeLimit, singletonSalt } from \"./common\";\nimport { debug } from \"./debug\";\nimport { sendTransaction } from \"../sendTransaction\";\n\nexport type Contract = {\n bytecode: Hex;\n deployedBytecodeSize?: number;\n debugLabel?: string;\n salt?: Hex;\n};\n\nexport async function ensureContract({\n client,\n deployerAddress,\n bytecode,\n deployedBytecodeSize,\n debugLabel = \"contract\",\n salt = singletonSalt,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n} & Contract): Promise<readonly Hex[]> {\n if (bytecode.includes(\"__$\")) {\n throw new Error(`Found unlinked public library in ${debugLabel} bytecode`);\n }\n\n const address = getCreate2Address({ from: deployerAddress, salt, bytecode });\n\n const contractCode = await getCode(client, { address, blockTag: \"pending\" });\n if (contractCode) {\n debug(\"found\", debugLabel, \"at\", address);\n return [];\n }\n\n if (deployedBytecodeSize != null) {\n if (deployedBytecodeSize === 0) {\n throw new Error(`Empty bytecode for ${debugLabel}`);\n }\n\n if (deployedBytecodeSize > contractSizeLimit) {\n console.warn(\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n } else if (deployedBytecodeSize > contractSizeLimit * 0.95) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is almost over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n }\n }\n\n debug(\"deploying\", debugLabel, \"at\", address);\n return [\n await sendTransaction(client, {\n chain: client.chain ?? null,\n to: deployerAddress,\n data: concatHex([salt, bytecode]),\n }),\n ];\n}\n","import { stringToHex } from \"viem\";\n\n// salt for deterministic deploys of singleton contracts\nexport const singletonSalt = stringToHex(\"\", { size: 32 });\n\n// https://eips.ethereum.org/EIPS/eip-170\nexport const contractSizeLimit = parseInt(\"6000\", 16);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"deploy\");\nexport const error = parentDebug.extend(\"deploy\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { Contract, ensureContract } from \"./ensureContract\";\nimport { waitForTransactions } from \"../waitForTransactions\";\nimport { uniqueBy } from \"../utils/uniqueBy\";\n\nexport async function ensureContractsDeployed({\n client,\n deployerAddress,\n contracts,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n readonly contracts: readonly Contract[];\n}): Promise<readonly Hex[]> {\n // Deployments assume a deterministic deployer, so we only need to deploy the unique bytecode\n const uniqueContracts = uniqueBy(contracts, (contract) => contract.bytecode);\n\n const txs = (\n await Promise.all(uniqueContracts.map((contract) => ensureContract({ client, deployerAddress, ...contract })))\n ).flat();\n\n await waitForTransactions({\n client,\n hashes: txs,\n debugLabel: \"contract deploys\",\n });\n\n return txs;\n}\n","import { Account, Address, Chain, Client, Transport } from \"viem\";\nimport { getBalance, sendRawTransaction, sendTransaction, waitForTransactionReceipt } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\nimport { getDeployer } from \"./getDeployer\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function ensureDeployer(client: Client<Transport, Chain | undefined, Account>): Promise<Address> {\n const existingDeployer = await getDeployer(client);\n if (existingDeployer !== undefined) {\n return existingDeployer;\n }\n\n // There's not really a way to simulate a pre-EIP-155 (no chain ID) transaction,\n // so we have to attempt to create the deployer first and, if it fails, fall back\n // to a regular deploy.\n\n // Send gas to deployment signer\n const gasRequired = BigInt(deployment.gasLimit) * BigInt(deployment.gasPrice);\n const currentBalance = await getBalance(client, { address: `0x${deployment.signerAddress}` });\n const gasNeeded = gasRequired - currentBalance;\n if (gasNeeded > 0) {\n debug(\"sending gas for CREATE2 deployer to signer at\", deployment.signerAddress);\n const gasTx = await sendTransaction(client, {\n chain: client.chain ?? null,\n to: `0x${deployment.signerAddress}`,\n value: gasNeeded,\n });\n const gasReceipt = await waitForTransactionReceipt(client, { hash: gasTx });\n if (gasReceipt.status !== \"success\") {\n console.error(\"failed to send gas to deployer signer\", gasReceipt);\n throw new Error(\"failed to send gas to deployer signer\");\n }\n }\n\n // Deploy the deployer\n debug(\"deploying CREATE2 deployer at\", deployer);\n const deployTx = await sendRawTransaction(client, { serializedTransaction: `0x${deployment.transaction}` }).catch(\n (error) => {\n // Do a regular contract create if the presigned transaction doesn't work due to replay protection\n if (String(error).includes(\"only replay-protected (EIP-155) transactions allowed over RPC\")) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\n ⚠️ Your chain or RPC does not allow for non EIP-155 signed transactions, so your deploys will not be determinstic and contract addresses may change between deploys.\\n\\n We recommend running your chain's node with \\`--rpc.allow-unprotected-txs\\` to enable determinstic deployments.\\n`,\n );\n debug(\"deploying CREATE2 deployer\");\n return sendTransaction(client, {\n chain: client.chain ?? null,\n data: `0x${deployment.creationCode}`,\n });\n }\n throw error;\n },\n );\n\n const deployReceipt = await waitForTransactionReceipt(client, { hash: deployTx });\n if (!deployReceipt.contractAddress) {\n throw new Error(\"Deploy receipt did not have contract address, was the deployer not deployed?\");\n }\n\n if (deployReceipt.contractAddress !== deployer) {\n console.warn(\n `\\n ⚠️ CREATE2 deployer created at ${deployReceipt.contractAddress} does not match the CREATE2 determinstic deployer we expected (${deployer})`,\n );\n }\n\n return deployReceipt.contractAddress;\n}\n","{\n \"gasPrice\": 100000000000,\n \"gasLimit\": 100000,\n \"signerAddress\": \"3fab184622dc19b6109349b94811493bf2a45362\",\n \"transaction\": \"f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222\",\n \"address\": \"4e59b44847b379578588920ca78fbf26c0b4956c\",\n \"creationCode\": \"604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3\"\n}\n","import { Address, Chain, Client, Transport, sliceHex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function getDeployer(client: Client<Transport, Chain | undefined>): Promise<Address | undefined> {\n const bytecode = await getCode(client, { address: deployer });\n if (bytecode) {\n debug(\"found deployer bytecode at\", deployer);\n // check if deployed bytecode is the same as the expected bytecode (minus 14-bytes creation code prefix)\n if (bytecode !== sliceHex(`0x${deployment.creationCode}`, 14)) {\n console.warn(\n `\\n ⚠️ Bytecode for deployer at ${deployer} did not match the expected CREATE2 bytecode. You may have unexpected results.\\n`,\n );\n }\n return deployer;\n }\n}\n","import { Hex, getCreate2Address } from \"viem\";\nimport { singletonSalt } from \"./common\";\n\nexport function getContractAddress({\n deployerAddress,\n bytecode,\n salt = singletonSalt,\n}: {\n readonly deployerAddress: Hex;\n readonly bytecode: Hex;\n readonly salt?: Hex;\n}): Hex {\n return getCreate2Address({ from: deployerAddress, bytecode, salt });\n}\n","import { Chain, EIP1193RequestFn, Hex, http, RpcTransactionReceipt, Transport } from \"viem\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { getUserOperationReceipt } from \"./methods/getUserOperationReceipt\";\nimport { chainTransport } from \"./chainTransport\";\n\ntype WiresawSendUserOperationResult = {\n txHash: Hex;\n userOpHash: Hex;\n};\n\ntype WiresawOptions<transport extends Transport> = {\n /** wiresaw-compatible transport */\n wiresawTransport: transport;\n /** fallback transport for bundler RPC methods */\n fallbackBundlerTransport?: Transport;\n /** fallback transport for all other RPC methods */\n fallbackDefaultTransport?: Transport;\n};\n\nexport function wiresaw<const wiresawTransport extends Transport>(\n transports?: WiresawOptions<wiresawTransport>,\n): wiresawTransport {\n return ((opts) => {\n const { wiresawTransport, fallbackBundlerTransport, fallbackDefaultTransport } =\n transports ?? getDefaultTransports(opts.chain);\n\n const { request: wiresawRequest, ...rest } = wiresawTransport(opts);\n\n let chainId: Hex | null = null;\n const transactionHashes: { [userOpHash: Hex]: Hex } = {};\n const transactionReceipts: { [transactionHashes: Hex]: RpcTransactionReceipt } = {};\n\n return {\n ...rest,\n // TODO: type `request` so we don't have to cast\n async request(req): ReturnType<EIP1193RequestFn> {\n try {\n if (req.method === \"eth_chainId\") {\n if (chainId != null) return chainId;\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n return (chainId = await fallbackRequest(req));\n }\n return (chainId = await wiresawRequest(req));\n }\n\n if (req.method === \"eth_estimateGas\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_estimateGas\" });\n }\n\n if (req.method === \"eth_call\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_call\" });\n }\n\n if (req.method === \"eth_getTransactionCount\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_getTransactionCount\" });\n }\n\n if (req.method === \"eth_getTransactionReceipt\") {\n return await getTransactionReceipt((req.params as [Hex])[0]);\n }\n\n if (req.method === \"eth_sendUserOperation\") {\n const { userOpHash, txHash } = (await wiresawRequest({\n ...req,\n method: \"wiresaw_sendUserOperation\",\n })) as WiresawSendUserOperationResult;\n transactionHashes[userOpHash] = txHash;\n return userOpHash;\n }\n\n if (req.method === \"eth_getUserOperationReceipt\") {\n const userOpHash = (req.params as [Hex])[0];\n const knownTransactionHash = transactionHashes[userOpHash];\n if (!knownTransactionHash) {\n throw new Error(`eth_getUserOperationReceipt only supported for own user operations`);\n }\n const transactionReceipt = await getTransactionReceipt(knownTransactionHash);\n return transactionReceipt && getUserOperationReceipt(userOpHash, transactionReceipt);\n }\n\n if (req.method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas({\n request: wiresawRequest,\n params: req.params as never,\n });\n }\n\n // Fallback to regular RPC for methods that don't require wiresaw\n if (\n req.method === \"eth_blockNumber\" ||\n req.method === \"eth_getBlockByNumber\" ||\n req.method === \"eth_maxPriorityFeePerGas\"\n ) {\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n return await fallbackRequest(req);\n }\n return await wiresawRequest(req);\n }\n\n return await wiresawRequest(req);\n } catch (e) {\n console.warn(\"[wiresaw] request failed\", e);\n const bundlerMethods = [\n \"eth_estimateUserOperationGas\",\n \"eth_sendUserOperation\",\n \"eth_getUserOperationReceipt\",\n ];\n if (bundlerMethods.includes(req.method)) {\n if (fallbackBundlerTransport) {\n const { request: fallbackRequest } = fallbackBundlerTransport(opts);\n console.warn(\"[wiresaw] falling back to bundler rpc\", req);\n return fallbackRequest(req);\n }\n }\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n console.warn(\"[wiresaw] falling back to eth rpc\", req);\n return fallbackRequest(req);\n }\n throw e;\n }\n\n async function getTransactionReceipt(hash: Hex): Promise<RpcTransactionReceipt | undefined> {\n // Return cached receipt if available\n if (transactionReceipts[hash]) return transactionReceipts[hash];\n\n // Fetch pending receipt\n const pendingReceipt = (await wiresawRequest({\n ...req,\n method: \"wiresaw_getTransactionReceipt\",\n params: [hash],\n })) as RpcTransactionReceipt | undefined;\n if (pendingReceipt) {\n transactionReceipts[hash] = pendingReceipt;\n return pendingReceipt;\n }\n\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n const receipt = (await fallbackRequest({\n ...req,\n method: \"eth_getTransactionReceipt\",\n params: [hash],\n })) as RpcTransactionReceipt | undefined;\n if (receipt) {\n transactionReceipts[hash] = receipt;\n return receipt;\n }\n }\n }\n },\n };\n }) as wiresawTransport;\n}\n\nfunction getDefaultTransports(chain?: Chain): WiresawOptions<Transport> {\n if (!chain) {\n throw new Error(\"No chain or transports provided\");\n }\n\n const wiresawTransport = chainTransport(chain.rpcUrls.wiresaw);\n if (!wiresawTransport) {\n throw new Error(\"Provided chain does not support wiresaw\");\n }\n\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n return {\n wiresawTransport,\n fallbackBundlerTransport: bundlerHttpUrl ? http(bundlerHttpUrl) : undefined,\n fallbackDefaultTransport: http(),\n };\n}\n","import {\n BundlerRpcSchema,\n decodeFunctionResult,\n DecodeFunctionResultReturnType,\n EIP1193RequestFn,\n encodeFunctionData,\n Hex,\n zeroAddress,\n} from \"viem\";\nimport { getRpcMethod } from \"../common\";\nimport {\n entryPoint07Address,\n formatUserOperation,\n formatUserOperationRequest,\n toPackedUserOperation,\n UserOperation,\n} from \"viem/account-abstraction\";\nimport { bigIntMax } from \"../../utils\";\nimport { entryPointGasSimulationsAbi } from \"../entryPointGasSimulations\";\n\ntype rpcMethod = getRpcMethod<BundlerRpcSchema, \"eth_estimateUserOperationGas\">;\n\ntype EstimateUserOperationGasOptions = {\n request: EIP1193RequestFn;\n params: rpcMethod[\"Parameters\"];\n};\n\nexport async function estimateUserOperationGas({\n request,\n params,\n}: EstimateUserOperationGasOptions): Promise<rpcMethod[\"ReturnType\"]> {\n const userOp = formatUserOperation(params[0]);\n const gasSimulation = await simulateGas({ userOp, request });\n const gasLimits = {\n verificationGasLimit: gasSimulation.verificationGas * 2n,\n callGasLimit: bigIntMax(gasSimulation.callGas * 2n, 9000n),\n paymasterVerificationGasLimit: gasSimulation.paymasterVerificationGas * 2n,\n paymasterPostOpGasLimit: gasSimulation.paymasterPostOpGas * 2n,\n preVerificationGas: 20_000n,\n };\n\n return formatUserOperationRequest({\n ...gasLimits,\n });\n}\n\ntype SimulateGasOptions = {\n request: EIP1193RequestFn;\n userOp: UserOperation<\"0.7\">;\n};\n\ntype SimulateGasResult = DecodeFunctionResultReturnType<typeof entryPointGasSimulationsAbi>;\n\nasync function simulateGas({ request, userOp }: SimulateGasOptions): Promise<SimulateGasResult> {\n // Prepare user operation for simulation\n const simulationUserOp = {\n ...userOp,\n preVerificationGas: 0n,\n callGasLimit: 10_000_000n,\n verificationGasLimit: 10_000_000n,\n // https://github.com/pimlicolabs/alto/blob/471998695e5ec75ef88dda3f8a534f47c24bcd1a/src/rpc/methods/eth_estimateUserOperationGas.ts#L117\n maxPriorityFeePerGas: userOp.maxFeePerGas,\n paymasterPostOpGasLimit: 2_000_000n,\n paymasterVerificationGasLimit: 5_000_000n,\n } satisfies UserOperation<\"0.7\">;\n\n const packedUserOp = toPackedUserOperation(simulationUserOp);\n const simulationData = encodeFunctionData({\n abi: entryPointGasSimulationsAbi,\n functionName: \"estimateGas\",\n args: [packedUserOp],\n });\n\n const hasPaymaster = userOp.paymaster != null && userOp.paymaster !== zeroAddress;\n const senderBalanceOverride = hasPaymaster ? {} : { [userOp.sender]: { balance: \"0xFFFFFFFFFFFFFFFFFFFF\" } };\n const simulationParams = [\n {\n to: entryPoint07Address,\n data: simulationData,\n },\n \"pending\",\n {\n ...senderBalanceOverride,\n },\n ];\n const encodedSimulationResult: Hex = await request({\n method: \"wiresaw_callEntryPointSimulations\",\n params: simulationParams,\n });\n\n return decodeFunctionResult({\n abi: entryPointGasSimulationsAbi,\n functionName: \"estimateGas\",\n data: encodedSimulationResult,\n });\n}\n","export const entryPointGasSimulationsAbi = [\n {\n inputs: [\n {\n components: [\n {\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes\",\n name: \"initCode\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"callData\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes32\",\n name: \"accountGasLimits\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"gasFees\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes\",\n name: \"paymasterAndData\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"signature\",\n type: \"bytes\",\n },\n ],\n internalType: \"struct PackedUserOperation\",\n name: \"op\",\n type: \"tuple\",\n },\n ],\n name: \"estimateGas\",\n outputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"verificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"callGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"paymasterVerificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"paymasterPostOpGas\",\n type: \"uint256\",\n },\n ],\n internalType: \"struct EntryPoint.GasInfo\",\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","import {\n Address,\n ExtractAbiItem,\n Hex,\n RpcTransactionReceipt,\n RpcUserOperationReceipt,\n decodeEventLog,\n encodeEventTopics,\n numberToHex,\n parseEventLogs,\n zeroAddress,\n} from \"viem\";\nimport { entryPoint07Abi } from \"viem/account-abstraction\";\n\nconst userOperationRevertReasonAbi = [\n entryPoint07Abi.find(\n (item): item is ExtractAbiItem<typeof entryPoint07Abi, \"UserOperationRevertReason\"> =>\n item.type === \"event\" && item.name === \"UserOperationRevertReason\",\n )!,\n] as const;\n\nconst userOperationEventTopic = encodeEventTopics({\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\",\n});\n\nexport function getUserOperationReceipt(userOpHash: Hex, receipt: RpcTransactionReceipt): RpcUserOperationReceipt {\n const userOperationRevertReasonTopicEvent = encodeEventTopics({\n abi: userOperationRevertReasonAbi,\n })[0];\n\n let entryPoint: Address = zeroAddress;\n let revertReason = undefined;\n\n let startIndex = -1;\n let endIndex = -1;\n receipt.logs.forEach((log, index) => {\n if (log?.topics[0] === userOperationEventTopic[0]) {\n // process UserOperationEvent\n if (log.topics[1] === userOpHash) {\n // it's our userOpHash. save as end of logs array\n endIndex = index;\n entryPoint = log.address;\n } else if (endIndex === -1) {\n // it's a different hash. remember it as beginning index, but only if we didn't find our end index yet.\n startIndex = index;\n }\n }\n\n if (log?.topics[0] === userOperationRevertReasonTopicEvent) {\n // process UserOperationRevertReason\n if (log.topics[1] === userOpHash) {\n // it's our userOpHash. capture revert reason.\n const decodedLog = decodeEventLog({\n abi: userOperationRevertReasonAbi,\n data: log.data,\n topics: log.topics,\n });\n\n revertReason = decodedLog.args.revertReason;\n }\n }\n });\n\n if (endIndex === -1) {\n throw new Error(\"fatal: no UserOperationEvent in logs\");\n }\n\n const logs = receipt.logs.slice(startIndex + 1, endIndex);\n\n const userOperationEvent = parseEventLogs({\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\",\n args: {\n userOpHash,\n },\n logs: receipt.logs,\n })[0]!;\n\n let paymaster: Address | undefined = userOperationEvent.args.paymaster;\n paymaster = paymaster === zeroAddress ? undefined : paymaster;\n\n return {\n userOpHash,\n entryPoint,\n sender: userOperationEvent.args.sender,\n nonce: numberToHex(userOperationEvent.args.nonce),\n paymaster,\n actualGasUsed: numberToHex(userOperationEvent.args.actualGasUsed),\n actualGasCost: numberToHex(userOperationEvent.args.actualGasCost),\n success: userOperationEvent.args.success,\n reason: revertReason,\n logs,\n receipt,\n };\n}\n","import { Chain, fallback, http, Transport, webSocket } from \"viem\";\n\nexport function chainTransport(rpcUrls: Chain[\"rpcUrls\"][string]): Transport | undefined {\n const webSocketUrl = rpcUrls?.webSocket?.[0];\n const httpUrl = rpcUrls?.http[0];\n\n if (webSocketUrl) {\n return httpUrl ? fallback([webSocket(webSocketUrl), http(httpUrl)]) : webSocket(webSocketUrl);\n }\n\n if (httpUrl) {\n return http(httpUrl);\n }\n}\n"],"mappings":"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","names":["debug","debug","sendTransaction","waitForTransactionReceipt","getCode","getCode","debug","deployer","debug","sendTransaction","waitForTransactionReceipt","error","getCreate2Address","getCreate2Address","http","zeroAddress","http"]}
|
package/dist/utils.js
CHANGED
|
@@ -13,12 +13,10 @@ import {
|
|
|
13
13
|
iteratorToArray,
|
|
14
14
|
mapObject,
|
|
15
15
|
unique,
|
|
16
|
+
uniqueBy,
|
|
16
17
|
wait,
|
|
17
18
|
waitForIdle
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import {
|
|
20
|
-
uniqueBy
|
|
21
|
-
} from "./chunk-CHXZROA7.js";
|
|
19
|
+
} from "./chunk-ETXWXV5T.js";
|
|
22
20
|
export {
|
|
23
21
|
assertExhaustive,
|
|
24
22
|
bigIntMax,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@latticexyz/common",
|
|
3
|
-
"version": "2.2.22
|
|
3
|
+
"version": "2.2.22",
|
|
4
4
|
"description": "Common low level logic shared between packages",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -69,11 +69,11 @@
|
|
|
69
69
|
"p-retry": "^5.1.2",
|
|
70
70
|
"prettier": "3.2.5",
|
|
71
71
|
"prettier-plugin-solidity": "1.3.1",
|
|
72
|
-
"@latticexyz/schema-type": "2.2.22
|
|
72
|
+
"@latticexyz/schema-type": "2.2.22"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
75
|
"@types/debug": "^4.1.7",
|
|
76
|
-
"viem": "2.
|
|
76
|
+
"viem": "2.30.6"
|
|
77
77
|
},
|
|
78
78
|
"peerDependencies": {
|
|
79
79
|
"@aws-sdk/client-kms": "3.x",
|
package/dist/chunk-CHXZROA7.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// src/utils/uniqueBy.ts
|
|
2
|
-
function uniqueBy(values, getKey) {
|
|
3
|
-
const map = /* @__PURE__ */ new Map();
|
|
4
|
-
for (const value of values) {
|
|
5
|
-
const key = getKey(value);
|
|
6
|
-
if (!map.has(key)) {
|
|
7
|
-
map.set(key, value);
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
return Array.from(map.values());
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export {
|
|
14
|
-
uniqueBy
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=chunk-CHXZROA7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/uniqueBy.ts"],"sourcesContent":["export function uniqueBy<value, key>(values: readonly value[], getKey: (value: value) => key): readonly value[] {\n const map = new Map<key, value>();\n for (const value of values) {\n const key = getKey(value);\n if (!map.has(key)) {\n map.set(key, value);\n }\n }\n return Array.from(map.values());\n}\n"],"mappings":";AAAO,SAAS,SAAqB,QAA0B,QAAiD;AAC9G,QAAM,MAAM,oBAAI,IAAgB;AAChC,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,CAAC,IAAI,IAAI,GAAG,GAAG;AACjB,UAAI,IAAI,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AAChC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/assertExhaustive.ts","../src/utils/bigIntMax.ts","../src/utils/bigIntMin.ts","../src/utils/bigIntSort.ts","../src/utils/chunk.ts","../src/utils/groupBy.ts","../src/utils/identity.ts","../src/utils/includes.ts","../src/utils/indent.ts","../src/utils/isDefined.ts","../src/utils/isNotNull.ts","../src/utils/iteratorToArray.ts","../src/utils/mapObject.ts","../src/utils/unique.ts","../src/utils/wait.ts","../src/utils/waitForIdle.ts"],"sourcesContent":["export function assertExhaustive(value: never, message?: string): never {\n throw new Error(message ?? `Unexpected value: ${value}`);\n}\n","export function bigIntMax(...args: bigint[]): bigint {\n return args.reduce((m, e) => (e > m ? e : m));\n}\n","export function bigIntMin(...args: bigint[]): bigint {\n return args.reduce((m, e) => (e < m ? e : m));\n}\n","export function bigIntSort(a: bigint, b: bigint): -1 | 0 | 1 {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","export function* chunk<T>(arr: readonly T[], n: number): Generator<readonly T[], void> {\n for (let i = 0; i < arr.length; i += n) {\n yield arr.slice(i, i + n);\n }\n}\n","export function groupBy<value, key>(\n values: readonly value[],\n getKey: (value: value) => key,\n): Map<key, readonly value[]> {\n const map = new Map<key, readonly value[]>();\n for (const value of values) {\n const key = getKey(value);\n if (!map.has(key)) map.set(key, []);\n (map.get(key) as value[]).push(value);\n }\n return map;\n}\n","export function identity<T>(value: T): T {\n return value;\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function includes<item>(items: item[], value: any): value is item {\n return items.includes(value);\n}\n","export function indent(message: string, indentation = \" \"): string {\n return message.replaceAll(/(^|\\n)/g, `$1${indentation}`);\n}\n","export function isDefined<T>(argument: T | undefined): argument is T {\n return argument !== undefined;\n}\n","export function isNotNull<T>(argument: T | null): argument is T {\n return argument !== null;\n}\n","export async function iteratorToArray<T>(iterator: AsyncIterable<T>): Promise<readonly T[]> {\n const items: T[] = [];\n for await (const item of iterator) {\n items.push(item);\n }\n return items;\n}\n","/**\n * Map each key of a source object via a given valueMap function\n */\nexport function mapObject<\n Source extends Record<string | number | symbol, unknown>,\n Target extends { [key in keyof Source]: unknown },\n>(source: Source, valueMap: (value: Source[typeof key], key: keyof Source) => Target[typeof key]): Target {\n return Object.fromEntries(\n Object.entries(source).map(([key, value]) => [key, valueMap(value as Source[keyof Source], key)]),\n ) as Target;\n}\n","export function unique<value>(values: readonly value[]): readonly value[] {\n return Array.from(new Set(values));\n}\n","export function wait(ms: number): Promise<void> {\n return new Promise<void>((resolve) => setTimeout(() => resolve(), ms));\n}\n","export function waitForIdle(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(() => resolve());\n } else {\n setTimeout(() => resolve(), 1);\n }\n });\n}\n"],"mappings":";AAAO,SAAS,iBAAiB,OAAc,SAAyB;AACtE,QAAM,IAAI,MAAM,WAAW,qBAAqB,KAAK,EAAE;AACzD;;;ACFO,SAAS,aAAa,MAAwB;AACnD,SAAO,KAAK,OAAO,CAAC,GAAG,MAAO,IAAI,IAAI,IAAI,CAAE;AAC9C;;;ACFO,SAAS,aAAa,MAAwB;AACnD,SAAO,KAAK,OAAO,CAAC,GAAG,MAAO,IAAI,IAAI,IAAI,CAAE;AAC9C;;;ACFO,SAAS,WAAW,GAAW,GAAuB;AAC3D,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;;;ACFO,UAAU,MAAS,KAAmB,GAA0C;AACrF,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,UAAM,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,EAC1B;AACF;;;ACJO,SAAS,QACd,QACA,QAC4B;AAC5B,QAAM,MAAM,oBAAI,IAA2B;AAC3C,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,CAAC,IAAI,IAAI,GAAG,EAAG,KAAI,IAAI,KAAK,CAAC,CAAC;AAClC,IAAC,IAAI,IAAI,GAAG,EAAc,KAAK,KAAK;AAAA,EACtC;AACA,SAAO;AACT;;;ACXO,SAAS,SAAY,OAAa;AACvC,SAAO;AACT;;;ACDO,SAAS,SAAe,OAAe,OAA2B;AACvE,SAAO,MAAM,SAAS,KAAK;AAC7B;;;ACHO,SAAS,OAAO,SAAiB,cAAc,MAAc;AAClE,SAAO,QAAQ,WAAW,WAAW,KAAK,WAAW,EAAE;AACzD;;;ACFO,SAAS,UAAa,UAAwC;AACnE,SAAO,aAAa;AACtB;;;ACFO,SAAS,UAAa,UAAmC;AAC9D,SAAO,aAAa;AACtB;;;ACFA,eAAsB,gBAAmB,UAAmD;AAC1F,QAAM,QAAa,CAAC;AACpB,mBAAiB,QAAQ,UAAU;AACjC,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AACT;;;ACHO,SAAS,UAGd,QAAgB,UAAwF;AACxG,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,SAAS,OAA+B,GAAG,CAAC,CAAC;AAAA,EAClG;AACF;;;ACVO,SAAS,OAAc,QAA4C;AACxE,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AACnC;;;ACFO,SAAS,KAAK,IAA2B;AAC9C,SAAO,IAAI,QAAc,CAAC,YAAY,WAAW,MAAM,QAAQ,GAAG,EAAE,CAAC;AACvE;;;ACFO,SAAS,cAA6B;AAC3C,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,QAAI,OAAO,wBAAwB,aAAa;AAC9C,0BAAoB,MAAM,QAAQ,CAAC;AAAA,IACrC,OAAO;AACL,iBAAW,MAAM,QAAQ,GAAG,CAAC;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;","names":[]}
|