thirdweb 5.95.0-nightly-4c1f384a635054a8cfaaa487e3ba7ada63b221ec-20250415110008 → 5.95.0-nightly-e7b01108037ebef07fba95f888be1905c8fab5df-20250417000348

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 (268) hide show
  1. package/dist/cjs/chains/utils.js +41 -2
  2. package/dist/cjs/chains/utils.js.map +1 -1
  3. package/dist/cjs/event/actions/get-events.js +56 -8
  4. package/dist/cjs/event/actions/get-events.js.map +1 -1
  5. package/dist/cjs/extensions/erc1155/read/getNFT.js +2 -0
  6. package/dist/cjs/extensions/erc1155/read/getNFT.js.map +1 -1
  7. package/dist/cjs/extensions/erc20/read/getBalance.js +2 -0
  8. package/dist/cjs/extensions/erc20/read/getBalance.js.map +1 -1
  9. package/dist/cjs/extensions/erc721/read/getNFT.js +42 -0
  10. package/dist/cjs/extensions/erc721/read/getNFT.js.map +1 -1
  11. package/dist/cjs/extensions/erc721/read/getNFTs.js +44 -17
  12. package/dist/cjs/extensions/erc721/read/getNFTs.js.map +1 -1
  13. package/dist/cjs/extensions/erc721/read/getOwnedNFTs.js +46 -0
  14. package/dist/cjs/extensions/erc721/read/getOwnedNFTs.js.map +1 -1
  15. package/dist/cjs/extensions/marketplace/direct-listings/utils.js +7 -4
  16. package/dist/cjs/extensions/marketplace/direct-listings/utils.js.map +1 -1
  17. package/dist/cjs/extensions/marketplace/english-auctions/utils.js +9 -4
  18. package/dist/cjs/extensions/marketplace/english-auctions/utils.js.map +1 -1
  19. package/dist/cjs/extensions/marketplace/offers/utils.js +7 -4
  20. package/dist/cjs/extensions/marketplace/offers/utils.js.map +1 -1
  21. package/dist/cjs/insight/common.js +18 -0
  22. package/dist/cjs/insight/common.js.map +1 -0
  23. package/dist/cjs/insight/get-events.js +57 -0
  24. package/dist/cjs/insight/get-events.js.map +1 -0
  25. package/dist/cjs/insight/get-nfts.js +159 -17
  26. package/dist/cjs/insight/get-nfts.js.map +1 -1
  27. package/dist/cjs/insight/get-tokens.js +35 -15
  28. package/dist/cjs/insight/get-tokens.js.map +1 -1
  29. package/dist/cjs/insight/get-transactions.js +17 -11
  30. package/dist/cjs/insight/get-transactions.js.map +1 -1
  31. package/dist/cjs/insight/index.js +5 -1
  32. package/dist/cjs/insight/index.js.map +1 -1
  33. package/dist/cjs/pay/buyWithCrypto/getHistory.js +2 -2
  34. package/dist/cjs/pay/buyWithCrypto/getHistory.js.map +1 -1
  35. package/dist/cjs/pay/buyWithCrypto/getStatus.js +2 -2
  36. package/dist/cjs/pay/buyWithCrypto/getStatus.js.map +1 -1
  37. package/dist/cjs/pay/buyWithFiat/getHistory.js +2 -2
  38. package/dist/cjs/pay/buyWithFiat/getHistory.js.map +1 -1
  39. package/dist/cjs/pay/buyWithFiat/getStatus.js +2 -2
  40. package/dist/cjs/pay/buyWithFiat/getStatus.js.map +1 -1
  41. package/dist/cjs/pay/getBuyHistory.js +2 -2
  42. package/dist/cjs/pay/getBuyHistory.js.map +1 -1
  43. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/ConfirmationScreen.js +6 -2
  44. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/ConfirmationScreen.js.map +1 -1
  45. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.js +3 -1
  46. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.js.map +1 -1
  47. package/dist/cjs/react/web/ui/ConnectWallet/screens/SendFunds.js +3 -1
  48. package/dist/cjs/react/web/ui/ConnectWallet/screens/SendFunds.js.map +1 -1
  49. package/dist/cjs/react/web/ui/ConnectWallet/screens/ViewNFTs.js +6 -43
  50. package/dist/cjs/react/web/ui/ConnectWallet/screens/ViewNFTs.js.map +1 -1
  51. package/dist/cjs/react/web/ui/ConnectWallet/screens/ViewTokens.js +3 -9
  52. package/dist/cjs/react/web/ui/ConnectWallet/screens/ViewTokens.js.map +1 -1
  53. package/dist/cjs/react/web/ui/components/TokenIcon.js +3 -1
  54. package/dist/cjs/react/web/ui/components/TokenIcon.js.map +1 -1
  55. package/dist/cjs/react/web/ui/prebuilt/NFT/utils.js +7 -2
  56. package/dist/cjs/react/web/ui/prebuilt/NFT/utils.js.map +1 -1
  57. package/dist/cjs/rpc/fetch-rpc.js +4 -4
  58. package/dist/cjs/rpc/fetch-rpc.js.map +1 -1
  59. package/dist/cjs/social/profiles.js +3 -8
  60. package/dist/cjs/social/profiles.js.map +1 -1
  61. package/dist/cjs/storage/download.js +2 -2
  62. package/dist/cjs/storage/download.js.map +1 -1
  63. package/dist/cjs/storage/unpin.js +2 -2
  64. package/dist/cjs/storage/unpin.js.map +1 -1
  65. package/dist/cjs/storage/upload/web-node.js +0 -1
  66. package/dist/cjs/storage/upload/web-node.js.map +1 -1
  67. package/dist/cjs/transaction/actions/gasless/providers/biconomy.js +0 -1
  68. package/dist/cjs/transaction/actions/gasless/providers/biconomy.js.map +1 -1
  69. package/dist/cjs/transaction/actions/gasless/providers/openzeppelin.js +0 -1
  70. package/dist/cjs/transaction/actions/gasless/providers/openzeppelin.js.map +1 -1
  71. package/dist/cjs/utils/nft/parseNft.js +4 -0
  72. package/dist/cjs/utils/nft/parseNft.js.map +1 -1
  73. package/dist/cjs/utils/signatures/resolve-signature.js +0 -2
  74. package/dist/cjs/utils/signatures/resolve-signature.js.map +1 -1
  75. package/dist/cjs/version.js +1 -1
  76. package/dist/cjs/wallets/smart/lib/calls.js +2 -2
  77. package/dist/cjs/wallets/smart/lib/calls.js.map +1 -1
  78. package/dist/cjs/wallets/utils/getWalletBalance.js +3 -0
  79. package/dist/cjs/wallets/utils/getWalletBalance.js.map +1 -1
  80. package/dist/esm/chains/utils.js +40 -2
  81. package/dist/esm/chains/utils.js.map +1 -1
  82. package/dist/esm/event/actions/get-events.js +56 -8
  83. package/dist/esm/event/actions/get-events.js.map +1 -1
  84. package/dist/esm/extensions/erc1155/read/getNFT.js +2 -0
  85. package/dist/esm/extensions/erc1155/read/getNFT.js.map +1 -1
  86. package/dist/esm/extensions/erc20/read/getBalance.js +2 -0
  87. package/dist/esm/extensions/erc20/read/getBalance.js.map +1 -1
  88. package/dist/esm/extensions/erc721/read/getNFT.js +42 -0
  89. package/dist/esm/extensions/erc721/read/getNFT.js.map +1 -1
  90. package/dist/esm/extensions/erc721/read/getNFTs.js +44 -17
  91. package/dist/esm/extensions/erc721/read/getNFTs.js.map +1 -1
  92. package/dist/esm/extensions/erc721/read/getOwnedNFTs.js +46 -0
  93. package/dist/esm/extensions/erc721/read/getOwnedNFTs.js.map +1 -1
  94. package/dist/esm/extensions/marketplace/direct-listings/utils.js +7 -4
  95. package/dist/esm/extensions/marketplace/direct-listings/utils.js.map +1 -1
  96. package/dist/esm/extensions/marketplace/english-auctions/utils.js +9 -4
  97. package/dist/esm/extensions/marketplace/english-auctions/utils.js.map +1 -1
  98. package/dist/esm/extensions/marketplace/offers/utils.js +7 -4
  99. package/dist/esm/extensions/marketplace/offers/utils.js.map +1 -1
  100. package/dist/esm/insight/common.js +15 -0
  101. package/dist/esm/insight/common.js.map +1 -0
  102. package/dist/esm/insight/get-events.js +54 -0
  103. package/dist/esm/insight/get-events.js.map +1 -0
  104. package/dist/esm/insight/get-nfts.js +155 -15
  105. package/dist/esm/insight/get-nfts.js.map +1 -1
  106. package/dist/esm/insight/get-tokens.js +32 -12
  107. package/dist/esm/insight/get-tokens.js.map +1 -1
  108. package/dist/esm/insight/get-transactions.js +14 -8
  109. package/dist/esm/insight/get-transactions.js.map +1 -1
  110. package/dist/esm/insight/index.js +2 -1
  111. package/dist/esm/insight/index.js.map +1 -1
  112. package/dist/esm/pay/buyWithCrypto/getHistory.js +2 -2
  113. package/dist/esm/pay/buyWithCrypto/getHistory.js.map +1 -1
  114. package/dist/esm/pay/buyWithCrypto/getStatus.js +2 -2
  115. package/dist/esm/pay/buyWithCrypto/getStatus.js.map +1 -1
  116. package/dist/esm/pay/buyWithFiat/getHistory.js +2 -2
  117. package/dist/esm/pay/buyWithFiat/getHistory.js.map +1 -1
  118. package/dist/esm/pay/buyWithFiat/getStatus.js +2 -2
  119. package/dist/esm/pay/buyWithFiat/getStatus.js.map +1 -1
  120. package/dist/esm/pay/getBuyHistory.js +2 -2
  121. package/dist/esm/pay/getBuyHistory.js.map +1 -1
  122. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/ConfirmationScreen.js +6 -2
  123. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/ConfirmationScreen.js.map +1 -1
  124. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.js +3 -1
  125. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.js.map +1 -1
  126. package/dist/esm/react/web/ui/ConnectWallet/screens/SendFunds.js +3 -1
  127. package/dist/esm/react/web/ui/ConnectWallet/screens/SendFunds.js.map +1 -1
  128. package/dist/esm/react/web/ui/ConnectWallet/screens/ViewNFTs.js +6 -43
  129. package/dist/esm/react/web/ui/ConnectWallet/screens/ViewNFTs.js.map +1 -1
  130. package/dist/esm/react/web/ui/ConnectWallet/screens/ViewTokens.js +3 -9
  131. package/dist/esm/react/web/ui/ConnectWallet/screens/ViewTokens.js.map +1 -1
  132. package/dist/esm/react/web/ui/components/TokenIcon.js +3 -1
  133. package/dist/esm/react/web/ui/components/TokenIcon.js.map +1 -1
  134. package/dist/esm/react/web/ui/prebuilt/NFT/utils.js +7 -2
  135. package/dist/esm/react/web/ui/prebuilt/NFT/utils.js.map +1 -1
  136. package/dist/esm/rpc/fetch-rpc.js +4 -4
  137. package/dist/esm/rpc/fetch-rpc.js.map +1 -1
  138. package/dist/esm/social/profiles.js +3 -8
  139. package/dist/esm/social/profiles.js.map +1 -1
  140. package/dist/esm/storage/download.js +2 -2
  141. package/dist/esm/storage/download.js.map +1 -1
  142. package/dist/esm/storage/unpin.js +2 -2
  143. package/dist/esm/storage/unpin.js.map +1 -1
  144. package/dist/esm/storage/upload/web-node.js +0 -1
  145. package/dist/esm/storage/upload/web-node.js.map +1 -1
  146. package/dist/esm/transaction/actions/gasless/providers/biconomy.js +0 -1
  147. package/dist/esm/transaction/actions/gasless/providers/biconomy.js.map +1 -1
  148. package/dist/esm/transaction/actions/gasless/providers/openzeppelin.js +0 -1
  149. package/dist/esm/transaction/actions/gasless/providers/openzeppelin.js.map +1 -1
  150. package/dist/esm/utils/nft/parseNft.js +4 -0
  151. package/dist/esm/utils/nft/parseNft.js.map +1 -1
  152. package/dist/esm/utils/signatures/resolve-signature.js +0 -2
  153. package/dist/esm/utils/signatures/resolve-signature.js.map +1 -1
  154. package/dist/esm/version.js +1 -1
  155. package/dist/esm/wallets/smart/lib/calls.js +2 -2
  156. package/dist/esm/wallets/smart/lib/calls.js.map +1 -1
  157. package/dist/esm/wallets/utils/getWalletBalance.js +3 -0
  158. package/dist/esm/wallets/utils/getWalletBalance.js.map +1 -1
  159. package/dist/types/chains/types.d.ts +7 -0
  160. package/dist/types/chains/types.d.ts.map +1 -1
  161. package/dist/types/chains/utils.d.ts +15 -1
  162. package/dist/types/chains/utils.d.ts.map +1 -1
  163. package/dist/types/event/actions/get-events.d.ts +1 -6
  164. package/dist/types/event/actions/get-events.d.ts.map +1 -1
  165. package/dist/types/extensions/erc1155/read/getNFT.d.ts.map +1 -1
  166. package/dist/types/extensions/erc20/read/getBalance.d.ts +2 -0
  167. package/dist/types/extensions/erc20/read/getBalance.d.ts.map +1 -1
  168. package/dist/types/extensions/erc721/read/getNFT.d.ts +5 -0
  169. package/dist/types/extensions/erc721/read/getNFT.d.ts.map +1 -1
  170. package/dist/types/extensions/erc721/read/getNFTs.d.ts +5 -0
  171. package/dist/types/extensions/erc721/read/getNFTs.d.ts.map +1 -1
  172. package/dist/types/extensions/erc721/read/getOwnedNFTs.d.ts +3 -1
  173. package/dist/types/extensions/erc721/read/getOwnedNFTs.d.ts.map +1 -1
  174. package/dist/types/extensions/marketplace/direct-listings/utils.d.ts.map +1 -1
  175. package/dist/types/extensions/marketplace/english-auctions/utils.d.ts.map +1 -1
  176. package/dist/types/extensions/marketplace/offers/utils.d.ts.map +1 -1
  177. package/dist/types/insight/common.d.ts +3 -0
  178. package/dist/types/insight/common.d.ts.map +1 -0
  179. package/dist/types/insight/get-events.d.ts +31 -0
  180. package/dist/types/insight/get-events.d.ts.map +1 -0
  181. package/dist/types/insight/get-nfts.d.ts +52 -4
  182. package/dist/types/insight/get-nfts.d.ts.map +1 -1
  183. package/dist/types/insight/get-tokens.d.ts +4 -4
  184. package/dist/types/insight/get-tokens.d.ts.map +1 -1
  185. package/dist/types/insight/get-transactions.d.ts +2 -2
  186. package/dist/types/insight/get-transactions.d.ts.map +1 -1
  187. package/dist/types/insight/index.d.ts +3 -2
  188. package/dist/types/insight/index.d.ts.map +1 -1
  189. package/dist/types/pay/buyWithCrypto/getHistory.d.ts.map +1 -1
  190. package/dist/types/pay/buyWithCrypto/getStatus.d.ts.map +1 -1
  191. package/dist/types/pay/buyWithFiat/getHistory.d.ts.map +1 -1
  192. package/dist/types/pay/buyWithFiat/getStatus.d.ts.map +1 -1
  193. package/dist/types/pay/getBuyHistory.d.ts.map +1 -1
  194. package/dist/types/react/core/utils/wallet.d.ts +1 -1
  195. package/dist/types/react/web/ui/ConnectWallet/screens/Buy/main/useBuyTxStates.d.ts +1 -1
  196. package/dist/types/react/web/ui/ConnectWallet/screens/Buy/swap/ConfirmationScreen.d.ts.map +1 -1
  197. package/dist/types/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.d.ts.map +1 -1
  198. package/dist/types/react/web/ui/ConnectWallet/screens/SendFunds.d.ts.map +1 -1
  199. package/dist/types/react/web/ui/ConnectWallet/screens/ViewNFTs.d.ts.map +1 -1
  200. package/dist/types/react/web/ui/ConnectWallet/screens/ViewTokens.d.ts.map +1 -1
  201. package/dist/types/react/web/ui/components/TokenIcon.d.ts.map +1 -1
  202. package/dist/types/react/web/ui/prebuilt/NFT/utils.d.ts.map +1 -1
  203. package/dist/types/rpc/fetch-rpc.d.ts.map +1 -1
  204. package/dist/types/social/profiles.d.ts.map +1 -1
  205. package/dist/types/storage/download.d.ts.map +1 -1
  206. package/dist/types/storage/unpin.d.ts.map +1 -1
  207. package/dist/types/storage/upload/web-node.d.ts.map +1 -1
  208. package/dist/types/transaction/actions/gasless/providers/biconomy.d.ts.map +1 -1
  209. package/dist/types/transaction/actions/gasless/providers/openzeppelin.d.ts.map +1 -1
  210. package/dist/types/utils/nft/parseNft.d.ts +8 -0
  211. package/dist/types/utils/nft/parseNft.d.ts.map +1 -1
  212. package/dist/types/utils/signatures/resolve-signature.d.ts.map +1 -1
  213. package/dist/types/version.d.ts +1 -1
  214. package/dist/types/wallets/utils/getWalletBalance.d.ts +2 -7
  215. package/dist/types/wallets/utils/getWalletBalance.d.ts.map +1 -1
  216. package/package.json +4 -4
  217. package/src/chains/types.ts +8 -0
  218. package/src/chains/utils.ts +65 -2
  219. package/src/event/actions/get-events.test.ts +96 -0
  220. package/src/event/actions/get-events.ts +87 -12
  221. package/src/extensions/erc1155/read/getNFT.test.ts +2 -0
  222. package/src/extensions/erc1155/read/getNFT.ts +2 -0
  223. package/src/extensions/erc20/drop20.test.ts +48 -132
  224. package/src/extensions/erc20/read/getBalance.test.ts +5 -9
  225. package/src/extensions/erc20/read/getBalance.ts +4 -0
  226. package/src/extensions/erc721/read/getNFT.test.ts +108 -0
  227. package/src/extensions/erc721/read/getNFT.ts +55 -1
  228. package/src/extensions/erc721/read/getNFTs.test.ts +219 -13
  229. package/src/extensions/erc721/read/getNFTs.ts +59 -20
  230. package/src/extensions/erc721/read/getOwnedNFTs.test.ts +27 -2
  231. package/src/extensions/erc721/read/getOwnedNFTs.ts +61 -1
  232. package/src/extensions/erc721/token721.test.ts +2 -0
  233. package/src/extensions/marketplace/direct-listings/direct-listings.test.ts +2 -18
  234. package/src/extensions/marketplace/direct-listings/utils.ts +7 -4
  235. package/src/extensions/marketplace/english-auctions/utils.ts +9 -4
  236. package/src/extensions/marketplace/offers/utils.ts +7 -4
  237. package/src/insight/common.ts +24 -0
  238. package/src/insight/get-events.ts +92 -0
  239. package/src/insight/get-nfts.ts +256 -22
  240. package/src/insight/get-tokens.ts +57 -26
  241. package/src/insight/get-transactions.ts +30 -20
  242. package/src/insight/index.ts +7 -2
  243. package/src/pay/buyWithCrypto/getHistory.ts +4 -2
  244. package/src/pay/buyWithCrypto/getStatus.ts +4 -2
  245. package/src/pay/buyWithFiat/getHistory.ts +4 -2
  246. package/src/pay/buyWithFiat/getStatus.ts +4 -2
  247. package/src/pay/getBuyHistory.ts +4 -2
  248. package/src/react/web/ui/ConnectWallet/screens/Buy/swap/ConfirmationScreen.tsx +10 -2
  249. package/src/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.tsx +5 -1
  250. package/src/react/web/ui/ConnectWallet/screens/SendFunds.tsx +5 -1
  251. package/src/react/web/ui/ConnectWallet/screens/ViewNFTs.tsx +43 -68
  252. package/src/react/web/ui/ConnectWallet/screens/ViewTokens.tsx +4 -14
  253. package/src/react/web/ui/components/TokenIcon.tsx +12 -3
  254. package/src/react/web/ui/prebuilt/NFT/utils.test.ts +2 -64
  255. package/src/react/web/ui/prebuilt/NFT/utils.ts +7 -2
  256. package/src/rpc/fetch-rpc.ts +6 -4
  257. package/src/social/profiles.ts +5 -9
  258. package/src/storage/download.ts +4 -2
  259. package/src/storage/unpin.ts +4 -2
  260. package/src/storage/upload/web-node.ts +0 -1
  261. package/src/transaction/actions/gasless/providers/biconomy.ts +0 -1
  262. package/src/transaction/actions/gasless/providers/openzeppelin.ts +0 -1
  263. package/src/utils/nft/parseNft.test.ts +8 -0
  264. package/src/utils/nft/parseNft.ts +12 -0
  265. package/src/utils/signatures/resolve-signature.ts +0 -2
  266. package/src/version.ts +1 -1
  267. package/src/wallets/smart/lib/calls.ts +2 -2
  268. package/src/wallets/utils/getWalletBalance.ts +5 -7
@@ -1,18 +1,13 @@
1
- /**
2
- * 1. blockTime + contract (with abi) + no events -> logs with types and parsing *if* contract has abi defined
3
- * 2. blockTime + contract (no abi) + no events -> logs with NO types but *with* parsing
4
- * 3. blockTime + no contract + events -> logs with types and parsing (across all "addresses") (no contract filter)
5
- * 4. blockTime + contract + events -> logs with types and parsing (filtered by contract address + event topics)
6
- */
7
-
8
1
  import type {
9
2
  Abi,
10
3
  AbiEvent,
11
4
  ExtractAbiEvent,
12
5
  ExtractAbiEventNames,
13
6
  } from "abitype";
7
+ import { type Log, formatLog } from "viem";
14
8
  import { resolveContractAbi } from "../../contract/actions/resolve-abi.js";
15
9
  import type { ThirdwebContract } from "../../contract/contract.js";
10
+ import { getContractEvents as getContractEventsInsight } from "../../insight/get-events.js";
16
11
  import { eth_blockNumber } from "../../rpc/actions/eth_blockNumber.js";
17
12
  import {
18
13
  type GetLogsBlockParams,
@@ -21,6 +16,7 @@ import {
21
16
  } from "../../rpc/actions/eth_getLogs.js";
22
17
  import { getRpcClient } from "../../rpc/rpc.js";
23
18
  import { getAddress } from "../../utils/address.js";
19
+ import { type Hex, numberToHex } from "../../utils/encoding/hex.js";
24
20
  import type { Prettify } from "../../utils/type-utils.js";
25
21
  import { type PreparedEvent, prepareEvent } from "../prepare-event.js";
26
22
  import { isAbiEvent } from "../utils.js";
@@ -34,6 +30,7 @@ export type GetContractEventsOptionsDirect<
34
30
  contract: ThirdwebContract<abi>;
35
31
  events?: abiEvents;
36
32
  strict?: TStrict;
33
+ useIndexer?: boolean;
37
34
  };
38
35
 
39
36
  export type GetContractEventsOptions<
@@ -49,6 +46,10 @@ export type GetContractEventsResult<
49
46
  TStrict extends boolean,
50
47
  > = ParseEventLogsResult<abiEvents, TStrict>;
51
48
 
49
+ type GetLogsParamsExtra = {
50
+ signature?: string;
51
+ } & GetLogsParams;
52
+
52
53
  /**
53
54
  * Retrieves events from a contract based on the provided options.
54
55
  * @param options - The options for retrieving events.
@@ -106,7 +107,13 @@ export async function getContractEvents<
106
107
  >(
107
108
  options: GetContractEventsOptions<abi, abiEvents, TStrict>,
108
109
  ): Promise<GetContractEventsResult<abiEvents, TStrict>> {
109
- const { contract, events, blockRange, ...restParams } = options;
110
+ const {
111
+ contract,
112
+ events,
113
+ blockRange,
114
+ useIndexer = true,
115
+ ...restParams
116
+ } = options;
110
117
 
111
118
  const rpcRequest = getRpcClient(contract);
112
119
 
@@ -164,7 +171,7 @@ export async function getContractEvents<
164
171
  }
165
172
  }
166
173
 
167
- const logsParams: GetLogsParams[] =
174
+ const logsParams: GetLogsParamsExtra[] =
168
175
  events && events.length > 0
169
176
  ? // if we have events passed in then we use those
170
177
  events.map((e) => ({
@@ -175,9 +182,33 @@ export async function getContractEvents<
175
182
  : // otherwise we want "all" events (aka not pass any topics at all)
176
183
  [{ ...restParams, address: getAddress(contract.address) }];
177
184
 
178
- const logs = await Promise.all(
179
- logsParams.map((ethLogParams) => eth_getLogs(rpcRequest, ethLogParams)),
180
- );
185
+ let logs: Log[][] = [];
186
+
187
+ // try fetching from insight if available
188
+ if (useIndexer) {
189
+ try {
190
+ logs = await Promise.all(
191
+ logsParams.map((p) =>
192
+ getLogsFromInsight({
193
+ params: p,
194
+ contract,
195
+ }),
196
+ ),
197
+ );
198
+ } catch (e) {
199
+ console.warn("Error fetching from insight, falling back to rpc", e);
200
+ // fetch from rpc
201
+ logs = await Promise.all(
202
+ logsParams.map((ethLogParams) => eth_getLogs(rpcRequest, ethLogParams)),
203
+ );
204
+ }
205
+ } else {
206
+ // fetch from rpc
207
+ logs = await Promise.all(
208
+ logsParams.map((ethLogParams) => eth_getLogs(rpcRequest, ethLogParams)),
209
+ );
210
+ }
211
+
181
212
  const flattenLogs = logs
182
213
  .flat()
183
214
  .sort((a, b) => Number((a.blockNumber ?? 0n) - (b.blockNumber ?? 0n)));
@@ -186,3 +217,47 @@ export async function getContractEvents<
186
217
  events: resolvedEvents,
187
218
  });
188
219
  }
220
+
221
+ async function getLogsFromInsight(options: {
222
+ params: GetLogsParamsExtra;
223
+ contract: ThirdwebContract<Abi>;
224
+ }): Promise<Log[]> {
225
+ const { params, contract } = options;
226
+
227
+ const fromBlock =
228
+ typeof params.fromBlock === "bigint" ? Number(params.fromBlock) : undefined;
229
+
230
+ const toBlock =
231
+ typeof params.toBlock === "bigint" ? Number(params.toBlock) : undefined;
232
+
233
+ const r = await getContractEventsInsight({
234
+ client: contract.client,
235
+ chains: [contract.chain],
236
+ contractAddress: contract.address,
237
+ queryOptions: {
238
+ limit: 500,
239
+ filter_block_hash: params.blockHash,
240
+ filter_block_number_gte: fromBlock,
241
+ filter_block_number_lte: toBlock,
242
+ filter_topic_0: params.topics?.[0] as Hex | undefined,
243
+ filter_topic_1: params.topics?.[1] as Hex | undefined,
244
+ filter_topic_2: params.topics?.[2] as Hex | undefined,
245
+ filter_topic_3: params.topics?.[3] as Hex | undefined,
246
+ },
247
+ });
248
+
249
+ const cleanedEventData = r.map((tx) => ({
250
+ chainId: tx.chain_id,
251
+ blockNumber: numberToHex(Number(tx.block_number)),
252
+ blockHash: tx.block_hash as Hex,
253
+ blockTimestamp: tx.block_timestamp,
254
+ transactionHash: tx.transaction_hash as Hex,
255
+ transactionIndex: numberToHex(tx.transaction_index),
256
+ logIndex: numberToHex(tx.log_index),
257
+ address: tx.address,
258
+ data: tx.data as Hex,
259
+ topics: tx.topics as [`0x${string}`, ...`0x${string}`[]] | [] | undefined,
260
+ }));
261
+
262
+ return cleanedEventData.map((e) => formatLog(e));
263
+ }
@@ -11,6 +11,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("erc1155.getNFT", () => {
11
11
  });
12
12
  expect(nft).toMatchInlineSnapshot(`
13
13
  {
14
+ "chainId": 1,
14
15
  "id": 2n,
15
16
  "metadata": {
16
17
  "animation_url": "ipfs://QmYoM63qaumQznBRx38tQjkY4ewbymeFb2KWBhkfMqNHax/3.mp4",
@@ -36,6 +37,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("erc1155.getNFT", () => {
36
37
  },
37
38
  "owner": null,
38
39
  "supply": 2519n,
40
+ "tokenAddress": "0x42d3641255C946CC451474295d29D3505173F22A",
39
41
  "tokenURI": "ipfs://QmbMXdbnNUAuGRoY6c6G792c6T9utfaBGqRUaMaRUf52Cb/2",
40
42
  "type": "ERC1155",
41
43
  }
@@ -58,6 +58,8 @@ export async function getNFT(
58
58
  type: "ERC1155",
59
59
  owner: null,
60
60
  supply,
61
+ tokenAddress: options.contract.address,
62
+ chainId: options.contract.chain.id,
61
63
  },
62
64
  );
63
65
  }
@@ -59,17 +59,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
59
59
  }, 60_000);
60
60
 
61
61
  it("should allow to claim tokens", async () => {
62
- await expect(
63
- getBalance({ contract, address: TEST_ACCOUNT_A.address }),
64
- ).resolves.toMatchInlineSnapshot(`
65
- {
66
- "decimals": 18,
67
- "displayValue": "0",
68
- "name": "Test DropERC20",
69
- "symbol": "",
70
- "value": 0n,
71
- }
72
- `);
62
+ expect(
63
+ (await getBalance({ contract, address: TEST_ACCOUNT_A.address }))
64
+ .displayValue,
65
+ ).toBe("0");
73
66
  await sendAndConfirmTransaction({
74
67
  transaction: setClaimConditions({
75
68
  contract,
@@ -98,31 +91,17 @@ describe.runIf(process.env.TW_SECRET_KEY)(
98
91
  transaction: claimTx,
99
92
  account: TEST_ACCOUNT_A,
100
93
  });
101
- await expect(
102
- getBalance({ contract, address: TEST_ACCOUNT_A.address }),
103
- ).resolves.toMatchInlineSnapshot(`
104
- {
105
- "decimals": 18,
106
- "displayValue": "1",
107
- "name": "Test DropERC20",
108
- "symbol": "",
109
- "value": 1000000000000000000n,
110
- }
111
- `);
94
+ expect(
95
+ (await getBalance({ contract, address: TEST_ACCOUNT_A.address }))
96
+ .displayValue,
97
+ ).toBe("1");
112
98
  });
113
99
 
114
100
  it("should allow to claim tokens with value", async () => {
115
- await expect(
116
- getBalance({ contract, address: TEST_ACCOUNT_C.address }),
117
- ).resolves.toMatchInlineSnapshot(`
118
- {
119
- "decimals": 18,
120
- "displayValue": "0",
121
- "name": "Test DropERC20",
122
- "symbol": "",
123
- "value": 0n,
124
- }
125
- `);
101
+ expect(
102
+ (await getBalance({ contract, address: TEST_ACCOUNT_C.address }))
103
+ .displayValue,
104
+ ).toBe("0");
126
105
  // set cc with price
127
106
  await sendAndConfirmTransaction({
128
107
  transaction: setClaimConditions({
@@ -150,17 +129,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
150
129
  transaction: claimTx,
151
130
  account: TEST_ACCOUNT_C,
152
131
  });
153
- await expect(
154
- getBalance({ contract, address: TEST_ACCOUNT_C.address }),
155
- ).resolves.toMatchInlineSnapshot(`
156
- {
157
- "decimals": 18,
158
- "displayValue": "2",
159
- "name": "Test DropERC20",
160
- "symbol": "",
161
- "value": 2000000000000000000n,
162
- }
163
- `);
132
+ expect(
133
+ (await getBalance({ contract, address: TEST_ACCOUNT_C.address }))
134
+ .displayValue,
135
+ ).toBe("2");
164
136
  });
165
137
 
166
138
  describe("Allowlists", () => {
@@ -181,17 +153,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
181
153
  account: TEST_ACCOUNT_A,
182
154
  });
183
155
 
184
- await expect(
185
- getBalance({ contract, address: TEST_ACCOUNT_B.address }),
186
- ).resolves.toMatchInlineSnapshot(`
187
- {
188
- "decimals": 18,
189
- "displayValue": "0",
190
- "name": "Test DropERC20",
191
- "symbol": "",
192
- "value": 0n,
193
- }
194
- `);
156
+ expect(
157
+ (await getBalance({ contract, address: TEST_ACCOUNT_B.address }))
158
+ .displayValue,
159
+ ).toBe("0");
195
160
 
196
161
  expect(
197
162
  await canClaim({
@@ -228,17 +193,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
228
193
  }),
229
194
  });
230
195
 
231
- await expect(
232
- getBalance({ contract, address: TEST_ACCOUNT_B.address }),
233
- ).resolves.toMatchInlineSnapshot(`
234
- {
235
- "decimals": 18,
236
- "displayValue": "1",
237
- "name": "Test DropERC20",
238
- "symbol": "",
239
- "value": 1000000000000000000n,
240
- }
241
- `);
196
+ expect(
197
+ (await getBalance({ contract, address: TEST_ACCOUNT_B.address }))
198
+ .displayValue,
199
+ ).toBe("1");
242
200
 
243
201
  await expect(
244
202
  sendAndConfirmTransaction({
@@ -274,17 +232,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
274
232
  account: TEST_ACCOUNT_A,
275
233
  });
276
234
 
277
- await expect(
278
- getBalance({ contract, address: TEST_ACCOUNT_A.address }),
279
- ).resolves.toMatchInlineSnapshot(`
280
- {
281
- "decimals": 18,
282
- "displayValue": "1",
283
- "name": "Test DropERC20",
284
- "symbol": "",
285
- "value": 1000000000000000000n,
286
- }
287
- `);
235
+ expect(
236
+ (await getBalance({ contract, address: TEST_ACCOUNT_A.address }))
237
+ .displayValue,
238
+ ).toBe("1");
288
239
 
289
240
  // we try to claim an extra `2` tokens
290
241
  // this should faile bcause the max claimable is `3` and we have previously already claimed 2 tokens (one for ourselves, one for the other wallet)
@@ -318,17 +269,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
318
269
  }),
319
270
  });
320
271
 
321
- await expect(
322
- getBalance({ contract, address: TEST_ACCOUNT_A.address }),
323
- ).resolves.toMatchInlineSnapshot(`
324
- {
325
- "decimals": 18,
326
- "displayValue": "2",
327
- "name": "Test DropERC20",
328
- "symbol": "",
329
- "value": 2000000000000000000n,
330
- }
331
- `);
272
+ expect(
273
+ (await getBalance({ contract, address: TEST_ACCOUNT_A.address }))
274
+ .displayValue,
275
+ ).toBe("2");
332
276
  });
333
277
  });
334
278
 
@@ -353,17 +297,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
353
297
  account: TEST_ACCOUNT_A,
354
298
  });
355
299
 
356
- await expect(
357
- getBalance({ contract, address: TEST_ACCOUNT_A.address }),
358
- ).resolves.toMatchInlineSnapshot(`
359
- {
360
- "decimals": 18,
361
- "displayValue": "2",
362
- "name": "Test DropERC20",
363
- "symbol": "",
364
- "value": 2000000000000000000n,
365
- }
366
- `);
300
+ expect(
301
+ (await getBalance({ contract, address: TEST_ACCOUNT_A.address }))
302
+ .displayValue,
303
+ ).toBe("2");
367
304
 
368
305
  await sendAndConfirmTransaction({
369
306
  account: TEST_ACCOUNT_A,
@@ -374,17 +311,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
374
311
  }),
375
312
  });
376
313
 
377
- await expect(
378
- getBalance({ contract, address: TEST_ACCOUNT_A.address }),
379
- ).resolves.toMatchInlineSnapshot(`
380
- {
381
- "decimals": 18,
382
- "displayValue": "3",
383
- "name": "Test DropERC20",
384
- "symbol": "",
385
- "value": 3000000000000000000n,
386
- }
387
- `);
314
+ expect(
315
+ (await getBalance({ contract, address: TEST_ACCOUNT_A.address }))
316
+ .displayValue,
317
+ ).toBe("3");
388
318
  });
389
319
 
390
320
  it("should be able to retrieve multiple phases", async () => {
@@ -436,17 +366,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
436
366
  account: TEST_ACCOUNT_D,
437
367
  });
438
368
  // check that the account has claimed one token
439
- await expect(
440
- getBalance({ contract, address: TEST_ACCOUNT_D.address }),
441
- ).resolves.toMatchInlineSnapshot(`
442
- {
443
- "decimals": 18,
444
- "displayValue": "0.000000000000000001",
445
- "name": "Test DropERC20",
446
- "symbol": "",
447
- "value": 1n,
448
- }
449
- `);
369
+ expect(
370
+ (await getBalance({ contract, address: TEST_ACCOUNT_D.address }))
371
+ .displayValue,
372
+ ).toBe("0.000000000000000001");
450
373
 
451
374
  // attempt to claim another token (this should fail)
452
375
  await expect(
@@ -482,17 +405,10 @@ describe.runIf(process.env.TW_SECRET_KEY)(
482
405
  account: TEST_ACCOUNT_D,
483
406
  });
484
407
  // check that the account has claimed two tokens
485
- await expect(
486
- getBalance({ contract, address: TEST_ACCOUNT_D.address }),
487
- ).resolves.toMatchInlineSnapshot(`
488
- {
489
- "decimals": 18,
490
- "displayValue": "0.000000000000000002",
491
- "name": "Test DropERC20",
492
- "symbol": "",
493
- "value": 2n,
494
- }
495
- `);
408
+ expect(
409
+ (await getBalance({ contract, address: TEST_ACCOUNT_D.address }))
410
+ .displayValue,
411
+ ).toBe("0.000000000000000002");
496
412
  });
497
413
  },
498
414
  );
@@ -10,14 +10,10 @@ describe.runIf(process.env.TW_SECRET_KEY)("erc20.getBalance", () => {
10
10
  contract: USDT_CONTRACT,
11
11
  address: VITALIK_WALLET,
12
12
  });
13
- expect(balance).toMatchInlineSnapshot(`
14
- {
15
- "decimals": 6,
16
- "displayValue": "1544.900798",
17
- "name": "Tether USD",
18
- "symbol": "USDT",
19
- "value": 1544900798n,
20
- }
21
- `);
13
+ expect(balance.displayValue).toBe("1544.900798");
14
+ expect(balance.name).toBe("Tether USD");
15
+ expect(balance.symbol).toBe("USDT");
16
+ expect(balance.value).toBe(1544900798n);
17
+ expect(balance.decimals).toBe(6);
22
18
  });
23
19
  });
@@ -23,6 +23,8 @@ export type GetBalanceResult = {
23
23
  displayValue: string;
24
24
  symbol: string;
25
25
  name: string;
26
+ tokenAddress: string;
27
+ chainId: number;
26
28
  };
27
29
 
28
30
  /**
@@ -48,5 +50,7 @@ export async function getBalance(
48
50
  ...currencyMetadata,
49
51
  value: balanceWei,
50
52
  displayValue: toTokens(balanceWei, currencyMetadata.decimals),
53
+ tokenAddress: options.contract.address,
54
+ chainId: options.contract.chain.id,
51
55
  };
52
56
  }
@@ -3,14 +3,118 @@ import { DOODLES_CONTRACT } from "~test/test-contracts.js";
3
3
  import { getNFT } from "./getNFT.js";
4
4
 
5
5
  describe.runIf(process.env.TW_SECRET_KEY)("erc721.getNFT", () => {
6
+ it("without owner using indexer", async () => {
7
+ const nft = await getNFT({
8
+ contract: DOODLES_CONTRACT,
9
+ tokenId: 1n,
10
+ includeOwner: false,
11
+ });
12
+ expect(nft.metadata.name).toBe("Doodle #1");
13
+ // TODO (insight): re-enable once insight fixes the client id caching issue
14
+ // expect(nft).toMatchInlineSnapshot(`
15
+ // {
16
+ // "chainId": 1,
17
+ // "id": 1n,
18
+ // "metadata": {
19
+ // "attributes": [
20
+ // {
21
+ // "trait_type": "face",
22
+ // "value": "holographic beard",
23
+ // },
24
+ // {
25
+ // "trait_type": "hair",
26
+ // "value": "white bucket cap",
27
+ // },
28
+ // {
29
+ // "trait_type": "body",
30
+ // "value": "purple sweater with satchel",
31
+ // },
32
+ // {
33
+ // "trait_type": "background",
34
+ // "value": "grey",
35
+ // },
36
+ // {
37
+ // "trait_type": "head",
38
+ // "value": "gradient 2",
39
+ // },
40
+ // ],
41
+ // "description": "A community-driven collectibles project featuring art by Burnt Toast. Doodles come in a joyful range of colors, traits and sizes with a collection size of 10,000. Each Doodle allows its owner to vote for experiences and activations paid for by the Doodles Community Treasury. Burnt Toast is the working alias for Scott Martin, a Canadian–based illustrator, designer, animator and muralist.",
42
+ // "image": "https://${clientId}.ipfscdn.io/ipfs/QmTDxnzcvj2p3xBrKcGv1wxoyhAn2yzCQnZZ9LmFjReuH9",
43
+ // "image_url": "https://${clientId}.ipfscdn.io/ipfs/QmTDxnzcvj2p3xBrKcGv1wxoyhAn2yzCQnZZ9LmFjReuH9",
44
+ // "name": "Doodle #1",
45
+ // "uri": "https://${clientId}.ipfscdn.io/ipfs/QmPMc4tcBsMqLRuCQtPmPe84bpSjrC3Ky7t3JWuHXYB4aS/1",
46
+ // },
47
+ // "owner": null,
48
+ // "tokenAddress": "0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",
49
+ // "tokenURI": "https://${clientId}.ipfscdn.io/ipfs/QmPMc4tcBsMqLRuCQtPmPe84bpSjrC3Ky7t3JWuHXYB4aS/1",
50
+ // "type": "ERC721",
51
+ // }
52
+ // `);
53
+ });
54
+
55
+ it("with owner using indexer", async () => {
56
+ const nft = await getNFT({
57
+ contract: { ...DOODLES_CONTRACT },
58
+ tokenId: 1n,
59
+ includeOwner: true,
60
+ });
61
+ expect(nft.metadata.name).toBe("Doodle #1");
62
+ expect(nft.owner).toBe("0xbe9936fcfc50666f5425fde4a9decc59cef73b24");
63
+ // TODO (insight): re-enable once insight fixes the client id caching issue
64
+ // expect(nft).toMatchInlineSnapshot(`
65
+ // {
66
+ // "chainId": 1,
67
+ // "id": 1n,
68
+ // "metadata": {
69
+ // "attributes": [
70
+ // {
71
+ // "trait_type": "face",
72
+ // "value": "holographic beard",
73
+ // },
74
+ // {
75
+ // "trait_type": "hair",
76
+ // "value": "white bucket cap",
77
+ // },
78
+ // {
79
+ // "trait_type": "body",
80
+ // "value": "purple sweater with satchel",
81
+ // },
82
+ // {
83
+ // "trait_type": "background",
84
+ // "value": "grey",
85
+ // },
86
+ // {
87
+ // "trait_type": "head",
88
+ // "value": "gradient 2",
89
+ // },
90
+ // ],
91
+ // "description": "A community-driven collectibles project featuring art by Burnt Toast. Doodles come in a joyful range of colors, traits and sizes with a collection size of 10,000. Each Doodle allows its owner to vote for experiences and activations paid for by the Doodles Community Treasury. Burnt Toast is the working alias for Scott Martin, a Canadian–based illustrator, designer, animator and muralist.",
92
+ // "image": "https://${clientId}.ipfscdn.io/ipfs/QmTDxnzcvj2p3xBrKcGv1wxoyhAn2yzCQnZZ9LmFjReuH9",
93
+ // "image_url": "https://${clientId}.ipfscdn.io/ipfs/QmTDxnzcvj2p3xBrKcGv1wxoyhAn2yzCQnZZ9LmFjReuH9",
94
+ // "name": "Doodle #1",
95
+ // "owner_addresses": [
96
+ // "0xbe9936fcfc50666f5425fde4a9decc59cef73b24",
97
+ // ],
98
+ // "uri": "https://${clientId}.ipfscdn.io/ipfs/QmPMc4tcBsMqLRuCQtPmPe84bpSjrC3Ky7t3JWuHXYB4aS/1",
99
+ // },
100
+ // "owner": "0xbe9936fcfc50666f5425fde4a9decc59cef73b24",
101
+ // "tokenAddress": "0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",
102
+ // "tokenURI": "https://${clientId}.ipfscdn.io/ipfs/QmPMc4tcBsMqLRuCQtPmPe84bpSjrC3Ky7t3JWuHXYB4aS/1",
103
+ // "type": "ERC721",
104
+ // }
105
+ // `);
106
+ });
107
+
6
108
  it("without owner", async () => {
7
109
  const nft = await getNFT({
8
110
  contract: { ...DOODLES_CONTRACT },
9
111
  tokenId: 1n,
10
112
  includeOwner: false,
113
+ useIndexer: false,
11
114
  });
12
115
  expect(nft).toMatchInlineSnapshot(`
13
116
  {
117
+ "chainId": 1,
14
118
  "id": 1n,
15
119
  "metadata": {
16
120
  "attributes": [
@@ -40,6 +144,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("erc721.getNFT", () => {
40
144
  "name": "Doodle #1",
41
145
  },
42
146
  "owner": null,
147
+ "tokenAddress": "0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",
43
148
  "tokenURI": "ipfs://QmPMc4tcBsMqLRuCQtPmPe84bpSjrC3Ky7t3JWuHXYB4aS/1",
44
149
  "type": "ERC721",
45
150
  }
@@ -51,9 +156,11 @@ describe.runIf(process.env.TW_SECRET_KEY)("erc721.getNFT", () => {
51
156
  contract: { ...DOODLES_CONTRACT },
52
157
  tokenId: 1n,
53
158
  includeOwner: true,
159
+ useIndexer: false,
54
160
  });
55
161
  expect(nft).toMatchInlineSnapshot(`
56
162
  {
163
+ "chainId": 1,
57
164
  "id": 1n,
58
165
  "metadata": {
59
166
  "attributes": [
@@ -83,6 +190,7 @@ describe.runIf(process.env.TW_SECRET_KEY)("erc721.getNFT", () => {
83
190
  "name": "Doodle #1",
84
191
  },
85
192
  "owner": "0xbE9936FCFC50666f5425FDE4A9decC59cEF73b24",
193
+ "tokenAddress": "0x8a90cab2b38dba80c64b7734e58ee1db38b8992e",
86
194
  "tokenURI": "ipfs://QmPMc4tcBsMqLRuCQtPmPe84bpSjrC3Ky7t3JWuHXYB4aS/1",
87
195
  "type": "ERC721",
88
196
  }