thirdweb 5.48.2 → 5.48.3-nightly-a8e2bc58c9e8fe5b75d6c27d406e6b80d5d067e2-20240828000339

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 (176) hide show
  1. package/dist/cjs/exports/wallets/smart.js +4 -2
  2. package/dist/cjs/exports/wallets/smart.js.map +1 -1
  3. package/dist/cjs/extensions/erc1155/drops/write/claimTo.js.map +1 -1
  4. package/dist/cjs/extensions/erc4337/__generated__/IEntryPoint_v07/events/PostOpRevertReason.js +32 -0
  5. package/dist/cjs/extensions/erc4337/__generated__/IEntryPoint_v07/events/PostOpRevertReason.js.map +1 -0
  6. package/dist/cjs/extensions/erc4337/__generated__/IEntryPoint_v07/read/getUserOpHash.js +153 -0
  7. package/dist/cjs/extensions/erc4337/__generated__/IEntryPoint_v07/read/getUserOpHash.js.map +1 -0
  8. package/dist/cjs/extensions/prebuilts/__generated__/VoteERC20/write/initialize.js +184 -0
  9. package/dist/cjs/extensions/prebuilts/__generated__/VoteERC20/write/initialize.js.map +1 -0
  10. package/dist/cjs/extensions/prebuilts/deploy-vote.js +122 -0
  11. package/dist/cjs/extensions/prebuilts/deploy-vote.js.map +1 -0
  12. package/dist/cjs/react/core/hooks/pay/useBuyWithCryptoQuote.js +5 -1
  13. package/dist/cjs/react/core/hooks/pay/useBuyWithCryptoQuote.js.map +1 -1
  14. package/dist/cjs/react/core/hooks/pay/useBuyWithFiatQuote.js +5 -1
  15. package/dist/cjs/react/core/hooks/pay/useBuyWithFiatQuote.js.map +1 -1
  16. package/dist/cjs/react/core/hooks/transaction/useSendAndConfirmTransaction.js +12 -0
  17. package/dist/cjs/react/core/hooks/transaction/useSendAndConfirmTransaction.js.map +1 -1
  18. package/dist/cjs/react/native/hooks/transaction/useSendTransaction.js +11 -0
  19. package/dist/cjs/react/native/hooks/transaction/useSendTransaction.js.map +1 -1
  20. package/dist/cjs/react/web/ui/TransactionButton/index.js +13 -0
  21. package/dist/cjs/react/web/ui/TransactionButton/index.js.map +1 -1
  22. package/dist/cjs/transaction/actions/send-and-confirm-transaction.js +13 -0
  23. package/dist/cjs/transaction/actions/send-and-confirm-transaction.js.map +1 -1
  24. package/dist/cjs/transaction/actions/send-transaction.js +13 -0
  25. package/dist/cjs/transaction/actions/send-transaction.js.map +1 -1
  26. package/dist/cjs/transaction/actions/zksync/send-eip712-transaction.js +1 -1
  27. package/dist/cjs/transaction/actions/zksync/send-eip712-transaction.js.map +1 -1
  28. package/dist/cjs/version.js +1 -1
  29. package/dist/cjs/version.js.map +1 -1
  30. package/dist/cjs/wallets/in-app/web/lib/in-app-account.js +5 -1
  31. package/dist/cjs/wallets/in-app/web/lib/in-app-account.js.map +1 -1
  32. package/dist/cjs/wallets/in-app/web/utils/iFrameCommunication/IframeCommunicator.js +1 -0
  33. package/dist/cjs/wallets/in-app/web/utils/iFrameCommunication/IframeCommunicator.js.map +1 -1
  34. package/dist/cjs/wallets/smart/index.js +13 -2
  35. package/dist/cjs/wallets/smart/index.js.map +1 -1
  36. package/dist/cjs/wallets/smart/lib/bundler.js +11 -2
  37. package/dist/cjs/wallets/smart/lib/bundler.js.map +1 -1
  38. package/dist/cjs/wallets/smart/lib/constants.js +27 -13
  39. package/dist/cjs/wallets/smart/lib/constants.js.map +1 -1
  40. package/dist/cjs/wallets/smart/lib/packUserOp.js +75 -0
  41. package/dist/cjs/wallets/smart/lib/packUserOp.js.map +1 -0
  42. package/dist/cjs/wallets/smart/lib/paymaster.js +11 -1
  43. package/dist/cjs/wallets/smart/lib/paymaster.js.map +1 -1
  44. package/dist/cjs/wallets/smart/lib/userop.js +201 -66
  45. package/dist/cjs/wallets/smart/lib/userop.js.map +1 -1
  46. package/dist/cjs/wallets/smart/lib/utils.js +1 -1
  47. package/dist/cjs/wallets/smart/lib/utils.js.map +1 -1
  48. package/dist/cjs/wallets/smart/smart-wallet.js +2 -1
  49. package/dist/cjs/wallets/smart/smart-wallet.js.map +1 -1
  50. package/dist/cjs/wallets/smart/types.js.map +1 -1
  51. package/dist/esm/exports/wallets/smart.js +1 -1
  52. package/dist/esm/exports/wallets/smart.js.map +1 -1
  53. package/dist/esm/extensions/erc1155/drops/write/claimTo.js.map +1 -1
  54. package/dist/esm/extensions/erc4337/__generated__/IEntryPoint_v07/events/PostOpRevertReason.js +29 -0
  55. package/dist/esm/extensions/erc4337/__generated__/IEntryPoint_v07/events/PostOpRevertReason.js.map +1 -0
  56. package/dist/esm/extensions/erc4337/__generated__/IEntryPoint_v07/read/getUserOpHash.js +145 -0
  57. package/dist/esm/extensions/erc4337/__generated__/IEntryPoint_v07/read/getUserOpHash.js.map +1 -0
  58. package/dist/esm/extensions/prebuilts/__generated__/VoteERC20/write/initialize.js +177 -0
  59. package/dist/esm/extensions/prebuilts/__generated__/VoteERC20/write/initialize.js.map +1 -0
  60. package/dist/esm/extensions/prebuilts/deploy-vote.js +119 -0
  61. package/dist/esm/extensions/prebuilts/deploy-vote.js.map +1 -0
  62. package/dist/esm/react/core/hooks/pay/useBuyWithCryptoQuote.js +5 -1
  63. package/dist/esm/react/core/hooks/pay/useBuyWithCryptoQuote.js.map +1 -1
  64. package/dist/esm/react/core/hooks/pay/useBuyWithFiatQuote.js +5 -1
  65. package/dist/esm/react/core/hooks/pay/useBuyWithFiatQuote.js.map +1 -1
  66. package/dist/esm/react/core/hooks/transaction/useSendAndConfirmTransaction.js +12 -0
  67. package/dist/esm/react/core/hooks/transaction/useSendAndConfirmTransaction.js.map +1 -1
  68. package/dist/esm/react/native/hooks/transaction/useSendTransaction.js +11 -0
  69. package/dist/esm/react/native/hooks/transaction/useSendTransaction.js.map +1 -1
  70. package/dist/esm/react/web/ui/TransactionButton/index.js +13 -0
  71. package/dist/esm/react/web/ui/TransactionButton/index.js.map +1 -1
  72. package/dist/esm/transaction/actions/send-and-confirm-transaction.js +13 -0
  73. package/dist/esm/transaction/actions/send-and-confirm-transaction.js.map +1 -1
  74. package/dist/esm/transaction/actions/send-transaction.js +13 -0
  75. package/dist/esm/transaction/actions/send-transaction.js.map +1 -1
  76. package/dist/esm/transaction/actions/zksync/send-eip712-transaction.js +1 -1
  77. package/dist/esm/transaction/actions/zksync/send-eip712-transaction.js.map +1 -1
  78. package/dist/esm/version.js +1 -1
  79. package/dist/esm/version.js.map +1 -1
  80. package/dist/esm/wallets/in-app/web/lib/in-app-account.js +5 -1
  81. package/dist/esm/wallets/in-app/web/lib/in-app-account.js.map +1 -1
  82. package/dist/esm/wallets/in-app/web/utils/iFrameCommunication/IframeCommunicator.js +1 -0
  83. package/dist/esm/wallets/in-app/web/utils/iFrameCommunication/IframeCommunicator.js.map +1 -1
  84. package/dist/esm/wallets/smart/index.js +14 -3
  85. package/dist/esm/wallets/smart/index.js.map +1 -1
  86. package/dist/esm/wallets/smart/lib/bundler.js +12 -3
  87. package/dist/esm/wallets/smart/lib/bundler.js.map +1 -1
  88. package/dist/esm/wallets/smart/lib/constants.js +23 -10
  89. package/dist/esm/wallets/smart/lib/constants.js.map +1 -1
  90. package/dist/esm/wallets/smart/lib/packUserOp.js +65 -0
  91. package/dist/esm/wallets/smart/lib/packUserOp.js.map +1 -0
  92. package/dist/esm/wallets/smart/lib/paymaster.js +12 -2
  93. package/dist/esm/wallets/smart/lib/paymaster.js.map +1 -1
  94. package/dist/esm/wallets/smart/lib/userop.js +202 -67
  95. package/dist/esm/wallets/smart/lib/userop.js.map +1 -1
  96. package/dist/esm/wallets/smart/lib/utils.js +1 -1
  97. package/dist/esm/wallets/smart/lib/utils.js.map +1 -1
  98. package/dist/esm/wallets/smart/smart-wallet.js +3 -2
  99. package/dist/esm/wallets/smart/smart-wallet.js.map +1 -1
  100. package/dist/esm/wallets/smart/types.js.map +1 -1
  101. package/dist/types/exports/wallets/smart.d.ts +2 -2
  102. package/dist/types/exports/wallets/smart.d.ts.map +1 -1
  103. package/dist/types/extensions/erc1155/drops/write/claimTo.d.ts +2 -3
  104. package/dist/types/extensions/erc1155/drops/write/claimTo.d.ts.map +1 -1
  105. package/dist/types/extensions/erc4337/__generated__/IEntryPoint_v07/events/PostOpRevertReason.d.ts +57 -0
  106. package/dist/types/extensions/erc4337/__generated__/IEntryPoint_v07/events/PostOpRevertReason.d.ts.map +1 -0
  107. package/dist/types/extensions/erc4337/__generated__/IEntryPoint_v07/read/getUserOpHash.d.ts +123 -0
  108. package/dist/types/extensions/erc4337/__generated__/IEntryPoint_v07/read/getUserOpHash.d.ts.map +1 -0
  109. package/dist/types/extensions/prebuilts/__generated__/VoteERC20/write/initialize.d.ts +129 -0
  110. package/dist/types/extensions/prebuilts/__generated__/VoteERC20/write/initialize.d.ts.map +1 -0
  111. package/dist/types/extensions/prebuilts/deploy-vote.d.ts +82 -0
  112. package/dist/types/extensions/prebuilts/deploy-vote.d.ts.map +1 -0
  113. package/dist/types/react/core/hooks/pay/useBuyWithCryptoQuote.d.ts.map +1 -1
  114. package/dist/types/react/core/hooks/pay/useBuyWithFiatQuote.d.ts.map +1 -1
  115. package/dist/types/react/core/hooks/transaction/useSendAndConfirmTransaction.d.ts +12 -0
  116. package/dist/types/react/core/hooks/transaction/useSendAndConfirmTransaction.d.ts.map +1 -1
  117. package/dist/types/react/native/hooks/transaction/useSendTransaction.d.ts +11 -0
  118. package/dist/types/react/native/hooks/transaction/useSendTransaction.d.ts.map +1 -1
  119. package/dist/types/react/web/ui/TransactionButton/index.d.ts +13 -0
  120. package/dist/types/react/web/ui/TransactionButton/index.d.ts.map +1 -1
  121. package/dist/types/transaction/actions/send-and-confirm-transaction.d.ts +13 -0
  122. package/dist/types/transaction/actions/send-and-confirm-transaction.d.ts.map +1 -1
  123. package/dist/types/transaction/actions/send-transaction.d.ts +13 -0
  124. package/dist/types/transaction/actions/send-transaction.d.ts.map +1 -1
  125. package/dist/types/version.d.ts +1 -1
  126. package/dist/types/version.d.ts.map +1 -1
  127. package/dist/types/wallets/in-app/web/lib/in-app-account.d.ts.map +1 -1
  128. package/dist/types/wallets/in-app/web/utils/iFrameCommunication/IframeCommunicator.d.ts.map +1 -1
  129. package/dist/types/wallets/smart/index.d.ts.map +1 -1
  130. package/dist/types/wallets/smart/lib/bundler.d.ts +3 -3
  131. package/dist/types/wallets/smart/lib/bundler.d.ts.map +1 -1
  132. package/dist/types/wallets/smart/lib/constants.d.ts +6 -6
  133. package/dist/types/wallets/smart/lib/constants.d.ts.map +1 -1
  134. package/dist/types/wallets/smart/lib/packUserOp.d.ts +16 -0
  135. package/dist/types/wallets/smart/lib/packUserOp.d.ts.map +1 -0
  136. package/dist/types/wallets/smart/lib/paymaster.d.ts +3 -3
  137. package/dist/types/wallets/smart/lib/paymaster.d.ts.map +1 -1
  138. package/dist/types/wallets/smart/lib/userop.d.ts +6 -4
  139. package/dist/types/wallets/smart/lib/userop.d.ts.map +1 -1
  140. package/dist/types/wallets/smart/lib/utils.d.ts +2 -2
  141. package/dist/types/wallets/smart/lib/utils.d.ts.map +1 -1
  142. package/dist/types/wallets/smart/smart-wallet.d.ts.map +1 -1
  143. package/dist/types/wallets/smart/types.d.ts +62 -9
  144. package/dist/types/wallets/smart/types.d.ts.map +1 -1
  145. package/package.json +1 -1
  146. package/src/exports/wallets/smart.ts +4 -2
  147. package/src/extensions/erc1155/drops/write/claimTo.ts +2 -3
  148. package/src/extensions/erc4337/__generated__/IEntryPoint_v07/events/PostOpRevertReason.ts +49 -0
  149. package/src/extensions/erc4337/__generated__/IEntryPoint_v07/read/getUserOpHash.ts +181 -0
  150. package/src/extensions/prebuilts/__generated__/VoteERC20/write/initialize.ts +230 -0
  151. package/src/extensions/prebuilts/deploy-vote.test.ts +73 -0
  152. package/src/extensions/prebuilts/deploy-vote.ts +213 -0
  153. package/src/extensions/vote/read/proposalExists.test.ts +123 -0
  154. package/src/react/core/hooks/pay/useBuyWithCryptoQuote.ts +16 -1
  155. package/src/react/core/hooks/pay/useBuyWithFiatQuote.ts +16 -1
  156. package/src/react/core/hooks/transaction/useSendAndConfirmTransaction.ts +12 -0
  157. package/src/react/native/hooks/transaction/useSendTransaction.tsx +11 -0
  158. package/src/react/web/ui/TransactionButton/index.tsx +13 -0
  159. package/src/transaction/actions/send-and-confirm-transaction.ts +13 -0
  160. package/src/transaction/actions/send-transaction.ts +13 -0
  161. package/src/transaction/actions/zksync/send-eip712-transaction.ts +1 -1
  162. package/src/version.ts +1 -1
  163. package/src/wallets/in-app/web/lib/in-app-account.ts +5 -1
  164. package/src/wallets/in-app/web/utils/iFrameCommunication/IframeCommunicator.ts +1 -0
  165. package/src/wallets/smart/index.ts +21 -5
  166. package/src/wallets/smart/lib/bundler.ts +21 -5
  167. package/src/wallets/smart/lib/constants.ts +29 -10
  168. package/src/wallets/smart/lib/packUserOp.ts +79 -0
  169. package/src/wallets/smart/lib/paymaster.ts +22 -5
  170. package/src/wallets/smart/lib/userop.ts +292 -85
  171. package/src/wallets/smart/lib/utils.ts +11 -4
  172. package/src/wallets/smart/smart-wallet-integration-v07.test.ts +206 -0
  173. package/src/wallets/smart/smart-wallet-integration.test.ts +1 -1
  174. package/src/wallets/smart/smart-wallet-zksync.test.ts +3 -3
  175. package/src/wallets/smart/smart-wallet.ts +4 -2
  176. package/src/wallets/smart/types.ts +73 -9
@@ -40,6 +40,18 @@ export type SendAndConfirmTransactionConfig = {
40
40
  * }
41
41
  * });
42
42
  * ```
43
+ *
44
+ * ### Gasless usage with OpenZeppelin
45
+ * ```tsx
46
+ * import { useSendAndConfirmTransaction } from "thirdweb/react";
47
+ * const mutation = useSendAndConfirmTransaction({
48
+ * gasless: {
49
+ * provider: "openzeppelin",
50
+ * relayerUrl: "https://...",
51
+ * relayerForwarderAddress: "0x...",
52
+ * }
53
+ * });
54
+ * ```
43
55
  * @transaction
44
56
  */
45
57
  export function useSendAndConfirmTransaction(
@@ -30,6 +30,17 @@ import { useSwitchActiveWalletChain } from "../../../core/hooks/wallets/useSwitc
30
30
  * }
31
31
  * });
32
32
  * ```
33
+ *
34
+ * ### Gasless usage with OpenZeppelin
35
+ * ```tsx
36
+ * import { useSendTransaction } from "thirdweb/react";
37
+ * const mutation = useSendTransaction({
38
+ * gasless: {
39
+ * provider: "openzeppelin",
40
+ * relayerUrl: "https://...",
41
+ * relayerForwarderAddress: "0x...",
42
+ * }
43
+ * });
33
44
  * @transaction
34
45
  */
35
46
  export function useSendTransaction(config: SendTransactionConfig = {}) {
@@ -115,6 +115,19 @@ import { Button } from "../components/buttons.js";
115
115
  * ...
116
116
  * </TransactionButton>
117
117
  * ```
118
+ *
119
+ * ### Gasless usage with OpenZeppelin
120
+ * ```tsx
121
+ * <TransactionButton
122
+ * gasless={{
123
+ * provider: "openzeppelin",
124
+ * relayerUrl: "https://...",
125
+ * relayerForwarderAddress: "0x...",
126
+ * }}
127
+ * >
128
+ * ...
129
+ * </TransactionButton>
130
+ * ```
118
131
  * @component
119
132
  */
120
133
  export function TransactionButton(props: TransactionButtonProps) {
@@ -35,6 +35,19 @@ import { waitForReceipt } from "./wait-for-tx-receipt.js";
35
35
  * }
36
36
  * });
37
37
  * ```
38
+ *
39
+ * ### Gasless usage with OpenZeppelin
40
+ * ```ts
41
+ * const transactionReceipt = await sendAndConfirmTransaction({
42
+ * account,
43
+ * transaction,
44
+ * gasless: {
45
+ * provider: "openzeppelin",
46
+ * relayerUrl: "https://...",
47
+ * relayerForwarderAddress: "0x...",
48
+ * }
49
+ * });
50
+ * ```
38
51
  */
39
52
  export async function sendAndConfirmTransaction(
40
53
  options: SendTransactionOptions,
@@ -121,6 +121,19 @@ export interface SendTransactionOptions {
121
121
  * }
122
122
  * });
123
123
  * ```
124
+ *
125
+ * ### Gasless usage with OpenZeppelin
126
+ * ```ts
127
+ * const { transactionHash } = await sendTransaction({
128
+ * account,
129
+ * transaction,
130
+ * gasless: {
131
+ * provider: "openzeppelin",
132
+ * relayerUrl: "https://...",
133
+ * relayerForwarderAddress: "0x...",
134
+ * }
135
+ * });
136
+ * ```
124
137
  */
125
138
  export async function sendTransaction(
126
139
  options: SendTransactionOptions,
@@ -131,7 +131,7 @@ export async function populateEip712Transaction(
131
131
  const baseFee = toBigInt(result.max_fee_per_gas);
132
132
  maxFeePerGas = baseFee * 2n; // bumping the base fee per gas to ensure fast inclusion
133
133
  maxPriorityFeePerGas = toBigInt(result.max_priority_fee_per_gas) || 1n;
134
- gasPerPubdata = toBigInt(result.gas_per_pubdata_limit);
134
+ gasPerPubdata = toBigInt(result.gas_per_pubdata_limit) * 2n; // doubling for fast inclusion;
135
135
  }
136
136
 
137
137
  // serialize the transaction (with fees, gas, nonce)
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "5.48.2";
1
+ export const version = "5.48.3-nightly-a8e2bc58c9e8fe5b75d6c27d406e6b80d5d067e2-20240828000339";
@@ -304,6 +304,7 @@ export class IFrameWallet {
304
304
  return signedMessage as Hex;
305
305
  },
306
306
  async signTypedData(_typedData) {
307
+ console.log("signTypedData", _typedData);
307
308
  const parsedTypedData = parseTypedData(_typedData);
308
309
  // deleting EIP712 Domain as it results in ambiguous primary type on some cases
309
310
  // this happens when going from viem to ethers via the iframe
@@ -312,8 +313,11 @@ export class IFrameWallet {
312
313
  }
313
314
  const domain = parsedTypedData.domain as TypedDataDefinition["domain"];
314
315
  const chainId = domain?.chainId;
316
+ const verifyingContract = domain?.verifyingContract
317
+ ? { verifyingContract: domain?.verifyingContract }
318
+ : {};
315
319
  const domainData = {
316
- verifyingContract: domain?.verifyingContract,
320
+ ...verifyingContract,
317
321
  name: domain?.name,
318
322
  version: domain?.version,
319
323
  };
@@ -23,6 +23,7 @@ const iframeBaseStyle = {
23
23
  right: "0px",
24
24
  zIndex: "2147483646",
25
25
  display: "none",
26
+ pointerEvents: "all",
26
27
  };
27
28
 
28
29
  // Global var to help track iframe state
@@ -42,7 +42,7 @@ import {
42
42
  prepareBatchExecute,
43
43
  prepareExecute,
44
44
  } from "./lib/calls.js";
45
- import { DEFAULT_ACCOUNT_FACTORY } from "./lib/constants.js";
45
+ import { getDefaultAccountFactory } from "./lib/constants.js";
46
46
  import {
47
47
  createUnsignedUserOp,
48
48
  signUserOp,
@@ -50,11 +50,13 @@ import {
50
50
  } from "./lib/userop.js";
51
51
  import { isNativeAAChain } from "./lib/utils.js";
52
52
  import type {
53
+ BundlerOptions,
53
54
  PaymasterResult,
54
55
  SmartAccountOptions,
55
56
  SmartWalletConnectionOptions,
56
57
  SmartWalletOptions,
57
- UserOperation,
58
+ UserOperationV06,
59
+ UserOperationV07,
58
60
  } from "./types.js";
59
61
 
60
62
  /**
@@ -95,7 +97,9 @@ export async function connectSmartWallet(
95
97
  }
96
98
 
97
99
  const options = creationOptions;
98
- const factoryAddress = options.factoryAddress ?? DEFAULT_ACCOUNT_FACTORY;
100
+ const factoryAddress =
101
+ options.factoryAddress ??
102
+ getDefaultAccountFactory(creationOptions.overrides?.entrypointAddress);
99
103
  const chain = connectChain ?? options.chain;
100
104
  const sponsorGas =
101
105
  "gasless" in options ? options.gasless : options.sponsorGas;
@@ -182,7 +186,9 @@ async function createSmartAccount(
182
186
  const erc20Paymaster = options.overrides?.erc20Paymaster;
183
187
  let paymasterOverride:
184
188
  | undefined
185
- | ((userOp: UserOperation) => Promise<PaymasterResult>) = undefined;
189
+ | ((
190
+ userOp: UserOperationV06 | UserOperationV07,
191
+ ) => Promise<PaymasterResult>) = undefined;
186
192
  if (erc20Paymaster) {
187
193
  await approveERC20({
188
194
  accountContract,
@@ -195,6 +201,9 @@ async function createSmartAccount(
195
201
  erc20Paymaster.address as Hex,
196
202
  erc20Paymaster?.token as Hex,
197
203
  ]),
204
+ // for 0.7 compatibility
205
+ paymaster: erc20Paymaster.address as Hex,
206
+ paymasterData: "0x",
198
207
  };
199
208
  };
200
209
  paymasterOverride = options.overrides?.paymaster || paymasterCallback;
@@ -567,13 +576,20 @@ async function _sendUserOp(args: {
567
576
  overrides: options.overrides,
568
577
  });
569
578
  const signedUserOp = await signUserOp({
579
+ client: options.client,
570
580
  chain: options.chain,
571
581
  adminAccount: options.personalAccount,
572
582
  entrypointAddress: options.overrides?.entrypointAddress,
573
583
  userOp: unsignedUserOp,
574
584
  });
585
+ const bundlerOptions: BundlerOptions = {
586
+ chain: options.chain,
587
+ client: options.client,
588
+ bundlerUrl: options.overrides?.bundlerUrl,
589
+ entrypointAddress: options.overrides?.entrypointAddress,
590
+ };
575
591
  const userOpHash = await bundleUserOp({
576
- options,
592
+ options: bundlerOptions,
577
593
  userOp: signedUserOp,
578
594
  });
579
595
  // wait for tx receipt rather than return the userOp hash
@@ -1,6 +1,7 @@
1
1
  import { type TransactionSerializable, decodeErrorResult } from "viem";
2
2
  import { parseEventLogs } from "../../../event/actions/parse-logs.js";
3
3
  import { userOperationRevertReasonEvent } from "../../../extensions/erc4337/__generated__/IEntryPoint/events/UserOperationRevertReason.js";
4
+ import { postOpRevertReasonEvent } from "../../../extensions/erc4337/__generated__/IEntryPoint_v07/events/PostOpRevertReason.js";
4
5
  import type { TransactionReceipt } from "../../../transaction/types.js";
5
6
  import { type Hex, hexToBigInt } from "../../../utils/encoding/hex.js";
6
7
  import { getClientFetch } from "../../../utils/fetch.js";
@@ -10,8 +11,9 @@ import {
10
11
  type EstimationResult,
11
12
  type GasPriceResult,
12
13
  type PmTransactionData,
13
- type UserOperation,
14
14
  type UserOperationReceipt,
15
+ type UserOperationV06,
16
+ type UserOperationV07,
15
17
  formatUserOperationReceipt,
16
18
  } from "../types.js";
17
19
  import {
@@ -19,6 +21,7 @@ import {
19
21
  ENTRYPOINT_ADDRESS_v0_6,
20
22
  MANAGED_ACCOUNT_GAS_BUFFER,
21
23
  getDefaultBundlerUrl,
24
+ getEntryPointVersion,
22
25
  } from "./constants.js";
23
26
  import { hexlifyUserOp } from "./utils.js";
24
27
 
@@ -38,7 +41,7 @@ import { hexlifyUserOp } from "./utils.js";
38
41
  * @walletUtils
39
42
  */
40
43
  export async function bundleUserOp(args: {
41
- userOp: UserOperation;
44
+ userOp: UserOperationV06 | UserOperationV07;
42
45
  options: BundlerOptions;
43
46
  }): Promise<Hex> {
44
47
  return sendBundlerRequest({
@@ -67,7 +70,7 @@ export async function bundleUserOp(args: {
67
70
  * @walletUtils
68
71
  */
69
72
  export async function estimateUserOpGas(args: {
70
- userOp: UserOperation;
73
+ userOp: UserOperationV06 | UserOperationV07;
71
74
  options: BundlerOptions;
72
75
  }): Promise<EstimationResult> {
73
76
  const res = await sendBundlerRequest({
@@ -85,6 +88,14 @@ export async function estimateUserOpGas(args: {
85
88
  verificationGas: hexToBigInt(res.verificationGas),
86
89
  verificationGasLimit: hexToBigInt(res.verificationGasLimit),
87
90
  callGasLimit: hexToBigInt(res.callGasLimit) + MANAGED_ACCOUNT_GAS_BUFFER,
91
+ paymasterVerificationGasLimit:
92
+ res.paymasterVerificationGasLimit !== undefined
93
+ ? hexToBigInt(res.paymasterVerificationGasLimit)
94
+ : undefined,
95
+ paymasterPostOpGasLimit:
96
+ res.paymasterPostOpGasLimit !== undefined
97
+ ? hexToBigInt(res.paymasterPostOpGasLimit)
98
+ : undefined,
88
99
  };
89
100
  }
90
101
 
@@ -147,7 +158,7 @@ export async function getUserOpReceipt(
147
158
  if (res.success === false) {
148
159
  // parse revert reason
149
160
  const logs = parseEventLogs({
150
- events: [userOperationRevertReasonEvent()],
161
+ events: [userOperationRevertReasonEvent(), postOpRevertReasonEvent()],
151
162
  logs: res.logs,
152
163
  });
153
164
  const revertReason = logs[0]?.args?.revertReason;
@@ -258,7 +269,12 @@ async function sendBundlerRequest(args: {
258
269
  console.debug(`>>> sending ${operation} with payload:`, params);
259
270
  }
260
271
 
261
- const bundlerUrl = options.bundlerUrl ?? getDefaultBundlerUrl(options.chain);
272
+ const entryPointVersion = getEntryPointVersion(
273
+ options.entrypointAddress || ENTRYPOINT_ADDRESS_v0_6,
274
+ );
275
+ const bundlerVersion = entryPointVersion === "v0.6" ? "v1" : "v2";
276
+ const bundlerUrl =
277
+ options.bundlerUrl ?? getDefaultBundlerUrl(options.chain, bundlerVersion);
262
278
  const fetchWithHeaders = getClientFetch(options.client);
263
279
  const response = await fetchWithHeaders(bundlerUrl, {
264
280
  method: "POST",
@@ -1,4 +1,5 @@
1
1
  import type { Chain } from "../../../chains/types.js";
2
+ import { getAddress } from "../../../utils/address.js";
2
3
  import { getThirdwebDomains } from "../../../utils/domains.js";
3
4
 
4
5
  // dev only
@@ -7,31 +8,49 @@ export const DEBUG = false;
7
8
  export const DUMMY_SIGNATURE =
8
9
  "0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c";
9
10
 
10
- export const DEFAULT_ACCOUNT_FACTORY =
11
+ export const DEFAULT_ACCOUNT_FACTORY_V0_6 =
11
12
  "0x85e23b94e7F5E9cC1fF78BCe78cfb15B81f0DF00";
13
+ export const DEFAULT_ACCOUNT_FACTORY_V0_7 =
14
+ "0x4be0ddfebca9a5a4a617dee4dece99e7c862dceb";
12
15
 
13
16
  export const ENTRYPOINT_ADDRESS_v0_6 =
14
17
  "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; // v0.6
18
+ export const ENTRYPOINT_ADDRESS_v0_7 =
19
+ "0x0000000071727De22E5E9d8BAf0edAc6f37da032"; // v0.7
20
+
15
21
  export const MANAGED_ACCOUNT_GAS_BUFFER = 50000n;
16
22
 
17
- /**
23
+ /*
18
24
  * @internal
19
25
  */
20
- export const getDefaultBundlerUrl = (chain: Chain) => {
21
- const domain = getThirdwebDomains().bundler;
22
- if (domain.startsWith("localhost:")) {
23
- return `http://${domain}?chain=${chain.id}`;
26
+ export const getDefaultAccountFactory = (entryPointAddress?: string) => {
27
+ const version = getEntryPointVersion(
28
+ entryPointAddress || ENTRYPOINT_ADDRESS_v0_6,
29
+ );
30
+ if (version === "v0.7") {
31
+ return DEFAULT_ACCOUNT_FACTORY_V0_7;
24
32
  }
25
- return `https://${chain.id}.${domain}/`;
33
+ return DEFAULT_ACCOUNT_FACTORY_V0_6;
26
34
  };
27
35
 
28
36
  /**
29
37
  * @internal
30
38
  */
31
- export const getDefaultPaymasterUrl = (chain: Chain) => {
39
+ export const getDefaultBundlerUrl = (chain: Chain, version: "v1" | "v2") => {
32
40
  const domain = getThirdwebDomains().bundler;
33
41
  if (domain.startsWith("localhost:")) {
34
- return `http://${domain}?chain=${chain.id}`;
42
+ return `http://${domain}/${version ?? "v1"}?chain=${chain.id}`;
43
+ }
44
+ return `https://${chain.id}.${domain}/${version ?? "v1"}`;
45
+ };
46
+
47
+ export const getEntryPointVersion = (address: string): "v0.6" | "v0.7" => {
48
+ const checksummedAddress = getAddress(address);
49
+ if (checksummedAddress === ENTRYPOINT_ADDRESS_v0_6) {
50
+ return "v0.6";
51
+ }
52
+ if (checksummedAddress === ENTRYPOINT_ADDRESS_v0_7) {
53
+ return "v0.7";
35
54
  }
36
- return `https://${chain.id}.${domain}/`;
55
+ throw new Error("Unknown paymaster version");
37
56
  };
@@ -0,0 +1,79 @@
1
+ import { type Hex, concat, pad, slice, toHex } from "viem";
2
+ import type { PackedUserOperation, UserOperationV07 } from "../types.js";
3
+
4
+ export function getInitCode(unpackedUserOperation: UserOperationV07) {
5
+ return unpackedUserOperation.factory
6
+ ? concat([
7
+ unpackedUserOperation.factory as Hex,
8
+ unpackedUserOperation.factoryData || ("0x" as Hex),
9
+ ])
10
+ : "0x";
11
+ }
12
+
13
+ export function getAccountGasLimits(unpackedUserOperation: UserOperationV07) {
14
+ return concat([
15
+ pad(toHex(unpackedUserOperation.verificationGasLimit), {
16
+ size: 16,
17
+ }),
18
+ pad(toHex(unpackedUserOperation.callGasLimit), { size: 16 }),
19
+ ]) as Hex;
20
+ }
21
+
22
+ export function unpackAccountGasLimits(accountGasLimits: Hex) {
23
+ return {
24
+ verificationGasLimit: BigInt(slice(accountGasLimits, 0, 16)),
25
+ callGasLimit: BigInt(slice(accountGasLimits, 16)),
26
+ };
27
+ }
28
+
29
+ export function getGasLimits(unpackedUserOperation: UserOperationV07) {
30
+ return concat([
31
+ pad(toHex(unpackedUserOperation.maxPriorityFeePerGas), {
32
+ size: 16,
33
+ }),
34
+ pad(toHex(unpackedUserOperation.maxFeePerGas), { size: 16 }),
35
+ ]) as Hex;
36
+ }
37
+
38
+ export function unpackGasLimits(gasLimits: Hex) {
39
+ return {
40
+ maxPriorityFeePerGas: BigInt(slice(gasLimits, 0, 16)),
41
+ maxFeePerGas: BigInt(slice(gasLimits, 16)),
42
+ };
43
+ }
44
+
45
+ export function getPaymasterAndData(unpackedUserOperation: UserOperationV07) {
46
+ return unpackedUserOperation.paymaster
47
+ ? concat([
48
+ unpackedUserOperation.paymaster as Hex,
49
+ pad(
50
+ toHex(
51
+ unpackedUserOperation.paymasterVerificationGasLimit || BigInt(0),
52
+ ),
53
+ {
54
+ size: 16,
55
+ },
56
+ ),
57
+ pad(toHex(unpackedUserOperation.paymasterPostOpGasLimit || BigInt(0)), {
58
+ size: 16,
59
+ }),
60
+ unpackedUserOperation.paymasterData || ("0x" as Hex),
61
+ ])
62
+ : "0x";
63
+ }
64
+
65
+ export const getPackedUserOperation = (
66
+ userOperation: UserOperationV07,
67
+ ): PackedUserOperation => {
68
+ return {
69
+ sender: userOperation.sender,
70
+ nonce: userOperation.nonce,
71
+ initCode: getInitCode(userOperation),
72
+ callData: userOperation.callData,
73
+ accountGasLimits: getAccountGasLimits(userOperation),
74
+ preVerificationGas: userOperation.preVerificationGas,
75
+ gasFees: getGasLimits(userOperation),
76
+ paymasterAndData: getPaymasterAndData(userOperation),
77
+ signature: userOperation.signature,
78
+ };
79
+ };
@@ -2,11 +2,16 @@ import type { Chain } from "../../../chains/types.js";
2
2
  import type { ThirdwebClient } from "../../../client/client.js";
3
3
  import { hexToBigInt } from "../../../utils/encoding/hex.js";
4
4
  import { getClientFetch } from "../../../utils/fetch.js";
5
- import type { PaymasterResult, UserOperation } from "../types.js";
5
+ import type {
6
+ PaymasterResult,
7
+ UserOperationV06,
8
+ UserOperationV07,
9
+ } from "../types.js";
6
10
  import {
7
11
  DEBUG,
8
12
  ENTRYPOINT_ADDRESS_v0_6,
9
- getDefaultPaymasterUrl,
13
+ getDefaultBundlerUrl,
14
+ getEntryPointVersion,
10
15
  } from "./constants.js";
11
16
  import { hexlifyUserOp } from "./utils.js";
12
17
 
@@ -29,11 +34,13 @@ import { hexlifyUserOp } from "./utils.js";
29
34
  * @walletUtils
30
35
  */
31
36
  export async function getPaymasterAndData(args: {
32
- userOp: UserOperation;
37
+ userOp: UserOperationV06 | UserOperationV07;
33
38
  client: ThirdwebClient;
34
39
  chain: Chain;
35
40
  entrypointAddress?: string;
36
- paymasterOverride?: (userOp: UserOperation) => Promise<PaymasterResult>;
41
+ paymasterOverride?: (
42
+ userOp: UserOperationV06 | UserOperationV07,
43
+ ) => Promise<PaymasterResult>;
37
44
  }): Promise<PaymasterResult> {
38
45
  const { userOp, paymasterOverride, client, chain, entrypointAddress } = args;
39
46
 
@@ -45,8 +52,10 @@ export async function getPaymasterAndData(args: {
45
52
  "Content-Type": "application/json",
46
53
  };
47
54
 
48
- const paymasterUrl = getDefaultPaymasterUrl(chain);
49
55
  const entrypoint = entrypointAddress ?? ENTRYPOINT_ADDRESS_v0_6;
56
+ const entrypointVersion = getEntryPointVersion(entrypoint);
57
+ const paymasterVersion = entrypointVersion === "v0.6" ? "v1" : "v2";
58
+ const paymasterUrl = getDefaultBundlerUrl(chain, paymasterVersion);
50
59
 
51
60
  // Ask the paymaster to sign the transaction and return a valid paymasterAndData value.
52
61
  const fetchWithHeaders = getClientFetch(client);
@@ -95,6 +104,14 @@ Code: ${code}`,
95
104
  callGasLimit: res.result.callGasLimit
96
105
  ? hexToBigInt(res.result.callGasLimit)
97
106
  : undefined,
107
+ paymaster: res.result.paymaster,
108
+ paymasterData: res.result.paymasterData,
109
+ paymasterVerificationGasLimit: res.result.paymasterVerificationGasLimit
110
+ ? hexToBigInt(res.result.paymasterVerificationGasLimit)
111
+ : undefined,
112
+ paymasterPostOpGasLimit: res.result.paymasterPostOpGasLimit
113
+ ? hexToBigInt(res.result.paymasterPostOpGasLimit)
114
+ : undefined,
98
115
  };
99
116
  }
100
117
  const error =