@zerodev/sdk 4.0.31 → 4.0.33

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 (100) hide show
  1. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
  2. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js +53 -4
  3. package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -1
  4. package/dist/cjs/kernel-zerodev/account.d.ts +3 -0
  5. package/dist/cjs/kernel-zerodev/account.js +47 -6
  6. package/dist/cjs/kernel-zerodev/account.js.map +1 -1
  7. package/dist/cjs/kernel-zerodev/client/create-client.js.map +1 -1
  8. package/dist/cjs/kernel-zerodev/constants.d.ts +2 -2
  9. package/dist/cjs/kernel-zerodev/constants.js +2 -2
  10. package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
  11. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  12. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.js.map +1 -1
  13. package/dist/cjs/kernel-zerodev/middleware/paymaster.js +19 -6
  14. package/dist/cjs/kernel-zerodev/middleware/paymaster.js.map +1 -1
  15. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.d.ts +7 -3
  16. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js +45 -18
  17. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js.map +1 -1
  18. package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
  19. package/dist/cjs/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js.map +1 -1
  20. package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
  21. package/dist/cjs/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
  22. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  23. package/dist/cjs/kernel-zerodev/paymaster/base.js +36 -33
  24. package/dist/cjs/kernel-zerodev/paymaster/base.js.map +1 -1
  25. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
  26. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js +48 -39
  27. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js.map +1 -1
  28. package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.js +7 -15
  29. package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.js.map +1 -1
  30. package/dist/cjs/kernel-zerodev/provider.js +1 -2
  31. package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
  32. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
  33. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js +53 -4
  34. package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -1
  35. package/dist/esm/kernel-zerodev/account.d.ts +3 -0
  36. package/dist/esm/kernel-zerodev/account.js +47 -6
  37. package/dist/esm/kernel-zerodev/account.js.map +1 -1
  38. package/dist/esm/kernel-zerodev/client/create-client.js.map +1 -1
  39. package/dist/esm/kernel-zerodev/constants.d.ts +2 -2
  40. package/dist/esm/kernel-zerodev/constants.js +2 -2
  41. package/dist/esm/kernel-zerodev/constants.js.map +1 -1
  42. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  43. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.js.map +1 -1
  44. package/dist/esm/kernel-zerodev/middleware/paymaster.js +19 -6
  45. package/dist/esm/kernel-zerodev/middleware/paymaster.js.map +1 -1
  46. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.d.ts +7 -3
  47. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js +46 -18
  48. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js.map +1 -1
  49. package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
  50. package/dist/esm/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js.map +1 -1
  51. package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
  52. package/dist/esm/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
  53. package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  54. package/dist/esm/kernel-zerodev/paymaster/base.js +36 -33
  55. package/dist/esm/kernel-zerodev/paymaster/base.js.map +1 -1
  56. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
  57. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js +47 -39
  58. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js.map +1 -1
  59. package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.js +7 -15
  60. package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.js.map +1 -1
  61. package/dist/esm/kernel-zerodev/provider.js +1 -2
  62. package/dist/esm/kernel-zerodev/provider.js.map +1 -1
  63. package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts +42 -4
  64. package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts.map +1 -1
  65. package/dist/types/kernel-zerodev/account.d.ts +3 -0
  66. package/dist/types/kernel-zerodev/account.d.ts.map +1 -1
  67. package/dist/types/kernel-zerodev/client/create-client.d.ts.map +1 -1
  68. package/dist/types/kernel-zerodev/constants.d.ts +2 -2
  69. package/dist/types/kernel-zerodev/constants.d.ts.map +1 -1
  70. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  71. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts.map +1 -1
  72. package/dist/types/kernel-zerodev/middleware/paymaster.d.ts.map +1 -1
  73. package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts +7 -3
  74. package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts.map +1 -1
  75. package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts.map +1 -1
  76. package/dist/types/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.d.ts.map +1 -1
  77. package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts.map +1 -1
  78. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
  79. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -1
  80. package/dist/types/kernel-zerodev/paymaster/base.d.ts.map +1 -1
  81. package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts +4 -3
  82. package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts.map +1 -1
  83. package/dist/types/kernel-zerodev/paymaster/verifying-paymaster.d.ts.map +1 -1
  84. package/dist/types/kernel-zerodev/provider.d.ts.map +1 -1
  85. package/package.json +4 -2
  86. package/src/kernel-zerodev/abis/KernelAccountAbi.ts +53 -4
  87. package/src/kernel-zerodev/account.ts +57 -10
  88. package/src/kernel-zerodev/client/create-client.ts +1 -0
  89. package/src/kernel-zerodev/constants.ts +3 -2
  90. package/src/kernel-zerodev/ethers-provider/account-signer.ts +1 -1
  91. package/src/kernel-zerodev/middleware/paymaster.ts +20 -9
  92. package/src/kernel-zerodev/owner/getCustodialOwner.ts +94 -36
  93. package/src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts +0 -4
  94. package/src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts +0 -2
  95. package/src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts +0 -2
  96. package/src/kernel-zerodev/owner/passkey/utils.ts +0 -1
  97. package/src/kernel-zerodev/paymaster/base.ts +44 -38
  98. package/src/kernel-zerodev/paymaster/token-paymaster.ts +74 -53
  99. package/src/kernel-zerodev/paymaster/verifying-paymaster.ts +7 -14
  100. package/src/kernel-zerodev/provider.ts +1 -2
@@ -1 +1 @@
1
- {"version":3,"file":"getAutocompletePasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAChD,SAAS,EACT,MAAM,GAAG,OAAO,GAKjB;IACC,IAEE,CAAC,mBAAmB,EAAE,+BAA+B;QAErD,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,EACvD;QACA,OAAO;KACR;IAGD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI;YACF,aAAa,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBACrD,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE;oBAET,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,MAAM;aAC1C,CAAC,CACH,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,MAAM,aAAa,SAAS,YAAY,SAAS,CAAC,YAAY,EAAE,EACnE;gBACE,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;gBACrC,SAAS;aACV,CACF,CAAC;YACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAuB;gBAChC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;gBAC/B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,WAAW,CACT,GAAG,EACH,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;gBACH,aAAa,EAAE,CAAC,MAA2B,EAAE,EAAE,CAC7C,aAAa,CACX,MAAM,EACN,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;aACJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,OAAO;AACT,CAAC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortController,\n abortWebauthn,\n base64UrlEncode,\n generateRandomBuffer,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getAutocompletePasskeyOwner({\n projectId,\n apiUrl = API_URL,\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n if (\n //@ts-ignore\n !PublicKeyCredential?.isConditionalMediationAvailable ||\n //@ts-ignore\n !PublicKeyCredential?.isConditionalMediationAvailable()\n ) {\n return;\n }\n\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortWebauthn();\n const assertion = JSON.parse(\n await getWebAuthnAssertion(base64UrlEncode(challenge), {\n mediation: \"conditional\",\n publicKey: {\n //@ts-expect-error\n rpId: window.location.hostname,\n userVerification: \"required\",\n },\n signal: abortController.controller.signal,\n })\n );\n const response = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`,\n {\n challenge: base64UrlEncode(challenge),\n assertion,\n }\n );\n const { id, walletId, address } = await response.data;\n console.log(\"owner\", id, walletId, address);\n const owner: SmartAccountSigner = {\n getAddress: async () => address,\n signMessage: (msg) =>\n signMessage(\n msg,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n signTypedData: (params: SignTypedDataParams) =>\n signTypedData(\n params,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n };\n return owner;\n } catch (e) {\n console.log(e);\n }\n }\n return;\n}\n"]}
1
+ {"version":3,"file":"getAutocompletePasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAChD,SAAS,EACT,MAAM,GAAG,OAAO,GAKjB;IACC,IAEE,CAAC,mBAAmB,EAAE,+BAA+B;QAErD,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,EACvD;QACA,OAAO;KACR;IAED,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI;YACF,aAAa,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBACrD,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE;oBACT,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,MAAM;aAC1C,CAAC,CACH,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,MAAM,aAAa,SAAS,YAAY,SAAS,CAAC,YAAY,EAAE,EACnE;gBACE,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;gBACrC,SAAS;aACV,CACF,CAAC;YACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAuB;gBAChC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;gBAC/B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,WAAW,CACT,GAAG,EACH,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;gBACH,aAAa,EAAE,CAAC,MAA2B,EAAE,EAAE,CAC7C,aAAa,CACX,MAAM,EACN,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;aACJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,OAAO;AACT,CAAC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortController,\n abortWebauthn,\n base64UrlEncode,\n generateRandomBuffer,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getAutocompletePasskeyOwner({\n projectId,\n apiUrl = API_URL,\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n if (\n //@ts-ignore\n !PublicKeyCredential?.isConditionalMediationAvailable ||\n //@ts-ignore\n !PublicKeyCredential?.isConditionalMediationAvailable()\n ) {\n return;\n }\n\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortWebauthn();\n const assertion = JSON.parse(\n await getWebAuthnAssertion(base64UrlEncode(challenge), {\n mediation: \"conditional\",\n publicKey: {\n rpId: window.location.hostname,\n userVerification: \"required\",\n },\n signal: abortController.controller.signal,\n })\n );\n const response = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`,\n {\n challenge: base64UrlEncode(challenge),\n assertion,\n }\n );\n const { id, walletId, address } = await response.data;\n console.log(\"owner\", id, walletId, address);\n const owner: SmartAccountSigner = {\n getAddress: async () => address,\n signMessage: (msg) =>\n signMessage(\n msg,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n signTypedData: (params: SignTypedDataParams) =>\n signTypedData(\n params,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n };\n return owner;\n } catch (e) {\n console.log(e);\n }\n }\n return;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,MAAM,GAAG,OAAO,EAChB,eAAe,GAAG,KAAK,GAMxB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI;YACF,aAAa,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBACrD,SAAS,EAAE;oBAET,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;oBAC5B,gBAAgB,EAAE,eAAe;wBAC/B,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC;wBACvC,CAAC,CAAC,SAAS;iBACd;aACF,CAAC,CACH,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,MAAM,aAAa,SAAS,YAAY,SAAS,CAAC,YAAY,EAAE,EACnE;gBACE,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;gBACrC,SAAS;aACV,CACF,CAAC;YACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACtD,MAAM,KAAK,GAAuB;gBAChC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;gBAC/B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,WAAW,CACT,GAAG,EACH,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;gBACH,aAAa,EAAE,CAAC,MAA2B,EAAE,EAAE,CAC7C,aAAa,CACX,MAAM,EACN,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;aACJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,OAAO;AACT,CAAC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortWebauthn,\n base64UrlEncode,\n generateRandomBuffer,\n getCredentials,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getPasskeyOwner({\n projectId,\n name,\n apiUrl = API_URL,\n withCredentials = false,\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n withCredentials?: boolean;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortWebauthn();\n const assertion = JSON.parse(\n await getWebAuthnAssertion(base64UrlEncode(challenge), {\n publicKey: {\n //@ts-expect-error\n rpId: window.location.hostname,\n userVerification: \"required\",\n allowCredentials: withCredentials\n ? await getCredentials(projectId, name)\n : undefined,\n },\n })\n );\n const response = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`,\n {\n challenge: base64UrlEncode(challenge),\n assertion,\n }\n );\n const { id, walletId, address } = await response.data;\n const owner: SmartAccountSigner = {\n getAddress: async () => address,\n signMessage: (msg) =>\n signMessage(\n msg,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n signTypedData: (params: SignTypedDataParams) =>\n signTypedData(\n params,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n };\n return owner;\n } catch (e) {\n console.log(e);\n }\n }\n return;\n}\n"]}
1
+ {"version":3,"file":"getPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,MAAM,GAAG,OAAO,EAChB,eAAe,GAAG,KAAK,GAMxB;IACC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI;YACF,aAAa,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBACrD,SAAS,EAAE;oBACT,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;oBAC5B,gBAAgB,EAAE,eAAe;wBAC/B,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC;wBACvC,CAAC,CAAC,SAAS;iBACd;aACF,CAAC,CACH,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,MAAM,aAAa,SAAS,YAAY,SAAS,CAAC,YAAY,EAAE,EACnE;gBACE,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;gBACrC,SAAS;aACV,CACF,CAAC;YACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACtD,MAAM,KAAK,GAAuB;gBAChC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;gBAC/B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,WAAW,CACT,GAAG,EACH,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;gBACH,aAAa,EAAE,CAAC,MAA2B,EAAE,EAAE,CAC7C,aAAa,CACX,MAAM,EACN,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;aACJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,OAAO;AACT,CAAC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortWebauthn,\n base64UrlEncode,\n generateRandomBuffer,\n getCredentials,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getPasskeyOwner({\n projectId,\n name,\n apiUrl = API_URL,\n withCredentials = false,\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n withCredentials?: boolean;\n}): Promise<SmartAccountSigner | undefined> {\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortWebauthn();\n const assertion = JSON.parse(\n await getWebAuthnAssertion(base64UrlEncode(challenge), {\n publicKey: {\n rpId: window.location.hostname,\n userVerification: \"required\",\n allowCredentials: withCredentials\n ? await getCredentials(projectId, name)\n : undefined,\n },\n })\n );\n const response = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`,\n {\n challenge: base64UrlEncode(challenge),\n assertion,\n }\n );\n const { id, walletId, address } = await response.data;\n const owner: SmartAccountSigner = {\n getAddress: async () => address,\n signMessage: (msg) =>\n signMessage(\n msg,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n signTypedData: (params: SignTypedDataParams) =>\n signTypedData(\n params,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n };\n return owner;\n } catch (e) {\n console.log(e);\n }\n }\n return;\n}\n"]}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import type { SignTypedDataParams } from "@alchemy/aa-core";
3
2
  export declare const abortController: {
4
3
  controller: AbortController;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAElE,WAAW,CAAC;IACV,OAAO,EAAE,yBAAyB;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,IAAI,eAAe,EAAE;CAClC,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC7E,eAAe,CAAC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AAEtC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAgB,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAsB,EAAU,EAAE;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;SAC1B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAC5C,GAAW,EACX,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,OAAO,EAChB,EAAE;IACF,aAAa,EAAE,CAAC;IAChB,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,kBAAkB,CACvD;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,gCAAgC;YACtC,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE;gBACV,YAAY,EAAE,QAAQ;gBACtB,OAAO,EAAE,GAAG;gBACZ,QAAQ,EAAE,8BAA8B;gBACxC,YAAY,EAAE,qBAAqB;aACpC;YACD,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;SAChC;KACF,EACD;QACE,SAAS,EAAE;YACT,gBAAgB,EAAE;gBAChB;oBACE,EAAE,EAAE,uBAAuB,CAAC,YAAY,CAAC;oBACzC,IAAI,EAAE,SAAS;iBAChB;aACF;SACF;KACF,CACF,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,IAAI,CACpC,GAAG,MAAM,aAAa,SAAS,gBAAgB,EAC/C;QACE,aAAa;KACd,CACF,CAAC;IACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,2BAA2B,EAAE;QACnD,IAAI,MAAM,GAAG,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC;QAEpD,IAAI,MAAM,EAAE;YACV,MAAM,YAAY,GAAG,cAAc,CAAC;gBAClC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE;gBAClB,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE;gBAClB,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;aACjC,CAAC,CAAC;YACH,IAAI,YAAY,EAAE;gBAChB,OAAO,YAAY,CAAC;aACrB;SACF;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAwB,EACxB,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,OAAO,EAChB,EAAE;IACF,OAAO,MAAM,yBAAyB,CACpC,WAAW,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EACzD,EAAE,EACF,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,MAA2B,EAC3B,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,OAAO,EAChB,EAAE;IACF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,MAAM,yBAAyB,CACpC,UAAU,EACV,EAAE,EACF,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,SAAiB,EACjB,IAAa,EACb,MAAM,GAAG,OAAO,EAChB,EAAE;IACF,MAAM,GAAG,GACP,GAAG,MAAM,aAAa,SAAS,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;IAClC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAkB,EAAE,EAAE,CAAC,CAAC;QAC9C,EAAE,EAAE,uBAAuB,CAAC,UAAU,CAAC;QACvC,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAGF,MAAM,UAAU,uBAAuB,CAAC,eAAuB;IAE7D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAQrE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IAG7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAG5B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACjC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { browserInit, TurnkeyApi } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport { API_URL } from \"../../constants.js\";\nimport type { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData, signatureToHex, hashMessage } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const abortController = {\n controller: new AbortController(),\n};\n\nexport function abortWebauthn() {\n abortController.controller.abort(\"ZeroDev: Reset previous Webauthn request\");\n abortController.controller = new AbortController();\n}\n\nexport const publicKey = \"public-key\";\n\nexport const es256 = -7;\n\nexport const generateRandomBuffer = (): ArrayBuffer => {\n const arr = new Uint8Array(32);\n //@ts-expect-error\n crypto.getRandomValues(arr);\n return arr.buffer;\n};\n\nexport const base64UrlEncode = (challenge: ArrayBuffer): string => {\n return Buffer.from(challenge)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n};\n\nexport const signMessageImplementation = async (\n msg: string,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n abortWebauthn();\n const signedRequest = await TurnkeyApi.signSignRawPayload(\n {\n body: {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD\",\n organizationId: id,\n parameters: {\n privateKeyId: walletId,\n payload: msg,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n timestampMs: String(Date.now()),\n },\n },\n {\n publicKey: {\n allowCredentials: [\n {\n id: base64URLStringToBuffer(credentialId),\n type: publicKey,\n },\n ],\n },\n }\n );\n const proxyResponse = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/proxy`,\n {\n signedRequest,\n }\n );\n const { activity } = await proxyResponse.data;\n if (activity.status === \"ACTIVITY_STATUS_COMPLETED\") {\n let result = activity?.result?.signRawPayloadResult;\n\n if (result) {\n const signatureHex = signatureToHex({\n r: `0x${result.r}`,\n s: `0x${result.s}`,\n v: result.v === \"00\" ? 27n : 28n,\n });\n if (signatureHex) {\n return signatureHex;\n }\n }\n }\n return \"0x\";\n};\n\nexport const signMessage = async (\n msg: string | Uint8Array,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n return await signMessageImplementation(\n hashMessage(typeof msg === \"string\" ? msg : { raw: msg }),\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const signTypedData = async (\n params: SignTypedDataParams,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const hashToSign = hashTypedData(params);\n return await signMessageImplementation(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const getCredentials = async (\n projectId: string,\n name?: string,\n apiUrl = API_URL\n) => {\n const url =\n `${apiUrl}/projects/${projectId}/wallets` + (name ? `/${name}` : \"\");\n const response = await axios.get(url);\n const credentials = response.data;\n return credentials.map((credential: string) => ({\n id: base64URLStringToBuffer(credential),\n type: \"public-key\",\n }));\n};\n\n// https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8\nexport function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, \"+\").replace(/_/g, \"/\");\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, \"=\");\n\n // Convert to a binary string\n const binary = atob(padded);\n\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return buffer;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { browserInit, TurnkeyApi } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport { API_URL } from \"../../constants.js\";\nimport type { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData, signatureToHex, hashMessage } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const abortController = {\n controller: new AbortController(),\n};\n\nexport function abortWebauthn() {\n abortController.controller.abort(\"ZeroDev: Reset previous Webauthn request\");\n abortController.controller = new AbortController();\n}\n\nexport const publicKey = \"public-key\";\n\nexport const es256 = -7;\n\nexport const generateRandomBuffer = (): ArrayBuffer => {\n const arr = new Uint8Array(32);\n crypto.getRandomValues(arr);\n return arr.buffer;\n};\n\nexport const base64UrlEncode = (challenge: ArrayBuffer): string => {\n return Buffer.from(challenge)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n};\n\nexport const signMessageImplementation = async (\n msg: string,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n abortWebauthn();\n const signedRequest = await TurnkeyApi.signSignRawPayload(\n {\n body: {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD\",\n organizationId: id,\n parameters: {\n privateKeyId: walletId,\n payload: msg,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n timestampMs: String(Date.now()),\n },\n },\n {\n publicKey: {\n allowCredentials: [\n {\n id: base64URLStringToBuffer(credentialId),\n type: publicKey,\n },\n ],\n },\n }\n );\n const proxyResponse = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/proxy`,\n {\n signedRequest,\n }\n );\n const { activity } = await proxyResponse.data;\n if (activity.status === \"ACTIVITY_STATUS_COMPLETED\") {\n let result = activity?.result?.signRawPayloadResult;\n\n if (result) {\n const signatureHex = signatureToHex({\n r: `0x${result.r}`,\n s: `0x${result.s}`,\n v: result.v === \"00\" ? 27n : 28n,\n });\n if (signatureHex) {\n return signatureHex;\n }\n }\n }\n return \"0x\";\n};\n\nexport const signMessage = async (\n msg: string | Uint8Array,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n return await signMessageImplementation(\n hashMessage(typeof msg === \"string\" ? msg : { raw: msg }),\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const signTypedData = async (\n params: SignTypedDataParams,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const hashToSign = hashTypedData(params);\n return await signMessageImplementation(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const getCredentials = async (\n projectId: string,\n name?: string,\n apiUrl = API_URL\n) => {\n const url =\n `${apiUrl}/projects/${projectId}/wallets` + (name ? `/${name}` : \"\");\n const response = await axios.get(url);\n const credentials = response.data;\n return credentials.map((credential: string) => ({\n id: base64URLStringToBuffer(credential),\n type: \"public-key\",\n }));\n};\n\n// https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8\nexport function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, \"+\").replace(/_/g, \"/\");\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, \"=\");\n\n // Convert to a binary string\n const binary = atob(padded);\n\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return buffer;\n}\n"]}
@@ -13,40 +13,43 @@ export class Paymaster {
13
13
  });
14
14
  }
15
15
  async signUserOp({ userOp, callData, gasTokenAddress, erc20UserOp, erc20CallData, paymasterProvider, shouldOverrideFee = false, }) {
16
- try {
17
- const hexifiedUserOp = deepHexlify(await resolveProperties(userOp));
18
- let resolvedERC20UserOp;
19
- let hexifiedERC20UserOp;
20
- if (erc20UserOp) {
21
- resolvedERC20UserOp = await resolveProperties(erc20UserOp);
22
- hexifiedERC20UserOp = hexifyUserOp(resolvedERC20UserOp);
23
- }
24
- const chainId = await getChainId(this.provider.getProjectId());
25
- if (!chainId)
26
- throw new Error("ChainId not found");
27
- let requestBodyParams = Object.fromEntries(Object.entries({
28
- projectId: this.provider.getProjectId(),
29
- chainId,
30
- userOp: hexifiedUserOp,
31
- entryPointAddress: ENTRYPOINT_ADDRESS,
32
- callData: callData instanceof Promise ? await callData : callData,
33
- tokenAddress: gasTokenAddress,
34
- erc20UserOp: hexifiedERC20UserOp,
35
- erc20CallData: erc20CallData instanceof Promise
36
- ? await erc20CallData
37
- : erc20CallData,
38
- paymasterProvider,
39
- shouldOverrideFee,
40
- }).filter(([_, value]) => value !== undefined));
41
- const { data: paymasterResp } = await axios.post(`${PAYMASTER_URL}/sign`, {
42
- ...requestBodyParams,
43
- }, { headers: { "Content-Type": "application/json" } });
44
- return paymasterResp;
45
- }
46
- catch (error) {
47
- console.log(error);
48
- return undefined;
16
+ const hexifiedUserOp = deepHexlify(await resolveProperties(userOp));
17
+ let resolvedERC20UserOp;
18
+ let hexifiedERC20UserOp;
19
+ if (erc20UserOp) {
20
+ resolvedERC20UserOp = await resolveProperties(erc20UserOp);
21
+ hexifiedERC20UserOp = hexifyUserOp(resolvedERC20UserOp);
49
22
  }
23
+ const chainId = await getChainId(this.provider.getProjectId());
24
+ if (!chainId)
25
+ throw new Error("ChainId not found");
26
+ let requestBodyParams = Object.fromEntries(Object.entries({
27
+ projectId: this.provider.getProjectId(),
28
+ chainId,
29
+ userOp: hexifiedUserOp,
30
+ entryPointAddress: ENTRYPOINT_ADDRESS,
31
+ callData: callData instanceof Promise ? await callData : callData,
32
+ gasTokenData: gasTokenAddress && hexifiedERC20UserOp && erc20CallData
33
+ ? {
34
+ tokenAddress: gasTokenAddress,
35
+ erc20UserOp: hexifiedERC20UserOp,
36
+ erc20CallData: erc20CallData instanceof Promise
37
+ ? await erc20CallData
38
+ : erc20CallData,
39
+ }
40
+ : undefined,
41
+ tokenAddress: gasTokenAddress,
42
+ erc20UserOp: hexifiedERC20UserOp,
43
+ erc20CallData: erc20CallData instanceof Promise
44
+ ? await erc20CallData
45
+ : erc20CallData,
46
+ paymasterProvider,
47
+ shouldOverrideFee,
48
+ }).filter(([_, value]) => value !== undefined));
49
+ const { data: paymasterResp } = await axios.post(`${PAYMASTER_URL}/getPaymasterAndData`, {
50
+ ...requestBodyParams,
51
+ }, { headers: { "Content-Type": "application/json" } });
52
+ return paymasterResp;
50
53
  }
51
54
  }
52
55
  //# sourceMappingURL=base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/paymaster/base.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAgB,SAAS;IAC7B,YAAsB,QAAyB;QAAnC;;;;mBAAU,QAAQ;WAAiB;IAAG,CAAC;IAMzC,KAAK,CAAC,UAAU,CAAC,EACzB,MAAM,EACN,QAAQ,EACR,eAAe,EACf,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAAG,KAAK,GAS1B;QACC,IAAI;YACF,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;YACpE,IAAI,mBAAmB,CAAC;YACxB,IAAI,mBAAwB,CAAC;YAC7B,IAAI,WAAW,EAAE;gBACf,mBAAmB,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBAE3D,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;aACzD;YACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACnD,IAAI,iBAAiB,GAAG,MAAM,CAAC,WAAW,CACxC,MAAM,CAAC,OAAO,CAAC;gBACb,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;gBACvC,OAAO;gBACP,MAAM,EAAE,cAAc;gBACtB,iBAAiB,EAAE,kBAAkB;gBACrC,QAAQ,EAAE,QAAQ,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACjE,YAAY,EAAE,eAAe;gBAC7B,WAAW,EAAE,mBAAmB;gBAChC,aAAa,EACX,aAAa,YAAY,OAAO;oBAC9B,CAAC,CAAC,MAAM,aAAa;oBACrB,CAAC,CAAC,aAAa;gBACnB,iBAAiB;gBACjB,iBAAiB;aAClB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAC/C,CAAC;YACF,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAC9C,GAAG,aAAa,OAAO,EACvB;gBACE,GAAG,iBAAiB;aACrB,EACD,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACpD,CAAC;YACF,OAAO,aAAa,CAAC;SACtB;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,SAAS,CAAC;SAClB;IACH,CAAC;CACF","sourcesContent":["import {\n deepHexlify,\n type BytesLike,\n type PromiseOrValue,\n type UserOperationStruct,\n resolveProperties,\n} from \"@alchemy/aa-core\";\nimport axios from \"axios\";\nimport { ENTRYPOINT_ADDRESS, PAYMASTER_URL } from \"../constants.js\";\nimport type { ZeroDevProvider } from \"../provider.js\";\nimport { hexifyUserOp } from \"../utils/ERC4337-utils.js\";\nimport type { PaymasterAndBundlerProviders } from \"./types.js\";\nimport { getChainId } from \"../api/index.js\";\n\nexport abstract class Paymaster {\n constructor(protected provider: ZeroDevProvider) {}\n abstract getPaymasterResponse(\n struct: UserOperationStruct,\n paymasterProvider?: PaymasterAndBundlerProviders,\n shouldOverrideFee?: boolean\n ): Promise<UserOperationStruct | undefined>;\n protected async signUserOp({\n userOp,\n callData,\n gasTokenAddress,\n erc20UserOp,\n erc20CallData,\n paymasterProvider,\n shouldOverrideFee = false,\n }: {\n userOp: UserOperationStruct;\n callData?: PromiseOrValue<BytesLike>;\n gasTokenAddress?: string;\n erc20UserOp?: Partial<UserOperationStruct>;\n erc20CallData?: PromiseOrValue<BytesLike>;\n paymasterProvider?: PaymasterAndBundlerProviders;\n shouldOverrideFee?: boolean;\n }): Promise<any> {\n try {\n const hexifiedUserOp = deepHexlify(await resolveProperties(userOp));\n let resolvedERC20UserOp;\n let hexifiedERC20UserOp: any;\n if (erc20UserOp) {\n resolvedERC20UserOp = await resolveProperties(erc20UserOp);\n\n hexifiedERC20UserOp = hexifyUserOp(resolvedERC20UserOp);\n }\n const chainId = await getChainId(this.provider.getProjectId());\n if (!chainId) throw new Error(\"ChainId not found\");\n let requestBodyParams = Object.fromEntries(\n Object.entries({\n projectId: this.provider.getProjectId(),\n chainId,\n userOp: hexifiedUserOp,\n entryPointAddress: ENTRYPOINT_ADDRESS,\n callData: callData instanceof Promise ? await callData : callData,\n tokenAddress: gasTokenAddress,\n erc20UserOp: hexifiedERC20UserOp,\n erc20CallData:\n erc20CallData instanceof Promise\n ? await erc20CallData\n : erc20CallData,\n paymasterProvider,\n shouldOverrideFee,\n }).filter(([_, value]) => value !== undefined)\n );\n const { data: paymasterResp } = await axios.post(\n `${PAYMASTER_URL}/sign`,\n {\n ...requestBodyParams,\n },\n { headers: { \"Content-Type\": \"application/json\" } }\n );\n return paymasterResp;\n } catch (error) {\n console.log(error);\n return undefined;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/paymaster/base.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAgB,SAAS;IAC7B,YAAsB,QAAyB;QAAnC;;;;mBAAU,QAAQ;WAAiB;IAAG,CAAC;IAMzC,KAAK,CAAC,UAAU,CAAC,EACzB,MAAM,EACN,QAAQ,EACR,eAAe,EACf,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAAG,KAAK,GAS1B;QACC,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,mBAAmB,CAAC;QACxB,IAAI,mBAAwB,CAAC;QAC7B,IAAI,WAAW,EAAE;YACf,mBAAmB,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAE3D,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;SACzD;QACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,iBAAiB,GAAG,MAAM,CAAC,WAAW,CACxC,MAAM,CAAC,OAAO,CAAC;YACb,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;YACvC,OAAO;YACP,MAAM,EAAE,cAAc;YACtB,iBAAiB,EAAE,kBAAkB;YACrC,QAAQ,EAAE,QAAQ,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ;YACjE,YAAY,EACV,eAAe,IAAI,mBAAmB,IAAI,aAAa;gBACrD,CAAC,CAAC;oBACE,YAAY,EAAE,eAAe;oBAC7B,WAAW,EAAE,mBAAmB;oBAChC,aAAa,EACX,aAAa,YAAY,OAAO;wBAC9B,CAAC,CAAC,MAAM,aAAa;wBACrB,CAAC,CAAC,aAAa;iBACpB;gBACH,CAAC,CAAC,SAAS;YACf,YAAY,EAAE,eAAe;YAC7B,WAAW,EAAE,mBAAmB;YAChC,aAAa,EACX,aAAa,YAAY,OAAO;gBAC9B,CAAC,CAAC,MAAM,aAAa;gBACrB,CAAC,CAAC,aAAa;YACnB,iBAAiB;YACjB,iBAAiB;SAClB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAC/C,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAC9C,GAAG,aAAa,sBAAsB,EACtC;YACE,GAAG,iBAAiB;SACrB,EACD,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACpD,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;CACF","sourcesContent":["import {\n deepHexlify,\n type BytesLike,\n type PromiseOrValue,\n type UserOperationStruct,\n resolveProperties,\n} from \"@alchemy/aa-core\";\nimport axios from \"axios\";\nimport { ENTRYPOINT_ADDRESS, PAYMASTER_URL } from \"../constants.js\";\nimport type { ZeroDevProvider } from \"../provider.js\";\nimport { hexifyUserOp } from \"../utils/ERC4337-utils.js\";\nimport type { PaymasterAndBundlerProviders } from \"./types.js\";\nimport { getChainId } from \"../api/index.js\";\n\nexport abstract class Paymaster {\n constructor(protected provider: ZeroDevProvider) {}\n abstract getPaymasterResponse(\n struct: UserOperationStruct,\n paymasterProvider?: PaymasterAndBundlerProviders,\n shouldOverrideFee?: boolean\n ): Promise<UserOperationStruct | undefined>;\n protected async signUserOp({\n userOp,\n callData,\n gasTokenAddress,\n erc20UserOp,\n erc20CallData,\n paymasterProvider,\n shouldOverrideFee = false,\n }: {\n userOp: UserOperationStruct;\n callData?: PromiseOrValue<BytesLike>;\n gasTokenAddress?: string;\n erc20UserOp?: Partial<UserOperationStruct>;\n erc20CallData?: PromiseOrValue<BytesLike>;\n paymasterProvider?: PaymasterAndBundlerProviders;\n shouldOverrideFee?: boolean;\n }): Promise<any> {\n const hexifiedUserOp = deepHexlify(await resolveProperties(userOp));\n let resolvedERC20UserOp;\n let hexifiedERC20UserOp: any;\n if (erc20UserOp) {\n resolvedERC20UserOp = await resolveProperties(erc20UserOp);\n\n hexifiedERC20UserOp = hexifyUserOp(resolvedERC20UserOp);\n }\n const chainId = await getChainId(this.provider.getProjectId());\n if (!chainId) throw new Error(\"ChainId not found\");\n let requestBodyParams = Object.fromEntries(\n Object.entries({\n projectId: this.provider.getProjectId(),\n chainId,\n userOp: hexifiedUserOp,\n entryPointAddress: ENTRYPOINT_ADDRESS,\n callData: callData instanceof Promise ? await callData : callData,\n gasTokenData:\n gasTokenAddress && hexifiedERC20UserOp && erc20CallData\n ? {\n tokenAddress: gasTokenAddress,\n erc20UserOp: hexifiedERC20UserOp,\n erc20CallData:\n erc20CallData instanceof Promise\n ? await erc20CallData\n : erc20CallData,\n }\n : undefined,\n tokenAddress: gasTokenAddress,\n erc20UserOp: hexifiedERC20UserOp,\n erc20CallData:\n erc20CallData instanceof Promise\n ? await erc20CallData\n : erc20CallData,\n paymasterProvider,\n shouldOverrideFee,\n }).filter(([_, value]) => value !== undefined)\n );\n const { data: paymasterResp } = await axios.post(\n `${PAYMASTER_URL}/getPaymasterAndData`,\n {\n ...requestBodyParams,\n },\n { headers: { \"Content-Type\": \"application/json\" } }\n );\n return paymasterResp;\n }\n}\n"]}
@@ -1,14 +1,15 @@
1
- import { type PromiseOrValue, type BytesLike, type UserOperationStruct } from "@alchemy/aa-core";
1
+ import { type PromiseOrValue, type BytesLike, type UserOperationCallData, type UserOperationStruct, type BatchUserOperationCallData } from "@alchemy/aa-core";
2
2
  import { type Hex } from "viem";
3
3
  import type { ZeroDevProvider } from "../provider.js";
4
4
  import { type UserOperationCallDataWithDelegate } from "../utils.js";
5
5
  import { Paymaster } from "./base.js";
6
6
  import { type PaymasterAndBundlerProviders, type PaymasterConfig } from "./types.js";
7
+ export declare function isBatchUserOperationCallData(data: any): data is BatchUserOperationCallData;
7
8
  export declare class TokenPaymaster extends Paymaster {
8
9
  protected paymasterConfig: PaymasterConfig<"TOKEN_PAYMASTER">;
9
10
  constructor(provider: ZeroDevProvider, paymasterConfig: PaymasterConfig<"TOKEN_PAYMASTER">);
10
11
  getPaymasterAddress(paymasterProvider?: PaymasterAndBundlerProviders): Promise<Hex | undefined>;
11
- decodeMainCallFromCallData(kernelAddress: PromiseOrValue<string>, callData: PromiseOrValue<BytesLike>): Promise<UserOperationCallDataWithDelegate | undefined>;
12
- getERC20UserOp(struct: UserOperationStruct, mainCall: UserOperationCallDataWithDelegate, gasTokenAddress: Hex, paymasterAddress: Hex): Promise<UserOperationStruct | undefined>;
12
+ decodeMainCallFromCallData(kernelAddress: PromiseOrValue<string>, callData: PromiseOrValue<BytesLike>): Promise<UserOperationCallData | BatchUserOperationCallData | UserOperationCallDataWithDelegate | undefined>;
13
+ getERC20UserOp<T extends UserOperationCallData | BatchUserOperationCallData>(struct: UserOperationStruct, mainCall: T, gasTokenAddress: Hex, paymasterAddress: Hex): Promise<UserOperationStruct | undefined>;
13
14
  getPaymasterResponse(struct: UserOperationStruct, paymasterProvider?: PaymasterAndBundlerProviders, shouldOverrideFee?: boolean): Promise<UserOperationStruct | undefined>;
14
15
  }
@@ -3,13 +3,16 @@ import axios from "axios";
3
3
  import { toHex, decodeFunctionData, encodeFunctionData, isAddress, } from "viem";
4
4
  import { ERC20Abi } from "../abis/ERC20Abi.js";
5
5
  import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
6
- import { MultiSendAbi } from "../abis/MultiSendAbi.js";
7
- import { PAYMASTER_URL, ENTRYPOINT_ADDRESS, MULTISEND_ADDR, ERC20_APPROVAL_AMOUNT, } from "../constants.js";
6
+ import { PAYMASTER_URL, ENTRYPOINT_ADDRESS, ERC20_APPROVAL_AMOUNT, MULTISEND_ADDR, } from "../constants.js";
8
7
  import { AccountNotConnected, IncorrectCallDataForTokenPaymaster, } from "../errors.js";
9
8
  import { getGasTokenAddress, } from "../utils.js";
10
9
  import { Paymaster } from "./base.js";
11
10
  import {} from "./types.js";
12
11
  import { getChainId } from "../api/index.js";
12
+ import { MultiSendAbi } from "../abis/MultiSendAbi.js";
13
+ export function isBatchUserOperationCallData(data) {
14
+ return data && Array.isArray(data);
15
+ }
13
16
  export class TokenPaymaster extends Paymaster {
14
17
  constructor(provider, paymasterConfig) {
15
18
  super(provider);
@@ -82,6 +85,14 @@ export class TokenPaymaster extends Paymaster {
82
85
  }
83
86
  return mainCall;
84
87
  }
88
+ else if (functionName === "executeBatch") {
89
+ const [txs] = args;
90
+ return txs.map((tx) => ({
91
+ target: tx.to,
92
+ value: tx.value ?? 0n,
93
+ data: tx.data,
94
+ }));
95
+ }
85
96
  }
86
97
  catch (error) {
87
98
  return {
@@ -109,10 +120,14 @@ export class TokenPaymaster extends Paymaster {
109
120
  if (!this.provider.account) {
110
121
  throw AccountNotConnected;
111
122
  }
112
- const erc20CallData = await this.provider.account.encodeBatchExecute([
113
- approveData,
114
- mainCall,
115
- ]);
123
+ let calls;
124
+ if (isBatchUserOperationCallData(mainCall)) {
125
+ calls = [approveData, ...mainCall];
126
+ }
127
+ else {
128
+ calls = [approveData, mainCall];
129
+ }
130
+ const erc20CallData = await this.provider.account.encodeBatchExecute(calls);
116
131
  return {
117
132
  ...struct,
118
133
  callData: erc20CallData,
@@ -132,40 +147,33 @@ export class TokenPaymaster extends Paymaster {
132
147
  }
133
148
  }
134
149
  async getPaymasterResponse(struct, paymasterProvider, shouldOverrideFee) {
135
- try {
136
- const mainCall = await this.decodeMainCallFromCallData(struct.sender, struct.callData);
137
- if (!mainCall) {
138
- throw IncorrectCallDataForTokenPaymaster;
139
- }
140
- const chainId = await getChainId(this.provider.getProjectId());
141
- if (!chainId) {
142
- throw new Error("ChainId not found");
143
- }
144
- const gasTokenAddress = getGasTokenAddress(this.paymasterConfig.gasToken, chainId);
145
- let paymasterAddress = await this.getPaymasterAddress(paymasterProvider);
146
- if (gasTokenAddress !== undefined &&
147
- paymasterAddress !== undefined &&
148
- isAddress(paymasterAddress)) {
149
- const erc20UserOp = await this.getERC20UserOp(struct, mainCall, gasTokenAddress, paymasterAddress);
150
- if (!erc20UserOp) {
151
- return;
152
- }
153
- const paymasterResp = await this.signUserOp({
154
- userOp: struct,
155
- callData: struct.callData,
156
- gasTokenAddress,
157
- erc20UserOp,
158
- erc20CallData: erc20UserOp.callData,
159
- paymasterProvider,
160
- shouldOverrideFee,
161
- });
162
- if (paymasterResp) {
163
- return paymasterResp;
164
- }
165
- }
150
+ const mainCall = await this.decodeMainCallFromCallData(struct.sender, struct.callData);
151
+ if (!mainCall) {
152
+ throw IncorrectCallDataForTokenPaymaster;
166
153
  }
167
- catch (error) {
168
- console.log(error);
154
+ const chainId = await getChainId(this.provider.getProjectId());
155
+ if (!chainId) {
156
+ throw new Error("ChainId not found");
157
+ }
158
+ const gasTokenAddress = getGasTokenAddress(this.paymasterConfig.gasToken, chainId);
159
+ let paymasterAddress = await this.getPaymasterAddress(paymasterProvider);
160
+ if (gasTokenAddress !== undefined &&
161
+ paymasterAddress !== undefined &&
162
+ isAddress(paymasterAddress)) {
163
+ const erc20UserOp = await this.getERC20UserOp(struct, mainCall, gasTokenAddress, paymasterAddress);
164
+ if (!erc20UserOp) {
165
+ return;
166
+ }
167
+ const paymasterResp = await this.signUserOp({
168
+ userOp: struct,
169
+ callData: struct.callData,
170
+ gasTokenAddress,
171
+ erc20UserOp,
172
+ erc20CallData: erc20UserOp.callData,
173
+ paymasterProvider,
174
+ shouldOverrideFee,
175
+ });
176
+ return paymasterResp;
169
177
  }
170
178
  return;
171
179
  }
@@ -1 +1 @@
1
- {"version":3,"file":"token-paymaster.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/paymaster/token-paymaster.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type PromiseOrValue,\n type BytesLike,\n type UserOperationCallData,\n type UserOperationStruct,\n} from \"@alchemy/aa-core\";\nimport axios from \"axios\";\nimport {\n type Hex,\n toHex,\n decodeFunctionData,\n encodeFunctionData,\n isAddress,\n} from \"viem\";\nimport { ERC20Abi } from \"../abis/ERC20Abi.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MultiSendAbi } from \"../abis/MultiSendAbi.js\";\nimport {\n PAYMASTER_URL,\n ENTRYPOINT_ADDRESS,\n MULTISEND_ADDR,\n ERC20_APPROVAL_AMOUNT,\n} from \"../constants.js\";\nimport {\n AccountNotConnected,\n IncorrectCallDataForTokenPaymaster,\n} from \"../errors.js\";\nimport type { ZeroDevProvider } from \"../provider.js\";\nimport {\n getGasTokenAddress,\n type UserOperationCallDataWithDelegate,\n} from \"../utils.js\";\nimport { Paymaster } from \"./base.js\";\nimport {\n type PaymasterAndBundlerProviders,\n type PaymasterConfig,\n} from \"./types.js\";\nimport { getChainId } from \"../api/index.js\";\n\nexport class TokenPaymaster extends Paymaster {\n constructor(\n provider: ZeroDevProvider,\n protected paymasterConfig: PaymasterConfig<\"TOKEN_PAYMASTER\">\n ) {\n super(provider);\n }\n async getPaymasterAddress(\n paymasterProvider?: PaymasterAndBundlerProviders\n ): Promise<Hex | undefined> {\n const chainId = await getChainId(this.provider.getProjectId());\n\n try {\n const { data: paymasterResp } = await axios.post(\n `${PAYMASTER_URL}/getPaymasterAddress`,\n {\n chainId,\n entryPointAddress: ENTRYPOINT_ADDRESS,\n paymasterProvider,\n },\n { headers: { \"Content-Type\": \"application/json\" } }\n );\n return paymasterResp as Hex;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n }\n async decodeMainCallFromCallData(\n kernelAddress: PromiseOrValue<string>,\n callData: PromiseOrValue<BytesLike>\n ): Promise<UserOperationCallDataWithDelegate | undefined> {\n let data: Hex = \"0x\";\n if (callData instanceof Promise) {\n const _data = await callData;\n if (_data instanceof Uint8Array) {\n data = toHex(_data);\n } else {\n data = _data as Hex;\n }\n } else if (callData instanceof Uint8Array) {\n data = toHex(callData);\n } else {\n data = callData as Hex;\n }\n\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: data,\n });\n if (functionName === \"execute\") {\n const [target, value, data] = args;\n let msFuntionName;\n try {\n ({ functionName: msFuntionName } = decodeFunctionData({\n abi: MultiSendAbi,\n data,\n }));\n } catch (error) {}\n let mainCall:\n | UserOperationCallData\n | UserOperationCallDataWithDelegate = {\n target,\n value: value ?? 0n,\n data,\n };\n if (msFuntionName === \"multiSend\") {\n mainCall = {\n ...mainCall,\n target: MULTISEND_ADDR,\n delegateCall: true,\n data,\n };\n }\n return mainCall;\n }\n } catch (error) {\n return {\n target: (kernelAddress instanceof Promise\n ? await kernelAddress\n : kernelAddress) as Hex,\n data,\n value: 0n,\n delegateCall: true,\n };\n }\n return;\n }\n\n async getERC20UserOp(\n struct: UserOperationStruct,\n mainCall: UserOperationCallDataWithDelegate,\n gasTokenAddress: Hex,\n paymasterAddress: Hex\n ): Promise<UserOperationStruct | undefined> {\n try {\n const approveData: UserOperationCallData = {\n target: gasTokenAddress,\n value: BigInt(0),\n data: encodeFunctionData({\n abi: ERC20Abi,\n functionName: \"approve\",\n args: [paymasterAddress, ERC20_APPROVAL_AMOUNT[gasTokenAddress]],\n }),\n };\n if (!this.provider.account) {\n throw AccountNotConnected;\n }\n const erc20CallData = await this.provider.account.encodeBatchExecute([\n approveData,\n mainCall,\n ]);\n return {\n ...struct,\n callData: erc20CallData,\n callGasLimit: await this.provider.rpcClient.estimateGas({\n account: ENTRYPOINT_ADDRESS,\n to: await this.provider.getAddress(),\n data: erc20CallData,\n }),\n signature: await this.provider\n .getAccount()\n .getValidator()\n .getDynamicDummySignature(\n (await struct.sender) as Hex,\n erc20CallData\n ),\n };\n } catch (error) {\n return;\n }\n }\n\n async getPaymasterResponse(\n struct: UserOperationStruct,\n paymasterProvider?: PaymasterAndBundlerProviders,\n shouldOverrideFee?: boolean\n ): Promise<UserOperationStruct | undefined> {\n try {\n const mainCall = await this.decodeMainCallFromCallData(\n struct.sender,\n struct.callData\n );\n if (!mainCall) {\n throw IncorrectCallDataForTokenPaymaster;\n }\n const chainId = await getChainId(this.provider.getProjectId());\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const gasTokenAddress = getGasTokenAddress(\n this.paymasterConfig.gasToken,\n chainId\n );\n let paymasterAddress = await this.getPaymasterAddress(paymasterProvider);\n if (\n gasTokenAddress !== undefined &&\n paymasterAddress !== undefined &&\n isAddress(paymasterAddress)\n ) {\n const erc20UserOp = await this.getERC20UserOp(\n struct,\n mainCall,\n gasTokenAddress,\n paymasterAddress\n );\n if (!erc20UserOp) {\n return;\n }\n const paymasterResp = await this.signUserOp({\n userOp: struct,\n callData: struct.callData,\n gasTokenAddress,\n erc20UserOp,\n erc20CallData: erc20UserOp.callData,\n paymasterProvider,\n shouldOverrideFee,\n });\n if (paymasterResp) {\n return paymasterResp;\n }\n }\n } catch (error) {\n console.log(error);\n }\n return;\n }\n}\n"]}
1
+ {"version":3,"file":"token-paymaster.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/paymaster/token-paymaster.ts"],"names":[],"mappings":"AAAA,OAAO,EAMN,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,EACL,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,GACV,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,kCAAkC,GACnC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAGN,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,UAAU,4BAA4B,CAC1C,IAAS;IAET,OAAO,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AACD,MAAM,OAAO,cAAe,SAAQ,SAAS;IAC3C,YACE,QAAyB,EACf,eAAmD;QAE7D,KAAK,CAAC,QAAQ,CAAC,CAAC;QAFhB;;;;mBAAU,eAAe;WAAoC;IAG/D,CAAC;IACD,KAAK,CAAC,mBAAmB,CACvB,iBAAgD;QAEhD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAE/D,IAAI;YACF,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAC9C,GAAG,aAAa,sBAAsB,EACtC;gBACE,OAAO;gBACP,iBAAiB,EAAE,kBAAkB;gBACrC,iBAAiB;aAClB,EACD,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACpD,CAAC;YACF,OAAO,aAAoB,CAAC;SAC7B;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,OAAO,SAAS,CAAC;SAClB;IACH,CAAC;IACD,KAAK,CAAC,0BAA0B,CAC9B,aAAqC,EACrC,QAAmC;QAOnC,IAAI,IAAI,GAAQ,IAAI,CAAC;QACrB,IAAI,QAAQ,YAAY,OAAO,EAAE;YAC/B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC;YAC7B,IAAI,KAAK,YAAY,UAAU,EAAE;gBAC/B,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;aACrB;iBAAM;gBACL,IAAI,GAAG,KAAY,CAAC;aACrB;SACF;aAAM,IAAI,QAAQ,YAAY,UAAU,EAAE;YACzC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;SACxB;aAAM;YACL,IAAI,GAAG,QAAe,CAAC;SACxB;QAED,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC;gBAChD,GAAG,EAAE,gBAAgB;gBACrB,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YACH,IAAI,YAAY,KAAK,SAAS,EAAE;gBAC9B,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;gBACnC,IAAI,aAAa,CAAC;gBAClB,IAAI;oBACF,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAAC;wBACpD,GAAG,EAAE,YAAY;wBACjB,IAAI;qBACL,CAAC,CAAC,CAAC;iBACL;gBAAC,OAAO,KAAK,EAAE,GAAE;gBAClB,IAAI,QAAQ,GAE4B;oBACtC,MAAM;oBACN,KAAK,EAAE,KAAK,IAAI,EAAE;oBAClB,IAAI;iBACL,CAAC;gBACF,IAAI,aAAa,KAAK,WAAW,EAAE;oBACjC,QAAQ,GAAG;wBACT,GAAG,QAAQ;wBACX,MAAM,EAAE,cAAc;wBACtB,YAAY,EAAE,IAAI;wBAClB,IAAI;qBACL,CAAC;iBACH;gBACD,OAAO,QAAQ,CAAC;aACjB;iBAAM,IAAI,YAAY,KAAK,cAAc,EAAE;gBAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACnB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtB,MAAM,EAAE,EAAE,CAAC,EAAE;oBACb,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE;oBACrB,IAAI,EAAE,EAAE,CAAC,IAAI;iBACd,CAAC,CAAC,CAAC;aACL;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO;gBACL,MAAM,EAAE,CAAC,aAAa,YAAY,OAAO;oBACvC,CAAC,CAAC,MAAM,aAAa;oBACrB,CAAC,CAAC,aAAa,CAAQ;gBACzB,IAAI;gBACJ,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,IAAI;aACnB,CAAC;SACH;QACD,OAAO;IACT,CAAC;IAED,KAAK,CAAC,cAAc,CAGlB,MAA2B,EAC3B,QAAW,EACX,eAAoB,EACpB,gBAAqB;QAErB,IAAI;YACF,MAAM,WAAW,GAA0B;gBACzC,MAAM,EAAE,eAAe;gBACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChB,IAAI,EAAE,kBAAkB,CAAC;oBACvB,GAAG,EAAE,QAAQ;oBACb,YAAY,EAAE,SAAS;oBACvB,IAAI,EAAE,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC;iBACjE,CAAC;aACH,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAC1B,MAAM,mBAAmB,CAAC;aAC3B;YAED,IAAI,KAAiC,CAAC;YAEtC,IAAI,4BAA4B,CAAC,QAAQ,CAAC,EAAE;gBAC1C,KAAK,GAAG,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAC;aACpC;iBAAM;gBACL,KAAK,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;aACjC;YACD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAClE,KAAK,CACN,CAAC;YACF,OAAO;gBACL,GAAG,MAAM;gBACT,QAAQ,EAAE,aAAa;gBACvB,YAAY,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC;oBACtD,OAAO,EAAE,kBAAkB;oBAC3B,EAAE,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;oBACpC,IAAI,EAAE,aAAa;iBACpB,CAAC;gBACF,SAAS,EAAE,MAAM,IAAI,CAAC,QAAQ;qBAC3B,UAAU,EAAE;qBACZ,YAAY,EAAE;qBACd,wBAAwB,CACvB,CAAC,MAAM,MAAM,CAAC,MAAM,CAAQ,EAC5B,aAAa,CACd;aACJ,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,OAAO;SACR;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,MAA2B,EAC3B,iBAAgD,EAChD,iBAA2B;QAE3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,0BAA0B,CACpD,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,CAChB,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,kCAAkC,CAAC;SAC1C;QACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;SACtC;QACD,MAAM,eAAe,GAAG,kBAAkB,CACxC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAC7B,OAAO,CACR,CAAC;QACF,IAAI,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QACzE,IACE,eAAe,KAAK,SAAS;YAC7B,gBAAgB,KAAK,SAAS;YAC9B,SAAS,CAAC,gBAAgB,CAAC,EAC3B;YACA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAC3C,MAAM,EACN,QAAQ,EACR,eAAe,EACf,gBAAgB,CACjB,CAAC;YACF,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO;aACR;YACD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;gBAC1C,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,eAAe;gBACf,WAAW;gBACX,aAAa,EAAE,WAAW,CAAC,QAAQ;gBACnC,iBAAiB;gBACjB,iBAAiB;aAClB,CAAC,CAAC;YACH,OAAO,aAAa,CAAC;SACtB;QACD,OAAO;IACT,CAAC;CACF","sourcesContent":["import {\n type PromiseOrValue,\n type BytesLike,\n type UserOperationCallData,\n type UserOperationStruct,\n type BatchUserOperationCallData,\n} from \"@alchemy/aa-core\";\nimport axios from \"axios\";\nimport {\n type Hex,\n toHex,\n decodeFunctionData,\n encodeFunctionData,\n isAddress,\n} from \"viem\";\nimport { ERC20Abi } from \"../abis/ERC20Abi.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport {\n PAYMASTER_URL,\n ENTRYPOINT_ADDRESS,\n ERC20_APPROVAL_AMOUNT,\n MULTISEND_ADDR,\n} from \"../constants.js\";\nimport {\n AccountNotConnected,\n IncorrectCallDataForTokenPaymaster,\n} from \"../errors.js\";\nimport type { ZeroDevProvider } from \"../provider.js\";\nimport {\n getGasTokenAddress,\n type UserOperationCallDataWithDelegate,\n} from \"../utils.js\";\nimport { Paymaster } from \"./base.js\";\nimport {\n type PaymasterAndBundlerProviders,\n type PaymasterConfig,\n} from \"./types.js\";\nimport { getChainId } from \"../api/index.js\";\nimport { MultiSendAbi } from \"../abis/MultiSendAbi.js\";\n\nexport function isBatchUserOperationCallData(\n data: any\n): data is BatchUserOperationCallData {\n return data && Array.isArray(data);\n}\nexport class TokenPaymaster extends Paymaster {\n constructor(\n provider: ZeroDevProvider,\n protected paymasterConfig: PaymasterConfig<\"TOKEN_PAYMASTER\">\n ) {\n super(provider);\n }\n async getPaymasterAddress(\n paymasterProvider?: PaymasterAndBundlerProviders\n ): Promise<Hex | undefined> {\n const chainId = await getChainId(this.provider.getProjectId());\n\n try {\n const { data: paymasterResp } = await axios.post(\n `${PAYMASTER_URL}/getPaymasterAddress`,\n {\n chainId,\n entryPointAddress: ENTRYPOINT_ADDRESS,\n paymasterProvider,\n },\n { headers: { \"Content-Type\": \"application/json\" } }\n );\n return paymasterResp as Hex;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n }\n async decodeMainCallFromCallData(\n kernelAddress: PromiseOrValue<string>,\n callData: PromiseOrValue<BytesLike>\n ): Promise<\n | UserOperationCallData\n | BatchUserOperationCallData\n | UserOperationCallDataWithDelegate\n | undefined\n > {\n let data: Hex = \"0x\";\n if (callData instanceof Promise) {\n const _data = await callData;\n if (_data instanceof Uint8Array) {\n data = toHex(_data);\n } else {\n data = _data as Hex;\n }\n } else if (callData instanceof Uint8Array) {\n data = toHex(callData);\n } else {\n data = callData as Hex;\n }\n\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: data,\n });\n if (functionName === \"execute\") {\n const [target, value, data] = args;\n let msFuntionName;\n try {\n ({ functionName: msFuntionName } = decodeFunctionData({\n abi: MultiSendAbi,\n data,\n }));\n } catch (error) {}\n let mainCall:\n | UserOperationCallData\n | UserOperationCallDataWithDelegate = {\n target,\n value: value ?? 0n,\n data,\n };\n if (msFuntionName === \"multiSend\") {\n mainCall = {\n ...mainCall,\n target: MULTISEND_ADDR,\n delegateCall: true,\n data,\n };\n }\n return mainCall;\n } else if (functionName === \"executeBatch\") {\n const [txs] = args;\n return txs.map((tx) => ({\n target: tx.to,\n value: tx.value ?? 0n,\n data: tx.data,\n }));\n }\n } catch (error) {\n return {\n target: (kernelAddress instanceof Promise\n ? await kernelAddress\n : kernelAddress) as Hex,\n data,\n value: 0n,\n delegateCall: true,\n };\n }\n return;\n }\n\n async getERC20UserOp<\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n struct: UserOperationStruct,\n mainCall: T,\n gasTokenAddress: Hex,\n paymasterAddress: Hex\n ): Promise<UserOperationStruct | undefined> {\n try {\n const approveData: UserOperationCallData = {\n target: gasTokenAddress,\n value: BigInt(0),\n data: encodeFunctionData({\n abi: ERC20Abi,\n functionName: \"approve\",\n args: [paymasterAddress, ERC20_APPROVAL_AMOUNT[gasTokenAddress]],\n }),\n };\n if (!this.provider.account) {\n throw AccountNotConnected;\n }\n\n let calls: BatchUserOperationCallData;\n\n if (isBatchUserOperationCallData(mainCall)) {\n calls = [approveData, ...mainCall];\n } else {\n calls = [approveData, mainCall];\n }\n const erc20CallData = await this.provider.account.encodeBatchExecute(\n calls\n );\n return {\n ...struct,\n callData: erc20CallData,\n callGasLimit: await this.provider.rpcClient.estimateGas({\n account: ENTRYPOINT_ADDRESS,\n to: await this.provider.getAddress(),\n data: erc20CallData,\n }),\n signature: await this.provider\n .getAccount()\n .getValidator()\n .getDynamicDummySignature(\n (await struct.sender) as Hex,\n erc20CallData\n ),\n };\n } catch (error) {\n return;\n }\n }\n\n async getPaymasterResponse(\n struct: UserOperationStruct,\n paymasterProvider?: PaymasterAndBundlerProviders,\n shouldOverrideFee?: boolean\n ): Promise<UserOperationStruct | undefined> {\n const mainCall = await this.decodeMainCallFromCallData(\n struct.sender,\n struct.callData\n );\n if (!mainCall) {\n throw IncorrectCallDataForTokenPaymaster;\n }\n const chainId = await getChainId(this.provider.getProjectId());\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const gasTokenAddress = getGasTokenAddress(\n this.paymasterConfig.gasToken,\n chainId\n );\n let paymasterAddress = await this.getPaymasterAddress(paymasterProvider);\n if (\n gasTokenAddress !== undefined &&\n paymasterAddress !== undefined &&\n isAddress(paymasterAddress)\n ) {\n const erc20UserOp = await this.getERC20UserOp(\n struct,\n mainCall,\n gasTokenAddress,\n paymasterAddress\n );\n if (!erc20UserOp) {\n return;\n }\n const paymasterResp = await this.signUserOp({\n userOp: struct,\n callData: struct.callData,\n gasTokenAddress,\n erc20UserOp,\n erc20CallData: erc20UserOp.callData,\n paymasterProvider,\n shouldOverrideFee,\n });\n return paymasterResp;\n }\n return;\n }\n}\n"]}
@@ -5,21 +5,13 @@ export class VerifyingPaymaster extends Paymaster {
5
5
  super(provider);
6
6
  }
7
7
  async getPaymasterResponse(struct, paymasterProvider, shouldOverrideFee) {
8
- try {
9
- const hexifiedUserOp = deepHexlify(await resolveProperties(struct));
10
- const paymasterResp = await this.signUserOp({
11
- userOp: hexifiedUserOp,
12
- paymasterProvider,
13
- shouldOverrideFee,
14
- });
15
- if (paymasterResp) {
16
- return paymasterResp;
17
- }
18
- }
19
- catch (error) {
20
- console.log(error);
21
- }
22
- return;
8
+ const hexifiedUserOp = deepHexlify(await resolveProperties(struct));
9
+ const paymasterResp = await this.signUserOp({
10
+ userOp: hexifiedUserOp,
11
+ paymasterProvider,
12
+ shouldOverrideFee,
13
+ });
14
+ return paymasterResp;
23
15
  }
24
16
  }
25
17
  //# sourceMappingURL=verifying-paymaster.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifying-paymaster.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/paymaster/verifying-paymaster.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC/C,YACE,QAAyB,EACzB,CAAyC;QAEzC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,oBAAoB,CACxB,MAA2B,EAC3B,iBAAgD,EAChD,iBAA2B;QAE3B,IAAI;YACF,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;YACpE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;gBAC1C,MAAM,EAAE,cAAc;gBACtB,iBAAiB;gBACjB,iBAAiB;aAClB,CAAC,CAAC;YACH,IAAI,aAAa,EAAE;gBACjB,OAAO,aAAa,CAAC;aACtB;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACpB;QACD,OAAO;IACT,CAAC;CACF","sourcesContent":["import {\n type UserOperationStruct,\n deepHexlify,\n resolveProperties,\n} from \"@alchemy/aa-core\";\nimport { Paymaster } from \"./base.js\";\nimport type { ZeroDevProvider } from \"../provider.js\";\nimport type { PaymasterAndBundlerProviders, PaymasterConfig } from \"./types.js\";\n\nexport class VerifyingPaymaster extends Paymaster {\n constructor(\n provider: ZeroDevProvider,\n _: PaymasterConfig<\"VERIFYING_PAYMASTER\">\n ) {\n super(provider);\n }\n async getPaymasterResponse(\n struct: UserOperationStruct,\n paymasterProvider?: PaymasterAndBundlerProviders,\n shouldOverrideFee?: boolean\n ): Promise<UserOperationStruct | undefined> {\n try {\n const hexifiedUserOp = deepHexlify(await resolveProperties(struct));\n const paymasterResp = await this.signUserOp({\n userOp: hexifiedUserOp,\n paymasterProvider,\n shouldOverrideFee,\n });\n if (paymasterResp) {\n return paymasterResp;\n }\n } catch (error) {\n console.log(error);\n }\n return;\n }\n}\n"]}
1
+ {"version":3,"file":"verifying-paymaster.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/paymaster/verifying-paymaster.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC/C,YACE,QAAyB,EACzB,CAAyC;QAEzC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,oBAAoB,CACxB,MAA2B,EAC3B,iBAAgD,EAChD,iBAA2B;QAE3B,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YAC1C,MAAM,EAAE,cAAc;YACtB,iBAAiB;YACjB,iBAAiB;SAClB,CAAC,CAAC;QACH,OAAO,aAAa,CAAC;IACvB,CAAC;CACF","sourcesContent":["import {\n type UserOperationStruct,\n deepHexlify,\n resolveProperties,\n} from \"@alchemy/aa-core\";\nimport { Paymaster } from \"./base.js\";\nimport type { ZeroDevProvider } from \"../provider.js\";\nimport type { PaymasterAndBundlerProviders, PaymasterConfig } from \"./types.js\";\n\nexport class VerifyingPaymaster extends Paymaster {\n constructor(\n provider: ZeroDevProvider,\n _: PaymasterConfig<\"VERIFYING_PAYMASTER\">\n ) {\n super(provider);\n }\n async getPaymasterResponse(\n struct: UserOperationStruct,\n paymasterProvider?: PaymasterAndBundlerProviders,\n shouldOverrideFee?: boolean\n ): Promise<UserOperationStruct | undefined> {\n const hexifiedUserOp = deepHexlify(await resolveProperties(struct));\n const paymasterResp = await this.signUserOp({\n userOp: hexifiedUserOp,\n paymasterProvider,\n shouldOverrideFee,\n });\n return paymasterResp;\n }\n}\n"]}
@@ -171,8 +171,7 @@ export class ZeroDevProvider extends SmartAccountProvider {
171
171
  configurable: true,
172
172
  writable: true,
173
173
  value: async (struct) => {
174
- struct.paymasterAndData =
175
- "0xfe7dbcab8aaee4eb67943c1e6be95b1d065985c6000000000000000000000000000000000000000000000000000001869aa31cf400000000000000000000000000000000000000000000000000000000000000007dfe2190f34af27b265bae608717cdc9368b471fc0c097ab7b4088f255b4961e57b039e7e571b15221081c5dce7bcb93459b27a3ab65d2f8a889f4a40b4022801b";
174
+ struct.paymasterAndData = "0x";
176
175
  return struct;
177
176
  }
178
177
  });
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,GAOR,MAAM,MAAM,CAAC;AACd,OAAO,EACL,WAAW,EACX,iBAAiB,EAEjB,QAAQ,EAIR,SAAS,EACT,cAAc,EAGd,oBAAoB,GAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,iCAAiC,EACjC,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAoB7E,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,yCAAQ,CAAA;IACR,yDAAgB,CAAA;AAClB,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB;AAQD,MAAM,OAAO,eAAgB,SAAQ,oBAAmC;IAKtE,YAAY,EACV,SAAS,EACT,KAAK,EACL,iBAAiB,GAAG,kBAAkB,EACtC,MAAM,GAAG,WAAW,EACpB,OAAO,EACP,eAAe,EACf,IAAI,GACkB;QACtB,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACnE,MAAM,SAAS,GAAG,gCAAgC,CAAC;YACjD,KAAK,EAAE,MAAM;YACb,MAAM;YACN,SAAS;YACT,eAAe;SAChB,CAAC,CAAC;QAEH,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE;YACnD,GAAG,IAAI;YACP,YAAY,EAAE,IAAI,EAAE,YAAY,IAAI,EAAE;YACtC,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,IAAI,KAAK;YACnD,oBAAoB,EAClB,IAAI,EAAE,oBAAoB;gBAC1B,4BAA4B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAC;QA5BK;;;;;WAAkB;QAClB;;;;;WAAyB;QACzB;;;;;WAA8B;QAqCxC;;;;mBAAe,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS;WAAC;QAE5C;;;;mBAAkB,KAAK,EACrB,OAA8B,EAC9B,YAA6D,SAAS,CAAC,IAAI,EAC5D,EAAE;gBACjB,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;oBACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;iBACtD;gBAED,MAAM,SAAS,GAA2B,EAAE,CAAC;gBAC7C,IAAI,OAAO,CAAC,YAAY,EAAE;oBACxB,SAAS,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;iBAC/C;gBACD,IAAI,OAAO,CAAC,oBAAoB,EAAE;oBAChC,SAAS,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;iBAC/D;gBAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAC3C;oBACE,MAAM,EAAE,OAAO,CAAC,EAAE;oBAClB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;oBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;iBAC7D,EACD,SAAS,EACT,SAAS,CACV,CAAC;gBAEF,OAAO,MAAM,IAAI,CAAC,+BAA+B,CAAC,IAAY,CAAC,CAAC;YAClE,CAAC;WAAC;QAEF;;;;mBAAoB,KAAK,EAGvB,IAAO,EACP,SAAkC,EAClC,YAAyC,SAAS,CAAC,IAAmC,EACpD,EAAE;gBACpC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;iBAC3C;gBACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;oBAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;iBAC7C;gBAED,IAAI,QAAQ,GAAc,IAAI,CAAC;gBAE/B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACvB,IAAI,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE;wBAChC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;qBACxD;yBAAM;wBACL,MAAM,gBAAgB,CAAC;qBACxB;iBACF;qBAAM,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACxC,IAAI,SAAS,KAAK,SAAS,CAAC,YAAY,EAAE;wBACxC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACjD,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,KAAK,IAAI,EAAE,EAChB,IAAI,CAAC,IAAI,CACV,CAAC;qBACH;yBAAM,IAAI,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE;wBACvC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CACzC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,KAAK,IAAI,EAAE,EAChB,IAAI,CAAC,IAAI,CACV,CAAC;qBACH;yBAAM;wBACL,MAAM,gBAAgB,CAAC;qBACxB;iBACF;qBAAM;oBACL,MAAM,gBAAgB,CAAC;iBACxB;gBAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAClD,IAAI,IAAI,GAAW,EAAE,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5C,IAAI,QAA6B,CAAC;gBAClC,IAAI,OAA4B,CAAC;gBACjC,IAAI,YAAY,EAAE,oBAAoB,CAAC;gBACvC,GAAG;oBACD,QAAQ,GAAG,MAAM,SAAS,CACxB,IAAI,CAAC,4BAA4B,EACjC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,uBAAuB,EAC5B,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,gBAAgB,IAAI,cAAc,EACvC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC,CAChD,CAAC;wBACA,QAAQ;wBACR,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE;wBACzB,KAAK;wBACL,QAAQ;wBACR,SAAS,EAAE,MAAM,IAAI,CAAC,OAAO;6BAC1B,YAAY,EAAE;6BACd,wBAAwB,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,QAAe,CAAC;wBACrE,YAAY;wBACZ,oBAAoB;qBACE,CAAC,CAAC;oBAC1B,OAAO,GAAG,WAAW,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAEzD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;wBAE5B,MAAM,IAAI,KAAK,CACb,yFAAyF,IAAI,CAAC,SAAS,CACrG,OAAO,EACP,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;qBACH;oBAED,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;oBAE7B,OAAO,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;oBACvE,IAAI;wBACF,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAC3C,OAAO,EACP,IAAI,CAAC,iBAAiB,CACvB,CAAC;qBACH;oBAAC,OAAO,KAAU,EAAE;wBACnB,IAAI,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE;4BACnE,YAAY,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;4BAC5D,oBAAoB;gCAClB,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;4BAEvD,OAAO,CAAC,GAAG,CACT,SACE,IAAI,CAAC,qBAAqB,GAAG,KAC/B,iEAAiE,YAAY,2BAA2B,oBAAoB,EAAE,CAC/H,CAAC;4BACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAChD,CAAC;4BACF,SAAS;yBACV;wBACD,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;qBAC/B;iBACF,QAAQ,IAAI,KAAK,EAAE,EAAE;gBAEtB,OAAO;oBACL,IAAI;oBACJ,OAAO;iBACR,CAAC;YACJ,CAAC;WAAC;QAsCF;;;;mBAA+C,GAAG,EAAE;gBAClD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAClC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;iBAC3C;gBACD,OAAO,IAAI,CAAC,OAAO,CAAC;YACtB,CAAC;WAAC;QAEF;;;;mBAAoD,KAAK,EACvD,MAA2B,EACG,EAAE;gBAChC,MAAM,CAAC,gBAAgB;oBACrB,8SAA8S,CAAC;gBACjT,OAAO,MAAM,CAAC;YAChB,CAAC;WAAC;QAYF;;;;mBAAsE,KAAK,EACzE,IAAI,EACJ,EAAE;gBACF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;gBAChC,QAAQ,MAAM,EAAE;oBACd,KAAK,aAAa;wBAChB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,KAAK,qBAAqB;wBACxB,MAAM,CAAC,EAAE,CAAC,GAAG,MAAiC,CAAC;wBAC/C,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;oBAClC,KAAK,sBAAsB;wBAEzB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnD,KAAK,eAAe;wBAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;4BACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;yBAC3C;wBACD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,MAAO,CAAC;wBAChC,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE;4BACrE,MAAM,IAAI,KAAK,CACb,yDAAyD,CAC1D,CAAC;yBACH;wBAED,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAChD;wBAEE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBACvC;YACH,CAAC;WAAC;QArPA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,gBAAgB;YACnB,IAAI,EAAE,gBAAgB,IAAI,2BAA2B,CAAC;QACxD,IAAI,CAAC,qBAAqB;YACxB,IAAI,EAAE,qBAAqB,IAAI,iCAAiC,CAAC;QAEnE,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAoJD,oBAAoB,CAAC,OAAY;QAC/B,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE;YACzB,MAAM,eAAe,GAAuB,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;YACpE,OAAO,CACL,CAAC,eAAe,EAAE,QAAQ,CACxB,oEAAoE,CACrE;gBACC,eAAe,EAAE,KAAK,CAAC,8BAA8B,CAAC,KAAK,IAAI,CAAC;gBAClE,KAAK,CACN,CAAC;SACH;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,OAAY;QACtB,IAAI,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE;YAC1B,IAAI,aAAa,GAAW,EAAE,CAAC;YAC/B,IAAI,eAAe,GAAuB,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;YAClE,IAAI,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;gBAElD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC1D,IAAI,OAAO,IAAI,IAAI,EAAE;oBACnB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACpC,aAAa,GAAG,uBAAuB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;oBACnD,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;iBAC5B;aACF;YACD,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,+DAA+D,eAAe,IAAI,aAAa,EAAE,CAClG,CAAC;YACF,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC5B,OAAO,KAAK,CAAC;SACd;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAiBD,2BAA2B,CAAC,MAAwC;QAClE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACvB,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;SACH;QAED,OAAO,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;CAgCF","sourcesContent":["import {\n fromHex,\n type Address,\n type Chain,\n type Hash,\n type Hex,\n type HttpTransport,\n type RpcTransactionRequest,\n} from \"viem\";\nimport {\n deepHexlify,\n resolveProperties,\n type SmartAccountProviderOpts,\n getChain,\n type UserOperationCallData,\n type BatchUserOperationCallData,\n type SendUserOperationResult,\n asyncPipe,\n noOpMiddleware,\n type UserOperationStruct,\n type BytesLike,\n SmartAccountProvider,\n type AccountMiddlewareFn,\n type UserOperationOverrides,\n} from \"@alchemy/aa-core\";\nimport {\n BUNDLER_URL,\n DEFAULT_SEND_TX_MAX_RETRIES,\n DEFAULT_SEND_TX_RETRY_INTERVAL_MS,\n ENTRYPOINT_ADDRESS,\n minPriorityFeePerBidDefaults,\n} from \"./constants.js\";\nimport { KernelSmartContractAccount, isKernelAccount } from \"./account.js\";\nimport { withZeroDevGasEstimator } from \"./middleware/gas-estimator.js\";\nimport { isValidRequest } from \"./utils/ERC4337-utils.js\";\nimport { InvalidOperation } from \"./errors.js\";\nimport { withZeroDevPaymasterAndData } from \"./middleware/paymaster.js\";\nimport { createZeroDevPublicErc4337Client } from \"./client/create-client.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"./paymaster/types.js\";\n\nexport type ZeroDevProviderConfig = {\n projectId: string;\n chain: Chain | number;\n entryPointAddress?: Address;\n rpcUrl?: string;\n account?: KernelSmartContractAccount;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: SmartAccountProviderOpts & {\n sendTxMaxRetries?: number;\n sendTxRetryIntervalMs?: number;\n };\n};\n\nexport enum Operation {\n Call = 0,\n DelegateCall = 1,\n}\n\ntype UserOpDataOperationTypes<T> = T extends UserOperationCallData\n ? Operation.Call | Operation.DelegateCall\n : T extends BatchUserOperationCallData\n ? Operation.Call\n : never;\n\nexport class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {\n protected projectId: string;\n protected sendTxMaxRetries: number;\n protected sendTxRetryIntervalMs: number;\n\n constructor({\n projectId,\n chain,\n entryPointAddress = ENTRYPOINT_ADDRESS,\n rpcUrl = BUNDLER_URL,\n account,\n bundlerProvider,\n opts,\n }: ZeroDevProviderConfig) {\n const _chain = typeof chain === \"number\" ? getChain(chain) : chain;\n const rpcClient = createZeroDevPublicErc4337Client({\n chain: _chain,\n rpcUrl,\n projectId,\n bundlerProvider,\n });\n\n super(rpcClient, entryPointAddress, _chain, account, {\n ...opts,\n txMaxRetries: opts?.txMaxRetries ?? 10,\n txRetryIntervalMs: opts?.txRetryIntervalMs ?? 10000,\n minPriorityFeePerBid:\n opts?.minPriorityFeePerBid ??\n minPriorityFeePerBidDefaults.get(_chain.id),\n });\n\n this.projectId = projectId;\n this.sendTxMaxRetries =\n opts?.sendTxMaxRetries ?? DEFAULT_SEND_TX_MAX_RETRIES;\n this.sendTxRetryIntervalMs =\n opts?.sendTxRetryIntervalMs ?? DEFAULT_SEND_TX_RETRY_INTERVAL_MS;\n\n withZeroDevGasEstimator(this);\n }\n\n getProjectId = (): string => this.projectId;\n\n sendTransaction = async (\n request: RpcTransactionRequest,\n operation: UserOpDataOperationTypes<UserOperationCallData> = Operation.Call\n ): Promise<Hash> => {\n if (!request.to) {\n throw new Error(\"transaction is missing to address\");\n }\n\n const overrides: UserOperationOverrides = {};\n if (request.maxFeePerGas) {\n overrides.maxFeePerGas = request.maxFeePerGas;\n }\n if (request.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = request.maxPriorityFeePerGas;\n }\n\n const { hash } = await this.sendUserOperation(\n {\n target: request.to,\n data: request.data ?? \"0x\",\n value: request.value ? fromHex(request.value, \"bigint\") : 0n,\n },\n overrides,\n operation\n );\n\n return await this.waitForUserOperationTransaction(hash as Hash);\n };\n\n sendUserOperation = async <\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n data: T,\n overrides?: UserOperationOverrides,\n operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>\n ): Promise<SendUserOperationResult> => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n if (!this.account.validator) {\n throw new Error(\"validator not connected!\");\n }\n\n let callData: BytesLike = \"0x\";\n\n if (Array.isArray(data)) {\n if (operation === Operation.Call) {\n callData = await this.account.encodeBatchExecute(data);\n } else {\n throw InvalidOperation;\n }\n } else if (isKernelAccount(this.account)) {\n if (operation === Operation.DelegateCall) {\n callData = await this.account.encodeExecuteDelegate(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else if (operation === Operation.Call) {\n callData = await this.account.encodeExecute(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else {\n throw InvalidOperation;\n }\n } else {\n throw InvalidOperation;\n }\n\n const initCode = await this.account.getInitCode();\n let hash: string = \"\";\n let i = 0;\n const nonce = await this.account.getNonce();\n let uoStruct: UserOperationStruct;\n let request: UserOperationStruct;\n let maxFeePerGas, maxPriorityFeePerGas;\n do {\n uoStruct = await asyncPipe(\n this.dummyPaymasterDataMiddleware,\n this.feeDataGetter,\n this.paymasterDataMiddleware,\n this.gasEstimator,\n this.customMiddleware ?? noOpMiddleware,\n async (struct) => ({ ...struct, ...overrides })\n )({\n initCode,\n sender: this.getAddress(),\n nonce,\n callData,\n signature: await this.account\n .getValidator()\n .getDynamicDummySignature(await this.getAddress(), callData as Hex),\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as UserOperationStruct);\n request = deepHexlify(await resolveProperties(uoStruct));\n\n if (!isValidRequest(request)) {\n // this pretty prints the uo\n throw new Error(\n `Request is missing parameters. All properties on UserOperationStruct must be set. uo: ${JSON.stringify(\n request,\n null,\n 2\n )}`\n );\n }\n\n this.account.approvePlugin();\n\n request.signature = await this.account.validator.getSignature(request);\n try {\n hash = await this.rpcClient.sendUserOperation(\n request,\n this.entryPointAddress\n );\n } catch (error: any) {\n if (this.isReplacementOpError(error) && i++ < this.sendTxMaxRetries) {\n maxFeePerGas = (BigInt(request.maxFeePerGas) * 113n) / 100n;\n maxPriorityFeePerGas =\n (BigInt(request.maxPriorityFeePerGas) * 113n) / 100n;\n\n console.log(\n `After ${\n this.sendTxRetryIntervalMs / 60000\n } minutes, resending tx with Increased Gas fees: maxFeePerGas: ${maxFeePerGas}, maxPriorityFeePerGas: ${maxPriorityFeePerGas}`\n );\n await new Promise((resolve) =>\n setTimeout(resolve, this.sendTxRetryIntervalMs)\n );\n continue;\n }\n throw this.unwrapError(error);\n }\n } while (hash === \"\");\n\n return {\n hash,\n request,\n };\n };\n\n isReplacementOpError(errorIn: any): boolean {\n if (errorIn.cause != null) {\n const failedOpMessage: string | undefined = errorIn?.cause?.message;\n return (\n (failedOpMessage?.includes(\n \"replacement op must increase maxFeePerGas and MaxPriorityFeePerGas\"\n ) ||\n failedOpMessage?.match(/.*replacement.*underpriced.*/) !== null) ??\n false\n );\n }\n return false;\n }\n\n unwrapError(errorIn: any): Error {\n if (errorIn?.cause != null) {\n let paymasterInfo: string = \"\";\n let failedOpMessage: string | undefined = errorIn?.cause?.message;\n if (failedOpMessage?.includes(\"FailedOp\") === true) {\n // TODO: better error extraction methods will be needed\n const matched = failedOpMessage.match(/FailedOp\\((.*)\\)/);\n if (matched != null) {\n const split = matched[1].split(\",\");\n paymasterInfo = `(paymaster address: ${split[1]})`;\n failedOpMessage = split[2];\n }\n }\n const error = new Error(\n `The bundler has failed to include UserOperation in a batch: ${failedOpMessage} ${paymasterInfo}`\n );\n error.stack = errorIn.stack;\n return error;\n }\n return errorIn;\n }\n\n getAccount: () => KernelSmartContractAccount = () => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n return this.account;\n };\n\n dummyPaymasterDataMiddleware: AccountMiddlewareFn = async (\n struct: UserOperationStruct\n ): Promise<UserOperationStruct> => {\n struct.paymasterAndData =\n \"0xfe7dbcab8aaee4eb67943c1e6be95b1d065985c6000000000000000000000000000000000000000000000000000001869aa31cf400000000000000000000000000000000000000000000000000000000000000007dfe2190f34af27b265bae608717cdc9368b471fc0c097ab7b4088f255b4961e57b039e7e571b15221081c5dce7bcb93459b27a3ab65d2f8a889f4a40b4022801b\";\n return struct;\n };\n\n withZeroDevPaymasterAndData(config: PaymasterConfig<PaymasterPolicy>) {\n if (!this.isConnected()) {\n throw new Error(\n \"ZeroDevProvider: account is not set, did you call `connect` first?\"\n );\n }\n\n return withZeroDevPaymasterAndData(this, config);\n }\n\n request: (args: { method: string; params?: any[] }) => Promise<any> = async (\n args\n ) => {\n const { method, params } = args;\n switch (method) {\n case \"eth_chainId\":\n return this.chain.id;\n case \"eth_sendTransaction\":\n const [tx] = params as [RpcTransactionRequest];\n return this.sendTransaction(tx);\n case \"eth_signTypedData_v4\":\n //@ts-expect-error\n return this.signTypedData(JSON.parse(params[1]));\n case \"personal_sign\":\n if (!this.account) {\n throw new Error(\"account not connected!\");\n }\n const [data, address] = params!;\n if (address.toLowerCase() !== (await this.getAddress()).toLowerCase()) {\n throw new Error(\n \"cannot sign for address that is not the current account\"\n );\n }\n // @ts-ignore\n return this.account.signMessageWith6492(data);\n default:\n // @ts-ignore\n return this.rpcClient.request(args);\n }\n };\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n fromHex,\n type Address,\n type Chain,\n type Hash,\n type Hex,\n type HttpTransport,\n type RpcTransactionRequest,\n} from \"viem\";\nimport {\n deepHexlify,\n resolveProperties,\n type SmartAccountProviderOpts,\n getChain,\n type UserOperationCallData,\n type BatchUserOperationCallData,\n type SendUserOperationResult,\n asyncPipe,\n noOpMiddleware,\n type UserOperationStruct,\n type BytesLike,\n SmartAccountProvider,\n type AccountMiddlewareFn,\n type UserOperationOverrides,\n} from \"@alchemy/aa-core\";\nimport {\n BUNDLER_URL,\n DEFAULT_SEND_TX_MAX_RETRIES,\n DEFAULT_SEND_TX_RETRY_INTERVAL_MS,\n ENTRYPOINT_ADDRESS,\n minPriorityFeePerBidDefaults,\n} from \"./constants.js\";\nimport { KernelSmartContractAccount, isKernelAccount } from \"./account.js\";\nimport { withZeroDevGasEstimator } from \"./middleware/gas-estimator.js\";\nimport { isValidRequest } from \"./utils/ERC4337-utils.js\";\nimport { InvalidOperation } from \"./errors.js\";\nimport { withZeroDevPaymasterAndData } from \"./middleware/paymaster.js\";\nimport { createZeroDevPublicErc4337Client } from \"./client/create-client.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"./paymaster/types.js\";\n\nexport type ZeroDevProviderConfig = {\n projectId: string;\n chain: Chain | number;\n entryPointAddress?: Address;\n rpcUrl?: string;\n account?: KernelSmartContractAccount;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: SmartAccountProviderOpts & {\n sendTxMaxRetries?: number;\n sendTxRetryIntervalMs?: number;\n };\n};\n\nexport enum Operation {\n Call = 0,\n DelegateCall = 1,\n}\n\ntype UserOpDataOperationTypes<T> = T extends UserOperationCallData\n ? Operation.Call | Operation.DelegateCall\n : T extends BatchUserOperationCallData\n ? Operation.Call\n : never;\n\nexport class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {\n protected projectId: string;\n protected sendTxMaxRetries: number;\n protected sendTxRetryIntervalMs: number;\n\n constructor({\n projectId,\n chain,\n entryPointAddress = ENTRYPOINT_ADDRESS,\n rpcUrl = BUNDLER_URL,\n account,\n bundlerProvider,\n opts,\n }: ZeroDevProviderConfig) {\n const _chain = typeof chain === \"number\" ? getChain(chain) : chain;\n const rpcClient = createZeroDevPublicErc4337Client({\n chain: _chain,\n rpcUrl,\n projectId,\n bundlerProvider,\n });\n\n super(rpcClient, entryPointAddress, _chain, account, {\n ...opts,\n txMaxRetries: opts?.txMaxRetries ?? 10,\n txRetryIntervalMs: opts?.txRetryIntervalMs ?? 10000,\n minPriorityFeePerBid:\n opts?.minPriorityFeePerBid ??\n minPriorityFeePerBidDefaults.get(_chain.id),\n });\n\n this.projectId = projectId;\n this.sendTxMaxRetries =\n opts?.sendTxMaxRetries ?? DEFAULT_SEND_TX_MAX_RETRIES;\n this.sendTxRetryIntervalMs =\n opts?.sendTxRetryIntervalMs ?? DEFAULT_SEND_TX_RETRY_INTERVAL_MS;\n\n withZeroDevGasEstimator(this);\n }\n\n getProjectId = (): string => this.projectId;\n\n sendTransaction = async (\n request: RpcTransactionRequest,\n operation: UserOpDataOperationTypes<UserOperationCallData> = Operation.Call\n ): Promise<Hash> => {\n if (!request.to) {\n throw new Error(\"transaction is missing to address\");\n }\n\n const overrides: UserOperationOverrides = {};\n if (request.maxFeePerGas) {\n overrides.maxFeePerGas = request.maxFeePerGas;\n }\n if (request.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = request.maxPriorityFeePerGas;\n }\n\n const { hash } = await this.sendUserOperation(\n {\n target: request.to,\n data: request.data ?? \"0x\",\n value: request.value ? fromHex(request.value, \"bigint\") : 0n,\n },\n overrides,\n operation\n );\n\n return await this.waitForUserOperationTransaction(hash as Hash);\n };\n\n sendUserOperation = async <\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n data: T,\n overrides?: UserOperationOverrides,\n operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>\n ): Promise<SendUserOperationResult> => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n if (!this.account.validator) {\n throw new Error(\"validator not connected!\");\n }\n\n let callData: BytesLike = \"0x\";\n\n if (Array.isArray(data)) {\n if (operation === Operation.Call) {\n callData = await this.account.encodeBatchExecute(data);\n } else {\n throw InvalidOperation;\n }\n } else if (isKernelAccount(this.account)) {\n if (operation === Operation.DelegateCall) {\n callData = await this.account.encodeExecuteDelegate(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else if (operation === Operation.Call) {\n callData = await this.account.encodeExecute(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else {\n throw InvalidOperation;\n }\n } else {\n throw InvalidOperation;\n }\n\n const initCode = await this.account.getInitCode();\n let hash: string = \"\";\n let i = 0;\n const nonce = await this.account.getNonce();\n let uoStruct: UserOperationStruct;\n let request: UserOperationStruct;\n let maxFeePerGas, maxPriorityFeePerGas;\n do {\n uoStruct = await asyncPipe(\n this.dummyPaymasterDataMiddleware,\n this.feeDataGetter,\n this.paymasterDataMiddleware,\n this.gasEstimator,\n this.customMiddleware ?? noOpMiddleware,\n async (struct) => ({ ...struct, ...overrides })\n )({\n initCode,\n sender: this.getAddress(),\n nonce,\n callData,\n signature: await this.account\n .getValidator()\n .getDynamicDummySignature(await this.getAddress(), callData as Hex),\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as UserOperationStruct);\n request = deepHexlify(await resolveProperties(uoStruct));\n\n if (!isValidRequest(request)) {\n // this pretty prints the uo\n throw new Error(\n `Request is missing parameters. All properties on UserOperationStruct must be set. uo: ${JSON.stringify(\n request,\n null,\n 2\n )}`\n );\n }\n\n this.account.approvePlugin();\n\n request.signature = await this.account.validator.getSignature(request);\n try {\n hash = await this.rpcClient.sendUserOperation(\n request,\n this.entryPointAddress\n );\n } catch (error: any) {\n if (this.isReplacementOpError(error) && i++ < this.sendTxMaxRetries) {\n maxFeePerGas = (BigInt(request.maxFeePerGas) * 113n) / 100n;\n maxPriorityFeePerGas =\n (BigInt(request.maxPriorityFeePerGas) * 113n) / 100n;\n\n console.log(\n `After ${\n this.sendTxRetryIntervalMs / 60000\n } minutes, resending tx with Increased Gas fees: maxFeePerGas: ${maxFeePerGas}, maxPriorityFeePerGas: ${maxPriorityFeePerGas}`\n );\n await new Promise((resolve) =>\n setTimeout(resolve, this.sendTxRetryIntervalMs)\n );\n continue;\n }\n throw this.unwrapError(error);\n }\n } while (hash === \"\");\n\n return {\n hash,\n request,\n };\n };\n\n isReplacementOpError(errorIn: any): boolean {\n if (errorIn.cause != null) {\n const failedOpMessage: string | undefined = errorIn?.cause?.message;\n return (\n (failedOpMessage?.includes(\n \"replacement op must increase maxFeePerGas and MaxPriorityFeePerGas\"\n ) ||\n failedOpMessage?.match(/.*replacement.*underpriced.*/) !== null) ??\n false\n );\n }\n return false;\n }\n\n unwrapError(errorIn: any): Error {\n if (errorIn?.cause != null) {\n let paymasterInfo: string = \"\";\n let failedOpMessage: string | undefined = errorIn?.cause?.message;\n if (failedOpMessage?.includes(\"FailedOp\") === true) {\n // TODO: better error extraction methods will be needed\n const matched = failedOpMessage.match(/FailedOp\\((.*)\\)/);\n if (matched != null) {\n const split = matched[1].split(\",\");\n paymasterInfo = `(paymaster address: ${split[1]})`;\n failedOpMessage = split[2];\n }\n }\n const error = new Error(\n `The bundler has failed to include UserOperation in a batch: ${failedOpMessage} ${paymasterInfo}`\n );\n error.stack = errorIn.stack;\n return error;\n }\n return errorIn;\n }\n\n getAccount: () => KernelSmartContractAccount = () => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n return this.account;\n };\n\n dummyPaymasterDataMiddleware: AccountMiddlewareFn = async (\n struct: UserOperationStruct\n ): Promise<UserOperationStruct> => {\n struct.paymasterAndData = \"0x\";\n return struct;\n };\n\n withZeroDevPaymasterAndData(config: PaymasterConfig<PaymasterPolicy>) {\n if (!this.isConnected()) {\n throw new Error(\n \"ZeroDevProvider: account is not set, did you call `connect` first?\"\n );\n }\n\n return withZeroDevPaymasterAndData(this, config);\n }\n\n request: (args: { method: string; params?: any[] }) => Promise<any> = async (\n args\n ) => {\n const { method, params } = args;\n switch (method) {\n case \"eth_chainId\":\n return this.chain.id;\n case \"eth_sendTransaction\":\n const [tx] = params as [RpcTransactionRequest];\n return this.sendTransaction(tx);\n case \"eth_signTypedData_v4\":\n //@ts-expect-error\n return this.signTypedData(JSON.parse(params[1]));\n case \"personal_sign\":\n if (!this.account) {\n throw new Error(\"account not connected!\");\n }\n const [data, address] = params!;\n if (address.toLowerCase() !== (await this.getAddress()).toLowerCase()) {\n throw new Error(\n \"cannot sign for address that is not the current account\"\n );\n }\n // @ts-ignore\n return this.account.signMessageWith6492(data);\n default:\n // @ts-ignore\n return this.rpcClient.request(args);\n }\n };\n}\n"]}