@pimlico/alto 0.0.0-main.20250916T162729 → 0.0.0-main.20250930T125129

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.
Files changed (91) hide show
  1. package/esm/cli/config/bundler.d.ts +12 -0
  2. package/esm/cli/config/bundler.js +2 -0
  3. package/esm/cli/config/bundler.js.map +1 -1
  4. package/esm/cli/config/options.js +11 -0
  5. package/esm/cli/config/options.js.map +1 -1
  6. package/esm/cli/setupServer.js +1 -1
  7. package/esm/cli/setupServer.js.map +1 -1
  8. package/esm/cli/shutDown.js +15 -55
  9. package/esm/cli/shutDown.js.map +1 -1
  10. package/esm/executor/bundleManager.d.ts +1 -1
  11. package/esm/executor/bundleManager.js +47 -34
  12. package/esm/executor/bundleManager.js.map +1 -1
  13. package/esm/executor/executorManager.js +3 -4
  14. package/esm/executor/executorManager.js.map +1 -1
  15. package/esm/executor/senderManager/createRedisSenderManager.js +1 -2
  16. package/esm/executor/senderManager/createRedisSenderManager.js.map +1 -1
  17. package/esm/handlers/arbitrumGasPriceManager.js +2 -2
  18. package/esm/handlers/gasPriceManager.js +3 -3
  19. package/esm/handlers/mantleGasPriceManager.js +4 -4
  20. package/esm/handlers/optimismManager.js +1 -1
  21. package/esm/mempool/mempool.d.ts +3 -11
  22. package/esm/mempool/mempool.js +91 -93
  23. package/esm/mempool/mempool.js.map +1 -1
  24. package/esm/mempool/monitoring.d.ts +1 -1
  25. package/esm/mempool/monitoring.js +30 -21
  26. package/esm/mempool/monitoring.js.map +1 -1
  27. package/esm/receiptCache/createMemoryReceiptCache.js +8 -5
  28. package/esm/receiptCache/createMemoryReceiptCache.js.map +1 -1
  29. package/esm/receiptCache/createRedisReceiptCache.js +13 -11
  30. package/esm/receiptCache/createRedisReceiptCache.js.map +1 -1
  31. package/esm/receiptCache/index.d.ts +4 -1
  32. package/esm/receiptCache/index.js.map +1 -1
  33. package/esm/rpc/methods/pimlico_sendUserOperationNow.js +4 -1
  34. package/esm/rpc/methods/pimlico_sendUserOperationNow.js.map +1 -1
  35. package/esm/store/createMempoolStore.d.ts +1 -1
  36. package/esm/store/createMempoolStore.js +51 -143
  37. package/esm/store/createMempoolStore.js.map +1 -1
  38. package/esm/store/index.d.ts +4 -75
  39. package/esm/store/index.js +4 -1
  40. package/esm/store/index.js.map +1 -1
  41. package/esm/store/outstanding/index.d.ts +13 -0
  42. package/esm/store/outstanding/index.js +16 -0
  43. package/esm/store/outstanding/index.js.map +1 -0
  44. package/esm/store/{createMemoryOutstandingStore.d.ts → outstanding/memory.d.ts} +11 -10
  45. package/esm/store/outstanding/memory.js +249 -0
  46. package/esm/store/outstanding/memory.js.map +1 -0
  47. package/esm/store/outstanding/redis.d.ts +11 -0
  48. package/esm/store/outstanding/redis.js +201 -0
  49. package/esm/store/outstanding/redis.js.map +1 -0
  50. package/esm/store/outstanding/types.d.ts +18 -0
  51. package/esm/store/outstanding/types.js +2 -0
  52. package/esm/store/outstanding/types.js.map +1 -0
  53. package/esm/store/processing/index.d.ts +11 -0
  54. package/esm/store/processing/index.js +17 -0
  55. package/esm/store/processing/index.js.map +1 -0
  56. package/esm/store/processing/memory.d.ts +14 -0
  57. package/esm/store/processing/memory.js +46 -0
  58. package/esm/store/processing/memory.js.map +1 -0
  59. package/esm/store/processing/redis.d.ts +21 -0
  60. package/esm/store/processing/redis.js +69 -0
  61. package/esm/store/processing/redis.js.map +1 -0
  62. package/esm/store/processing/types.d.ts +9 -0
  63. package/esm/store/processing/types.js +2 -0
  64. package/esm/store/processing/types.js.map +1 -0
  65. package/esm/store/types.d.ts +49 -0
  66. package/esm/store/types.js +2 -0
  67. package/esm/store/types.js.map +1 -0
  68. package/esm/utils/minMaxQueue/createRedisMinMaxQueue.d.ts +23 -2
  69. package/esm/utils/minMaxQueue/createRedisMinMaxQueue.js +83 -60
  70. package/esm/utils/minMaxQueue/createRedisMinMaxQueue.js.map +1 -1
  71. package/esm/utils/minMaxQueue/index.d.ts +2 -2
  72. package/esm/utils/minMaxQueue/index.js +2 -2
  73. package/esm/utils/minMaxQueue/index.js.map +1 -1
  74. package/esm/utils/userop.d.ts +1 -0
  75. package/esm/utils/userop.js +6 -0
  76. package/esm/utils/userop.js.map +1 -1
  77. package/package.json +1 -1
  78. package/esm/cli/config/redisKeys.d.ts +0 -9
  79. package/esm/cli/config/redisKeys.js +0 -16
  80. package/esm/cli/config/redisKeys.js.map +0 -1
  81. package/esm/store/createMemoryOutstandingStore.js +0 -240
  82. package/esm/store/createMemoryOutstandingStore.js.map +0 -1
  83. package/esm/store/createRedisOutstandingStore.d.ts +0 -28
  84. package/esm/store/createRedisOutstandingStore.js +0 -341
  85. package/esm/store/createRedisOutstandingStore.js.map +0 -1
  86. package/esm/store/createRedisStore.d.ts +0 -10
  87. package/esm/store/createRedisStore.js +0 -128
  88. package/esm/store/createRedisStore.js.map +0 -1
  89. package/esm/store/createStore.d.ts +0 -6
  90. package/esm/store/createStore.js +0 -66
  91. package/esm/store/createStore.js.map +0 -1
@@ -1,28 +0,0 @@
1
- import { type Address } from "../types/index.js";
2
- import { type ChainableCommander, Redis } from "ioredis";
3
- import type { OutstandingStore } from "./index.js";
4
- import type { AltoConfig } from "../createConfig.js";
5
- export declare class RedisHash {
6
- private redis;
7
- private keyName;
8
- constructor(redis: Redis, keyName: string);
9
- get keyPath(): string;
10
- set({ key, value, multi }: {
11
- key: string;
12
- value: string;
13
- multi?: ChainableCommander | Redis;
14
- }): Promise<void>;
15
- get(field: string): Promise<string | null>;
16
- delete({ key, multi }: {
17
- key: string;
18
- multi?: ChainableCommander | Redis;
19
- }): Promise<void>;
20
- exists(field: string): Promise<boolean>;
21
- getAll(): Promise<Record<string, string>>;
22
- }
23
- export declare const createRedisOutstandingQueue: ({ config, entryPoint, redisEndpoint }: {
24
- config: AltoConfig;
25
- entryPoint: Address;
26
- redisEndpoint: string;
27
- }) => OutstandingStore;
28
- //# sourceMappingURL=createRedisOutstandingStore.d.ts.map
@@ -1,341 +0,0 @@
1
- import { userOpInfoSchema } from "../types/index.js";
2
- import { Redis } from "ioredis";
3
- import { toHex } from "viem/utils";
4
- import { getNonceKeyAndSequence, isVersion06, isVersion07 } from "../utils/userop.js";
5
- const serializeUserOpInfo = (userOpInfo) => {
6
- return JSON.stringify(userOpInfo, (_, value) => typeof value === "bigint" ? toHex(value) : value);
7
- };
8
- const deserializeUserOpInfo = (data) => {
9
- try {
10
- const parsed = JSON.parse(data);
11
- const result = userOpInfoSchema.safeParse(parsed);
12
- if (!result.success) {
13
- throw new Error(`Failed to parse UserOpInfo: ${result.error.message}`);
14
- }
15
- return result.data;
16
- }
17
- catch (error) {
18
- if (error instanceof Error) {
19
- throw new Error(`UserOpInfo deserialization failed: ${error.message}`);
20
- }
21
- throw new Error("UserOpInfo deserialization failed with unknown error");
22
- }
23
- };
24
- const isDeployment = (userOp) => {
25
- const isV6Deployment = isVersion06(userOp) && !!userOp.initCode && userOp.initCode !== "0x";
26
- const isV7Deployment = isVersion07(userOp) && !!userOp.factory && userOp.factory !== "0x";
27
- return isV6Deployment || isV7Deployment;
28
- };
29
- class RedisSortedSet {
30
- redis;
31
- keyName;
32
- constructor(redis, keyName) {
33
- this.redis = redis;
34
- this.keyName = keyName;
35
- }
36
- get keyPath() {
37
- return this.keyName;
38
- }
39
- async add({ member, score, multi = this.redis }) {
40
- await multi.zadd(this.keyPath, score, member);
41
- }
42
- async remove({ member, multi = this.redis }) {
43
- await multi.zrem(this.keyPath, member);
44
- }
45
- getByScoreRange(min, max) {
46
- return Promise.resolve(this.redis.zrangebyscore(this.keyPath, min, max));
47
- }
48
- getByRankRange(start, stop) {
49
- return Promise.resolve(this.redis.zrange(this.keyPath, start, stop));
50
- }
51
- async popMax() {
52
- const result = (await this.redis.zmpop(1, [this.keyPath], "MAX", "COUNT", 1));
53
- return result && result[1].length > 0 ? result[1][0][0] : undefined;
54
- }
55
- async popMin() {
56
- const result = (await this.redis.zmpop(1, [this.keyPath], "MIN", "COUNT", 1));
57
- return result && result[1].length > 0 ? result[1][0][0] : undefined;
58
- }
59
- async delete({ multi = this.redis }) {
60
- await multi.del(this.keyPath);
61
- }
62
- }
63
- export class RedisHash {
64
- redis;
65
- keyName;
66
- constructor(redis, keyName) {
67
- this.redis = redis;
68
- this.keyName = keyName;
69
- }
70
- get keyPath() {
71
- return this.keyName;
72
- }
73
- async set({ key, value, multi = this.redis }) {
74
- await multi.hset(this.keyPath, key, value);
75
- }
76
- get(field) {
77
- return Promise.resolve(this.redis.hget(this.keyPath, field));
78
- }
79
- async delete({ key, multi = this.redis }) {
80
- await multi.hdel(this.keyPath, key);
81
- }
82
- async exists(field) {
83
- return (await this.redis.hexists(this.keyPath, field)) === 1;
84
- }
85
- getAll() {
86
- return Promise.resolve(this.redis.hgetall(this.keyPath));
87
- }
88
- }
89
- class RedisOutstandingQueue {
90
- redis;
91
- chainId;
92
- entryPoint;
93
- // Redis data structures
94
- readyOpsQueue; // gasPrice -> pendingOpsKey
95
- userOpHashLookup; // userOpHash -> pendingOpsKey
96
- factoryLookup; // sender -> userOpHash
97
- constructor({ config, entryPoint, redisEndpoint }) {
98
- this.redis = new Redis(redisEndpoint, {});
99
- this.chainId = config.chainId;
100
- this.entryPoint = entryPoint;
101
- // Initialize Redis data structures
102
- const factoryLookupKey = `${this.chainId}:outstanding:factory-lookup:${this.entryPoint}`;
103
- const userOpHashLookupKey = `${this.chainId}:outstanding:user-op-hash-index:${this.entryPoint}`;
104
- const readyOpsQueueKey = `${this.chainId}:outstanding:pending-queue:${this.entryPoint}`;
105
- this.readyOpsQueue = new RedisSortedSet(this.redis, readyOpsQueueKey);
106
- this.userOpHashLookup = new RedisHash(this.redis, userOpHashLookupKey);
107
- this.factoryLookup = new RedisHash(this.redis, factoryLookupKey);
108
- }
109
- // Helpers
110
- getPendingOpsSet(userOp) {
111
- return new RedisSortedSet(this.redis, this.getPendingOpsKey(userOp));
112
- }
113
- getPendingOpsKey(userOp) {
114
- const [nonceKey] = getNonceKeyAndSequence(userOp.nonce);
115
- const fingerprint = `${userOp.sender}-${toHex(nonceKey)}`;
116
- return `${this.chainId}:outstanding:pending-ops:${this.entryPoint}:${fingerprint}`;
117
- }
118
- // OutstandingStore methods
119
- contains(userOpHash) {
120
- return Promise.resolve(this.userOpHashLookup.exists(userOpHash));
121
- }
122
- async popConflicting(userOp) {
123
- const [, nonceSeq] = getNonceKeyAndSequence(userOp.nonce);
124
- const pendingOpsSet = this.getPendingOpsSet(userOp);
125
- // Check for operations with the same nonce sequence
126
- const conflictingNonce = await pendingOpsSet.getByScoreRange(Number(nonceSeq), Number(nonceSeq));
127
- if (conflictingNonce.length > 0) {
128
- const conflicting = deserializeUserOpInfo(conflictingNonce[0]);
129
- await this.remove(conflicting.userOpHash);
130
- return {
131
- reason: "conflicting_nonce",
132
- userOpInfo: conflicting
133
- };
134
- }
135
- // Check for conflicting deployments to the same address
136
- if (isDeployment(userOp)) {
137
- const conflictingUserOpHash = await this.factoryLookup.get(userOp.sender);
138
- if (conflictingUserOpHash) {
139
- const pendingOpsKey = await this.userOpHashLookup.get(conflictingUserOpHash);
140
- if (pendingOpsKey) {
141
- const conflictingPendingOpsSet = new RedisSortedSet(this.redis, pendingOpsKey);
142
- const ops = await conflictingPendingOpsSet.getByRankRange(0, -1);
143
- const userOps = ops.map(deserializeUserOpInfo);
144
- const conflictingUserOp = userOps.find((op) => op.userOpHash === conflictingUserOpHash);
145
- if (conflictingUserOp) {
146
- await this.remove(conflictingUserOp.userOpHash);
147
- return {
148
- reason: "conflicting_deployment",
149
- userOpInfo: conflictingUserOp
150
- };
151
- }
152
- }
153
- }
154
- }
155
- return undefined;
156
- }
157
- async peek() {
158
- // Get highest gas price operation's key
159
- const pendingOpsKeys = await this.readyOpsQueue.getByRankRange(0, 0);
160
- if (pendingOpsKeys.length === 0) {
161
- return undefined;
162
- }
163
- // Get the lowest nonce operation from the pendingOpsKey
164
- const pendingOpsSet = new RedisSortedSet(this.redis, pendingOpsKeys[0]);
165
- const userOpInfoStrings = await pendingOpsSet.getByRankRange(0, 0);
166
- if (userOpInfoStrings.length === 0) {
167
- return undefined;
168
- }
169
- return deserializeUserOpInfo(userOpInfoStrings[0]);
170
- }
171
- async add(userOpInfo) {
172
- const { userOpHash, userOp } = userOpInfo;
173
- const pendingOpsSet = this.getPendingOpsSet(userOp);
174
- const [, nonceSeq] = getNonceKeyAndSequence(userOp.nonce);
175
- // check if this will be the lowest nonce operation
176
- // We need this info before starting the transaction
177
- const existingOps = await pendingOpsSet.getByRankRange(0, 0);
178
- const isLowestNonce = existingOps.length === 0 ||
179
- userOp.nonce < deserializeUserOpInfo(existingOps[0]).userOp.nonce;
180
- const multi = this.redis.multi();
181
- // Add to pendingOps sorted set with nonceSeq as score
182
- await pendingOpsSet.add({
183
- member: serializeUserOpInfo(userOpInfo),
184
- score: Number(nonceSeq),
185
- multi
186
- });
187
- // Add to userOpHash lookup
188
- await this.userOpHashLookup.set({
189
- key: userOpHash,
190
- value: pendingOpsSet.keyPath,
191
- multi
192
- });
193
- // Track factory deployments if needed
194
- if (isDeployment(userOp)) {
195
- await this.factoryLookup.set({
196
- key: userOp.sender,
197
- value: userOpHash,
198
- multi
199
- });
200
- }
201
- // If lowest nonce, update ready queue with this userOp's gasPrice
202
- if (isLowestNonce) {
203
- await this.readyOpsQueue.add({
204
- member: pendingOpsSet.keyPath,
205
- score: Number(userOp.maxFeePerGas),
206
- multi
207
- });
208
- }
209
- await multi.exec();
210
- }
211
- async remove(userOpHash) {
212
- // Get the userOp info from the secondary index
213
- const pendingOpsKey = await this.userOpHashLookup.get(userOpHash);
214
- if (!pendingOpsKey) {
215
- return false;
216
- }
217
- // Get all pending operations for this key
218
- const pendingOpsSet = new RedisSortedSet(this.redis, pendingOpsKey);
219
- const ops = await pendingOpsSet.getByRankRange(0, -1);
220
- if (ops.length === 0) {
221
- return false;
222
- }
223
- const userOps = ops.map(deserializeUserOpInfo);
224
- const userOpInfo = userOps.find((op) => op.userOpHash === userOpHash);
225
- if (!userOpInfo) {
226
- return false;
227
- }
228
- // Check if we're removing the lowest nonce operation
229
- const isLowestNonce = userOps[0].userOpHash === userOpHash;
230
- // If this is the lowest nonce, check if there's a next operation before starting the transaction
231
- let nextOp;
232
- if (isLowestNonce && userOps.length > 1) {
233
- // userOps is already sorted by nonce sequence because it comes from the sorted set
234
- // So we can simply take the second operation as the next one
235
- nextOp = userOps[1];
236
- }
237
- // Create a transaction
238
- const multi = this.redis.multi();
239
- // Clean up factory deployment tracking if needed
240
- if (isDeployment(userOpInfo.userOp)) {
241
- await this.factoryLookup.delete({
242
- key: userOpInfo.userOp.sender,
243
- multi
244
- });
245
- }
246
- // Remove from the sorted set
247
- await pendingOpsSet.remove({
248
- member: serializeUserOpInfo(userOpInfo),
249
- multi
250
- });
251
- // Remove from hash lookup
252
- await this.userOpHashLookup.delete({
253
- key: userOpHash,
254
- multi
255
- });
256
- if (isLowestNonce) {
257
- // Remove from ready queue
258
- await this.readyOpsQueue.remove({ member: pendingOpsKey, multi });
259
- // If we have a next operation, add it to the ready queue
260
- if (nextOp) {
261
- await this.readyOpsQueue.add({
262
- member: pendingOpsKey,
263
- score: Number(nextOp.userOp.maxFeePerGas),
264
- multi
265
- });
266
- }
267
- }
268
- // Execute transaction
269
- await multi.exec();
270
- return true;
271
- }
272
- async pop() {
273
- // Pop highest gas price operation
274
- const pendingOpsKey = await this.readyOpsQueue.popMax();
275
- if (!pendingOpsKey) {
276
- return undefined;
277
- }
278
- const pendingOpsSet = new RedisSortedSet(this.redis, pendingOpsKey);
279
- // Get the operations from the set (limited to 2 for efficiency)
280
- const ops = await pendingOpsSet.getByRankRange(0, 1);
281
- if (ops.length === 0) {
282
- return undefined;
283
- }
284
- const currentUserOpStr = ops[0];
285
- const currentUserOp = deserializeUserOpInfo(currentUserOpStr);
286
- // Create a transaction
287
- const multi = this.redis.multi();
288
- // Remove the current operation
289
- await pendingOpsSet.remove({ member: currentUserOpStr, multi });
290
- await this.userOpHashLookup.delete({
291
- key: currentUserOp.userOpHash,
292
- multi
293
- });
294
- // Execute transaction
295
- await multi.exec();
296
- // Check if there are more operations in this set
297
- if (ops.length > 1) {
298
- const nextUserOp = deserializeUserOpInfo(ops[1]);
299
- await this.readyOpsQueue.add({
300
- member: pendingOpsKey,
301
- score: Number(nextUserOp.userOp.maxFeePerGas)
302
- });
303
- }
304
- else {
305
- // Delete the empty set
306
- await pendingOpsSet.delete({});
307
- }
308
- return currentUserOp;
309
- }
310
- async getQueuedUserOps(userOp) {
311
- const pendingOpsSet = this.getPendingOpsSet(userOp);
312
- const [, nonceSequence] = getNonceKeyAndSequence(userOp.nonce);
313
- const pendingOps = await pendingOpsSet.getByRankRange(0, -1);
314
- // Filter operations with nonce sequence less than the current one
315
- return pendingOps
316
- .map(deserializeUserOpInfo)
317
- .filter((opInfo) => {
318
- const [, opNonceSeq] = getNonceKeyAndSequence(opInfo.userOp.nonce);
319
- return opNonceSeq < nonceSequence;
320
- })
321
- .map((opInfo) => opInfo.userOp);
322
- }
323
- // These methods aren't implemented
324
- dumpLocal() {
325
- return Promise.resolve([]); // We can't dump from redis as the latency is too high
326
- }
327
- clear() {
328
- throw new Error("Not implemented: clear");
329
- }
330
- // Skip limit checks when using Redis
331
- validateQueuedLimit() {
332
- return true;
333
- }
334
- validateParallelLimit() {
335
- return true;
336
- }
337
- }
338
- export const createRedisOutstandingQueue = ({ config, entryPoint, redisEndpoint }) => {
339
- return new RedisOutstandingQueue({ config, entryPoint, redisEndpoint });
340
- };
341
- //# sourceMappingURL=createRedisOutstandingStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createRedisOutstandingStore.js","sourceRoot":"","sources":["../../store/createRedisOutstandingStore.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import { type Address } from "viem";
2
- import type { Store } from "./index.js";
3
- import type { AltoConfig } from "../createConfig.js";
4
- export declare const createRedisStore: ({ config, storeType, entryPoint, redisEndpoint }: {
5
- config: AltoConfig;
6
- storeType: string;
7
- entryPoint: Address;
8
- redisEndpoint: string;
9
- }) => Store;
10
- //# sourceMappingURL=createRedisStore.d.ts.map
@@ -1,128 +0,0 @@
1
- import Redis from "ioredis";
2
- import { toHex } from "viem";
3
- import { userOperationSchema } from "../types/schemas.js";
4
- import { isVersion06, isVersion07 } from "../utils/userop.js";
5
- import { RedisHash } from "./createRedisOutstandingStore.js";
6
- import { createMemoryStore } from "./createStore.js";
7
- const isDeploymentOperation = (userOp) => {
8
- const isV6Deployment = isVersion06(userOp) && !!userOp.initCode && userOp.initCode !== "0x";
9
- const isV7Deployment = isVersion07(userOp) && !!userOp.factory && userOp.factory !== "0x";
10
- return isV6Deployment || isV7Deployment;
11
- };
12
- const serializeUserOp = (userOpInfo) => {
13
- return JSON.stringify(userOpInfo, (_, value) => typeof value === "bigint" ? toHex(value) : value);
14
- };
15
- const deserializeUserOp = (data) => {
16
- try {
17
- const parsed = JSON.parse(data);
18
- const result = userOperationSchema.safeParse(parsed);
19
- if (!result.success) {
20
- throw new Error(`Failed to parse UserOpInfo: ${result.error.message}`);
21
- }
22
- return result.data;
23
- }
24
- catch (error) {
25
- if (error instanceof Error) {
26
- throw new Error(`UserOpInfo deserialization failed: ${error.message}`);
27
- }
28
- throw new Error("UserOpInfo deserialization failed with unknown error");
29
- }
30
- };
31
- export const createRedisStore = ({ config, storeType, entryPoint, redisEndpoint }) => {
32
- const redis = new Redis(redisEndpoint, {});
33
- const factoryLookupKey = `${config.chainId}:${storeType}:factory-lookup:${entryPoint}`;
34
- const conflictingNonceKey = `${config.chainId}:${storeType}:conflicting-nonce:${entryPoint}`;
35
- const userOpHashLookupKey = `${config.chainId}:${storeType}:user-op-hash-index:${entryPoint}`;
36
- const senderNonceLookupKey = `${config.chainId}:${storeType}:sender-nonce-lookup:${entryPoint}`;
37
- const conflictingNonce = new RedisHash(redis, conflictingNonceKey); // userOpHash -> userOp
38
- const factoryLookup = new RedisHash(redis, factoryLookupKey); // sender -> userOpHash (if deployment is present)
39
- const senderNonceLookup = new RedisHash(redis, senderNonceLookupKey); // sender + nonce -> userOp
40
- const userOpHashLookup = new RedisHash(redis, userOpHashLookupKey); // userOpHash -> userOp
41
- const memoryStore = createMemoryStore({ config });
42
- const encodeSenderNonce = (userOp) => {
43
- return `${userOp.sender}-${userOp.nonce}`;
44
- };
45
- return {
46
- add: async (op) => {
47
- // Local memory logic
48
- memoryStore.add(op);
49
- // Global redis logic
50
- const { userOpHash, userOp } = op;
51
- const multi = redis.multi();
52
- await userOpHashLookup.set({
53
- key: userOpHash,
54
- value: serializeUserOp(userOp),
55
- multi
56
- });
57
- await conflictingNonce.set({
58
- key: userOpHash,
59
- value: serializeUserOp(userOp),
60
- multi
61
- });
62
- await senderNonceLookup.set({
63
- key: encodeSenderNonce(userOp),
64
- value: serializeUserOp(userOp),
65
- multi
66
- });
67
- if (isDeploymentOperation(userOp)) {
68
- await factoryLookup.set({
69
- key: op.userOp.sender,
70
- value: op.userOpHash,
71
- multi
72
- });
73
- }
74
- await multi.exec();
75
- },
76
- remove: async (userOpHash) => {
77
- // Local memory logic
78
- memoryStore.remove(userOpHash);
79
- // Redis Logic
80
- const exist = await userOpHashLookup.get(userOpHash);
81
- if (!exist) {
82
- return false;
83
- }
84
- const userOp = deserializeUserOp(exist);
85
- const multi = redis.multi();
86
- await userOpHashLookup.delete({ key: userOpHash, multi });
87
- await senderNonceLookup.delete({
88
- key: encodeSenderNonce(userOp),
89
- multi
90
- });
91
- if (isDeploymentOperation(userOp)) {
92
- await factoryLookup.delete({ key: userOp.sender, multi });
93
- }
94
- await multi.exec();
95
- return true;
96
- },
97
- contains: async (userOpHash) => {
98
- return await userOpHashLookup.exists(userOpHash);
99
- },
100
- dumpLocal: () => {
101
- return memoryStore.dumpLocal();
102
- },
103
- findConflicting: async (userOp) => {
104
- const conflictingNonce = await senderNonceLookup.get(encodeSenderNonce(userOp));
105
- if (conflictingNonce) {
106
- return {
107
- reason: "conflicting_nonce",
108
- userOp: deserializeUserOp(conflictingNonce)
109
- };
110
- }
111
- if (isDeploymentOperation(userOp)) {
112
- const userOpHash = await factoryLookup.get(userOp.sender);
113
- if (userOpHash) {
114
- const userOp = await userOpHashLookup.get(userOpHash);
115
- if (!userOp) {
116
- return undefined;
117
- }
118
- return {
119
- reason: "conflicting_deployment",
120
- userOp: deserializeUserOp(userOp)
121
- };
122
- }
123
- }
124
- return undefined;
125
- }
126
- };
127
- };
128
- //# sourceMappingURL=createRedisStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createRedisStore.js","sourceRoot":"","sources":["../../store/createRedisStore.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import type { Store } from "./index.js";
2
- import type { AltoConfig } from "../createConfig.js";
3
- export declare const createMemoryStore: ({ config }: {
4
- config: AltoConfig;
5
- }) => Store;
6
- //# sourceMappingURL=createStore.d.ts.map
@@ -1,66 +0,0 @@
1
- import { isVersion06, isVersion07 } from "../utils/userop.js";
2
- export const createMemoryStore = ({ config }) => {
3
- let store = [];
4
- return {
5
- findConflicting: async (userOp) => {
6
- const dump = [...store];
7
- const { sender, nonce } = userOp;
8
- // Check for same sender and nonce
9
- const conflictingNonce = dump.find((userOpInfo) => {
10
- const { userOp: mempoolUserOp } = userOpInfo;
11
- return (mempoolUserOp.sender === sender &&
12
- mempoolUserOp.nonce === nonce);
13
- });
14
- if (conflictingNonce) {
15
- return {
16
- reason: "conflicting_nonce",
17
- userOp: conflictingNonce.userOp
18
- };
19
- }
20
- // Check for deployment conflict
21
- const isCurrentOpDeployment = (isVersion06(userOp) &&
22
- userOp.initCode &&
23
- userOp.initCode !== "0x") ||
24
- (isVersion07(userOp) &&
25
- userOp.factory &&
26
- userOp.factory !== "0x");
27
- if (isCurrentOpDeployment) {
28
- const conflictingDeployment = dump.find((userOpInfo) => {
29
- const { userOp: mempoolUserOp } = userOpInfo;
30
- const isV6Deployment = isVersion06(mempoolUserOp) &&
31
- mempoolUserOp.initCode &&
32
- mempoolUserOp.initCode !== "0x";
33
- const isV7Deployment = isVersion07(mempoolUserOp) &&
34
- mempoolUserOp.factory &&
35
- mempoolUserOp.factory !== "0x";
36
- const isDeployment = isV6Deployment || isV7Deployment;
37
- return mempoolUserOp.sender === sender && isDeployment;
38
- });
39
- if (conflictingDeployment) {
40
- return {
41
- reason: "conflicting_deployment",
42
- userOp: conflictingDeployment.userOp
43
- };
44
- }
45
- }
46
- return undefined;
47
- },
48
- add: (op) => {
49
- store = [...store, op];
50
- return Promise.resolve();
51
- },
52
- remove: (userOpHash) => {
53
- const exists = store.some((op) => op.userOpHash === userOpHash);
54
- store = store.filter((op) => op.userOpHash !== userOpHash);
55
- return Promise.resolve(exists);
56
- },
57
- contains: (userOpHash) => {
58
- const contains = store.some((op) => op.userOpHash === userOpHash);
59
- return Promise.resolve(contains);
60
- },
61
- dumpLocal: () => {
62
- return Promise.resolve([...store]);
63
- }
64
- };
65
- };
66
- //# sourceMappingURL=createStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createStore.js","sourceRoot":"","sources":["../../store/createStore.ts"],"names":[],"mappings":"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"}