thirdweb 5.89.1 → 5.90.1

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 (131) hide show
  1. package/dist/cjs/chains/constants.js +17 -2
  2. package/dist/cjs/chains/constants.js.map +1 -1
  3. package/dist/cjs/exports/wallets/smart.js +2 -1
  4. package/dist/cjs/exports/wallets/smart.js.map +1 -1
  5. package/dist/cjs/gas/fee-data.js +1 -0
  6. package/dist/cjs/gas/fee-data.js.map +1 -1
  7. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/BuyScreen.js +2 -0
  8. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/BuyScreen.js.map +1 -1
  9. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/BuyTokenInput.js +2 -0
  10. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/BuyTokenInput.js.map +1 -1
  11. package/dist/cjs/storage/download.js +16 -0
  12. package/dist/cjs/storage/download.js.map +1 -1
  13. package/dist/cjs/storage/mock.js +46 -0
  14. package/dist/cjs/storage/mock.js.map +1 -0
  15. package/dist/cjs/storage/upload/web-node.js +6 -1
  16. package/dist/cjs/storage/upload/web-node.js.map +1 -1
  17. package/dist/cjs/transaction/actions/estimate-gas-cost.js +1 -1
  18. package/dist/cjs/transaction/actions/estimate-gas-cost.js.map +1 -1
  19. package/dist/cjs/utils/process.js +4 -1
  20. package/dist/cjs/utils/process.js.map +1 -1
  21. package/dist/cjs/version.js +1 -1
  22. package/dist/cjs/wallets/manager/index.js +1 -1
  23. package/dist/cjs/wallets/manager/index.js.map +1 -1
  24. package/dist/cjs/wallets/smart/index.js +1 -0
  25. package/dist/cjs/wallets/smart/index.js.map +1 -1
  26. package/dist/cjs/wallets/smart/lib/bundler.js +75 -0
  27. package/dist/cjs/wallets/smart/lib/bundler.js.map +1 -1
  28. package/dist/cjs/wallets/smart/lib/userop.js +35 -13
  29. package/dist/cjs/wallets/smart/lib/userop.js.map +1 -1
  30. package/dist/esm/chains/constants.js +17 -2
  31. package/dist/esm/chains/constants.js.map +1 -1
  32. package/dist/esm/exports/wallets/smart.js +1 -1
  33. package/dist/esm/exports/wallets/smart.js.map +1 -1
  34. package/dist/esm/gas/fee-data.js +1 -0
  35. package/dist/esm/gas/fee-data.js.map +1 -1
  36. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/BuyScreen.js +2 -0
  37. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/BuyScreen.js.map +1 -1
  38. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/BuyTokenInput.js +2 -0
  39. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/BuyTokenInput.js.map +1 -1
  40. package/dist/esm/storage/download.js +16 -0
  41. package/dist/esm/storage/download.js.map +1 -1
  42. package/dist/esm/storage/mock.js +42 -0
  43. package/dist/esm/storage/mock.js.map +1 -0
  44. package/dist/esm/storage/upload/web-node.js +6 -1
  45. package/dist/esm/storage/upload/web-node.js.map +1 -1
  46. package/dist/esm/transaction/actions/estimate-gas-cost.js +1 -1
  47. package/dist/esm/transaction/actions/estimate-gas-cost.js.map +1 -1
  48. package/dist/esm/utils/process.js +3 -0
  49. package/dist/esm/utils/process.js.map +1 -1
  50. package/dist/esm/version.js +1 -1
  51. package/dist/esm/wallets/manager/index.js +1 -1
  52. package/dist/esm/wallets/manager/index.js.map +1 -1
  53. package/dist/esm/wallets/smart/index.js +1 -1
  54. package/dist/esm/wallets/smart/index.js.map +1 -1
  55. package/dist/esm/wallets/smart/lib/bundler.js +74 -0
  56. package/dist/esm/wallets/smart/lib/bundler.js.map +1 -1
  57. package/dist/esm/wallets/smart/lib/userop.js +34 -13
  58. package/dist/esm/wallets/smart/lib/userop.js.map +1 -1
  59. package/dist/types/chains/constants.d.ts +1 -1
  60. package/dist/types/chains/constants.d.ts.map +1 -1
  61. package/dist/types/exports/wallets/smart.d.ts +1 -1
  62. package/dist/types/exports/wallets/smart.d.ts.map +1 -1
  63. package/dist/types/gas/fee-data.d.ts.map +1 -1
  64. package/dist/types/react/web/ui/ConnectWallet/screens/Buy/swap/BuyTokenInput.d.ts.map +1 -1
  65. package/dist/types/storage/download.d.ts.map +1 -1
  66. package/dist/types/storage/mock.d.ts +11 -0
  67. package/dist/types/storage/mock.d.ts.map +1 -0
  68. package/dist/types/storage/upload/web-node.d.ts.map +1 -1
  69. package/dist/types/utils/process.d.ts +1 -0
  70. package/dist/types/utils/process.d.ts.map +1 -1
  71. package/dist/types/version.d.ts +1 -1
  72. package/dist/types/wallets/manager/index.d.ts +1 -1
  73. package/dist/types/wallets/manager/index.d.ts.map +1 -1
  74. package/dist/types/wallets/smart/index.d.ts +2 -0
  75. package/dist/types/wallets/smart/index.d.ts.map +1 -1
  76. package/dist/types/wallets/smart/lib/bundler.d.ts +30 -1
  77. package/dist/types/wallets/smart/lib/bundler.d.ts.map +1 -1
  78. package/dist/types/wallets/smart/lib/userop.d.ts +8 -0
  79. package/dist/types/wallets/smart/lib/userop.d.ts.map +1 -1
  80. package/package.json +7 -7
  81. package/src/adapters/viem-legacy.test.ts +1 -1
  82. package/src/auth/verify-typed-data.test.ts +2 -4
  83. package/src/chains/constants.ts +17 -2
  84. package/src/contract/actions/resolve-abi.test.ts +3 -3
  85. package/src/exports/wallets/smart.ts +1 -0
  86. package/src/extensions/erc1155/customDrop1155.test.ts +3 -14
  87. package/src/extensions/erc1155/drop1155.test.ts +3 -14
  88. package/src/extensions/erc1155/token1155.test.ts +16 -109
  89. package/src/extensions/erc20/read/getCurrencyMetadata.test.ts +1 -1
  90. package/src/extensions/erc721/customDrop721.test.ts +3 -13
  91. package/src/extensions/erc721/drop721.test.ts +3 -13
  92. package/src/extensions/erc721/read/getNFTs.test.ts +1 -1
  93. package/src/extensions/erc721/read/getOwnedTokenIds.test.ts +1 -1
  94. package/src/extensions/lens/read/resolveAddress.test.ts +1 -1
  95. package/src/extensions/prebuilts/deploy-vote.test.ts +1 -1
  96. package/src/extensions/unstoppable-domains/read/resolveAddress.test.ts +1 -1
  97. package/src/extensions/unstoppable-domains/read/resolveName.test.ts +1 -1
  98. package/src/gas/fee-data.ts +1 -0
  99. package/src/pay/convert/cryptoToFiat.test.ts +4 -4
  100. package/src/pay/convert/fiatToCrypto.test.ts +4 -4
  101. package/src/react/core/hooks/wallets/useConnect.test.tsx +3 -3
  102. package/src/react/web/ui/ConnectWallet/screens/Buy/BuyScreen.tsx +3 -0
  103. package/src/react/web/ui/ConnectWallet/screens/Buy/swap/BuyTokenInput.tsx +3 -0
  104. package/src/react/web/ui/prebuilt/Account/balance.test.tsx +7 -13
  105. package/src/react/web/ui/prebuilt/Chain/icon.test.tsx +1 -1
  106. package/src/react/web/ui/prebuilt/NFT/description.test.tsx +1 -1
  107. package/src/react/web/ui/prebuilt/NFT/media.test.tsx +1 -1
  108. package/src/react/web/ui/prebuilt/NFT/name.test.tsx +1 -1
  109. package/src/react/web/ui/prebuilt/NFT/utils.test.ts +1 -1
  110. package/src/react/web/ui/prebuilt/Token/name.test.tsx +1 -1
  111. package/src/react/web/ui/prebuilt/Token/symbol.test.tsx +1 -1
  112. package/src/react/web/ui/prebuilt/Wallet/icon.test.tsx +1 -1
  113. package/src/react/web/ui/prebuilt/Wallet/name.test.tsx +1 -1
  114. package/src/react/web/ui/prebuilt/thirdweb/ClaimButton/ClaimButton.test.tsx +1 -1
  115. package/src/storage/download.test.ts +1 -1
  116. package/src/storage/download.ts +17 -0
  117. package/src/storage/mock.ts +52 -0
  118. package/src/storage/upload/web-node.test.ts +2 -1
  119. package/src/storage/upload/web-node.ts +8 -1
  120. package/src/transaction/actions/encode.test.ts +1 -1
  121. package/src/transaction/actions/estimate-gas-cost.ts +1 -1
  122. package/src/utils/nft/fetch-token-metadata.test.ts +1 -1
  123. package/src/utils/process.ts +4 -0
  124. package/src/version.ts +1 -1
  125. package/src/wallets/manager/index.ts +6 -2
  126. package/src/wallets/smart/index.ts +1 -1
  127. package/src/wallets/smart/lib/bundler.ts +95 -0
  128. package/src/wallets/smart/lib/userop.ts +42 -15
  129. package/src/wallets/smart/smart-wallet-integration-v07.test.ts +25 -21
  130. package/src/wallets/smart/smart-wallet-integration.test.ts +21 -1
  131. package/src/wallets/smart/smart-wallet-modular.test.ts +1 -2
@@ -1,7 +1,10 @@
1
+ import type { ThirdwebClient } from "../../../client/client.js";
2
+ import type { PreparedTransaction } from "../../../transaction/prepare-transaction.js";
1
3
  import type { SerializableTransaction } from "../../../transaction/serialize-transaction.js";
2
4
  import type { TransactionReceipt } from "../../../transaction/types.js";
3
5
  import { type Hex } from "../../../utils/encoding/hex.js";
4
- import { type BundlerOptions, type EstimationResult, type GasPriceResult, type PmTransactionData, type UserOperationReceipt, type UserOperationV06, type UserOperationV07 } from "../types.js";
6
+ import type { Account } from "../../interfaces/wallet.js";
7
+ import { type BundlerOptions, type EstimationResult, type GasPriceResult, type PmTransactionData, type SmartWalletOptions, type UserOperationReceipt, type UserOperationV06, type UserOperationV07 } from "../types.js";
5
8
  /**
6
9
  * Bundle a user operation.
7
10
  * @param args - The options for bundling a user operation.
@@ -46,6 +49,32 @@ export declare function estimateUserOpGas(args: {
46
49
  };
47
50
  };
48
51
  }): Promise<EstimationResult>;
52
+ /**
53
+ * Estimate the gas cost of a user operation.
54
+ * @param args - The options for estimating the gas cost of a user operation.
55
+ * @returns The estimated gas cost of the user operation.
56
+ * @example
57
+ * ```ts
58
+ * import { estimateUserOpGasCost } from "thirdweb/wallets/smart";
59
+ *
60
+ * const gasCost = await estimateUserOpGasCost({
61
+ * transactions,
62
+ * adminAccount,
63
+ * client,
64
+ * smartWalletOptions,
65
+ * });
66
+ * ```
67
+ * @walletUtils
68
+ */
69
+ export declare function estimateUserOpGasCost(args: {
70
+ transactions: PreparedTransaction[];
71
+ adminAccount: Account;
72
+ client: ThirdwebClient;
73
+ smartWalletOptions: SmartWalletOptions;
74
+ }): Promise<{
75
+ ether: string;
76
+ wei: bigint;
77
+ }>;
49
78
  /**
50
79
  * Get the gas fees of a user operation.
51
80
  * @param args - The options for getting the gas price of a user operation.
@@ -1 +1 @@
1
- {"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../../../../src/wallets/smart/lib/bundler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,gCAAgC,CAAC;AAGvE,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAEtB,MAAM,aAAa,CAAC;AAQrB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG,OAAO,CAAC,GAAG,CAAC,CASf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IACJ,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC;CACzB,EACD,cAAc,CAAC,EAAE;IACf,CAAC,CAAC,EAAE,MAAM,GAAG;QACX,SAAS,EAAE;YACT,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAAC;SAC5B,CAAC;KACH,CAAC;CACH,GACA,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG,OAAO,CAAC,cAAc,CAAC,CAW1B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,GAAG;IACrB,UAAU,EAAE,GAAG,CAAC;CACjB,GACA,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CA6BzC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,GAAG;IACrB,UAAU,EAAE,GAAG,CAAC;CACjB,GACA,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAU3C;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,uBAAuB,CAAC;CACtC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAW7B;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,uBAAuB,CAAC;IACrC,iBAAiB,EAAE,GAAG,CAAC;CACxB,GAAG,OAAO,CAAC;IAAE,eAAe,EAAE,GAAG,CAAA;CAAE,CAAC,CAepC"}
1
+ {"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../../../../src/wallets/smart/lib/bundler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,gCAAgC,CAAC;AAIvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAEtB,MAAM,aAAa,CAAC;AAUrB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG,OAAO,CAAC,GAAG,CAAC,CASf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IACJ,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC;CACzB,EACD,cAAc,CAAC,EAAE;IACf,CAAC,CAAC,EAAE,MAAM,GAAG;QACX,SAAS,EAAE;YACT,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAAC;SAC5B,CAAC;KACH,CAAC;CACH,GACA,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;;;GA6DA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG,OAAO,CAAC,cAAc,CAAC,CAW1B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,GAAG;IACrB,UAAU,EAAE,GAAG,CAAC;CACjB,GACA,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CA6BzC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,GAAG;IACrB,UAAU,EAAE,GAAG,CAAC;CACjB,GACA,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAU3C;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,uBAAuB,CAAC;CACtC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAW7B;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,uBAAuB,CAAC;IACrC,iBAAiB,EAAE,GAAG,CAAC;CACxB,GAAG,OAAO,CAAC;IAAE,eAAe,EAAE,GAAG,CAAA;CAAE,CAAC,CAepC"}
@@ -111,4 +111,12 @@ export declare function createAndSignUserOp(options: {
111
111
  waitForDeployment?: boolean;
112
112
  isDeployedOverride?: boolean;
113
113
  }): Promise<UserOperationV06 | UserOperationV07>;
114
+ export declare function prepareUserOp(options: {
115
+ transactions: PreparedTransaction[];
116
+ adminAccount: Account;
117
+ client: ThirdwebClient;
118
+ smartWalletOptions: SmartWalletOptions;
119
+ waitForDeployment?: boolean;
120
+ isDeployedOverride?: boolean;
121
+ }): Promise<UserOperationV06 | UserOperationV07>;
114
122
  //# sourceMappingURL=userop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"userop.d.ts","sourceRoot":"","sources":["../../../../../src/wallets/smart/lib/userop.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACL,KAAK,gBAAgB,EAEtB,MAAM,+BAA+B,CAAC;AAOvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAI1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EACV,cAAc,EAEd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAkCrB,eAAO,MAAM,qBAAqB,oBAAqB,gBAAgB,SAEtE,CAAC;AAMF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,cAAc,GAAG;IACrB,UAAU,EAAE,GAAG,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAc7B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,WAAW,EAAE,mBAAmB,CAAC;IACjC,eAAe,EAAE,gBAAgB,CAAC;IAClC,eAAe,EAAE,gBAAgB,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;CAC7C,GAAG,OAAO,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,CAqF/C;AAsVD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAC5C,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,CA0C/C;AAkDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,gDAoEA"}
1
+ {"version":3,"file":"userop.d.ts","sourceRoot":"","sources":["../../../../../src/wallets/smart/lib/userop.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACL,KAAK,gBAAgB,EAEtB,MAAM,+BAA+B,CAAC;AAOvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAI1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EACV,cAAc,EAEd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAkCrB,eAAO,MAAM,qBAAqB,oBAAqB,gBAAgB,SAEtE,CAAC;AAMF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,cAAc,GAAG;IACrB,UAAU,EAAE,GAAG,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAc7B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,WAAW,EAAE,mBAAmB,CAAC;IACjC,eAAe,EAAE,gBAAgB,CAAC;IAClC,eAAe,EAAE,gBAAgB,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;CAC7C,GAAG,OAAO,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,CAqF/C;AAsVD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAC5C,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,CA0C/C;AAkDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,gDAiBA;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,gDAqEA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thirdweb",
3
- "version": "5.89.1",
3
+ "version": "5.90.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/thirdweb-dev/js.git#main"
@@ -228,7 +228,7 @@
228
228
  "mipd": "0.0.7",
229
229
  "ox": "0.6.9",
230
230
  "uqr": "0.1.2",
231
- "viem": "2.22.17"
231
+ "viem": "2.23.5"
232
232
  },
233
233
  "peerDependencies": {
234
234
  "@aws-sdk/client-lambda": "^3",
@@ -332,7 +332,7 @@
332
332
  "ethers6": "npm:ethers@6",
333
333
  "expo-linking": "7.0.5",
334
334
  "expo-web-browser": "14.0.1",
335
- "happy-dom": "16.8.1",
335
+ "happy-dom": "17.1.8",
336
336
  "knip": "5.45.0",
337
337
  "msw": "2.7.3",
338
338
  "prettier": "3.3.3",
@@ -372,10 +372,10 @@
372
372
  "clean": "rimraf dist",
373
373
  "size": "size-limit",
374
374
  "test:watch": "vitest -c ./test/vitest.config.ts dev",
375
- "test": "vitest run -c ./test/vitest.config.ts --coverage",
376
- "test:cov": "vitest dev -c ./test/vitest.config.ts --coverage",
377
- "test:ui": "vitest dev -c ./test/vitest.config.ts --coverage --ui",
378
- "test:dev": "vitest run -c ./test/vitest.config.ts",
375
+ "test": "NODE_OPTIONS=--max-old-space-size=8192 vitest run -c ./test/vitest.config.ts --coverage",
376
+ "test:cov": "NODE_OPTIONS=--max-old-space-size=8192 vitest dev -c ./test/vitest.config.ts --coverage",
377
+ "test:ui": "NODE_OPTIONS=--max-old-space-size=8192 vitest dev -c ./test/vitest.config.ts --coverage --ui",
378
+ "test:dev": "NODE_OPTIONS=--max-old-space-size=8192 vitest run -c ./test/vitest.config.ts",
379
379
  "test:react": "vitest run -c ./test/vitest.config.ts dev --ui src/react",
380
380
  "typedoc": "node scripts/typedoc.mjs && node scripts/parse.mjs",
381
381
  "update-version": "node scripts/version.mjs",
@@ -153,7 +153,7 @@ describe("walletClient.toViem", () => {
153
153
  [UnknownRpcError: An unknown RPC error occurred.
154
154
 
155
155
  Details: Can't switch chains because only an account was passed to 'viemAdapter.walletClient.toViem()', please pass a connected wallet instance instead.
156
- Version: viem@2.22.17]
156
+ Version: viem@2.23.5]
157
157
  `);
158
158
  });
159
159
  });
@@ -26,8 +26,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("verifyTypedData", async () => {
26
26
  ).toBe(true);
27
27
  });
28
28
 
29
- // FIXME: flaky test - needs to be fixed
30
- test.skip("invalid EOA signature", async () => {
29
+ test("invalid EOA signature", async () => {
31
30
  expect(
32
31
  await verifyTypedData({
33
32
  ...typedData.basic,
@@ -54,8 +53,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("verifyTypedData", async () => {
54
53
  ).toBe(true);
55
54
  });
56
55
 
57
- // FIXME: flaky test - needs to be fixed
58
- test.skip("invalid smart account signature", async () => {
56
+ test("invalid smart account signature", async () => {
59
57
  expect(
60
58
  await verifyTypedData({
61
59
  ...typedData.basic,
@@ -25,6 +25,21 @@ const opChains = [
25
25
  * TODO this should be in the chain definition itself
26
26
  * @internal
27
27
  */
28
- export function isOpStackChain(chain: Chain) {
29
- return opChains.includes(chain.id);
28
+ export async function isOpStackChain(chain: Chain) {
29
+ if (chain.id === 1337 || chain.id === 31337) {
30
+ return false;
31
+ }
32
+
33
+ if (opChains.includes(chain.id)) {
34
+ return true;
35
+ }
36
+ // fallback to checking the stack on rpc
37
+ try {
38
+ const { getChainMetadata } = await import("./utils.js");
39
+ const chainMetadata = await getChainMetadata(chain);
40
+ return chainMetadata.stackType === "optimism_bedrock";
41
+ } catch {
42
+ // If the network check fails, assume it's not a OP chain
43
+ return false;
44
+ }
30
45
  }
@@ -61,7 +61,7 @@ it("should throw error if contract bytecode is 0x", async () => {
61
61
  client: TEST_CLIENT,
62
62
  chain: FORKED_ETHEREUM_CHAIN,
63
63
  });
64
- await expect(() =>
65
- resolveAbiFromBytecode(wrongContract),
66
- ).rejects.toThrowError("Failed to load contract bytecode");
64
+ await expect(resolveAbiFromBytecode(wrongContract)).rejects.toThrowError(
65
+ "Failed to load contract bytecode",
66
+ );
67
67
  });
@@ -13,6 +13,7 @@ export {
13
13
  bundleUserOp,
14
14
  getUserOpGasFees,
15
15
  estimateUserOpGas,
16
+ estimateUserOpGasCost,
16
17
  } from "../../wallets/smart/lib/bundler.js";
17
18
 
18
19
  export {
@@ -69,20 +69,9 @@ describe.runIf(process.env.TW_SECRET_KEY)(
69
69
  });
70
70
 
71
71
  await expect(nextTokenIdToMint({ contract })).resolves.toBe(6n);
72
- await expect(
73
- getNFT({ contract, tokenId: 0n }),
74
- ).resolves.toMatchInlineSnapshot(`
75
- {
76
- "id": 0n,
77
- "metadata": {
78
- "name": "Test NFT",
79
- },
80
- "owner": null,
81
- "supply": 0n,
82
- "tokenURI": "ipfs://QmTo68Dm1ntSp2BHLmE9gesS6ELuXosRz5mAgFCK6tfsRk/0",
83
- "type": "ERC1155",
84
- }
85
- `);
72
+ expect((await getNFT({ contract, tokenId: 0n })).metadata.name).toBe(
73
+ "Test NFT",
74
+ );
86
75
  });
87
76
 
88
77
  it("should allow to claim tokens", async () => {
@@ -89,20 +89,9 @@ describe.runIf(process.env.TW_SECRET_KEY)(
89
89
  });
90
90
 
91
91
  await expect(nextTokenIdToMint({ contract })).resolves.toBe(6n);
92
- await expect(
93
- getNFT({ contract, tokenId: 0n }),
94
- ).resolves.toMatchInlineSnapshot(`
95
- {
96
- "id": 0n,
97
- "metadata": {
98
- "name": "Test NFT",
99
- },
100
- "owner": null,
101
- "supply": 0n,
102
- "tokenURI": "ipfs://QmTo68Dm1ntSp2BHLmE9gesS6ELuXosRz5mAgFCK6tfsRk/0",
103
- "type": "ERC1155",
104
- }
105
- `);
92
+ expect((await getNFT({ contract, tokenId: 0n })).metadata.name).toBe(
93
+ "Test NFT",
94
+ );
106
95
  });
107
96
 
108
97
  it("should update metadata", async () => {
@@ -81,20 +81,9 @@ describe.runIf(process.env.TW_SECRET_KEY)("TokenERC1155", () => {
81
81
  // now 1 token minted
82
82
  await expect(nextTokenIdToMint({ contract })).resolves.toBe(1n);
83
83
  // tokenId 0 is minted
84
- await expect(
85
- getNFT({ contract, tokenId: 0n }),
86
- ).resolves.toMatchInlineSnapshot(`
87
- {
88
- "id": 0n,
89
- "metadata": {
90
- "name": "Test NFT",
91
- },
92
- "owner": null,
93
- "supply": 10n,
94
- "tokenURI": "ipfs://QmUut8sypH8NaPUeksnirut7MgggMeQa9RvJ37sV513sw3/0",
95
- "type": "ERC1155",
96
- }
97
- `);
84
+ expect((await getNFT({ contract, tokenId: 0n })).metadata.name).toBe(
85
+ "Test NFT",
86
+ );
98
87
  // account should have a balance of 10
99
88
  await expect(
100
89
  balanceOf({ contract, owner: TEST_ACCOUNT_A.address, tokenId: 0n }),
@@ -119,20 +108,8 @@ describe.runIf(process.env.TW_SECRET_KEY)("TokenERC1155", () => {
119
108
  await expect(nextTokenIdToMint({ contract })).resolves.toBe(1n);
120
109
  // tokenId 0 is minted
121
110
  // supply should be 15
122
- await expect(
123
- getNFT({ contract, tokenId: 0n }),
124
- ).resolves.toMatchInlineSnapshot(`
125
- {
126
- "id": 0n,
127
- "metadata": {
128
- "name": "Test NFT",
129
- },
130
- "owner": null,
131
- "supply": 15n,
132
- "tokenURI": "ipfs://QmUut8sypH8NaPUeksnirut7MgggMeQa9RvJ37sV513sw3/0",
133
- "type": "ERC1155",
134
- }
135
- `);
111
+ // @ts-expect-error - supply is there
112
+ expect((await getNFT({ contract, tokenId: 0n })).supply).toBe(15n);
136
113
  // account should have a balance of 15
137
114
  await expect(
138
115
  balanceOf({ contract, owner: TEST_ACCOUNT_A.address, tokenId: 0n }),
@@ -155,30 +132,13 @@ describe.runIf(process.env.TW_SECRET_KEY)("TokenERC1155", () => {
155
132
 
156
133
  // now 2 tokens minted
157
134
  await expect(nextTokenIdToMint({ contract })).resolves.toBe(2n);
158
- await expect(getNFTs({ contract })).resolves.toMatchInlineSnapshot(`
159
- [
160
- {
161
- "id": 0n,
162
- "metadata": {
163
- "name": "Test NFT",
164
- },
165
- "owner": null,
166
- "supply": 15n,
167
- "tokenURI": "ipfs://QmUut8sypH8NaPUeksnirut7MgggMeQa9RvJ37sV513sw3/0",
168
- "type": "ERC1155",
169
- },
170
- {
171
- "id": 1n,
172
- "metadata": {
173
- "name": "Test NFT 2",
174
- },
175
- "owner": null,
176
- "supply": 5n,
177
- "tokenURI": "ipfs://QmV6gsfzdiMRtpnh8ay3CgutStVbes7qoF4DKpYE64h8hT/0",
178
- "type": "ERC1155",
179
- },
180
- ]
181
- `);
135
+ await expect(getNFTs({ contract })).resolves.length(2);
136
+ expect((await getNFT({ contract, tokenId: 0n })).metadata.name).toBe(
137
+ "Test NFT",
138
+ );
139
+ expect((await getNFT({ contract, tokenId: 1n })).metadata.name).toBe(
140
+ "Test NFT 2",
141
+ );
182
142
  });
183
143
 
184
144
  it("isGetNFTsSupported should work with our Edition contracts", async () => {
@@ -241,63 +201,10 @@ describe.runIf(process.env.TW_SECRET_KEY)("TokenERC1155", () => {
241
201
  });
242
202
 
243
203
  const nfts = await getNFTs({ contract });
244
- expect(nfts).toStrictEqual([
245
- {
246
- // Updated tokenURI from the test above
247
- metadata: { name: "Test1 Updated" },
248
- owner: null,
249
- id: 0n,
250
- tokenURI: "ipfs://QmTSyt6YgoFtH8yhWgevC22BxjyrkCKuzdk86nqQJCwrV9/0",
251
- type: "ERC1155",
252
- supply: 15n,
253
- },
254
- {
255
- metadata: { name: "Test NFT 2" },
256
- owner: null,
257
- id: 1n,
258
- tokenURI: "ipfs://QmV6gsfzdiMRtpnh8ay3CgutStVbes7qoF4DKpYE64h8hT/0",
259
- type: "ERC1155",
260
- supply: 5n,
261
- },
262
- {
263
- metadata: {
264
- name: "tw-contract-name",
265
- symbol: "tw-contract-symbol",
266
- description: "tw-contract-description",
267
- },
268
- owner: null,
269
- id: 2n,
270
- // Minted using URI from the test above
271
- tokenURI:
272
- "ipfs://bafybeiewg2e3vehsb5pb34xwk25eyyfwlvajzmgz3rtdrvn3upsxnsbhzi/contractUri.json",
273
- type: "ERC1155",
274
- supply: 1n,
275
- },
276
- {
277
- metadata: { name: "batch token 0" },
278
- owner: null,
279
- id: 3n,
280
- tokenURI: "ipfs://QmPSQhC2J6Wig4pH1Lt5th19FM58J5oukhfLfpc9L1i39Q/0",
281
- type: "ERC1155",
282
- supply: 1n,
283
- },
284
- {
285
- metadata: { name: "batch token 1" },
286
- owner: null,
287
- id: 4n,
288
- tokenURI: "ipfs://QmWRQwLBAeq6Wr65Yj7A4aeYqMD1C7Hs1moz15ncS6EhGu/0",
289
- type: "ERC1155",
290
- supply: 2n,
291
- },
292
- {
293
- metadata: { name: "batch token 2" },
294
- owner: null,
295
- id: 5n,
296
- tokenURI: "ipfs://QmTg1wxKGvdZR4NrdkYZGcfB5YYaBz75DH83td5RwprMRP/0",
297
- type: "ERC1155",
298
- supply: 3n,
299
- },
300
- ]);
204
+ const names = nfts.map((nft) => nft.metadata.name);
205
+ expect(names).toContain("batch token 0");
206
+ expect(names).toContain("batch token 1");
207
+ expect(names).toContain("batch token 2");
301
208
  });
302
209
 
303
210
  it("getOwnedTokenIds should work", async () => {
@@ -4,7 +4,7 @@ import { getCurrencyMetadata } from "./getCurrencyMetadata.js";
4
4
 
5
5
  describe("getCurrencyMetadata", () => {
6
6
  it("should throw if not a valid ERC20 contract", async () => {
7
- await expect(() =>
7
+ await expect(
8
8
  getCurrencyMetadata({ contract: DOODLES_CONTRACT }),
9
9
  ).rejects.toThrowError("Invalid currency token");
10
10
  });
@@ -65,19 +65,9 @@ describe.runIf(process.env.TW_SECRET_KEY)(
65
65
  });
66
66
 
67
67
  await expect(nextTokenIdToMint({ contract })).resolves.toBe(6n);
68
- await expect(
69
- getNFT({ contract, tokenId: 0n }),
70
- ).resolves.toMatchInlineSnapshot(`
71
- {
72
- "id": 0n,
73
- "metadata": {
74
- "name": "Test NFT",
75
- },
76
- "owner": null,
77
- "tokenURI": "ipfs://QmTo68Dm1ntSp2BHLmE9gesS6ELuXosRz5mAgFCK6tfsRk/0",
78
- "type": "ERC721",
79
- }
80
- `);
68
+ expect((await getNFT({ contract, tokenId: 0n })).metadata.name).toBe(
69
+ "Test NFT",
70
+ );
81
71
  });
82
72
 
83
73
  it("should allow to claim tokens", async () => {
@@ -96,19 +96,9 @@ describe.runIf(process.env.TW_SECRET_KEY)(
96
96
  });
97
97
 
98
98
  await expect(nextTokenIdToMint({ contract })).resolves.toBe(10n);
99
- await expect(
100
- getNFT({ contract, tokenId: 0n }),
101
- ).resolves.toMatchInlineSnapshot(`
102
- {
103
- "id": 0n,
104
- "metadata": {
105
- "name": "Test NFT",
106
- },
107
- "owner": null,
108
- "tokenURI": "ipfs://QmY1Rr4C7cYVPAaXykMMxg3AVbatDZ6Rd7u3gzt79CiDSB/0",
109
- "type": "ERC721",
110
- }
111
- `);
99
+ expect((await getNFT({ contract, tokenId: 0n })).metadata.name).toBe(
100
+ "Test NFT",
101
+ );
112
102
  });
113
103
 
114
104
  it("should allow to claim tokens", async () => {
@@ -189,7 +189,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("erc721.getNFTs", () => {
189
189
  });
190
190
 
191
191
  it("should throw error if totalSupply and nextTokenIdToMint are not supported", async () => {
192
- await expect(() =>
192
+ await expect(
193
193
  getNFTs({ contract: UNISWAPV3_FACTORY_CONTRACT }),
194
194
  ).rejects.toThrowError(
195
195
  "Contract requires either `nextTokenIdToMint` or `totalSupply` function available to determine the next token ID to mint",
@@ -22,7 +22,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("erc721.getOwnedTokenIds", () => {
22
22
  it("should throw if tokenOfOwnerByIndex or tokensOfOwner not supported", async () => {
23
23
  // We know current Lens contract on Polygon doesn't have this.
24
24
  const contract = UNISWAPV3_FACTORY_CONTRACT;
25
- await expect(() =>
25
+ await expect(
26
26
  getOwnedTokenIds({ contract, owner: TEST_ACCOUNT_B.address }),
27
27
  ).rejects.toThrowError(
28
28
  `The contract at ${contract.address} on chain ${contract.chain.id} does not support the tokenOfOwnerByIndex or tokensOfOwner interface`,
@@ -14,7 +14,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("resolve lens address", () => {
14
14
  });
15
15
 
16
16
  it("should throw if passed an invalid lens handle", async () => {
17
- await expect(() =>
17
+ await expect(
18
18
  resolveAddress({ client: TEST_CLIENT, name: "vitalik.eth" }),
19
19
  ).rejects.toThrowError(
20
20
  "Could not fetch the wallet address for lens handle: vitalik.eth",
@@ -9,7 +9,7 @@ const account = TEST_ACCOUNT_B;
9
9
 
10
10
  describe.runIf(process.env.TW_SECRET_KEY)("deploy-voteERC20 contract", () => {
11
11
  it("should throw if passed an non-integer-like value to minVoteQuorumRequiredPercent", async () => {
12
- await expect(() =>
12
+ await expect(
13
13
  deployVoteContract({
14
14
  account,
15
15
  client: TEST_CLIENT,
@@ -19,7 +19,7 @@ describe.runIf(process.env.TW_SECRET_KEY)(
19
19
  });
20
20
 
21
21
  it("should throw an error with a non-existent domain name", async () => {
22
- await expect(() =>
22
+ await expect(
23
23
  resolveAddress({
24
24
  name: "thirdwebsdk.thissuredoesnotexist",
25
25
  client: TEST_CLIENT,
@@ -18,7 +18,7 @@ describe.runIf(process.env.TW_SECRET_KEY)(
18
18
  });
19
19
 
20
20
  it("should throw error on addresses that dont own any UD", async () => {
21
- await expect(() =>
21
+ await expect(
22
22
  resolveName({ client: TEST_CLIENT, address: TEST_ACCOUNT_D.address }),
23
23
  ).rejects.toThrowError(
24
24
  `Failed to retrieve domain for address: ${TEST_ACCOUNT_D.address}. Make sure you have set the Reverse Resolution address for your domain at https://unstoppabledomains.com/manage?page=reverseResolution&domain=your-domain`,
@@ -42,6 +42,7 @@ const FORCE_GAS_PRICE_CHAIN_IDS = [
42
42
  994873017, // Lumia Mainnet
43
43
  19011, // Homeverse Mainnet
44
44
  40875, // Homeverse Testnet
45
+ 1511670449, // GPT Mainnet
45
46
  ];
46
47
 
47
48
  /**
@@ -52,7 +52,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("Pay: crypto-to-fiat", () => {
52
52
  });
53
53
 
54
54
  it("should throw error for testnet chain (because testnets are not supported", async () => {
55
- await expect(() =>
55
+ await expect(
56
56
  convertCryptoToFiat({
57
57
  chain: sepolia,
58
58
  fromTokenAddress: NATIVE_TOKEN_ADDRESS,
@@ -66,7 +66,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("Pay: crypto-to-fiat", () => {
66
66
  });
67
67
 
68
68
  it("should throw error if fromTokenAddress is set to an invalid EVM address", async () => {
69
- await expect(() =>
69
+ await expect(
70
70
  convertCryptoToFiat({
71
71
  chain: ethereum,
72
72
  fromTokenAddress: "haha",
@@ -80,7 +80,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("Pay: crypto-to-fiat", () => {
80
80
  });
81
81
 
82
82
  it("should throw error if fromTokenAddress is set to a wallet address", async () => {
83
- await expect(() =>
83
+ await expect(
84
84
  convertCryptoToFiat({
85
85
  chain: base,
86
86
  fromTokenAddress: TEST_ACCOUNT_A.address,
@@ -99,7 +99,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("Pay: crypto-to-fiat", () => {
99
99
  status: 400,
100
100
  statusText: "Bad Request",
101
101
  });
102
- await expect(() =>
102
+ await expect(
103
103
  convertCryptoToFiat({
104
104
  chain: base,
105
105
  fromTokenAddress: NATIVE_TOKEN_ADDRESS,
@@ -53,7 +53,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("Pay: fiatToCrypto", () => {
53
53
  });
54
54
 
55
55
  it("should throw error for testnet chain (because testnets are not supported", async () => {
56
- await expect(() =>
56
+ await expect(
57
57
  convertFiatToCrypto({
58
58
  chain: sepolia,
59
59
  to: NATIVE_TOKEN_ADDRESS,
@@ -67,7 +67,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("Pay: fiatToCrypto", () => {
67
67
  });
68
68
 
69
69
  it("should throw error if `to` is set to an invalid EVM address", async () => {
70
- await expect(() =>
70
+ await expect(
71
71
  convertFiatToCrypto({
72
72
  chain: ethereum,
73
73
  to: "haha",
@@ -81,7 +81,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("Pay: fiatToCrypto", () => {
81
81
  });
82
82
 
83
83
  it("should throw error if `to` is set to a wallet address", async () => {
84
- await expect(() =>
84
+ await expect(
85
85
  convertFiatToCrypto({
86
86
  chain: base,
87
87
  to: TEST_ACCOUNT_A.address,
@@ -100,7 +100,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("Pay: fiatToCrypto", () => {
100
100
  status: 400,
101
101
  statusText: "Bad Request",
102
102
  });
103
- await expect(() =>
103
+ await expect(
104
104
  convertFiatToCrypto({
105
105
  chain: ethereum,
106
106
  to: NATIVE_TOKEN_ADDRESS,
@@ -48,7 +48,7 @@ describe("useAddConnectedWallet", () => {
48
48
  },
49
49
  );
50
50
  const { result } = renderHook(() => useConnect(), { wrapper });
51
- expect(statusResult.current).toEqual("disconnected");
51
+ expect(statusResult.current).toEqual("unknown");
52
52
  await result.current.connect(async () => wallet);
53
53
  expect(statusResult.current).toEqual("connected");
54
54
 
@@ -67,7 +67,7 @@ describe("useAddConnectedWallet", () => {
67
67
  },
68
68
  );
69
69
  const { result } = renderHook(() => useConnect(), { wrapper });
70
- expect(statusResult.current).toEqual("disconnected");
70
+ expect(statusResult.current).toEqual("unknown");
71
71
  await result.current.connect(async () => wallet);
72
72
  expect(statusResult.current).toEqual("connected");
73
73
 
@@ -85,7 +85,7 @@ describe("useAddConnectedWallet", () => {
85
85
  wrapper,
86
86
  },
87
87
  );
88
- expect(statusResult.current).toEqual("disconnected");
88
+ expect(statusResult.current).toEqual("unknown");
89
89
  const { result } = renderHook(() => useConnect(), { wrapper });
90
90
  await result.current.connect(async () => {
91
91
  throw new Error("test");
@@ -654,6 +654,9 @@ function SelectedTokenInfo(props: {
654
654
  onChange={(e) => {
655
655
  let value = e.target.value;
656
656
 
657
+ // Replace comma with period if it exists
658
+ value = value.replace(",", ".");
659
+
657
660
  if (value.startsWith(".")) {
658
661
  value = `0${value}`;
659
662
  }
@@ -73,6 +73,9 @@ export function BuyTokenInput(props: {
73
73
  onChange={(e) => {
74
74
  let value = e.target.value;
75
75
 
76
+ // Replace comma with period if it exists
77
+ value = value.replace(",", ".");
78
+
76
79
  if (value.startsWith(".")) {
77
80
  value = `0${value}`;
78
81
  }