viem 2.18.0 → 2.18.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 (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":"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,MAAM,IAAI,CAAA;IACnB,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,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IAC/B,OAAO,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAA;CAC5C,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;;;OAGG;IACH,SAAS,CAAC,EACN,OAAO,GACP;QACE;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC9B,GACD,SAAS,CAAA;IACb,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;aAjEnB,IAAI;WACN,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS;oBACf;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI;GAkE1C,CAAA;AAEH,wBAAsB,kBAAkB,CAAC,MAAM,SAAS,EAAE,EACxD,UAAU,EAAE,4BAA4B,CAAC,MAAM,CAAC,GAC/C,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CA4KlC"}
@@ -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
  })