viem 2.18.0 → 2.18.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/_cjs/accounts/index.js +3 -1
  3. package/_cjs/accounts/index.js.map +1 -1
  4. package/_cjs/actions/public/getLogs.js +2 -1
  5. package/_cjs/actions/public/getLogs.js.map +1 -1
  6. package/_cjs/chains/definitions/bobaSepolia.js +1 -0
  7. package/_cjs/chains/definitions/bobaSepolia.js.map +1 -1
  8. package/_cjs/chains/definitions/cronoszkEVMTestnet.js +24 -0
  9. package/_cjs/chains/definitions/cronoszkEVMTestnet.js.map +1 -0
  10. package/_cjs/chains/index.js +8 -6
  11. package/_cjs/chains/index.js.map +1 -1
  12. package/_cjs/clients/transports/webSocket.js +5 -2
  13. package/_cjs/clients/transports/webSocket.js.map +1 -1
  14. package/_cjs/errors/version.js +1 -1
  15. package/_cjs/utils/abi/parseEventLogs.js +70 -2
  16. package/_cjs/utils/abi/parseEventLogs.js.map +1 -1
  17. package/_cjs/utils/rpc/socket.js +27 -6
  18. package/_cjs/utils/rpc/socket.js.map +1 -1
  19. package/_cjs/utils/rpc/webSocket.js +22 -5
  20. package/_cjs/utils/rpc/webSocket.js.map +1 -1
  21. package/_esm/accounts/index.js +1 -0
  22. package/_esm/accounts/index.js.map +1 -1
  23. package/_esm/actions/public/getLogs.js +2 -1
  24. package/_esm/actions/public/getLogs.js.map +1 -1
  25. package/_esm/chains/definitions/bobaSepolia.js +1 -0
  26. package/_esm/chains/definitions/bobaSepolia.js.map +1 -1
  27. package/_esm/chains/definitions/cronoszkEVMTestnet.js +21 -0
  28. package/_esm/chains/definitions/cronoszkEVMTestnet.js.map +1 -0
  29. package/_esm/chains/index.js +1 -0
  30. package/_esm/chains/index.js.map +1 -1
  31. package/_esm/clients/transports/webSocket.js +5 -2
  32. package/_esm/clients/transports/webSocket.js.map +1 -1
  33. package/_esm/errors/version.js +1 -1
  34. package/_esm/utils/abi/parseEventLogs.js +72 -2
  35. package/_esm/utils/abi/parseEventLogs.js.map +1 -1
  36. package/_esm/utils/rpc/socket.js +29 -6
  37. package/_esm/utils/rpc/socket.js.map +1 -1
  38. package/_esm/utils/rpc/webSocket.js +22 -5
  39. package/_esm/utils/rpc/webSocket.js.map +1 -1
  40. package/_types/accounts/index.d.ts +1 -0
  41. package/_types/accounts/index.d.ts.map +1 -1
  42. package/_types/actions/public/getLogs.d.ts.map +1 -1
  43. package/_types/chains/definitions/bobaSepolia.d.ts +1 -1
  44. package/_types/chains/definitions/bobaSepolia.d.ts.map +1 -1
  45. package/_types/chains/definitions/cronoszkEVMTestnet.d.ts +35 -0
  46. package/_types/chains/definitions/cronoszkEVMTestnet.d.ts.map +1 -0
  47. package/_types/chains/index.d.ts +1 -0
  48. package/_types/chains/index.d.ts.map +1 -1
  49. package/_types/clients/transports/webSocket.d.ts +5 -0
  50. package/_types/clients/transports/webSocket.d.ts.map +1 -1
  51. package/_types/errors/version.d.ts +1 -1
  52. package/_types/utils/abi/parseEventLogs.d.ts +9 -3
  53. package/_types/utils/abi/parseEventLogs.d.ts.map +1 -1
  54. package/_types/utils/rpc/compat.d.ts +1 -0
  55. package/_types/utils/rpc/compat.d.ts.map +1 -1
  56. package/_types/utils/rpc/socket.d.ts +16 -2
  57. package/_types/utils/rpc/socket.d.ts.map +1 -1
  58. package/_types/utils/rpc/webSocket.d.ts +1 -1
  59. package/_types/utils/rpc/webSocket.d.ts.map +1 -1
  60. package/accounts/index.ts +1 -0
  61. package/actions/public/getLogs.ts +2 -1
  62. package/chains/definitions/bobaSepolia.ts +1 -0
  63. package/chains/definitions/cronoszkEVMTestnet.ts +21 -0
  64. package/chains/index.ts +1 -0
  65. package/clients/transports/webSocket.ts +10 -1
  66. package/errors/version.ts +1 -1
  67. package/package.json +1 -1
  68. package/utils/abi/parseEventLogs.ts +103 -14
  69. package/utils/rpc/socket.ts +59 -11
  70. package/utils/rpc/webSocket.ts +25 -6
@@ -1 +1 @@
1
- {"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EACL,KAAK,4BAA4B,EAElC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAA;AAE7B,KAAK,qCAAqC,GAAG;IAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CAC7C,CAAA;AAED,KAAK,qCAAqC,GAAG;IAC3C,cAAc,EAAE,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;CACjD,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,SAAS,CACP,IAAI,EAAE,qCAAqC,GAAG;QAC5C;;;WAGG;QACH,MAAM,EAAE,CAAC,UAAU,CAAC,CAAA;KACrB,GACA,OAAO,CAAC,qCAAqC,CAAC,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IACxC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,wCAAwC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,8CAA8C;IAC9C,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,wEAAwE;IACxE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CACxC,WAAW,EACX;IACE;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;IACnD,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAA;CACpD,CACF,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,wBAAwB,GACxB,oBAAoB,GACpB,SAAS,CAAA;AAEb;;GAEG;AACH,wBAAgB,SAAS;AACvB,uEAAuE;AACvE,GAAG,CAAC,EAAE,MAAM,EACZ,MAAM,GAAE,wBAA6B,GACpC,kBAAkB,CAsFpB"}
1
+ {"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../clients/transports/webSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EACL,KAAK,4BAA4B,EAElC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAA;AAE7B,KAAK,qCAAqC,GAAG;IAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CAC7C,CAAA;AAED,KAAK,qCAAqC,GAAG;IAC3C,cAAc,EAAE,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;CACjD,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,SAAS,CACP,IAAI,EAAE,qCAAqC,GAAG;QAC5C;;;WAGG;QACH,MAAM,EAAE,CAAC,UAAU,CAAC,CAAA;KACrB,GACA,OAAO,CAAC,qCAAqC,CAAC,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,0CAA0C;IAC1C,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IACxC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IACjE,wCAAwC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,8CAA8C;IAC9C,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,SAAS,CAAA;IACtD,wEAAwE;IACxE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CACxC,WAAW,EACX;IACE;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;IACnD,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAA;CACpD,CACF,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,wBAAwB,GACxB,oBAAoB,GACpB,SAAS,CAAA;AAEb;;GAEG;AACH,wBAAgB,SAAS;AACvB,uEAAuE;AACvE,GAAG,CAAC,EAAE,MAAM,EACZ,MAAM,GAAE,wBAA6B,GACpC,kBAAkB,CA0FpB"}
@@ -1,2 +1,2 @@
1
- export declare const version = "2.18.0";
1
+ export declare const version = "2.18.2";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,12 +1,18 @@
1
1
  import type { Abi } from 'abitype';
2
2
  import type { ErrorType } from '../../errors/utils.js';
3
- import type { ContractEventName } from '../../types/contract.js';
3
+ import type { ContractEventName, GetEventArgs } from '../../types/contract.js';
4
4
  import type { Log } from '../../types/log.js';
5
5
  import type { RpcLog } from '../../types/rpc.js';
6
6
  import { type DecodeEventLogErrorType } from './decodeEventLog.js';
7
- export type ParseEventLogsParameters<abi extends Abi | readonly unknown[] = Abi, eventName extends ContractEventName<abi> | ContractEventName<abi>[] | undefined = ContractEventName<abi>, strict extends boolean | undefined = boolean | undefined> = {
7
+ export type ParseEventLogsParameters<abi extends Abi | readonly unknown[] = Abi, eventName extends ContractEventName<abi> | ContractEventName<abi>[] | undefined = ContractEventName<abi>, strict extends boolean | undefined = boolean | undefined, allArgs = GetEventArgs<abi, eventName extends ContractEventName<abi> ? eventName : ContractEventName<abi>, {
8
+ EnableUnion: true;
9
+ IndexedOnly: false;
10
+ Required: false;
11
+ }>> = {
8
12
  /** Contract ABI. */
9
13
  abi: abi;
14
+ /** Arguments for the event. */
15
+ args?: allArgs | undefined;
10
16
  /** Contract event. */
11
17
  eventName?: eventName | ContractEventName<abi> | ContractEventName<abi>[] | undefined;
12
18
  /** List of logs. */
@@ -39,5 +45,5 @@ export type ParseEventLogsErrorType = DecodeEventLogErrorType | ErrorType;
39
45
  * const logs = parseEventLogs({ logs: receipt.logs })
40
46
  * // [{ args: { ... }, eventName: 'TransactionDeposited', ... }, ...]
41
47
  */
42
- export declare function parseEventLogs<abi extends Abi | readonly unknown[], strict extends boolean | undefined = true, eventName extends ContractEventName<abi> | ContractEventName<abi>[] | undefined = undefined>({ abi, eventName, logs, strict, }: ParseEventLogsParameters<abi, eventName, strict>): ParseEventLogsReturnType<abi, eventName, strict>;
48
+ export declare function parseEventLogs<abi extends Abi | readonly unknown[], strict extends boolean | undefined = true, eventName extends ContractEventName<abi> | ContractEventName<abi>[] | undefined = undefined>(parameters: ParseEventLogsParameters<abi, eventName, strict>): ParseEventLogsReturnType<abi, eventName, strict>;
43
49
  //# sourceMappingURL=parseEventLogs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseEventLogs.d.ts","sourceRoot":"","sources":["../../../utils/abi/parseEventLogs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAMlC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,qBAAqB,CAAA;AAE5B,MAAM,MAAM,wBAAwB,CAClC,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,GAAG,GAAG,EAC1C,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,EACtC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,IACtD;IACF,oBAAoB;IACpB,GAAG,EAAE,GAAG,CAAA;IACR,sBAAsB;IACtB,SAAS,CAAC,EACN,SAAS,GACT,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,CAAA;IACb,oBAAoB;IACpB,IAAI,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,wBAAwB,CAClC,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,GAAG,GAAG,EAC1C,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,EACtC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,EAExD,gBAAgB,SACZ,iBAAiB,CAAC,GAAG,CAAC,GACtB,SAAS,GAAG,SAAS,SAAS,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACtD,SAAS,CAAC,MAAM,CAAC,GACjB,SAAS,IACX,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAA;AAE1E,MAAM,MAAM,uBAAuB,GAAG,uBAAuB,GAAG,SAAS,CAAA;AAEzE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,CAC5B,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,EACpC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,IAAI,EACzC,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,SAAS,EACzB,EACA,GAAG,EACH,SAAS,EACT,IAAI,EACJ,MAAa,GACd,EAAE,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,wBAAwB,CAC5E,GAAG,EACH,SAAS,EACT,MAAM,CACP,CAmCA"}
1
+ {"version":3,"file":"parseEventLogs.d.ts","sourceRoot":"","sources":["../../../utils/abi/parseEventLogs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAwC,MAAM,SAAS,CAAA;AAMxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC9E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAIhD,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,qBAAqB,CAAA;AAG5B,MAAM,MAAM,wBAAwB,CAClC,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,GAAG,GAAG,EAC1C,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,EACtC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,EAExD,OAAO,GAAG,YAAY,CACpB,GAAG,EACH,SAAS,SAAS,iBAAiB,CAAC,GAAG,CAAC,GACpC,SAAS,GACT,iBAAiB,CAAC,GAAG,CAAC,EAC1B;IACE,WAAW,EAAE,IAAI,CAAA;IACjB,WAAW,EAAE,KAAK,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAA;CAChB,CACF,IACC;IACF,oBAAoB;IACpB,GAAG,EAAE,GAAG,CAAA;IACR,+BAA+B;IAC/B,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,sBAAsB;IACtB,SAAS,CAAC,EACN,SAAS,GACT,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,CAAA;IACb,oBAAoB;IACpB,IAAI,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,wBAAwB,CAClC,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,GAAG,GAAG,EAC1C,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,EACtC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,EAExD,gBAAgB,SACZ,iBAAiB,CAAC,GAAG,CAAC,GACtB,SAAS,GAAG,SAAS,SAAS,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACtD,SAAS,CAAC,MAAM,CAAC,GACjB,SAAS,IACX,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAA;AAE1E,MAAM,MAAM,uBAAuB,GAAG,uBAAuB,GAAG,SAAS,CAAA;AAEzE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,CAC5B,GAAG,SAAS,GAAG,GAAG,SAAS,OAAO,EAAE,EACpC,MAAM,SAAS,OAAO,GAAG,SAAS,GAAG,IAAI,EACzC,SAAS,SACL,iBAAiB,CAAC,GAAG,CAAC,GACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GACxB,SAAS,GAAG,SAAS,EAEzB,UAAU,EAAE,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,GAC3D,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CA8DlD"}
@@ -26,6 +26,7 @@ declare function webSocketAsync(socketClient: SocketRpcClient<WebSocket>, { body
26
26
  */
27
27
  export declare function getSocket(url: string): Promise<WebSocket & {
28
28
  close(): void;
29
+ ping?: (() => void) | undefined;
29
30
  request(params: {
30
31
  body: import("../../types/rpc.js").RpcRequest;
31
32
  }): void;
@@ -1 +1 @@
1
- {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../utils/rpc/compat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,WAAW,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAGlD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CACvC,eAAe,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CACtC,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAC5D,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAElE,iBAAS,SAAS,CAChB,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gBAAgB,GAC9C,mBAAmB,CAOrB;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAC5C,eAAe,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAC3C,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAClD,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,SAAS,CAAA;AAEb,iBAAe,cAAc,CAC3B,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE,qBAAqB,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAKnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM;;;;;;;;yBAtDkB,CAAA;;;;yBAAA,CAAA;;GA4D5D;AAED,eAAO,MAAM,GAAG;IACd;;;;;;;;;;;OAWG;cACO,MAAM,UAAU,qBAAqB;IAG/C;;;;;;;;;;;OAWG;;IAEH;;;;;;;;;;;OAWG;;CAEJ,CAAA"}
1
+ {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../../utils/rpc/compat.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,WAAW,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAGlD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CACvC,eAAe,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CACtC,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;AAC5D,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAElE,iBAAS,SAAS,CAChB,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gBAAgB,GAC9C,mBAAmB,CAOrB;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAC5C,eAAe,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAC3C,CAAC,CAAC,CAAC,CAAA;AACJ,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAClD,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,SAAS,CAAA;AAEb,iBAAe,cAAc,CAC3B,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC,EACxC,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE,qBAAqB,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAKnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM;;;;;;;;;yBAtDkB,CAAA;;;;yBAAA,CAAA;;GA4D5D;AAED,eAAO,MAAM,GAAG;IACd;;;;;;;;;;;OAWG;cACO,MAAM,UAAU,qBAAqB;IAG/C;;;;;;;;;;;OAWG;;IAEH;;;;;;;;;;;OAWG;;CAEJ,CAAA"}
@@ -8,12 +8,14 @@ type CallbackFn = {
8
8
  };
9
9
  type CallbackMap = Map<Id, CallbackFn>;
10
10
  export type GetSocketParameters = {
11
+ onClose: () => void;
11
12
  onError: (error?: Error | Event | undefined) => void;
12
13
  onOpen: () => void;
13
14
  onResponse: (data: RpcResponse) => void;
14
15
  };
15
16
  export type Socket<socket extends {}> = socket & {
16
17
  close(): void;
18
+ ping?: (() => void) | undefined;
17
19
  request(params: {
18
20
  body: RpcRequest;
19
21
  }): void;
@@ -36,9 +38,20 @@ export type SocketRpcClient<socket extends {}> = {
36
38
  };
37
39
  export type GetSocketRpcClientParameters<socket extends {} = {}> = {
38
40
  getSocket(params: GetSocketParameters): Promise<Socket<socket>>;
41
+ /**
42
+ * Whether or not to send keep-alive messages.
43
+ * @default true
44
+ */
45
+ keepAlive?: boolean | {
46
+ /**
47
+ * The interval (in ms) to send keep-alive messages.
48
+ * @default 30_000
49
+ */
50
+ interval?: number | undefined;
51
+ } | undefined;
39
52
  key?: string;
40
53
  /**
41
- * Whether or not to attempt to reconnect on socket failure.
54
+ * Whether or not to attempt to reconnect on socket failure or closure.
42
55
  * @default true
43
56
  */
44
57
  reconnect?: boolean | {
@@ -58,10 +71,11 @@ export type GetSocketRpcClientParameters<socket extends {} = {}> = {
58
71
  export type GetSocketRpcClientErrorType = CreateBatchSchedulerErrorType | ErrorType;
59
72
  export declare const socketClientCache: Map<string, SocketRpcClient<{
60
73
  close(): void;
74
+ ping?: (() => void) | undefined;
61
75
  request(params: {
62
76
  body: RpcRequest;
63
77
  }): void;
64
78
  }>>;
65
- export declare function getSocketRpcClient<socket extends {}>(params: GetSocketRpcClientParameters<socket>): Promise<SocketRpcClient<socket>>;
79
+ export declare function getSocketRpcClient<socket extends {}>(parameters: GetSocketRpcClientParameters<socket>): Promise<SocketRpcClient<socket>>;
66
80
  export {};
67
81
  //# sourceMappingURL=socket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EACL,KAAK,6BAA6B,EAEnC,MAAM,oCAAoC,CAAA;AAI3C,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAA;AACzB,KAAK,UAAU,GAAG;IAChB,UAAU,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;CACpE,CAAA;AACD,KAAK,WAAW,GAAG,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;AAEtC,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,KAAK,IAAI,CAAA;IACpD,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,MAAM,SAAS,EAAE,IAAI,MAAM,GAAG;IAC/C,KAAK,IAAI,IAAI,CAAA;IACb,OAAO,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,UAAU,CAAA;KACjB,GAAG,IAAI,CAAA;CACT,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,MAAM,SAAS,EAAE,IAAI;IAC/C,KAAK,IAAI,IAAI,CAAA;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACtB,OAAO,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,UAAU,CAAA;QAChB,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;QACnE,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;KAC3C,GAAG,IAAI,CAAA;IACR,YAAY,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,UAAU,CAAA;QAChB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC7B,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACxB,QAAQ,EAAE,WAAW,CAAA;IACrB,aAAa,EAAE,WAAW,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,4BAA4B,CAAC,MAAM,SAAS,EAAE,GAAG,EAAE,IAAI;IACjE,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,SAAS,CAAC,EACN,OAAO,GACP;QACE;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B;;;WAGG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC3B,GACD,SAAS,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,6BAA6B,GAC7B,SAAS,CAAA;AAEb,eAAO,MAAM,iBAAiB;aApDnB,IAAI;oBACG;QACd,IAAI,EAAE,UAAU,CAAA;KACjB,GAAG,IAAI;GAoDP,CAAA;AAEH,wBAAsB,kBAAkB,CAAC,MAAM,SAAS,EAAE,EACxD,MAAM,EAAE,4BAA4B,CAAC,MAAM,CAAC,GAC3C,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CA0IlC"}
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/socket.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import { type GetSocketRpcClientParameters, type SocketRpcClient } from './socket.js';
2
- export type GetWebSocketRpcClientOptions = Pick<GetSocketRpcClientParameters, 'reconnect'>;
2
+ export type GetWebSocketRpcClientOptions = Pick<GetSocketRpcClientParameters, 'keepAlive' | 'reconnect'>;
3
3
  export declare function getWebSocketRpcClient(url: string, options?: GetWebSocketRpcClientOptions | undefined): Promise<SocketRpcClient<WebSocket>>;
4
4
  //# sourceMappingURL=webSocket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EAErB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,4BAA4B,EAC5B,WAAW,CACZ,CAAA;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,4BAA4B,GAAG,SAAc,GACrD,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CA0DrC"}
1
+ {"version":3,"file":"webSocket.d.ts","sourceRoot":"","sources":["../../../utils/rpc/webSocket.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,4BAA4B,EAEjC,KAAK,eAAe,EAErB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,4BAA4B,EAC5B,WAAW,GAAG,WAAW,CAC1B,CAAA;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,4BAA4B,GAAG,SAAc,GACrD,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CA6ErC"}
package/accounts/index.ts CHANGED
@@ -35,6 +35,7 @@ export {
35
35
  type PrivateKeyToAccountErrorType,
36
36
  privateKeyToAccount,
37
37
  } from './privateKeyToAccount.js'
38
+ export { type ToAccountErrorType, toAccount } from './toAccount.js'
38
39
 
39
40
  export type {
40
41
  Account,
@@ -165,7 +165,7 @@ export async function getLogs<
165
165
  encodeEventTopics({
166
166
  abi: [event],
167
167
  eventName: (event as AbiEvent).name,
168
- args,
168
+ args: events_ ? undefined : args,
169
169
  } as EncodeEventTopicsParameters),
170
170
  )
171
171
  // TODO: Clean up type casting
@@ -205,6 +205,7 @@ export async function getLogs<
205
205
  >
206
206
  return parseEventLogs({
207
207
  abi: events,
208
+ args: args as any,
208
209
  logs: formattedLogs,
209
210
  strict,
210
211
  }) as unknown as GetLogsReturnType<
@@ -17,4 +17,5 @@ export const bobaSepolia = /*#__PURE__*/ defineChain({
17
17
  url: 'https://testnet.bobascan.com',
18
18
  },
19
19
  },
20
+ testnet: true,
20
21
  })
@@ -0,0 +1,21 @@
1
+ import { defineChain } from '../../utils/chain/defineChain.js'
2
+
3
+ export const cronoszkEVMTestnet = /*#__PURE__*/ defineChain({
4
+ id: 282,
5
+ name: 'Cronos zkEVM Testnet',
6
+ nativeCurrency: {
7
+ decimals: 18,
8
+ name: 'Cronos zkEVM Test Coin',
9
+ symbol: 'zkTCRO',
10
+ },
11
+ rpcUrls: {
12
+ default: { http: ['https://testnet.zkevm.cronos.org'] },
13
+ },
14
+ blockExplorers: {
15
+ default: {
16
+ name: 'Cronos zkEVM Testnet Explorer',
17
+ url: 'https://explorer.zkevm.cronos.org/testnet',
18
+ },
19
+ },
20
+ testnet: true,
21
+ })
package/chains/index.ts CHANGED
@@ -60,6 +60,7 @@ export { confluxESpaceTestnet } from './definitions/confluxESpaceTestnet.js'
60
60
  export { coreDao } from './definitions/coreDao.js'
61
61
  export { crab } from './definitions/crab.js'
62
62
  export { cronos } from './definitions/cronos.js'
63
+ export { cronoszkEVMTestnet } from './definitions/cronoszkEVMTestnet.js'
63
64
  export { cronosTestnet } from './definitions/cronosTestnet.js'
64
65
  export { crossbell } from './definitions/crossbell.js'
65
66
  export { cyber } from './definitions/cyber.js'
@@ -42,6 +42,11 @@ type WebSocketTransportSubscribe = {
42
42
  }
43
43
 
44
44
  export type WebSocketTransportConfig = {
45
+ /**
46
+ * Whether or not to send keep-alive ping messages.
47
+ * @default true
48
+ */
49
+ keepAlive?: GetWebSocketRpcClientOptions['keepAlive'] | undefined
45
50
  /** The key of the WebSocket transport. */
46
51
  key?: TransportConfig['key'] | undefined
47
52
  /** The name of the WebSocket transport. */
@@ -85,6 +90,7 @@ export function webSocket(
85
90
  config: WebSocketTransportConfig = {},
86
91
  ): WebSocketTransport {
87
92
  const {
93
+ keepAlive,
88
94
  key = 'webSocket',
89
95
  name = 'WebSocket JSON-RPC',
90
96
  reconnect,
@@ -101,7 +107,10 @@ export function webSocket(
101
107
  name,
102
108
  async request({ method, params }) {
103
109
  const body = { method, params }
104
- const rpcClient = await getWebSocketRpcClient(url_, { reconnect })
110
+ const rpcClient = await getWebSocketRpcClient(url_, {
111
+ keepAlive,
112
+ reconnect,
113
+ })
105
114
  const { error, result } = await rpcClient.requestAsync({
106
115
  body,
107
116
  timeout,
package/errors/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '2.18.0'
1
+ export const version = '2.18.2'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "viem",
3
3
  "description": "TypeScript Interface for Ethereum",
4
- "version": "2.18.0",
4
+ "version": "2.18.2",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",
@@ -1,19 +1,23 @@
1
1
  // TODO(v3): checksum address.
2
2
 
3
- import type { Abi } from 'abitype'
3
+ import type { Abi, AbiEvent, AbiEventParameter, Address } from 'abitype'
4
4
  import {
5
5
  AbiEventSignatureNotFoundError,
6
6
  DecodeLogDataMismatch,
7
7
  DecodeLogTopicsMismatch,
8
8
  } from '../../errors/abi.js'
9
9
  import type { ErrorType } from '../../errors/utils.js'
10
- import type { ContractEventName } from '../../types/contract.js'
10
+ import type { ContractEventName, GetEventArgs } from '../../types/contract.js'
11
11
  import type { Log } from '../../types/log.js'
12
12
  import type { RpcLog } from '../../types/rpc.js'
13
+ import { isAddressEqual } from '../address/isAddressEqual.js'
14
+ import { toBytes } from '../encoding/toBytes.js'
15
+ import { keccak256 } from '../hash/keccak256.js'
13
16
  import {
14
17
  type DecodeEventLogErrorType,
15
18
  decodeEventLog,
16
19
  } from './decodeEventLog.js'
20
+ import { getAbiItem } from './getAbiItem.js'
17
21
 
18
22
  export type ParseEventLogsParameters<
19
23
  abi extends Abi | readonly unknown[] = Abi,
@@ -22,9 +26,23 @@ export type ParseEventLogsParameters<
22
26
  | ContractEventName<abi>[]
23
27
  | undefined = ContractEventName<abi>,
24
28
  strict extends boolean | undefined = boolean | undefined,
29
+ ///
30
+ allArgs = GetEventArgs<
31
+ abi,
32
+ eventName extends ContractEventName<abi>
33
+ ? eventName
34
+ : ContractEventName<abi>,
35
+ {
36
+ EnableUnion: true
37
+ IndexedOnly: false
38
+ Required: false
39
+ }
40
+ >,
25
41
  > = {
26
42
  /** Contract ABI. */
27
43
  abi: abi
44
+ /** Arguments for the event. */
45
+ args?: allArgs | undefined
28
46
  /** Contract event. */
29
47
  eventName?:
30
48
  | eventName
@@ -84,25 +102,45 @@ export function parseEventLogs<
84
102
  | ContractEventName<abi>
85
103
  | ContractEventName<abi>[]
86
104
  | undefined = undefined,
87
- >({
88
- abi,
89
- eventName,
90
- logs,
91
- strict = true,
92
- }: ParseEventLogsParameters<abi, eventName, strict>): ParseEventLogsReturnType<
93
- abi,
94
- eventName,
95
- strict
96
- > {
105
+ >(
106
+ parameters: ParseEventLogsParameters<abi, eventName, strict>,
107
+ ): ParseEventLogsReturnType<abi, eventName, strict> {
108
+ const { abi, args, logs, strict = true } = parameters
109
+
110
+ const eventName = (() => {
111
+ if (!parameters.eventName) return undefined
112
+ if (Array.isArray(parameters.eventName)) return parameters.eventName
113
+ return [parameters.eventName as string]
114
+ })()
115
+
97
116
  return logs
98
117
  .map((log) => {
99
118
  try {
119
+ const abiItem = getAbiItem({
120
+ abi: abi as Abi,
121
+ name: log.topics[0] as string,
122
+ }) as AbiEvent
123
+ if (!abiItem) return null
124
+
100
125
  const event = decodeEventLog({
101
126
  ...log,
102
- abi,
127
+ abi: [abiItem],
103
128
  strict,
104
129
  })
105
- if (eventName && !eventName.includes(event.eventName!)) return null
130
+
131
+ // Check that the decoded event name matches the provided event name.
132
+ if (eventName && !eventName.includes(event.eventName)) return null
133
+
134
+ // Check that the decoded event args match the provided args.
135
+ if (
136
+ !includesArgs({
137
+ args: event.args,
138
+ inputs: abiItem.inputs,
139
+ matchArgs: args,
140
+ })
141
+ )
142
+ return null
143
+
106
144
  return { ...event, ...log }
107
145
  } catch (err) {
108
146
  let eventName: string | undefined
@@ -129,3 +167,54 @@ export function parseEventLogs<
129
167
  strict
130
168
  >
131
169
  }
170
+
171
+ function includesArgs(parameters: {
172
+ args: unknown
173
+ inputs: AbiEvent['inputs']
174
+ matchArgs: unknown
175
+ }) {
176
+ const { args, inputs, matchArgs } = parameters
177
+
178
+ if (!matchArgs) return true
179
+ if (!args) return false
180
+
181
+ function isEqual(input: AbiEventParameter, value: unknown, arg: unknown) {
182
+ try {
183
+ if (input.type === 'address')
184
+ return isAddressEqual(value as Address, arg as Address)
185
+ if (input.type === 'string' || input.type === 'bytes')
186
+ return keccak256(toBytes(value as string)) === arg
187
+ return value === arg
188
+ } catch {
189
+ return false
190
+ }
191
+ }
192
+
193
+ if (Array.isArray(args) && Array.isArray(matchArgs)) {
194
+ return matchArgs.every((value, index) => {
195
+ if (!value) return true
196
+ const input = inputs[index]
197
+ if (!input) return false
198
+ const value_ = Array.isArray(value) ? value : [value]
199
+ return value_.some((value) => isEqual(input, value, args[index]))
200
+ })
201
+ }
202
+
203
+ if (
204
+ typeof args === 'object' &&
205
+ !Array.isArray(args) &&
206
+ typeof matchArgs === 'object' &&
207
+ !Array.isArray(matchArgs)
208
+ )
209
+ return Object.entries(matchArgs).every(([key, value]) => {
210
+ if (!value) return true
211
+ const input = inputs.find((input) => input.name === key)
212
+ if (!input) return false
213
+ const value_ = Array.isArray(value) ? value : [value]
214
+ return value_.some((value) =>
215
+ isEqual(input, value, (args as Record<string, unknown>)[key]),
216
+ )
217
+ })
218
+
219
+ return false
220
+ }
@@ -16,6 +16,7 @@ type CallbackFn = {
16
16
  type CallbackMap = Map<Id, CallbackFn>
17
17
 
18
18
  export type GetSocketParameters = {
19
+ onClose: () => void
19
20
  onError: (error?: Error | Event | undefined) => void
20
21
  onOpen: () => void
21
22
  onResponse: (data: RpcResponse) => void
@@ -23,9 +24,8 @@ export type GetSocketParameters = {
23
24
 
24
25
  export type Socket<socket extends {}> = socket & {
25
26
  close(): void
26
- request(params: {
27
- body: RpcRequest
28
- }): void
27
+ ping?: (() => void) | undefined
28
+ request(params: { body: RpcRequest }): void
29
29
  }
30
30
 
31
31
  export type SocketRpcClient<socket extends {}> = {
@@ -47,9 +47,23 @@ export type SocketRpcClient<socket extends {}> = {
47
47
 
48
48
  export type GetSocketRpcClientParameters<socket extends {} = {}> = {
49
49
  getSocket(params: GetSocketParameters): Promise<Socket<socket>>
50
+ /**
51
+ * Whether or not to send keep-alive messages.
52
+ * @default true
53
+ */
54
+ keepAlive?:
55
+ | boolean
56
+ | {
57
+ /**
58
+ * The interval (in ms) to send keep-alive messages.
59
+ * @default 30_000
60
+ */
61
+ interval?: number | undefined
62
+ }
63
+ | undefined
50
64
  key?: string
51
65
  /**
52
- * Whether or not to attempt to reconnect on socket failure.
66
+ * Whether or not to attempt to reconnect on socket failure or closure.
53
67
  * @default true
54
68
  */
55
69
  reconnect?:
@@ -80,9 +94,17 @@ export const socketClientCache = /*#__PURE__*/ new Map<
80
94
  >()
81
95
 
82
96
  export async function getSocketRpcClient<socket extends {}>(
83
- params: GetSocketRpcClientParameters<socket>,
97
+ parameters: GetSocketRpcClientParameters<socket>,
84
98
  ): Promise<SocketRpcClient<socket>> {
85
- const { getSocket, key = 'socket', reconnect = true, url } = params
99
+ const {
100
+ getSocket,
101
+ keepAlive = true,
102
+ key = 'socket',
103
+ reconnect = true,
104
+ url,
105
+ } = parameters
106
+ const { interval: keepAliveInterval = 30_000 } =
107
+ typeof keepAlive === 'object' ? keepAlive : {}
86
108
  const { attempts = 5, delay = 2_000 } =
87
109
  typeof reconnect === 'object' ? reconnect : {}
88
110
 
@@ -105,10 +127,24 @@ export async function getSocketRpcClient<socket extends {}>(
105
127
  const subscriptions = new Map<Id, CallbackFn>()
106
128
 
107
129
  let error: Error | Event | undefined
108
- let socket: Socket<any>
130
+ let socket: Socket<{}>
131
+ let keepAliveTimer: Timer | undefined
132
+
109
133
  // Set up socket implementation.
110
134
  async function setup() {
111
- return getSocket({
135
+ const result = await getSocket({
136
+ onClose() {
137
+ // Clear all requests and subscriptions.
138
+ requests.clear()
139
+ subscriptions.clear()
140
+
141
+ // Attempt to reconnect.
142
+ if (reconnect && reconnectCount < attempts)
143
+ setTimeout(async () => {
144
+ reconnectCount++
145
+ await setup().catch(console.error)
146
+ }, delay)
147
+ },
112
148
  onError(error_) {
113
149
  error = error_
114
150
 
@@ -125,7 +161,7 @@ export async function getSocketRpcClient<socket extends {}>(
125
161
  if (reconnect && reconnectCount < attempts)
126
162
  setTimeout(async () => {
127
163
  reconnectCount++
128
- socket = await setup().catch(console.error)
164
+ await setup().catch(console.error)
129
165
  }, delay)
130
166
  },
131
167
  onOpen() {
@@ -141,17 +177,29 @@ export async function getSocketRpcClient<socket extends {}>(
141
177
  if (!isSubscription) cache.delete(id)
142
178
  },
143
179
  })
180
+
181
+ socket = result
182
+
183
+ if (keepAlive) {
184
+ if (keepAliveTimer) clearInterval(keepAliveTimer)
185
+ keepAliveTimer = setInterval(() => socket.ping?.(), keepAliveInterval)
186
+ }
187
+
188
+ return result
144
189
  }
145
- socket = await setup()
190
+ await setup()
146
191
  error = undefined
147
192
 
148
193
  // Create a new socket instance.
149
194
  socketClient = {
150
195
  close() {
196
+ keepAliveTimer && clearInterval(keepAliveTimer)
151
197
  socket.close()
152
198
  socketClientCache.delete(`${key}:${url}`)
153
199
  },
154
- socket,
200
+ get socket() {
201
+ return socket
202
+ },
155
203
  request({ body, onError, onResponse }) {
156
204
  if (error && onError) onError(error)
157
205
 
@@ -10,22 +10,23 @@ import {
10
10
 
11
11
  export type GetWebSocketRpcClientOptions = Pick<
12
12
  GetSocketRpcClientParameters,
13
- 'reconnect'
13
+ 'keepAlive' | 'reconnect'
14
14
  >
15
15
 
16
16
  export async function getWebSocketRpcClient(
17
17
  url: string,
18
18
  options: GetWebSocketRpcClientOptions | undefined = {},
19
19
  ): Promise<SocketRpcClient<WebSocket>> {
20
- const { reconnect } = options
20
+ const { keepAlive, reconnect } = options
21
21
 
22
22
  return getSocketRpcClient({
23
- async getSocket({ onError, onOpen, onResponse }) {
23
+ async getSocket({ onClose, onError, onOpen, onResponse }) {
24
24
  const WebSocket = await import('isows').then((module) => module.WebSocket)
25
25
  const socket = new WebSocket(url)
26
26
 
27
- function onClose() {
28
- socket.removeEventListener('close', onClose)
27
+ function onClose_() {
28
+ onClose()
29
+ socket.removeEventListener('close', onClose_)
29
30
  socket.removeEventListener('message', onMessage)
30
31
  socket.removeEventListener('error', onError)
31
32
  socket.removeEventListener('open', onOpen)
@@ -35,7 +36,7 @@ export async function getWebSocketRpcClient(
35
36
  }
36
37
 
37
38
  // Setup event listeners for RPC & subscription responses.
38
- socket.addEventListener('close', onClose)
39
+ socket.addEventListener('close', onClose_)
39
40
  socket.addEventListener('message', onMessage)
40
41
  socket.addEventListener('error', onError)
41
42
  socket.addEventListener('open', onOpen)
@@ -56,6 +57,23 @@ export async function getWebSocketRpcClient(
56
57
  close_.bind(socket)()
57
58
  onClose()
58
59
  },
60
+ ping() {
61
+ try {
62
+ if (
63
+ socket.readyState === socket.CLOSED ||
64
+ socket.readyState === socket.CLOSING
65
+ )
66
+ throw new WebSocketRequestError({
67
+ body: {},
68
+ url: socket.url,
69
+ details: 'Socket is closed.',
70
+ })
71
+
72
+ socket.send('ping')
73
+ } catch (error) {
74
+ onError(error as Error)
75
+ }
76
+ },
59
77
  request({ body }) {
60
78
  if (
61
79
  socket.readyState === socket.CLOSED ||
@@ -71,6 +89,7 @@ export async function getWebSocketRpcClient(
71
89
  },
72
90
  } as Socket<WebSocket>)
73
91
  },
92
+ keepAlive,
74
93
  reconnect,
75
94
  url,
76
95
  })