@prb/effect-evm 1.0.0-beta.1 → 1.0.0-beta.2

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 (78) hide show
  1. package/dist/balance/service.test.integration.d.ts +2 -0
  2. package/dist/balance/service.test.integration.d.ts.map +1 -0
  3. package/dist/balance/service.test.integration.js +289 -0
  4. package/dist/balance/service.test.integration.js.map +1 -0
  5. package/dist/block/service.test.integration.d.ts +2 -0
  6. package/dist/block/service.test.integration.d.ts.map +1 -0
  7. package/dist/block/service.test.integration.js +190 -0
  8. package/dist/block/service.test.integration.js.map +1 -0
  9. package/dist/core/errors/viem-mapper.d.ts.map +1 -1
  10. package/dist/core/errors/viem-mapper.js +11 -2
  11. package/dist/core/errors/viem-mapper.js.map +1 -1
  12. package/dist/erc20/index.d.ts +1 -0
  13. package/dist/erc20/index.d.ts.map +1 -1
  14. package/dist/erc20/index.js +1 -0
  15. package/dist/erc20/index.js.map +1 -1
  16. package/dist/erc20/metadata.d.ts +16 -0
  17. package/dist/erc20/metadata.d.ts.map +1 -0
  18. package/dist/erc20/metadata.js +67 -0
  19. package/dist/erc20/metadata.js.map +1 -0
  20. package/dist/events/backfill.test.integration.d.ts +2 -0
  21. package/dist/events/backfill.test.integration.d.ts.map +1 -0
  22. package/dist/events/backfill.test.integration.js +112 -0
  23. package/dist/events/backfill.test.integration.js.map +1 -0
  24. package/dist/events/reliable-stream-simple.test.integration.d.ts +2 -0
  25. package/dist/events/reliable-stream-simple.test.integration.d.ts.map +1 -0
  26. package/dist/events/reliable-stream-simple.test.integration.js +22 -0
  27. package/dist/events/reliable-stream-simple.test.integration.js.map +1 -0
  28. package/dist/events/reliable-stream.test.integration.d.ts +2 -0
  29. package/dist/events/reliable-stream.test.integration.d.ts.map +1 -0
  30. package/dist/events/reliable-stream.test.integration.js +327 -0
  31. package/dist/events/reliable-stream.test.integration.js.map +1 -0
  32. package/dist/events/stream.test.integration.d.ts +2 -0
  33. package/dist/events/stream.test.integration.d.ts.map +1 -0
  34. package/dist/events/stream.test.integration.js +120 -0
  35. package/dist/events/stream.test.integration.js.map +1 -0
  36. package/dist/gas/service.test.integration.d.ts +2 -0
  37. package/dist/gas/service.test.integration.d.ts.map +1 -0
  38. package/dist/gas/service.test.integration.js +128 -0
  39. package/dist/gas/service.test.integration.js.map +1 -0
  40. package/dist/nonce/service.test.integration.d.ts +2 -0
  41. package/dist/nonce/service.test.integration.d.ts.map +1 -0
  42. package/dist/nonce/service.test.integration.js +141 -0
  43. package/dist/nonce/service.test.integration.js.map +1 -0
  44. package/dist/query/client.test.integration.d.ts +2 -0
  45. package/dist/query/client.test.integration.d.ts.map +1 -0
  46. package/dist/query/client.test.integration.js +94 -0
  47. package/dist/query/client.test.integration.js.map +1 -0
  48. package/dist/query/contract-query.test.integration.d.ts +2 -0
  49. package/dist/query/contract-query.test.integration.d.ts.map +1 -0
  50. package/dist/query/contract-query.test.integration.js +133 -0
  51. package/dist/query/contract-query.test.integration.js.map +1 -0
  52. package/dist/safe/detection.test.integration.d.ts +2 -0
  53. package/dist/safe/detection.test.integration.d.ts.map +1 -0
  54. package/dist/safe/detection.test.integration.js +92 -0
  55. package/dist/safe/detection.test.integration.js.map +1 -0
  56. package/dist/safe/service.test.integration.d.ts +2 -0
  57. package/dist/safe/service.test.integration.d.ts.map +1 -0
  58. package/dist/safe/service.test.integration.js +173 -0
  59. package/dist/safe/service.test.integration.js.map +1 -0
  60. package/dist/safe/simulation/errors.d.ts +3 -3
  61. package/dist/safe/simulation/errors.js +1 -1
  62. package/dist/safe/simulation/index.d.ts +1 -1
  63. package/dist/safe/simulation/index.js +1 -1
  64. package/dist/safe/simulation/service.d.ts +2 -2
  65. package/dist/safe/simulation/service.js +2 -2
  66. package/dist/signature/service.test.integration.d.ts +2 -0
  67. package/dist/signature/service.test.integration.d.ts.map +1 -0
  68. package/dist/signature/service.test.integration.js +179 -0
  69. package/dist/signature/service.test.integration.js.map +1 -0
  70. package/dist/simulation/tenderly.test.integration.d.ts +2 -0
  71. package/dist/simulation/tenderly.test.integration.d.ts.map +1 -0
  72. package/dist/simulation/tenderly.test.integration.js +104 -0
  73. package/dist/simulation/tenderly.test.integration.js.map +1 -0
  74. package/dist/tx/manager.test.integration.d.ts +2 -0
  75. package/dist/tx/manager.test.integration.d.ts.map +1 -0
  76. package/dist/tx/manager.test.integration.js +157 -0
  77. package/dist/tx/manager.test.integration.js.map +1 -0
  78. package/package.json +5 -1
@@ -0,0 +1,133 @@
1
+ import { describe, expect, it } from "@effect/vitest";
2
+ import { Effect, Layer, Stream } from "effect";
3
+ import { erc20Abi } from "viem";
4
+ import { ContractReader } from "../contract/index.js";
5
+ import { ChainHead, ContractQuery, ContractQueryLive, MulticallBatcherLive, QueryClientLive, } from "../query/index.js";
6
+ import { makeRpcCacheLive, RequestDedupLive } from "../rpc/index.js";
7
+ import { TEST_ADDRESS, TEST_ADDRESS_2, TEST_CHAIN_ID } from "../testing-kit/index.js";
8
+ describe("ContractQuery", () => {
9
+ it.effect("batches concurrent reads into a single multicall", () => Effect.gen(function* () {
10
+ let multicallCount = 0;
11
+ let lastBatchSize = 0;
12
+ const contractReaderLayer = Layer.succeed(ContractReader, ContractReader.of({
13
+ multicall: (_chainId, calls) => {
14
+ multicallCount += 1;
15
+ lastBatchSize = calls.length;
16
+ return Effect.succeed(calls.map((_, i) => ({
17
+ result: BigInt(i + 1),
18
+ status: "success",
19
+ })));
20
+ },
21
+ read: () => Effect.succeed(0n),
22
+ }));
23
+ const chainHeadLayer = Layer.succeed(ChainHead, ChainHead.of({
24
+ current: () => Effect.succeed(1n),
25
+ watch: () => Effect.succeed(Stream.empty),
26
+ }));
27
+ const queryClientLayer = Layer.provideMerge(QueryClientLive, Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive));
28
+ const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);
29
+ const contractQueryLayer = Layer.provide(ContractQueryLive, Layer.mergeAll(queryClientLayer, multicallBatcherLayer));
30
+ const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));
31
+ const [r1, r2, r3] = yield* Effect.all([
32
+ contractQuery.read({
33
+ abi: erc20Abi,
34
+ address: TEST_ADDRESS,
35
+ args: [TEST_ADDRESS],
36
+ chainId: TEST_CHAIN_ID,
37
+ functionName: "balanceOf",
38
+ }),
39
+ contractQuery.read({
40
+ abi: erc20Abi,
41
+ address: TEST_ADDRESS,
42
+ args: [TEST_ADDRESS_2],
43
+ chainId: TEST_CHAIN_ID,
44
+ functionName: "balanceOf",
45
+ }),
46
+ contractQuery.read({
47
+ abi: erc20Abi,
48
+ address: TEST_ADDRESS,
49
+ chainId: TEST_CHAIN_ID,
50
+ functionName: "totalSupply",
51
+ }),
52
+ ], { batching: true, concurrency: 3 });
53
+ expect(r1).toBe(1n);
54
+ expect(r2).toBe(2n);
55
+ expect(r3).toBe(3n);
56
+ expect(multicallCount).toBe(1);
57
+ expect(lastBatchSize).toBe(3);
58
+ }).pipe(Effect.scoped));
59
+ it.effect("caches identical reads (no additional multicall)", () => Effect.gen(function* () {
60
+ let multicallCount = 0;
61
+ const contractReaderLayer = Layer.succeed(ContractReader, ContractReader.of({
62
+ multicall: (_chainId, calls) => {
63
+ multicallCount += 1;
64
+ return Effect.succeed(calls.map(() => ({
65
+ result: 123n,
66
+ status: "success",
67
+ })));
68
+ },
69
+ read: () => Effect.succeed(0n),
70
+ }));
71
+ const chainHeadLayer = Layer.succeed(ChainHead, ChainHead.of({
72
+ current: () => Effect.succeed(1n),
73
+ watch: () => Effect.succeed(Stream.empty),
74
+ }));
75
+ const queryClientLayer = Layer.provideMerge(QueryClientLive, Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive));
76
+ const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);
77
+ const contractQueryLayer = Layer.provide(ContractQueryLive, Layer.mergeAll(queryClientLayer, multicallBatcherLayer));
78
+ const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));
79
+ const params = {
80
+ abi: erc20Abi,
81
+ address: TEST_ADDRESS,
82
+ args: [TEST_ADDRESS],
83
+ chainId: TEST_CHAIN_ID,
84
+ functionName: "balanceOf",
85
+ };
86
+ const r1 = yield* contractQuery.read(params);
87
+ const r2 = yield* contractQuery.read(params);
88
+ expect(r1).toBe(123n);
89
+ expect(r2).toBe(123n);
90
+ expect(multicallCount).toBe(1);
91
+ }).pipe(Effect.scoped));
92
+ it.effect("does not crash when args contain BigInt (cache key)", () => Effect.gen(function* () {
93
+ let multicallCount = 0;
94
+ const bigintArgAbi = [
95
+ {
96
+ inputs: [{ name: "x", type: "uint256" }],
97
+ name: "echo",
98
+ outputs: [{ name: "y", type: "uint256" }],
99
+ stateMutability: "view",
100
+ type: "function",
101
+ },
102
+ ];
103
+ const contractReaderLayer = Layer.succeed(ContractReader, ContractReader.of({
104
+ multicall: (_chainId, calls) => {
105
+ multicallCount += 1;
106
+ expect(calls).toHaveLength(1);
107
+ return Effect.succeed([{ result: 456n, status: "success" }]);
108
+ },
109
+ read: () => Effect.succeed(0n),
110
+ }));
111
+ const chainHeadLayer = Layer.succeed(ChainHead, ChainHead.of({
112
+ current: () => Effect.succeed(1n),
113
+ watch: () => Effect.succeed(Stream.empty),
114
+ }));
115
+ const queryClientLayer = Layer.provideMerge(QueryClientLive, Layer.mergeAll(chainHeadLayer, makeRpcCacheLive({ ttl: 60_000 }), RequestDedupLive));
116
+ const multicallBatcherLayer = Layer.provideMerge(MulticallBatcherLive, contractReaderLayer);
117
+ const contractQueryLayer = Layer.provide(ContractQueryLive, Layer.mergeAll(queryClientLayer, multicallBatcherLayer));
118
+ const contractQuery = yield* ContractQuery.pipe(Effect.provide(contractQueryLayer));
119
+ const params = {
120
+ abi: bigintArgAbi,
121
+ address: TEST_ADDRESS,
122
+ args: [1n],
123
+ chainId: TEST_CHAIN_ID,
124
+ functionName: "echo",
125
+ };
126
+ const r1 = yield* contractQuery.read(params);
127
+ const r2 = yield* contractQuery.read(params);
128
+ expect(r1).toBe(456n);
129
+ expect(r2).toBe(456n);
130
+ expect(multicallCount).toBe(1);
131
+ }).pipe(Effect.scoped));
132
+ });
133
+ //# sourceMappingURL=contract-query.test.integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-query.test.integration.js","sourceRoot":"","sources":["../../src/query/contract-query.test.integration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEzF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,MAAM,CAAC,kDAAkD,EAAE,GAAG,EAAE,CACjE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CACvC,cAAc,EACd,cAAc,CAAC,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;gBAC7B,cAAc,IAAI,CAAC,CAAC;gBACpB,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC7B,OAAO,MAAM,CAAC,OAAO,CACnB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnB,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;oBACrB,MAAM,EAAE,SAAkB;iBAC3B,CAAC,CAAQ,CACX,CAAC;YACJ,CAAC;YACD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAS,CAAC;SACtC,CAAC,CACH,CAAC;QAEF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAClC,SAAS,EACT,SAAS,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;SAC1C,CAAC,CACH,CAAC;QAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,CACzC,eAAe,EACf,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC,CACpF,CAAC;QAEF,MAAM,qBAAqB,GAAG,KAAK,CAAC,YAAY,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;QAE5F,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CACtC,iBAAiB,EACjB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CACxD,CAAC;QAEF,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAGpF,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACpC;YACE,aAAa,CAAC,IAAI,CAAC;gBACjB,GAAG,EAAE,QAAQ;gBACb,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,CAAC,YAAY,CAAU;gBAC7B,OAAO,EAAE,aAAa;gBACtB,YAAY,EAAE,WAAW;aAC1B,CAAC;YACF,aAAa,CAAC,IAAI,CAAC;gBACjB,GAAG,EAAE,QAAQ;gBACb,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,CAAC,cAAc,CAAU;gBAC/B,OAAO,EAAE,aAAa;gBACtB,YAAY,EAAE,WAAW;aAC1B,CAAC;YACF,aAAa,CAAC,IAAI,CAAC;gBACjB,GAAG,EAAE,QAAQ;gBACb,OAAO,EAAE,YAAY;gBACrB,OAAO,EAAE,aAAa;gBACtB,YAAY,EAAE,aAAa;aAC5B,CAAC;SACH,EACD,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CACnC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CACvB,CAAC;IAEF,EAAE,CAAC,MAAM,CAAC,kDAAkD,EAAE,GAAG,EAAE,CACjE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CACvC,cAAc,EACd,cAAc,CAAC,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;gBAC7B,cAAc,IAAI,CAAC,CAAC;gBACpB,OAAO,MAAM,CAAC,OAAO,CACnB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;oBACf,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,SAAkB;iBAC3B,CAAC,CAAQ,CACX,CAAC;YACJ,CAAC;YACD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAS,CAAC;SACtC,CAAC,CACH,CAAC;QAEF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAClC,SAAS,EACT,SAAS,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;SAC1C,CAAC,CACH,CAAC;QAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,CACzC,eAAe,EACf,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC,CACpF,CAAC;QAEF,MAAM,qBAAqB,GAAG,KAAK,CAAC,YAAY,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;QAE5F,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CACtC,iBAAiB,EACjB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CACxD,CAAC;QAEF,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAEpF,MAAM,MAAM,GAAG;YACb,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,CAAC,YAAY,CAAU;YAC7B,OAAO,EAAE,aAAa;YACtB,YAAY,EAAE,WAAoB;SACnC,CAAC;QAEF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7C,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CACvB,CAAC;IAEF,EAAE,CAAC,MAAM,CAAC,qDAAqD,EAAE,GAAG,EAAE,CACpE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,MAAM,YAAY,GAAG;YACnB;gBACE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBACxC,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBACzC,eAAe,EAAE,MAAM;gBACvB,IAAI,EAAE,UAAU;aACjB;SACqB,CAAC;QAEzB,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CACvC,cAAc,EACd,cAAc,CAAC,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;gBAC7B,cAAc,IAAI,CAAC,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAQ,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAS,CAAC;SACtC,CAAC,CACH,CAAC;QAEF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAClC,SAAS,EACT,SAAS,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;SAC1C,CAAC,CACH,CAAC;QAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,CACzC,eAAe,EACf,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC,CACpF,CAAC;QAEF,MAAM,qBAAqB,GAAG,KAAK,CAAC,YAAY,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;QAE5F,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CACtC,iBAAiB,EACjB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CACxD,CAAC;QAEF,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAEpF,MAAM,MAAM,GAAG;YACb,GAAG,EAAE,YAAY;YACjB,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,CAAC,EAAE,CAAU;YACnB,OAAO,EAAE,aAAa;YACtB,YAAY,EAAE,MAAe;SAC9B,CAAC;QAEF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7C,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CACvB,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=detection.test.integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.test.integration.d.ts","sourceRoot":"","sources":["../../src/safe/detection.test.integration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { describe, expect, it } from "@effect/vitest";
2
+ import { Effect } from "effect";
3
+ import { mainnet } from "viem/chains";
4
+ import { makePublicClientLayer } from "../presets/index.js";
5
+ import { isSafeMultisig } from "./detection.js";
6
+ const SAFE_V1_3_0_SINGLETON = "0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552";
7
+ const SAFE_V1_4_1_SINGLETON = "0x41675C099F32341bf84BFc5382aF534df5C7461a";
8
+ const testLayer = makePublicClientLayer([
9
+ {
10
+ chain: mainnet,
11
+ chainId: 1,
12
+ rpcUrls: ["https://eth.llamarpc.com"],
13
+ },
14
+ ]);
15
+ describe("isSafeMultisig", () => {
16
+ describe("Positive Cases - Known Safe Wallets", () => {
17
+ it.effect("detects CoW DAO Safe (v1.3.0)", () => Effect.gen(function* () {
18
+ const result = yield* isSafeMultisig({
19
+ address: "0xcA771eda0c70aA7d053aB1B25004559B918FE662",
20
+ chainId: 1,
21
+ });
22
+ expect(result.isSafe).toBe(true);
23
+ expect(result.proxyHash).toBeDefined();
24
+ expect(result.singletonAddress).toBe(SAFE_V1_3_0_SINGLETON);
25
+ expect(result.singletonHash).toBeDefined();
26
+ }).pipe(Effect.provide(testLayer)));
27
+ it.effect("detects Gnosis DAO Safe (v1.3.0)", () => Effect.gen(function* () {
28
+ const result = yield* isSafeMultisig({
29
+ address: "0x849D52316331967b6fF1198e5E32A0eB168D039d",
30
+ chainId: 1,
31
+ });
32
+ expect(result.isSafe).toBe(true);
33
+ expect(result.proxyHash).toBeDefined();
34
+ expect(result.singletonAddress).toBe(SAFE_V1_3_0_SINGLETON);
35
+ expect(result.singletonHash).toBeDefined();
36
+ }).pipe(Effect.provide(testLayer)));
37
+ it.effect("detects v1.4.1 Safe", () => Effect.gen(function* () {
38
+ const result = yield* isSafeMultisig({
39
+ address: "0x843ed9137c60772b30a71a7fbdb7f302f336ace7",
40
+ chainId: 1,
41
+ });
42
+ expect(result.isSafe).toBe(true);
43
+ expect(result.proxyHash).toBeDefined();
44
+ expect(result.singletonAddress).toBe(SAFE_V1_4_1_SINGLETON);
45
+ expect(result.singletonHash).toBeDefined();
46
+ }).pipe(Effect.provide(testLayer)));
47
+ });
48
+ describe("Negative Cases - Non-Safe Contracts", () => {
49
+ it.effect("identifies non-Safe contract (vitalik.eth with EIP-7702) as non-Safe", () => Effect.gen(function* () {
50
+ const result = yield* isSafeMultisig({
51
+ address: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
52
+ chainId: 1,
53
+ });
54
+ expect(result.isSafe).toBe(false);
55
+ expect(result.singletonAddress).toBeUndefined();
56
+ expect(result.singletonHash).toBeUndefined();
57
+ }).pipe(Effect.provide(testLayer)));
58
+ it.effect("identifies Uniswap V2 Router as non-Safe", () => Effect.gen(function* () {
59
+ const result = yield* isSafeMultisig({
60
+ address: "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
61
+ chainId: 1,
62
+ });
63
+ expect(result.isSafe).toBe(false);
64
+ expect(result.proxyHash).toBeDefined();
65
+ expect(result.singletonAddress).toBeUndefined();
66
+ expect(result.singletonHash).toBeUndefined();
67
+ }).pipe(Effect.provide(testLayer)));
68
+ it.effect("identifies USDC as non-Safe", () => Effect.gen(function* () {
69
+ const result = yield* isSafeMultisig({
70
+ address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
71
+ chainId: 1,
72
+ });
73
+ expect(result.isSafe).toBe(false);
74
+ expect(result.proxyHash).toBeDefined();
75
+ expect(result.singletonAddress).toBeUndefined();
76
+ expect(result.singletonHash).toBeUndefined();
77
+ }).pipe(Effect.provide(testLayer)));
78
+ });
79
+ describe("Edge Cases", () => {
80
+ it.effect("handles precompile address gracefully", () => Effect.gen(function* () {
81
+ const result = yield* isSafeMultisig({
82
+ address: "0x0000000000000000000000000000000000000001",
83
+ chainId: 1,
84
+ });
85
+ expect(result.isSafe).toBe(false);
86
+ expect(result.proxyHash).toBeUndefined();
87
+ expect(result.singletonAddress).toBeUndefined();
88
+ expect(result.singletonHash).toBeUndefined();
89
+ }).pipe(Effect.provide(testLayer)));
90
+ });
91
+ });
92
+ //# sourceMappingURL=detection.test.integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.test.integration.js","sourceRoot":"","sources":["../../src/safe/detection.test.integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=service.test.integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.integration.d.ts","sourceRoot":"","sources":["../../src/safe/service.test.integration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
1
+ import { describe, expect, it } from "@effect/vitest";
2
+ import { Effect, Layer, Option } from "effect";
3
+ import { MIN_TX_GAS } from "../constants/index.js";
4
+ import { TEST_ADDRESS, TEST_CHAIN_ID, TEST_TX_HASH } from "../testing-kit/index.js";
5
+ import { SafeAppsService } from "./service.js";
6
+ const TEST_SAFE_ADDRESS = TEST_ADDRESS;
7
+ const TEST_SAFE_TX_HASH = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
8
+ const TEST_MESSAGE_HASH = "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890";
9
+ const TEST_SIGNATURE = "0xsignature";
10
+ const TEST_RECEIPT = {
11
+ blockHash: "0xblock",
12
+ blockNumber: 123n,
13
+ contractAddress: null,
14
+ cumulativeGasUsed: MIN_TX_GAS,
15
+ effectiveGasPrice: 1n,
16
+ from: "0xfrom",
17
+ gasUsed: MIN_TX_GAS,
18
+ logs: [],
19
+ logsBloom: "0x",
20
+ status: "success",
21
+ to: "0xto",
22
+ transactionHash: TEST_TX_HASH,
23
+ transactionIndex: 0,
24
+ type: "0x2",
25
+ };
26
+ const makeMockSafeAppsService = (config) => {
27
+ const defaultInfo = {
28
+ chainId: TEST_CHAIN_ID,
29
+ safeAddress: TEST_SAFE_ADDRESS,
30
+ };
31
+ return Layer.succeed(SafeAppsService, SafeAppsService.of({
32
+ enableOffchainSigning: () => Effect.void,
33
+ getInfo: () => Effect.succeed(config.getInfoResult ?? defaultInfo),
34
+ getOffchainSignature: () => Effect.succeed(config.offchainSignature ?? Option.none()),
35
+ getTransaction: () => Effect.succeed(config.getTxResult ?? {
36
+ status: "AWAITING_EXECUTION",
37
+ txHash: Option.some(TEST_TX_HASH),
38
+ }),
39
+ pollOffchainSignature: (messageHash) => Effect.succeed({ messageHash, signature: TEST_SIGNATURE }),
40
+ sendTransactions: () => Effect.succeed({
41
+ chainId: TEST_CHAIN_ID,
42
+ safeAddress: TEST_SAFE_ADDRESS,
43
+ safeTxHash: config.sendTxResult?.safeTxHash ?? TEST_SAFE_TX_HASH,
44
+ }),
45
+ signTypedData: () => Effect.succeed(config.signTypedDataResult ?? {
46
+ _tag: "Onchain",
47
+ safeTxHash: TEST_SAFE_TX_HASH,
48
+ }),
49
+ waitForTransactionReceipt: (safeTxHash) => Effect.succeed({
50
+ chainId: TEST_CHAIN_ID,
51
+ onchainHash: TEST_TX_HASH,
52
+ receipt: TEST_RECEIPT,
53
+ safeAddress: TEST_SAFE_ADDRESS,
54
+ safeTxHash,
55
+ }),
56
+ }));
57
+ };
58
+ describe("SafeAppsService", () => {
59
+ describe("getInfo", () => {
60
+ it.effect("returns Safe info with address and chainId", () => Effect.gen(function* () {
61
+ const service = yield* SafeAppsService;
62
+ const info = yield* service.getInfo();
63
+ expect(info.safeAddress).toBe(TEST_SAFE_ADDRESS);
64
+ expect(info.chainId).toBe(TEST_CHAIN_ID);
65
+ }).pipe(Effect.provide(makeMockSafeAppsService({}))));
66
+ });
67
+ describe("sendTransactions", () => {
68
+ it.effect("returns safeTxHash with safeAddress and chainId", () => Effect.gen(function* () {
69
+ const service = yield* SafeAppsService;
70
+ const result = yield* service.sendTransactions([
71
+ { data: "0x", to: TEST_ADDRESS, value: 0n },
72
+ ]);
73
+ expect(result.safeTxHash).toBe(TEST_SAFE_TX_HASH);
74
+ expect(result.safeAddress).toBe(TEST_SAFE_ADDRESS);
75
+ expect(result.chainId).toBe(TEST_CHAIN_ID);
76
+ }).pipe(Effect.provide(makeMockSafeAppsService({}))));
77
+ });
78
+ describe("getTransaction", () => {
79
+ it.effect("returns txHash as Option when executed", () => Effect.gen(function* () {
80
+ const service = yield* SafeAppsService;
81
+ const result = yield* service.getTransaction(TEST_SAFE_TX_HASH);
82
+ expect(Option.isSome(result.txHash)).toBe(true);
83
+ if (Option.isSome(result.txHash)) {
84
+ expect(result.txHash.value).toBe(TEST_TX_HASH);
85
+ }
86
+ }).pipe(Effect.provide(makeMockSafeAppsService({}))));
87
+ it.effect("returns Option.none when not yet executed", () => Effect.gen(function* () {
88
+ const service = yield* SafeAppsService;
89
+ const result = yield* service.getTransaction(TEST_SAFE_TX_HASH);
90
+ expect(Option.isNone(result.txHash)).toBe(true);
91
+ expect(result.status).toBe("AWAITING_CONFIRMATIONS");
92
+ }).pipe(Effect.provide(makeMockSafeAppsService({
93
+ getTxResult: {
94
+ status: "AWAITING_CONFIRMATIONS",
95
+ txHash: Option.none(),
96
+ },
97
+ }))));
98
+ });
99
+ describe("waitForTransactionReceipt", () => {
100
+ it.effect("returns SafeTxResult with receipt", () => Effect.gen(function* () {
101
+ const service = yield* SafeAppsService;
102
+ const result = yield* service.waitForTransactionReceipt(TEST_SAFE_TX_HASH);
103
+ expect(result.safeTxHash).toBe(TEST_SAFE_TX_HASH);
104
+ expect(result.onchainHash).toBe(TEST_TX_HASH);
105
+ expect(result.receipt.status).toBe("success");
106
+ expect(result.safeAddress).toBe(TEST_SAFE_ADDRESS);
107
+ expect(result.chainId).toBe(TEST_CHAIN_ID);
108
+ }).pipe(Effect.provide(makeMockSafeAppsService({}))));
109
+ });
110
+ describe("signTypedData", () => {
111
+ it.effect("returns Onchain variant for on-chain signing", () => Effect.gen(function* () {
112
+ const service = yield* SafeAppsService;
113
+ const result = yield* service.signTypedData({
114
+ domain: { chainId: 1, name: "Test" },
115
+ message: { value: "test" },
116
+ types: { Test: [{ name: "value", type: "string" }] },
117
+ });
118
+ expect(result._tag).toBe("Onchain");
119
+ if (result._tag === "Onchain") {
120
+ expect(result.safeTxHash).toBe(TEST_SAFE_TX_HASH);
121
+ }
122
+ }).pipe(Effect.provide(makeMockSafeAppsService({}))));
123
+ it.effect("returns Offchain variant for off-chain signing", () => Effect.gen(function* () {
124
+ const service = yield* SafeAppsService;
125
+ const result = yield* service.signTypedData({
126
+ domain: { chainId: 1, name: "Test" },
127
+ message: { value: "test" },
128
+ types: { Test: [{ name: "value", type: "string" }] },
129
+ });
130
+ expect(result._tag).toBe("Offchain");
131
+ if (result._tag === "Offchain") {
132
+ expect(result.messageHash).toBe(TEST_MESSAGE_HASH);
133
+ }
134
+ }).pipe(Effect.provide(makeMockSafeAppsService({
135
+ signTypedDataResult: {
136
+ _tag: "Offchain",
137
+ messageHash: TEST_MESSAGE_HASH,
138
+ },
139
+ }))));
140
+ });
141
+ describe("getOffchainSignature", () => {
142
+ it.effect("returns Option.none when signature not yet available", () => Effect.gen(function* () {
143
+ const service = yield* SafeAppsService;
144
+ const result = yield* service.getOffchainSignature(TEST_MESSAGE_HASH);
145
+ expect(Option.isNone(result)).toBe(true);
146
+ }).pipe(Effect.provide(makeMockSafeAppsService({}))));
147
+ it.effect("returns Option.some when signature available", () => Effect.gen(function* () {
148
+ const service = yield* SafeAppsService;
149
+ const result = yield* service.getOffchainSignature(TEST_MESSAGE_HASH);
150
+ expect(Option.isSome(result)).toBe(true);
151
+ if (Option.isSome(result)) {
152
+ expect(result.value).toBe(TEST_SIGNATURE);
153
+ }
154
+ }).pipe(Effect.provide(makeMockSafeAppsService({
155
+ offchainSignature: Option.some(TEST_SIGNATURE),
156
+ }))));
157
+ });
158
+ describe("pollOffchainSignature", () => {
159
+ it.effect("returns signature when available", () => Effect.gen(function* () {
160
+ const service = yield* SafeAppsService;
161
+ const result = yield* service.pollOffchainSignature(TEST_MESSAGE_HASH);
162
+ expect(result.messageHash).toBe(TEST_MESSAGE_HASH);
163
+ expect(result.signature).toBe(TEST_SIGNATURE);
164
+ }).pipe(Effect.provide(makeMockSafeAppsService({}))));
165
+ });
166
+ describe("enableOffchainSigning", () => {
167
+ it.effect("completes without error", () => Effect.gen(function* () {
168
+ const service = yield* SafeAppsService;
169
+ yield* service.enableOffchainSigning();
170
+ }).pipe(Effect.provide(makeMockSafeAppsService({}))));
171
+ });
172
+ });
173
+ //# sourceMappingURL=service.test.integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.integration.js","sourceRoot":"","sources":["../../src/safe/service.test.integration.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  import { Schema } from "effect";
2
- declare const GasLimitExceededError_base: Schema.TaggedErrorClass<GasLimitExceededError, "GasLimitExceededError", {
3
- readonly _tag: Schema.tag<"GasLimitExceededError">;
2
+ declare const GasLimitOverflowError_base: Schema.TaggedErrorClass<GasLimitOverflowError, "GasLimitOverflowError", {
3
+ readonly _tag: Schema.tag<"GasLimitOverflowError">;
4
4
  } & {
5
5
  blockGasLimit: typeof Schema.BigInt;
6
6
  estimatedGas: typeof Schema.BigInt;
7
7
  message: typeof Schema.String;
8
8
  threshold: typeof Schema.BigInt;
9
9
  }>;
10
- export declare class GasLimitExceededError extends GasLimitExceededError_base {
10
+ export declare class GasLimitOverflowError extends GasLimitOverflowError_base {
11
11
  }
12
12
  declare const SafeSimulationFailedError_base: Schema.TaggedErrorClass<SafeSimulationFailedError, "SafeSimulationFailedError", {
13
13
  readonly _tag: Schema.tag<"SafeSimulationFailedError">;
@@ -1,5 +1,5 @@
1
1
  import { Schema } from "effect";
2
- export class GasLimitExceededError extends Schema.TaggedError()("GasLimitExceededError", {
2
+ export class GasLimitOverflowError extends Schema.TaggedError()("GasLimitOverflowError", {
3
3
  blockGasLimit: Schema.BigInt,
4
4
  estimatedGas: Schema.BigInt,
5
5
  message: Schema.String,
@@ -1,7 +1,7 @@
1
1
  export { safeAbis } from "./abis.js";
2
2
  export { getMultiSendAddress, getSimulateAccessorAddress, } from "./addresses.js";
3
3
  export { decodeSimulationData, encodeMultiSend } from "./encoding.js";
4
- export { GasLimitExceededError, InvalidGasThresholdError, SafeContractsNotDeployedError, SafeSimulationFailedError, SimulationDecodeError, TransactionSizeTooLargeError, } from "./errors.js";
4
+ export { GasLimitOverflowError, InvalidGasThresholdError, SafeContractsNotDeployedError, SafeSimulationFailedError, SimulationDecodeError, TransactionSizeTooLargeError, } from "./errors.js";
5
5
  export { SafeSimulationService, SafeSimulationServiceLive, type SafeSimulationServiceShape, } from "./service.js";
6
6
  export type { SafeOperation, SafeSimulateBatchParams, SafeSimulationResult, SafeSimulationTransaction, } from "./types.js";
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,6 @@
1
1
  export { safeAbis } from "./abis.js";
2
2
  export { getMultiSendAddress, getSimulateAccessorAddress, } from "./addresses.js";
3
3
  export { decodeSimulationData, encodeMultiSend } from "./encoding.js";
4
- export { GasLimitExceededError, InvalidGasThresholdError, SafeContractsNotDeployedError, SafeSimulationFailedError, SimulationDecodeError, TransactionSizeTooLargeError, } from "./errors.js";
4
+ export { GasLimitOverflowError, InvalidGasThresholdError, SafeContractsNotDeployedError, SafeSimulationFailedError, SimulationDecodeError, TransactionSizeTooLargeError, } from "./errors.js";
5
5
  export { SafeSimulationService, SafeSimulationServiceLive, } from "./service.js";
6
6
  //# sourceMappingURL=index.js.map
@@ -1,10 +1,10 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
2
  import type { ClientNotFoundError } from "../../core/index.js";
3
3
  import { PublicClientService } from "../../core/index.js";
4
- import { GasLimitExceededError, InvalidGasThresholdError, SafeContractsNotDeployedError, SafeSimulationFailedError, SimulationDecodeError, TransactionSizeTooLargeError } from "./errors.js";
4
+ import { GasLimitOverflowError, InvalidGasThresholdError, SafeContractsNotDeployedError, SafeSimulationFailedError, SimulationDecodeError, TransactionSizeTooLargeError } from "./errors.js";
5
5
  import type { SafeSimulateBatchParams, SafeSimulationResult } from "./types.js";
6
6
  export type SafeSimulationServiceShape = {
7
- readonly simulateBatch: (params: SafeSimulateBatchParams) => Effect.Effect<SafeSimulationResult, ClientNotFoundError | InvalidGasThresholdError | SafeContractsNotDeployedError | TransactionSizeTooLargeError | SafeSimulationFailedError | SimulationDecodeError | GasLimitExceededError>;
7
+ readonly simulateBatch: (params: SafeSimulateBatchParams) => Effect.Effect<SafeSimulationResult, ClientNotFoundError | InvalidGasThresholdError | SafeContractsNotDeployedError | TransactionSizeTooLargeError | SafeSimulationFailedError | SimulationDecodeError | GasLimitOverflowError>;
8
8
  };
9
9
  declare const SafeSimulationService_base: Context.TagClass<SafeSimulationService, "ew3/SafeSimulation", SafeSimulationServiceShape>;
10
10
  export declare class SafeSimulationService extends SafeSimulationService_base {
@@ -4,7 +4,7 @@ import { PublicClientService } from "../../core/index.js";
4
4
  import { safeAbis } from "./abis.js";
5
5
  import { getMultiSendAddress, getSimulateAccessorAddress } from "./addresses.js";
6
6
  import { decodeSimulationData, encodeMultiSend } from "./encoding.js";
7
- import { GasLimitExceededError, InvalidGasThresholdError, SafeContractsNotDeployedError, SafeSimulationFailedError, SimulationDecodeError, TransactionSizeTooLargeError, } from "./errors.js";
7
+ import { GasLimitOverflowError, InvalidGasThresholdError, SafeContractsNotDeployedError, SafeSimulationFailedError, SimulationDecodeError, TransactionSizeTooLargeError, } from "./errors.js";
8
8
  export class SafeSimulationService extends Context.Tag("ew3/SafeSimulation")() {
9
9
  }
10
10
  export const SafeSimulationServiceLive = Layer.effect(SafeSimulationService, Effect.gen(function* () {
@@ -121,7 +121,7 @@ export const SafeSimulationServiceLive = Layer.effect(SafeSimulationService, Eff
121
121
  ], { concurrency: "unbounded" });
122
122
  const threshold = (block.gasLimit * BigInt(params.gasThresholdPercent ?? 95)) / 100n;
123
123
  if (result.success && result.gas > threshold) {
124
- return yield* Effect.fail(new GasLimitExceededError({
124
+ return yield* Effect.fail(new GasLimitOverflowError({
125
125
  blockGasLimit: block.gasLimit,
126
126
  estimatedGas: result.gas,
127
127
  message: "Gas consumption exceeds threshold of block gas limit. Try splitting into smaller batches.",
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=service.test.integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.integration.d.ts","sourceRoot":"","sources":["../../src/signature/service.test.integration.ts"],"names":[],"mappings":""}