@circle-fin/usdckit 0.21.0 → 0.22.0

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 (707) hide show
  1. package/dist/cjs/actions/generateTransferLink.d.ts +3 -3
  2. package/dist/cjs/actions/generateTransferLink.js +3 -0
  3. package/dist/cjs/actions/generateTransferLink.test.js +17 -0
  4. package/dist/cjs/actions/getSwapExactInQuote.d.ts +3 -3
  5. package/dist/cjs/actions/getTokenBalance.d.ts +30 -0
  6. package/dist/cjs/actions/getTokenBalance.js +51 -0
  7. package/dist/cjs/actions/getTokenBalance.test.js +165 -0
  8. package/dist/cjs/actions/index.d.ts +9 -1
  9. package/dist/cjs/actions/index.js +12 -9
  10. package/dist/cjs/actions/index.test.js +2 -0
  11. package/dist/cjs/actions/swapExactIn.d.ts +3 -3
  12. package/dist/cjs/actions/sweep.d.ts +3 -2
  13. package/dist/cjs/actions/sweep.js +5 -5
  14. package/dist/cjs/actions/sweep.test.js +13 -10
  15. package/dist/cjs/actions/transfer.d.ts +2 -2
  16. package/dist/cjs/actions/transfer.js +58 -30
  17. package/dist/cjs/actions/transfer.test.js +334 -135
  18. package/dist/cjs/chains.d.ts +2 -0
  19. package/dist/cjs/chains.js +12 -0
  20. package/dist/cjs/client.d.ts +35 -0
  21. package/dist/cjs/client.js +12 -0
  22. package/dist/cjs/extractChain.d.ts +109 -109
  23. package/dist/cjs/index.d.ts +4 -1
  24. package/dist/cjs/index.js +56 -10
  25. package/dist/cjs/index.test.js +1 -0
  26. package/dist/cjs/metadata.js +1 -1
  27. package/dist/cjs/onResponse.d.ts +1 -1
  28. package/dist/cjs/onResponse.js +3 -0
  29. package/dist/cjs/providers/circle-wallets/actions/createAccount.d.ts +2 -1
  30. package/dist/cjs/providers/circle-wallets/actions/createContractExecutionTransaction.d.ts +9 -1
  31. package/dist/cjs/providers/circle-wallets/actions/createContractExecutionTransaction.js +8 -0
  32. package/dist/cjs/providers/circle-wallets/actions/createTransaction.d.ts +4 -1
  33. package/dist/cjs/providers/circle-wallets/actions/createTransaction.js +3 -0
  34. package/dist/cjs/providers/circle-wallets/actions/createWalletSet.d.ts +1 -1
  35. package/dist/cjs/providers/circle-wallets/actions/createWallets.d.ts +1 -1
  36. package/dist/cjs/providers/circle-wallets/actions/deriveWallet.d.ts +1 -1
  37. package/dist/cjs/providers/circle-wallets/actions/drip.d.ts +2 -1
  38. package/dist/cjs/providers/circle-wallets/actions/estimateContractExecutionFee.d.ts +1 -1
  39. package/dist/cjs/providers/circle-wallets/actions/estimateTransferFee.d.ts +2 -1
  40. package/dist/cjs/providers/circle-wallets/actions/estimateTransferFee.js +2 -3
  41. package/dist/cjs/providers/circle-wallets/actions/estimateTransferFee.test.js +1 -20
  42. package/dist/cjs/providers/circle-wallets/actions/getAccounts.d.ts +2 -1
  43. package/dist/cjs/providers/circle-wallets/actions/getNotificationSignature.d.ts +1 -1
  44. package/dist/cjs/providers/circle-wallets/actions/getTokenBalances.d.ts +4 -15
  45. package/dist/cjs/providers/circle-wallets/actions/getTransactionById.d.ts +1 -1
  46. package/dist/cjs/providers/circle-wallets/actions/getWallet.d.ts +1 -1
  47. package/dist/cjs/providers/circle-wallets/actions/getWalletTokenBalance.d.ts +1 -1
  48. package/dist/cjs/providers/circle-wallets/actions/getWalletsWithBalances.d.ts +1 -1
  49. package/dist/cjs/providers/circle-wallets/actions/importContract.d.ts +1 -1
  50. package/dist/cjs/providers/circle-wallets/actions/index.d.ts +0 -8
  51. package/dist/cjs/providers/circle-wallets/actions/index.js +0 -8
  52. package/dist/cjs/providers/circle-wallets/actions/index.test.js +0 -4
  53. package/dist/cjs/providers/circle-wallets/actions/listTransactions.d.ts +1 -1
  54. package/dist/cjs/providers/circle-wallets/actions/listWallets.d.ts +1 -1
  55. package/dist/cjs/providers/circle-wallets/actions/requestTestnetTokens.d.ts +1 -1
  56. package/dist/cjs/providers/circle-wallets/actions/signTransaction.d.ts +1 -1
  57. package/dist/cjs/providers/circle-wallets/actions/verifyNotification.d.ts +1 -1
  58. package/dist/cjs/providers/circle-wallets/actions/writeContract.d.ts +2 -1
  59. package/dist/cjs/providers/circle-wallets/actions/writeContract.js +2 -5
  60. package/dist/cjs/providers/circle-wallets/actions/writeContract.test.js +9 -18
  61. package/dist/cjs/providers/circle-wallets/index.d.ts +4481 -0
  62. package/dist/cjs/providers/circle-wallets/index.js +40 -3
  63. package/dist/cjs/providers/circle-wallets/index.test.js +52 -3
  64. package/dist/cjs/providers/circle-wallets/transports/http.d.ts +19 -1
  65. package/dist/cjs/providers/circle-wallets/transports/http.js +2 -2
  66. package/dist/cjs/providers/circle-wallets/transports/http.test.js +24 -4
  67. package/dist/cjs/providers/circle-wallets/transports/index.d.ts +102 -22
  68. package/dist/cjs/providers/circle-wallets/transports/index.js +255 -1
  69. package/dist/cjs/providers/circle-wallets/transports/index.test.js +1623 -183
  70. package/dist/cjs/providers/circle-wallets/utils/index.d.ts +1 -0
  71. package/dist/cjs/providers/circle-wallets/utils/index.js +27 -0
  72. package/dist/cjs/providers/circle-wallets/utils/toSolanaSigner.d.ts +4 -0
  73. package/dist/cjs/providers/circle-wallets/utils/toSolanaSigner.js +33 -0
  74. package/dist/cjs/providers/circle-wallets/utils/toSolanaSigner.test.js +129 -0
  75. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/approve.d.ts +3 -3
  76. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/approve.js +5 -8
  77. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/bridge.d.ts +3 -3
  78. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/bridge.js +0 -3
  79. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/depositForBurn.d.ts +3 -3
  80. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/depositForBurn.js +5 -9
  81. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/index.js +6 -7
  82. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/listMessages.d.ts +3 -3
  83. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/receiveMessage.d.ts +3 -3
  84. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/receiveMessage.js +5 -9
  85. package/dist/cjs/providers/cross-chain-transfer-protocol/actions/waitForAttestationMessage.d.ts +3 -2
  86. package/dist/cjs/providers/cross-chain-transfer-protocol/transports/http.d.ts +0 -1
  87. package/dist/cjs/providers/cross-chain-transfer-protocol/transports/index.d.ts +1 -1
  88. package/dist/cjs/providers/cross-chain-transfer-protocol/transports/index.test.js +2 -2
  89. package/dist/cjs/providers/solana/actions/getAccountInfo.d.ts +23 -0
  90. package/dist/cjs/providers/{circle-wallets/actions/signTypedData.js → solana/actions/getAccountInfo.js} +7 -5
  91. package/dist/cjs/providers/solana/actions/getAccountInfo.test.js +39 -0
  92. package/dist/cjs/providers/solana/actions/getBalance.d.ts +15 -0
  93. package/dist/cjs/providers/solana/actions/getBalance.js +23 -0
  94. package/dist/cjs/providers/solana/actions/getBalance.test.js +35 -0
  95. package/dist/cjs/providers/solana/actions/getBlock.d.ts +60 -0
  96. package/dist/{esm/providers/circle-wallets/actions/signTypedData.js → cjs/providers/solana/actions/getBlock.js} +9 -4
  97. package/dist/cjs/providers/solana/actions/getBlock.test.d.ts +1 -0
  98. package/dist/cjs/providers/solana/actions/getBlock.test.js +34 -0
  99. package/dist/cjs/providers/solana/actions/getBlockCommitment.d.ts +13 -0
  100. package/dist/cjs/providers/solana/actions/getBlockCommitment.js +23 -0
  101. package/dist/cjs/providers/solana/actions/getBlockCommitment.test.d.ts +1 -0
  102. package/dist/cjs/providers/solana/actions/getBlockCommitment.test.js +36 -0
  103. package/dist/cjs/providers/solana/actions/getBlockHeight.d.ts +10 -0
  104. package/dist/cjs/providers/solana/actions/getBlockHeight.js +23 -0
  105. package/dist/cjs/providers/solana/actions/getBlockHeight.test.d.ts +1 -0
  106. package/dist/cjs/providers/solana/actions/getBlockHeight.test.js +33 -0
  107. package/dist/cjs/providers/solana/actions/getBlockProduction.d.ts +23 -0
  108. package/dist/cjs/providers/solana/actions/getBlockProduction.js +23 -0
  109. package/dist/cjs/providers/solana/actions/getBlockProduction.test.d.ts +1 -0
  110. package/dist/cjs/providers/solana/actions/getBlockProduction.test.js +40 -0
  111. package/dist/cjs/providers/solana/actions/getBlockTime.d.ts +10 -0
  112. package/dist/cjs/providers/solana/actions/getBlockTime.js +23 -0
  113. package/dist/cjs/providers/solana/actions/getBlockTime.test.d.ts +1 -0
  114. package/dist/cjs/providers/solana/actions/getBlockTime.test.js +33 -0
  115. package/dist/cjs/providers/solana/actions/getBlocks.d.ts +10 -0
  116. package/dist/cjs/providers/solana/actions/getBlocks.js +23 -0
  117. package/dist/cjs/providers/solana/actions/getBlocks.test.d.ts +1 -0
  118. package/dist/cjs/providers/solana/actions/getBlocks.test.js +35 -0
  119. package/dist/cjs/providers/solana/actions/getBlocksWithLimit.d.ts +10 -0
  120. package/dist/cjs/providers/solana/actions/getBlocksWithLimit.js +23 -0
  121. package/dist/cjs/providers/solana/actions/getBlocksWithLimit.test.d.ts +1 -0
  122. package/dist/cjs/providers/solana/actions/getBlocksWithLimit.test.js +34 -0
  123. package/dist/cjs/providers/solana/actions/getClusterName.d.ts +8 -0
  124. package/dist/cjs/providers/solana/actions/getClusterName.js +25 -0
  125. package/dist/cjs/providers/solana/actions/getClusterName.test.d.ts +1 -0
  126. package/dist/cjs/providers/solana/actions/getClusterName.test.js +32 -0
  127. package/dist/cjs/providers/solana/actions/getClusterNodes.d.ts +25 -0
  128. package/dist/cjs/providers/solana/actions/getClusterNodes.js +23 -0
  129. package/dist/cjs/providers/solana/actions/getClusterNodes.test.d.ts +1 -0
  130. package/dist/cjs/providers/solana/actions/getClusterNodes.test.js +32 -0
  131. package/dist/cjs/providers/solana/actions/getEpochInfo.d.ts +17 -0
  132. package/dist/cjs/providers/solana/actions/getEpochInfo.js +23 -0
  133. package/dist/cjs/providers/solana/actions/getEpochInfo.test.d.ts +1 -0
  134. package/dist/cjs/providers/solana/actions/getEpochInfo.test.js +39 -0
  135. package/dist/cjs/providers/solana/actions/getEpochSchedule.d.ts +16 -0
  136. package/dist/cjs/providers/solana/actions/getEpochSchedule.js +23 -0
  137. package/dist/cjs/providers/solana/actions/getEpochSchedule.test.d.ts +1 -0
  138. package/dist/cjs/providers/solana/actions/getEpochSchedule.test.js +32 -0
  139. package/dist/cjs/providers/solana/actions/getFeeForMessage.d.ts +15 -0
  140. package/dist/cjs/providers/solana/actions/getFeeForMessage.js +23 -0
  141. package/dist/cjs/providers/solana/actions/getFeeForMessage.test.d.ts +1 -0
  142. package/dist/cjs/providers/solana/actions/getFeeForMessage.test.js +33 -0
  143. package/dist/cjs/providers/solana/actions/getFirstAvailableBlock.d.ts +10 -0
  144. package/dist/cjs/providers/solana/actions/getFirstAvailableBlock.js +23 -0
  145. package/dist/cjs/providers/solana/actions/getFirstAvailableBlock.test.d.ts +1 -0
  146. package/dist/cjs/providers/solana/actions/getFirstAvailableBlock.test.js +32 -0
  147. package/dist/cjs/providers/solana/actions/getGenesisHash.d.ts +10 -0
  148. package/dist/cjs/providers/solana/actions/getGenesisHash.js +23 -0
  149. package/dist/cjs/providers/solana/actions/getGenesisHash.test.d.ts +1 -0
  150. package/dist/cjs/providers/solana/actions/getGenesisHash.test.js +32 -0
  151. package/dist/cjs/providers/solana/actions/getHealth.d.ts +10 -0
  152. package/dist/cjs/providers/solana/actions/getHealth.js +23 -0
  153. package/dist/cjs/providers/solana/actions/getHealth.test.d.ts +1 -0
  154. package/dist/cjs/providers/solana/actions/getHealth.test.js +32 -0
  155. package/dist/cjs/providers/solana/actions/getHighestSnapshotSlot.d.ts +13 -0
  156. package/dist/cjs/providers/solana/actions/getHighestSnapshotSlot.js +23 -0
  157. package/dist/cjs/providers/solana/actions/getHighestSnapshotSlot.test.d.ts +1 -0
  158. package/dist/cjs/providers/solana/actions/getHighestSnapshotSlot.test.js +32 -0
  159. package/dist/cjs/providers/solana/actions/getIdentity.d.ts +12 -0
  160. package/dist/cjs/providers/solana/actions/getIdentity.js +23 -0
  161. package/dist/cjs/providers/solana/actions/getIdentity.test.d.ts +1 -0
  162. package/dist/cjs/providers/solana/actions/getIdentity.test.js +32 -0
  163. package/dist/cjs/providers/solana/actions/getInflationGovernor.d.ts +16 -0
  164. package/dist/cjs/providers/solana/actions/getInflationGovernor.js +23 -0
  165. package/dist/cjs/providers/solana/actions/getInflationGovernor.test.d.ts +1 -0
  166. package/dist/cjs/providers/solana/actions/getInflationGovernor.test.js +33 -0
  167. package/dist/cjs/providers/solana/actions/getInflationRate.d.ts +15 -0
  168. package/dist/cjs/providers/solana/actions/getInflationRate.js +23 -0
  169. package/dist/cjs/providers/solana/actions/getInflationRate.test.d.ts +1 -0
  170. package/dist/cjs/providers/solana/actions/getInflationRate.test.js +39 -0
  171. package/dist/cjs/providers/solana/actions/getInflationReward.d.ts +16 -0
  172. package/dist/cjs/providers/solana/actions/getInflationReward.js +23 -0
  173. package/dist/cjs/providers/solana/actions/getInflationReward.test.d.ts +1 -0
  174. package/dist/cjs/providers/solana/actions/getInflationReward.test.js +35 -0
  175. package/dist/cjs/providers/solana/actions/getLargestAccounts.d.ts +18 -0
  176. package/dist/cjs/providers/solana/actions/getLargestAccounts.js +23 -0
  177. package/dist/cjs/providers/solana/actions/getLargestAccounts.test.d.ts +1 -0
  178. package/dist/cjs/providers/solana/actions/getLargestAccounts.test.js +33 -0
  179. package/dist/cjs/providers/solana/actions/getLatestBlockhash.d.ts +18 -0
  180. package/dist/cjs/providers/solana/actions/getLatestBlockhash.js +23 -0
  181. package/dist/cjs/providers/solana/actions/getLatestBlockhash.test.d.ts +1 -0
  182. package/dist/cjs/providers/solana/actions/getLatestBlockhash.test.js +33 -0
  183. package/dist/cjs/providers/solana/actions/getLeaderSchedule.d.ts +12 -0
  184. package/dist/cjs/providers/solana/actions/getLeaderSchedule.js +23 -0
  185. package/dist/cjs/providers/solana/actions/getLeaderSchedule.test.d.ts +1 -0
  186. package/dist/cjs/providers/solana/actions/getLeaderSchedule.test.js +34 -0
  187. package/dist/cjs/providers/solana/actions/getMaxRetransmitSlot.d.ts +10 -0
  188. package/dist/cjs/providers/solana/actions/getMaxRetransmitSlot.js +23 -0
  189. package/dist/cjs/providers/solana/actions/getMaxRetransmitSlot.test.d.ts +1 -0
  190. package/dist/cjs/providers/solana/actions/getMaxRetransmitSlot.test.js +32 -0
  191. package/dist/cjs/providers/solana/actions/getMaxShredInsertSlot.d.ts +10 -0
  192. package/dist/cjs/providers/solana/actions/getMaxShredInsertSlot.js +23 -0
  193. package/dist/cjs/providers/solana/actions/getMaxShredInsertSlot.test.d.ts +1 -0
  194. package/dist/cjs/providers/solana/actions/getMaxShredInsertSlot.test.js +32 -0
  195. package/dist/cjs/providers/solana/actions/getMinimumBalanceForRentExemption.d.ts +10 -0
  196. package/dist/cjs/providers/solana/actions/getMinimumBalanceForRentExemption.js +23 -0
  197. package/dist/cjs/providers/solana/actions/getMinimumBalanceForRentExemption.test.d.ts +1 -0
  198. package/dist/cjs/providers/solana/actions/getMinimumBalanceForRentExemption.test.js +34 -0
  199. package/dist/cjs/providers/solana/actions/getMultipleAccounts.d.ts +23 -0
  200. package/dist/cjs/providers/solana/actions/getMultipleAccounts.js +23 -0
  201. package/dist/cjs/providers/solana/actions/getMultipleAccounts.test.d.ts +1 -0
  202. package/dist/cjs/providers/solana/actions/getMultipleAccounts.test.js +43 -0
  203. package/dist/cjs/providers/solana/actions/getProgramAccounts.d.ts +21 -0
  204. package/dist/cjs/providers/solana/actions/getProgramAccounts.js +23 -0
  205. package/dist/cjs/providers/solana/actions/getProgramAccounts.test.d.ts +1 -0
  206. package/dist/cjs/providers/solana/actions/getProgramAccounts.test.js +39 -0
  207. package/dist/cjs/providers/solana/actions/getRecentPerformanceSamples.d.ts +16 -0
  208. package/dist/cjs/providers/solana/actions/getRecentPerformanceSamples.js +23 -0
  209. package/dist/cjs/providers/solana/actions/getRecentPerformanceSamples.test.d.ts +1 -0
  210. package/dist/cjs/providers/solana/actions/getRecentPerformanceSamples.test.js +33 -0
  211. package/dist/cjs/providers/solana/actions/getRecentPrioritizationFees.d.ts +13 -0
  212. package/dist/cjs/providers/solana/actions/getRecentPrioritizationFees.js +23 -0
  213. package/dist/cjs/providers/solana/actions/getRecentPrioritizationFees.test.d.ts +1 -0
  214. package/dist/cjs/providers/solana/actions/getRecentPrioritizationFees.test.js +34 -0
  215. package/dist/cjs/providers/solana/actions/getSignatureStatuses.d.ts +25 -0
  216. package/dist/cjs/providers/solana/actions/getSignatureStatuses.js +23 -0
  217. package/dist/cjs/providers/solana/actions/getSignatureStatuses.test.d.ts +1 -0
  218. package/dist/cjs/providers/solana/actions/getSignatureStatuses.test.js +35 -0
  219. package/dist/cjs/providers/solana/actions/getSignaturesForAddress.d.ts +17 -0
  220. package/dist/cjs/providers/solana/actions/getSignaturesForAddress.js +23 -0
  221. package/dist/cjs/providers/solana/actions/getSignaturesForAddress.test.d.ts +1 -0
  222. package/dist/cjs/providers/solana/actions/getSignaturesForAddress.test.js +46 -0
  223. package/dist/cjs/providers/solana/actions/getSlot.d.ts +10 -0
  224. package/dist/cjs/providers/solana/actions/getSlot.js +23 -0
  225. package/dist/cjs/providers/solana/actions/getSlot.test.d.ts +1 -0
  226. package/dist/cjs/providers/solana/actions/getSlot.test.js +33 -0
  227. package/dist/cjs/providers/solana/actions/getSlotLeader.d.ts +10 -0
  228. package/dist/cjs/providers/solana/actions/getSlotLeader.js +23 -0
  229. package/dist/cjs/providers/solana/actions/getSlotLeader.test.d.ts +1 -0
  230. package/dist/cjs/providers/solana/actions/getSlotLeader.test.js +33 -0
  231. package/dist/cjs/providers/solana/actions/getSlotLeaders.d.ts +10 -0
  232. package/dist/cjs/providers/solana/actions/getSlotLeaders.js +23 -0
  233. package/dist/cjs/providers/solana/actions/getSlotLeaders.test.d.ts +1 -0
  234. package/dist/cjs/providers/solana/actions/getSlotLeaders.test.js +34 -0
  235. package/dist/cjs/providers/solana/actions/getSupply.d.ts +21 -0
  236. package/dist/cjs/providers/solana/actions/getSupply.js +23 -0
  237. package/dist/cjs/providers/solana/actions/getSupply.test.d.ts +1 -0
  238. package/dist/cjs/providers/solana/actions/getSupply.test.js +33 -0
  239. package/dist/cjs/providers/solana/actions/getTokenAccountBalance.d.ts +20 -0
  240. package/dist/cjs/providers/solana/actions/getTokenAccountBalance.js +23 -0
  241. package/dist/cjs/providers/solana/actions/getTokenAccountBalance.test.d.ts +1 -0
  242. package/dist/cjs/providers/solana/actions/getTokenAccountBalance.test.js +34 -0
  243. package/dist/cjs/providers/solana/actions/getTokenAccountsByDelegate.d.ts +26 -0
  244. package/dist/cjs/providers/solana/actions/getTokenAccountsByDelegate.js +23 -0
  245. package/dist/cjs/providers/solana/actions/getTokenAccountsByDelegate.test.d.ts +1 -0
  246. package/dist/cjs/providers/solana/actions/getTokenAccountsByDelegate.test.js +35 -0
  247. package/dist/cjs/providers/solana/actions/getTokenAccountsByOwner.d.ts +26 -0
  248. package/dist/cjs/providers/solana/actions/getTokenAccountsByOwner.js +23 -0
  249. package/dist/cjs/providers/solana/actions/getTokenAccountsByOwner.test.d.ts +1 -0
  250. package/dist/cjs/providers/solana/actions/getTokenAccountsByOwner.test.js +39 -0
  251. package/dist/cjs/providers/solana/actions/getTokenLargestAccounts.d.ts +22 -0
  252. package/dist/cjs/providers/solana/actions/getTokenLargestAccounts.js +23 -0
  253. package/dist/cjs/providers/solana/actions/getTokenLargestAccounts.test.d.ts +1 -0
  254. package/dist/cjs/providers/solana/actions/getTokenLargestAccounts.test.js +34 -0
  255. package/dist/cjs/providers/solana/actions/getTokenSupply.d.ts +20 -0
  256. package/dist/cjs/providers/solana/actions/getTokenSupply.js +23 -0
  257. package/dist/cjs/providers/solana/actions/getTokenSupply.test.d.ts +1 -0
  258. package/dist/cjs/providers/solana/actions/getTokenSupply.test.js +34 -0
  259. package/dist/cjs/providers/solana/actions/getTransaction.d.ts +80 -0
  260. package/dist/cjs/providers/solana/actions/getTransaction.js +23 -0
  261. package/dist/cjs/providers/solana/actions/getTransaction.test.d.ts +1 -0
  262. package/dist/cjs/providers/solana/actions/getTransaction.test.js +34 -0
  263. package/dist/cjs/providers/solana/actions/getTransactionCount.d.ts +10 -0
  264. package/dist/cjs/providers/solana/actions/getTransactionCount.js +23 -0
  265. package/dist/cjs/providers/solana/actions/getTransactionCount.test.d.ts +1 -0
  266. package/dist/cjs/providers/solana/actions/getTransactionCount.test.js +33 -0
  267. package/dist/cjs/providers/solana/actions/getVersion.d.ts +13 -0
  268. package/dist/cjs/providers/solana/actions/getVersion.js +23 -0
  269. package/dist/cjs/providers/solana/actions/getVersion.test.d.ts +1 -0
  270. package/dist/cjs/providers/solana/actions/getVersion.test.js +35 -0
  271. package/dist/cjs/providers/solana/actions/getVoteAccounts.d.ts +31 -0
  272. package/dist/cjs/providers/solana/actions/getVoteAccounts.js +23 -0
  273. package/dist/cjs/providers/solana/actions/getVoteAccounts.test.d.ts +1 -0
  274. package/dist/cjs/providers/solana/actions/getVoteAccounts.test.js +33 -0
  275. package/dist/cjs/providers/solana/actions/index.d.ts +216 -0
  276. package/dist/cjs/providers/solana/actions/index.js +190 -0
  277. package/dist/cjs/providers/solana/actions/index.test.d.ts +1 -0
  278. package/dist/cjs/providers/solana/actions/index.test.js +78 -0
  279. package/dist/cjs/providers/solana/actions/isBlockhashValid.d.ts +15 -0
  280. package/dist/cjs/providers/solana/actions/isBlockhashValid.js +23 -0
  281. package/dist/cjs/providers/solana/actions/isBlockhashValid.test.d.ts +1 -0
  282. package/dist/cjs/providers/solana/actions/isBlockhashValid.test.js +34 -0
  283. package/dist/cjs/providers/solana/actions/minimumLedgerSlot.d.ts +10 -0
  284. package/dist/cjs/providers/solana/actions/minimumLedgerSlot.js +23 -0
  285. package/dist/cjs/providers/solana/actions/minimumLedgerSlot.test.d.ts +1 -0
  286. package/dist/cjs/providers/solana/actions/minimumLedgerSlot.test.js +32 -0
  287. package/dist/cjs/providers/solana/actions/sendTransaction.d.ts +13 -0
  288. package/dist/cjs/providers/solana/actions/sendTransaction.js +30 -0
  289. package/dist/cjs/providers/solana/actions/sendTransaction.test.d.ts +1 -0
  290. package/dist/cjs/providers/solana/actions/sendTransaction.test.js +82 -0
  291. package/dist/cjs/providers/solana/actions/simulateTransaction.d.ts +28 -0
  292. package/dist/cjs/providers/solana/actions/simulateTransaction.js +30 -0
  293. package/dist/cjs/providers/solana/actions/simulateTransaction.test.d.ts +1 -0
  294. package/dist/cjs/providers/solana/actions/simulateTransaction.test.js +82 -0
  295. package/dist/cjs/providers/solana/actions/switchCluster.d.ts +10 -0
  296. package/dist/cjs/providers/solana/actions/switchCluster.js +26 -0
  297. package/dist/cjs/providers/solana/actions/switchCluster.test.d.ts +1 -0
  298. package/dist/cjs/providers/solana/actions/switchCluster.test.js +33 -0
  299. package/dist/cjs/providers/solana/constants.d.ts +6 -0
  300. package/dist/cjs/providers/solana/constants.js +23 -0
  301. package/dist/cjs/providers/solana/index.d.ts +101 -0
  302. package/dist/cjs/providers/solana/index.js +39 -0
  303. package/dist/cjs/providers/solana/index.test.d.ts +1 -0
  304. package/dist/cjs/providers/solana/index.test.js +201 -0
  305. package/dist/cjs/providers/solana/transports/http.d.ts +8 -0
  306. package/dist/cjs/providers/solana/transports/http.js +20 -0
  307. package/dist/cjs/providers/solana/transports/http.test.d.ts +1 -0
  308. package/dist/cjs/providers/solana/transports/http.test.js +88 -0
  309. package/dist/cjs/providers/solana/transports/index.d.ts +734 -0
  310. package/dist/cjs/providers/solana/transports/index.js +205 -0
  311. package/dist/cjs/providers/solana/transports/index.test.d.ts +1 -0
  312. package/dist/cjs/providers/solana/transports/index.test.js +307 -0
  313. package/dist/cjs/providers/solana/utils/codecs.d.ts +4 -0
  314. package/dist/cjs/providers/solana/utils/codecs.js +20 -0
  315. package/dist/cjs/providers/solana/utils/index.d.ts +2 -0
  316. package/dist/cjs/providers/solana/utils/index.js +30 -0
  317. package/dist/cjs/providers/solana/utils/index.test.d.ts +1 -0
  318. package/dist/cjs/providers/solana/utils/index.test.js +53 -0
  319. package/dist/cjs/providers/solana/utils/toBase64EncodedWireTransaction.d.ts +26 -0
  320. package/dist/cjs/providers/solana/utils/toBase64EncodedWireTransaction.js +42 -0
  321. package/dist/cjs/providers/solana/utils/toBase64EncodedWireTransaction.test.d.ts +1 -0
  322. package/dist/cjs/providers/solana/utils/toBase64EncodedWireTransaction.test.js +108 -0
  323. package/dist/cjs/providers/uniswap/actions/exactInputSingle.d.ts +3 -3
  324. package/dist/cjs/providers/uniswap/actions/exactInputSingle.js +4 -4
  325. package/dist/cjs/providers/uniswap/actions/getPool.d.ts +3 -2
  326. package/dist/cjs/providers/uniswap/actions/quoteExactInputSingle.d.ts +3 -2
  327. package/dist/cjs/types.d.ts +8 -16
  328. package/dist/cjs/types.js +0 -10
  329. package/dist/cjs/utils/createConfig.d.ts +36 -0
  330. package/dist/cjs/utils/createConfig.js +51 -0
  331. package/dist/cjs/utils/createConfig.test.d.ts +1 -0
  332. package/dist/cjs/utils/createConfig.test.js +66 -0
  333. package/dist/cjs/utils/createCustomWalletClient.d.ts +46 -0
  334. package/dist/cjs/utils/createCustomWalletClient.js +114 -0
  335. package/dist/cjs/utils/createCustomWalletClient.test.d.ts +1 -0
  336. package/dist/cjs/utils/createCustomWalletClient.test.js +100 -0
  337. package/dist/cjs/utils/getChainContractByAddress.d.ts +2 -1
  338. package/dist/cjs/utils/getClient.d.ts +458 -0
  339. package/dist/cjs/utils/getClient.js +25 -0
  340. package/dist/cjs/utils/getClient.test.d.ts +1 -0
  341. package/dist/cjs/utils/getClient.test.js +46 -0
  342. package/dist/cjs/utils/index.d.ts +1 -0
  343. package/dist/cjs/utils/index.js +1 -0
  344. package/dist/cjs/utils/index.test.js +2 -0
  345. package/dist/esm/actions/generateTransferLink.d.ts +3 -3
  346. package/dist/esm/actions/generateTransferLink.js +3 -0
  347. package/dist/esm/actions/generateTransferLink.test.js +17 -0
  348. package/dist/esm/actions/getSwapExactInQuote.d.ts +3 -3
  349. package/dist/esm/actions/getTokenBalance.d.ts +30 -0
  350. package/dist/esm/actions/getTokenBalance.js +48 -0
  351. package/dist/esm/actions/getTokenBalance.test.d.ts +1 -0
  352. package/dist/esm/actions/getTokenBalance.test.js +163 -0
  353. package/dist/esm/actions/index.d.ts +9 -1
  354. package/dist/esm/actions/index.js +12 -9
  355. package/dist/esm/actions/index.test.js +2 -0
  356. package/dist/esm/actions/swapExactIn.d.ts +3 -3
  357. package/dist/esm/actions/sweep.d.ts +3 -2
  358. package/dist/esm/actions/sweep.js +5 -5
  359. package/dist/esm/actions/sweep.test.js +13 -10
  360. package/dist/esm/actions/transfer.d.ts +2 -2
  361. package/dist/esm/actions/transfer.js +60 -32
  362. package/dist/esm/actions/transfer.test.js +334 -135
  363. package/dist/esm/chains.d.ts +2 -0
  364. package/dist/esm/chains.js +11 -0
  365. package/dist/esm/client.d.ts +35 -0
  366. package/dist/esm/client.js +11 -0
  367. package/dist/esm/extractChain.d.ts +109 -109
  368. package/dist/esm/index.d.ts +4 -1
  369. package/dist/esm/index.js +31 -7
  370. package/dist/esm/index.test.js +1 -0
  371. package/dist/esm/metadata.js +1 -1
  372. package/dist/esm/onResponse.d.ts +1 -1
  373. package/dist/esm/onResponse.js +3 -0
  374. package/dist/esm/providers/circle-wallets/actions/createAccount.d.ts +2 -1
  375. package/dist/esm/providers/circle-wallets/actions/createContractExecutionTransaction.d.ts +9 -1
  376. package/dist/esm/providers/circle-wallets/actions/createContractExecutionTransaction.js +8 -0
  377. package/dist/esm/providers/circle-wallets/actions/createTransaction.d.ts +4 -1
  378. package/dist/esm/providers/circle-wallets/actions/createTransaction.js +3 -0
  379. package/dist/esm/providers/circle-wallets/actions/createWalletSet.d.ts +1 -1
  380. package/dist/esm/providers/circle-wallets/actions/createWallets.d.ts +1 -1
  381. package/dist/esm/providers/circle-wallets/actions/deriveWallet.d.ts +1 -1
  382. package/dist/esm/providers/circle-wallets/actions/drip.d.ts +2 -1
  383. package/dist/esm/providers/circle-wallets/actions/estimateContractExecutionFee.d.ts +1 -1
  384. package/dist/esm/providers/circle-wallets/actions/estimateTransferFee.d.ts +2 -1
  385. package/dist/esm/providers/circle-wallets/actions/estimateTransferFee.js +2 -3
  386. package/dist/esm/providers/circle-wallets/actions/estimateTransferFee.test.js +1 -20
  387. package/dist/esm/providers/circle-wallets/actions/getAccounts.d.ts +2 -1
  388. package/dist/esm/providers/circle-wallets/actions/getNotificationSignature.d.ts +1 -1
  389. package/dist/esm/providers/circle-wallets/actions/getTokenBalances.d.ts +4 -15
  390. package/dist/esm/providers/circle-wallets/actions/getTransactionById.d.ts +1 -1
  391. package/dist/esm/providers/circle-wallets/actions/getWallet.d.ts +1 -1
  392. package/dist/esm/providers/circle-wallets/actions/getWalletTokenBalance.d.ts +1 -1
  393. package/dist/esm/providers/circle-wallets/actions/getWalletsWithBalances.d.ts +1 -1
  394. package/dist/esm/providers/circle-wallets/actions/importContract.d.ts +1 -1
  395. package/dist/esm/providers/circle-wallets/actions/index.d.ts +0 -8
  396. package/dist/esm/providers/circle-wallets/actions/index.js +0 -8
  397. package/dist/esm/providers/circle-wallets/actions/index.test.js +0 -4
  398. package/dist/esm/providers/circle-wallets/actions/listTransactions.d.ts +1 -1
  399. package/dist/esm/providers/circle-wallets/actions/listWallets.d.ts +1 -1
  400. package/dist/esm/providers/circle-wallets/actions/requestTestnetTokens.d.ts +1 -1
  401. package/dist/esm/providers/circle-wallets/actions/signTransaction.d.ts +1 -1
  402. package/dist/esm/providers/circle-wallets/actions/verifyNotification.d.ts +1 -1
  403. package/dist/esm/providers/circle-wallets/actions/writeContract.d.ts +2 -1
  404. package/dist/esm/providers/circle-wallets/actions/writeContract.js +2 -5
  405. package/dist/esm/providers/circle-wallets/actions/writeContract.test.js +9 -18
  406. package/dist/esm/providers/circle-wallets/index.d.ts +4481 -0
  407. package/dist/esm/providers/circle-wallets/index.js +35 -0
  408. package/dist/esm/providers/circle-wallets/index.test.js +51 -2
  409. package/dist/esm/providers/circle-wallets/transports/http.d.ts +19 -1
  410. package/dist/esm/providers/circle-wallets/transports/http.js +3 -3
  411. package/dist/esm/providers/circle-wallets/transports/http.test.js +24 -4
  412. package/dist/esm/providers/circle-wallets/transports/index.d.ts +102 -22
  413. package/dist/esm/providers/circle-wallets/transports/index.js +257 -3
  414. package/dist/esm/providers/circle-wallets/transports/index.test.js +1617 -177
  415. package/dist/esm/providers/circle-wallets/utils/index.d.ts +1 -0
  416. package/dist/esm/providers/circle-wallets/utils/index.js +11 -0
  417. package/dist/esm/providers/circle-wallets/utils/toSolanaSigner.d.ts +4 -0
  418. package/dist/esm/providers/circle-wallets/utils/toSolanaSigner.js +30 -0
  419. package/dist/esm/providers/circle-wallets/utils/toSolanaSigner.test.d.ts +1 -0
  420. package/dist/esm/providers/circle-wallets/utils/toSolanaSigner.test.js +127 -0
  421. package/dist/esm/providers/cross-chain-transfer-protocol/actions/approve.d.ts +3 -3
  422. package/dist/esm/providers/cross-chain-transfer-protocol/actions/approve.js +7 -10
  423. package/dist/esm/providers/cross-chain-transfer-protocol/actions/bridge.d.ts +3 -3
  424. package/dist/esm/providers/cross-chain-transfer-protocol/actions/bridge.js +0 -3
  425. package/dist/esm/providers/cross-chain-transfer-protocol/actions/depositForBurn.d.ts +3 -3
  426. package/dist/esm/providers/cross-chain-transfer-protocol/actions/depositForBurn.js +6 -10
  427. package/dist/esm/providers/cross-chain-transfer-protocol/actions/index.js +6 -7
  428. package/dist/esm/providers/cross-chain-transfer-protocol/actions/listMessages.d.ts +3 -3
  429. package/dist/esm/providers/cross-chain-transfer-protocol/actions/receiveMessage.d.ts +3 -3
  430. package/dist/esm/providers/cross-chain-transfer-protocol/actions/receiveMessage.js +6 -10
  431. package/dist/esm/providers/cross-chain-transfer-protocol/actions/waitForAttestationMessage.d.ts +3 -2
  432. package/dist/esm/providers/cross-chain-transfer-protocol/transports/http.d.ts +0 -1
  433. package/dist/esm/providers/cross-chain-transfer-protocol/transports/index.d.ts +1 -1
  434. package/dist/esm/providers/cross-chain-transfer-protocol/transports/index.test.js +2 -2
  435. package/dist/esm/providers/solana/actions/getAccountInfo.d.ts +23 -0
  436. package/dist/esm/providers/solana/actions/getAccountInfo.js +20 -0
  437. package/dist/esm/providers/solana/actions/getAccountInfo.test.d.ts +1 -0
  438. package/dist/esm/providers/solana/actions/getAccountInfo.test.js +37 -0
  439. package/dist/esm/providers/solana/actions/getBalance.d.ts +15 -0
  440. package/dist/esm/providers/solana/actions/getBalance.js +20 -0
  441. package/dist/esm/providers/solana/actions/getBalance.test.d.ts +1 -0
  442. package/dist/esm/providers/solana/actions/getBalance.test.js +33 -0
  443. package/dist/esm/providers/solana/actions/getBlock.d.ts +60 -0
  444. package/dist/esm/providers/solana/actions/getBlock.js +20 -0
  445. package/dist/esm/providers/solana/actions/getBlock.test.d.ts +1 -0
  446. package/dist/esm/providers/solana/actions/getBlock.test.js +32 -0
  447. package/dist/esm/providers/solana/actions/getBlockCommitment.d.ts +13 -0
  448. package/dist/esm/providers/solana/actions/getBlockCommitment.js +20 -0
  449. package/dist/esm/providers/solana/actions/getBlockCommitment.test.d.ts +1 -0
  450. package/dist/esm/providers/solana/actions/getBlockCommitment.test.js +34 -0
  451. package/dist/esm/providers/solana/actions/getBlockHeight.d.ts +10 -0
  452. package/dist/esm/providers/solana/actions/getBlockHeight.js +20 -0
  453. package/dist/esm/providers/solana/actions/getBlockHeight.test.d.ts +1 -0
  454. package/dist/esm/providers/solana/actions/getBlockHeight.test.js +31 -0
  455. package/dist/esm/providers/solana/actions/getBlockProduction.d.ts +23 -0
  456. package/dist/esm/providers/solana/actions/getBlockProduction.js +20 -0
  457. package/dist/esm/providers/solana/actions/getBlockProduction.test.d.ts +1 -0
  458. package/dist/esm/providers/solana/actions/getBlockProduction.test.js +38 -0
  459. package/dist/esm/providers/solana/actions/getBlockTime.d.ts +10 -0
  460. package/dist/esm/providers/solana/actions/getBlockTime.js +20 -0
  461. package/dist/esm/providers/solana/actions/getBlockTime.test.d.ts +1 -0
  462. package/dist/esm/providers/solana/actions/getBlockTime.test.js +31 -0
  463. package/dist/esm/providers/solana/actions/getBlocks.d.ts +10 -0
  464. package/dist/esm/providers/solana/actions/getBlocks.js +20 -0
  465. package/dist/esm/providers/solana/actions/getBlocks.test.d.ts +1 -0
  466. package/dist/esm/providers/solana/actions/getBlocks.test.js +33 -0
  467. package/dist/esm/providers/solana/actions/getBlocksWithLimit.d.ts +10 -0
  468. package/dist/esm/providers/solana/actions/getBlocksWithLimit.js +20 -0
  469. package/dist/esm/providers/solana/actions/getBlocksWithLimit.test.d.ts +1 -0
  470. package/dist/esm/providers/solana/actions/getBlocksWithLimit.test.js +32 -0
  471. package/dist/esm/providers/solana/actions/getClusterName.d.ts +8 -0
  472. package/dist/esm/providers/solana/actions/getClusterName.js +22 -0
  473. package/dist/esm/providers/solana/actions/getClusterName.test.d.ts +1 -0
  474. package/dist/esm/providers/solana/actions/getClusterName.test.js +30 -0
  475. package/dist/esm/providers/solana/actions/getClusterNodes.d.ts +25 -0
  476. package/dist/esm/providers/solana/actions/getClusterNodes.js +20 -0
  477. package/dist/esm/providers/solana/actions/getClusterNodes.test.d.ts +1 -0
  478. package/dist/esm/providers/solana/actions/getClusterNodes.test.js +30 -0
  479. package/dist/esm/providers/solana/actions/getEpochInfo.d.ts +17 -0
  480. package/dist/esm/providers/solana/actions/getEpochInfo.js +20 -0
  481. package/dist/esm/providers/solana/actions/getEpochInfo.test.d.ts +1 -0
  482. package/dist/esm/providers/solana/actions/getEpochInfo.test.js +37 -0
  483. package/dist/esm/providers/solana/actions/getEpochSchedule.d.ts +16 -0
  484. package/dist/esm/providers/solana/actions/getEpochSchedule.js +20 -0
  485. package/dist/esm/providers/solana/actions/getEpochSchedule.test.d.ts +1 -0
  486. package/dist/esm/providers/solana/actions/getEpochSchedule.test.js +30 -0
  487. package/dist/esm/providers/solana/actions/getFeeForMessage.d.ts +15 -0
  488. package/dist/esm/providers/solana/actions/getFeeForMessage.js +20 -0
  489. package/dist/esm/providers/solana/actions/getFeeForMessage.test.d.ts +1 -0
  490. package/dist/esm/providers/solana/actions/getFeeForMessage.test.js +31 -0
  491. package/dist/esm/providers/solana/actions/getFirstAvailableBlock.d.ts +10 -0
  492. package/dist/esm/providers/solana/actions/getFirstAvailableBlock.js +20 -0
  493. package/dist/esm/providers/solana/actions/getFirstAvailableBlock.test.d.ts +1 -0
  494. package/dist/esm/providers/solana/actions/getFirstAvailableBlock.test.js +30 -0
  495. package/dist/esm/providers/solana/actions/getGenesisHash.d.ts +10 -0
  496. package/dist/esm/providers/solana/actions/getGenesisHash.js +20 -0
  497. package/dist/esm/providers/solana/actions/getGenesisHash.test.d.ts +1 -0
  498. package/dist/esm/providers/solana/actions/getGenesisHash.test.js +30 -0
  499. package/dist/esm/providers/solana/actions/getHealth.d.ts +10 -0
  500. package/dist/esm/providers/solana/actions/getHealth.js +20 -0
  501. package/dist/esm/providers/solana/actions/getHealth.test.d.ts +1 -0
  502. package/dist/esm/providers/solana/actions/getHealth.test.js +30 -0
  503. package/dist/esm/providers/solana/actions/getHighestSnapshotSlot.d.ts +13 -0
  504. package/dist/esm/providers/solana/actions/getHighestSnapshotSlot.js +20 -0
  505. package/dist/esm/providers/solana/actions/getHighestSnapshotSlot.test.d.ts +1 -0
  506. package/dist/esm/providers/solana/actions/getHighestSnapshotSlot.test.js +30 -0
  507. package/dist/esm/providers/solana/actions/getIdentity.d.ts +12 -0
  508. package/dist/esm/providers/solana/actions/getIdentity.js +20 -0
  509. package/dist/esm/providers/solana/actions/getIdentity.test.d.ts +1 -0
  510. package/dist/esm/providers/solana/actions/getIdentity.test.js +30 -0
  511. package/dist/esm/providers/solana/actions/getInflationGovernor.d.ts +16 -0
  512. package/dist/esm/providers/solana/actions/getInflationGovernor.js +20 -0
  513. package/dist/esm/providers/solana/actions/getInflationGovernor.test.d.ts +1 -0
  514. package/dist/esm/providers/solana/actions/getInflationGovernor.test.js +31 -0
  515. package/dist/esm/providers/solana/actions/getInflationRate.d.ts +15 -0
  516. package/dist/esm/providers/solana/actions/getInflationRate.js +20 -0
  517. package/dist/esm/providers/solana/actions/getInflationRate.test.d.ts +1 -0
  518. package/dist/esm/providers/solana/actions/getInflationRate.test.js +37 -0
  519. package/dist/esm/providers/solana/actions/getInflationReward.d.ts +16 -0
  520. package/dist/esm/providers/solana/actions/getInflationReward.js +20 -0
  521. package/dist/esm/providers/solana/actions/getInflationReward.test.d.ts +1 -0
  522. package/dist/esm/providers/solana/actions/getInflationReward.test.js +33 -0
  523. package/dist/esm/providers/solana/actions/getLargestAccounts.d.ts +18 -0
  524. package/dist/esm/providers/solana/actions/getLargestAccounts.js +20 -0
  525. package/dist/esm/providers/solana/actions/getLargestAccounts.test.d.ts +1 -0
  526. package/dist/esm/providers/solana/actions/getLargestAccounts.test.js +31 -0
  527. package/dist/esm/providers/solana/actions/getLatestBlockhash.d.ts +18 -0
  528. package/dist/esm/providers/solana/actions/getLatestBlockhash.js +20 -0
  529. package/dist/esm/providers/solana/actions/getLatestBlockhash.test.d.ts +1 -0
  530. package/dist/esm/providers/solana/actions/getLatestBlockhash.test.js +31 -0
  531. package/dist/esm/providers/solana/actions/getLeaderSchedule.d.ts +12 -0
  532. package/dist/esm/providers/solana/actions/getLeaderSchedule.js +20 -0
  533. package/dist/esm/providers/solana/actions/getLeaderSchedule.test.d.ts +1 -0
  534. package/dist/esm/providers/solana/actions/getLeaderSchedule.test.js +32 -0
  535. package/dist/esm/providers/solana/actions/getMaxRetransmitSlot.d.ts +10 -0
  536. package/dist/esm/providers/solana/actions/getMaxRetransmitSlot.js +20 -0
  537. package/dist/esm/providers/solana/actions/getMaxRetransmitSlot.test.d.ts +1 -0
  538. package/dist/esm/providers/solana/actions/getMaxRetransmitSlot.test.js +30 -0
  539. package/dist/esm/providers/solana/actions/getMaxShredInsertSlot.d.ts +10 -0
  540. package/dist/esm/providers/solana/actions/getMaxShredInsertSlot.js +20 -0
  541. package/dist/esm/providers/solana/actions/getMaxShredInsertSlot.test.d.ts +1 -0
  542. package/dist/esm/providers/solana/actions/getMaxShredInsertSlot.test.js +30 -0
  543. package/dist/esm/providers/solana/actions/getMinimumBalanceForRentExemption.d.ts +10 -0
  544. package/dist/esm/providers/solana/actions/getMinimumBalanceForRentExemption.js +20 -0
  545. package/dist/esm/providers/solana/actions/getMinimumBalanceForRentExemption.test.d.ts +1 -0
  546. package/dist/esm/providers/solana/actions/getMinimumBalanceForRentExemption.test.js +32 -0
  547. package/dist/esm/providers/solana/actions/getMultipleAccounts.d.ts +23 -0
  548. package/dist/esm/providers/solana/actions/getMultipleAccounts.js +20 -0
  549. package/dist/esm/providers/solana/actions/getMultipleAccounts.test.d.ts +1 -0
  550. package/dist/esm/providers/solana/actions/getMultipleAccounts.test.js +41 -0
  551. package/dist/esm/providers/solana/actions/getProgramAccounts.d.ts +21 -0
  552. package/dist/esm/providers/solana/actions/getProgramAccounts.js +20 -0
  553. package/dist/esm/providers/solana/actions/getProgramAccounts.test.d.ts +1 -0
  554. package/dist/esm/providers/solana/actions/getProgramAccounts.test.js +37 -0
  555. package/dist/esm/providers/solana/actions/getRecentPerformanceSamples.d.ts +16 -0
  556. package/dist/esm/providers/solana/actions/getRecentPerformanceSamples.js +20 -0
  557. package/dist/esm/providers/solana/actions/getRecentPerformanceSamples.test.d.ts +1 -0
  558. package/dist/esm/providers/solana/actions/getRecentPerformanceSamples.test.js +31 -0
  559. package/dist/esm/providers/solana/actions/getRecentPrioritizationFees.d.ts +13 -0
  560. package/dist/esm/providers/solana/actions/getRecentPrioritizationFees.js +20 -0
  561. package/dist/esm/providers/solana/actions/getRecentPrioritizationFees.test.d.ts +1 -0
  562. package/dist/esm/providers/solana/actions/getRecentPrioritizationFees.test.js +32 -0
  563. package/dist/esm/providers/solana/actions/getSignatureStatuses.d.ts +25 -0
  564. package/dist/esm/providers/solana/actions/getSignatureStatuses.js +20 -0
  565. package/dist/esm/providers/solana/actions/getSignatureStatuses.test.d.ts +1 -0
  566. package/dist/esm/providers/solana/actions/getSignatureStatuses.test.js +33 -0
  567. package/dist/esm/providers/solana/actions/getSignaturesForAddress.d.ts +17 -0
  568. package/dist/esm/providers/solana/actions/getSignaturesForAddress.js +20 -0
  569. package/dist/esm/providers/solana/actions/getSignaturesForAddress.test.d.ts +1 -0
  570. package/dist/esm/providers/solana/actions/getSignaturesForAddress.test.js +44 -0
  571. package/dist/esm/providers/solana/actions/getSlot.d.ts +10 -0
  572. package/dist/esm/providers/solana/actions/getSlot.js +20 -0
  573. package/dist/esm/providers/solana/actions/getSlot.test.d.ts +1 -0
  574. package/dist/esm/providers/solana/actions/getSlot.test.js +31 -0
  575. package/dist/esm/providers/solana/actions/getSlotLeader.d.ts +10 -0
  576. package/dist/esm/providers/solana/actions/getSlotLeader.js +20 -0
  577. package/dist/esm/providers/solana/actions/getSlotLeader.test.d.ts +1 -0
  578. package/dist/esm/providers/solana/actions/getSlotLeader.test.js +31 -0
  579. package/dist/esm/providers/solana/actions/getSlotLeaders.d.ts +10 -0
  580. package/dist/esm/providers/solana/actions/getSlotLeaders.js +20 -0
  581. package/dist/esm/providers/solana/actions/getSlotLeaders.test.d.ts +1 -0
  582. package/dist/esm/providers/solana/actions/getSlotLeaders.test.js +32 -0
  583. package/dist/esm/providers/solana/actions/getSupply.d.ts +21 -0
  584. package/dist/esm/providers/solana/actions/getSupply.js +20 -0
  585. package/dist/esm/providers/solana/actions/getSupply.test.d.ts +1 -0
  586. package/dist/esm/providers/solana/actions/getSupply.test.js +31 -0
  587. package/dist/esm/providers/solana/actions/getTokenAccountBalance.d.ts +20 -0
  588. package/dist/esm/providers/solana/actions/getTokenAccountBalance.js +20 -0
  589. package/dist/esm/providers/solana/actions/getTokenAccountBalance.test.d.ts +1 -0
  590. package/dist/esm/providers/solana/actions/getTokenAccountBalance.test.js +32 -0
  591. package/dist/esm/providers/solana/actions/getTokenAccountsByDelegate.d.ts +26 -0
  592. package/dist/esm/providers/solana/actions/getTokenAccountsByDelegate.js +20 -0
  593. package/dist/esm/providers/solana/actions/getTokenAccountsByDelegate.test.d.ts +1 -0
  594. package/dist/esm/providers/solana/actions/getTokenAccountsByDelegate.test.js +33 -0
  595. package/dist/esm/providers/solana/actions/getTokenAccountsByOwner.d.ts +26 -0
  596. package/dist/esm/providers/solana/actions/getTokenAccountsByOwner.js +20 -0
  597. package/dist/esm/providers/solana/actions/getTokenAccountsByOwner.test.d.ts +1 -0
  598. package/dist/esm/providers/solana/actions/getTokenAccountsByOwner.test.js +37 -0
  599. package/dist/esm/providers/solana/actions/getTokenLargestAccounts.d.ts +22 -0
  600. package/dist/esm/providers/solana/actions/getTokenLargestAccounts.js +20 -0
  601. package/dist/esm/providers/solana/actions/getTokenLargestAccounts.test.d.ts +1 -0
  602. package/dist/esm/providers/solana/actions/getTokenLargestAccounts.test.js +32 -0
  603. package/dist/esm/providers/solana/actions/getTokenSupply.d.ts +20 -0
  604. package/dist/esm/providers/solana/actions/getTokenSupply.js +20 -0
  605. package/dist/esm/providers/solana/actions/getTokenSupply.test.d.ts +1 -0
  606. package/dist/esm/providers/solana/actions/getTokenSupply.test.js +32 -0
  607. package/dist/esm/providers/solana/actions/getTransaction.d.ts +80 -0
  608. package/dist/esm/providers/solana/actions/getTransaction.js +20 -0
  609. package/dist/esm/providers/solana/actions/getTransaction.test.d.ts +1 -0
  610. package/dist/esm/providers/solana/actions/getTransaction.test.js +32 -0
  611. package/dist/esm/providers/solana/actions/getTransactionCount.d.ts +10 -0
  612. package/dist/esm/providers/solana/actions/getTransactionCount.js +20 -0
  613. package/dist/esm/providers/solana/actions/getTransactionCount.test.d.ts +1 -0
  614. package/dist/esm/providers/solana/actions/getTransactionCount.test.js +31 -0
  615. package/dist/esm/providers/solana/actions/getVersion.d.ts +13 -0
  616. package/dist/esm/providers/solana/actions/getVersion.js +20 -0
  617. package/dist/esm/providers/solana/actions/getVersion.test.d.ts +1 -0
  618. package/dist/esm/providers/solana/actions/getVersion.test.js +33 -0
  619. package/dist/esm/providers/solana/actions/getVoteAccounts.d.ts +31 -0
  620. package/dist/esm/providers/solana/actions/getVoteAccounts.js +20 -0
  621. package/dist/esm/providers/solana/actions/getVoteAccounts.test.d.ts +1 -0
  622. package/dist/esm/providers/solana/actions/getVoteAccounts.test.js +31 -0
  623. package/dist/esm/providers/solana/actions/index.d.ts +216 -0
  624. package/dist/esm/providers/solana/actions/index.js +173 -0
  625. package/dist/esm/providers/solana/actions/index.test.d.ts +1 -0
  626. package/dist/esm/providers/solana/actions/index.test.js +76 -0
  627. package/dist/esm/providers/solana/actions/isBlockhashValid.d.ts +15 -0
  628. package/dist/esm/providers/solana/actions/isBlockhashValid.js +20 -0
  629. package/dist/esm/providers/solana/actions/isBlockhashValid.test.d.ts +1 -0
  630. package/dist/esm/providers/solana/actions/isBlockhashValid.test.js +32 -0
  631. package/dist/esm/providers/solana/actions/minimumLedgerSlot.d.ts +10 -0
  632. package/dist/esm/providers/solana/actions/minimumLedgerSlot.js +20 -0
  633. package/dist/esm/providers/solana/actions/minimumLedgerSlot.test.d.ts +1 -0
  634. package/dist/esm/providers/solana/actions/minimumLedgerSlot.test.js +30 -0
  635. package/dist/esm/providers/solana/actions/sendTransaction.d.ts +13 -0
  636. package/dist/esm/providers/solana/actions/sendTransaction.js +27 -0
  637. package/dist/esm/providers/solana/actions/sendTransaction.test.d.ts +1 -0
  638. package/dist/esm/providers/solana/actions/sendTransaction.test.js +80 -0
  639. package/dist/esm/providers/solana/actions/simulateTransaction.d.ts +28 -0
  640. package/dist/esm/providers/solana/actions/simulateTransaction.js +27 -0
  641. package/dist/esm/providers/solana/actions/simulateTransaction.test.d.ts +1 -0
  642. package/dist/esm/providers/solana/actions/simulateTransaction.test.js +80 -0
  643. package/dist/esm/providers/solana/actions/switchCluster.d.ts +10 -0
  644. package/dist/esm/providers/solana/actions/switchCluster.js +23 -0
  645. package/dist/esm/providers/solana/actions/switchCluster.test.d.ts +1 -0
  646. package/dist/esm/providers/solana/actions/switchCluster.test.js +31 -0
  647. package/dist/esm/providers/solana/constants.d.ts +6 -0
  648. package/dist/esm/providers/solana/constants.js +17 -0
  649. package/dist/esm/providers/solana/index.d.ts +101 -0
  650. package/dist/esm/providers/solana/index.js +21 -0
  651. package/dist/esm/providers/solana/index.test.d.ts +1 -0
  652. package/dist/esm/providers/solana/index.test.js +166 -0
  653. package/dist/esm/providers/solana/transports/http.d.ts +8 -0
  654. package/dist/esm/providers/solana/transports/http.js +17 -0
  655. package/dist/esm/providers/solana/transports/http.test.d.ts +1 -0
  656. package/dist/esm/providers/solana/transports/http.test.js +86 -0
  657. package/dist/esm/providers/solana/transports/index.d.ts +734 -0
  658. package/dist/esm/providers/solana/transports/index.js +200 -0
  659. package/dist/esm/providers/solana/transports/index.test.d.ts +1 -0
  660. package/dist/esm/providers/solana/transports/index.test.js +272 -0
  661. package/dist/esm/providers/solana/utils/codecs.d.ts +4 -0
  662. package/dist/esm/providers/solana/utils/codecs.js +17 -0
  663. package/dist/esm/providers/solana/utils/index.d.ts +2 -0
  664. package/dist/esm/providers/solana/utils/index.js +12 -0
  665. package/dist/esm/providers/solana/utils/index.test.d.ts +1 -0
  666. package/dist/esm/providers/solana/utils/index.test.js +18 -0
  667. package/dist/esm/providers/solana/utils/toBase64EncodedWireTransaction.d.ts +26 -0
  668. package/dist/esm/providers/solana/utils/toBase64EncodedWireTransaction.js +39 -0
  669. package/dist/esm/providers/solana/utils/toBase64EncodedWireTransaction.test.d.ts +1 -0
  670. package/dist/esm/providers/solana/utils/toBase64EncodedWireTransaction.test.js +106 -0
  671. package/dist/esm/providers/uniswap/actions/exactInputSingle.d.ts +3 -3
  672. package/dist/esm/providers/uniswap/actions/exactInputSingle.js +5 -5
  673. package/dist/esm/providers/uniswap/actions/getPool.d.ts +3 -2
  674. package/dist/esm/providers/uniswap/actions/quoteExactInputSingle.d.ts +3 -2
  675. package/dist/esm/types.d.ts +8 -16
  676. package/dist/esm/types.js +0 -10
  677. package/dist/esm/utils/createConfig.d.ts +36 -0
  678. package/dist/esm/utils/createConfig.js +48 -0
  679. package/dist/esm/utils/createConfig.test.d.ts +1 -0
  680. package/dist/esm/utils/createConfig.test.js +64 -0
  681. package/dist/esm/utils/createCustomWalletClient.d.ts +46 -0
  682. package/dist/esm/utils/createCustomWalletClient.js +78 -0
  683. package/dist/esm/utils/createCustomWalletClient.test.d.ts +1 -0
  684. package/dist/esm/utils/createCustomWalletClient.test.js +98 -0
  685. package/dist/esm/utils/getChainContractByAddress.d.ts +2 -1
  686. package/dist/esm/utils/getClient.d.ts +458 -0
  687. package/dist/esm/utils/getClient.js +22 -0
  688. package/dist/esm/utils/getClient.test.d.ts +1 -0
  689. package/dist/esm/utils/getClient.test.js +44 -0
  690. package/dist/esm/utils/index.d.ts +1 -0
  691. package/dist/esm/utils/index.js +1 -0
  692. package/dist/esm/utils/index.test.js +2 -0
  693. package/package.json +11 -3
  694. package/dist/cjs/providers/circle-wallets/actions/signTypedData.d.ts +0 -8
  695. package/dist/cjs/providers/circle-wallets/actions/signTypedData.test.js +0 -51
  696. package/dist/cjs/providers/circle-wallets/actions/waitForTransactionHash.d.ts +0 -19
  697. package/dist/cjs/providers/circle-wallets/actions/waitForTransactionHash.js +0 -45
  698. package/dist/cjs/providers/circle-wallets/actions/waitForTransactionHash.test.js +0 -92
  699. package/dist/esm/providers/circle-wallets/actions/signTypedData.d.ts +0 -8
  700. package/dist/esm/providers/circle-wallets/actions/signTypedData.test.js +0 -49
  701. package/dist/esm/providers/circle-wallets/actions/waitForTransactionHash.d.ts +0 -19
  702. package/dist/esm/providers/circle-wallets/actions/waitForTransactionHash.js +0 -42
  703. package/dist/esm/providers/circle-wallets/actions/waitForTransactionHash.test.js +0 -90
  704. /package/dist/cjs/{providers/circle-wallets/actions/signTypedData.test.d.ts → actions/getTokenBalance.test.d.ts} +0 -0
  705. /package/dist/cjs/providers/circle-wallets/{actions/waitForTransactionHash.test.d.ts → utils/toSolanaSigner.test.d.ts} +0 -0
  706. /package/dist/{esm/providers/circle-wallets/actions/signTypedData.test.d.ts → cjs/providers/solana/actions/getAccountInfo.test.d.ts} +0 -0
  707. /package/dist/{esm/providers/circle-wallets/actions/waitForTransactionHash.test.d.ts → cjs/providers/solana/actions/getBalance.test.d.ts} +0 -0
@@ -10,10 +10,13 @@
10
10
  // prohibited without the express written permission of Circle Internet Group, Inc.
11
11
  import { initiateDeveloperControlledWalletsClient } from '@circle-fin/developer-controlled-wallets';
12
12
  import { initiateSmartContractPlatformClient } from '@circle-fin/smart-contract-platform';
13
- import { formatGwei } from 'viem';
13
+ import { formatGwei, MethodNotFoundRpcError, numberToHex, parseEther } from 'viem';
14
14
  import { describe, test, expect, vi, beforeEach, it } from 'vitest';
15
+ import { UnsupportedChainError } from '../../../errors/index.js';
15
16
  import * as generateIdempotencyKeyMod from '../../../utils/generateIdempotencyKey.js';
17
+ import { AVAX } from '../../cross-chain-transfer-protocol/chains/index.js';
16
18
  import { SENTINEL_FEES } from '../index.js';
19
+ import * as circleWalletsIndex from '../index.js';
17
20
  import { Provider } from './index.js';
18
21
  vi.mock('@circle-fin/smart-contract-platform');
19
22
  vi.mock('@circle-fin/developer-controlled-wallets');
@@ -24,6 +27,7 @@ vi.mock('@circle-fin/developer-controlled-wallets', () => ({
24
27
  describe('Provider', () => {
25
28
  let provider;
26
29
  let mockClient;
30
+ let mockScp;
27
31
  beforeEach(() => {
28
32
  mockClient = {
29
33
  createWalletSet: vi.fn(),
@@ -31,22 +35,29 @@ describe('Provider', () => {
31
35
  listWallets: vi.fn(),
32
36
  getWallet: vi.fn(),
33
37
  estimateTransferFee: vi.fn(),
38
+ estimateContractExecutionFee: vi.fn(),
34
39
  createTransaction: vi.fn(),
40
+ createContractExecutionTransaction: vi.fn(),
35
41
  getTransaction: vi.fn(),
36
42
  getWalletTokenBalance: vi.fn(),
37
43
  deriveWallet: vi.fn(),
38
44
  getNotificationSignature: vi.fn(),
39
45
  getWalletsWithBalances: vi.fn(),
40
46
  requestTestnetTokens: vi.fn(() => ''),
41
- signTypedData: vi.fn(),
42
47
  signTransaction: vi.fn(),
48
+ signTypedData: vi.fn(),
43
49
  listTransactions: vi.fn(),
44
50
  };
51
+ mockScp = {
52
+ queryContract: vi.fn(),
53
+ };
45
54
  initiateDeveloperControlledWalletsClient.mockReturnValue(mockClient);
55
+ initiateSmartContractPlatformClient.mockReturnValue(mockScp);
46
56
  provider = new Provider({
47
57
  apiKey: 'test-api-key',
48
58
  entitySecret: 'test-entity-secret',
49
59
  baseUrl: 'base-url',
60
+ chainId: 1,
50
61
  });
51
62
  });
52
63
  beforeEach(() => {
@@ -56,7 +67,7 @@ describe('Provider', () => {
56
67
  const params = { name: 'test-wallet-set' };
57
68
  const response = { data: { walletSet: 'test-wallet-set-id' } };
58
69
  mockClient.createWalletSet.mockResolvedValue(response);
59
- const result = await provider.circle_createWalletSet(params);
70
+ const result = await provider.request({ method: 'circle_createWalletSet', params: [params] });
60
71
  expect(result).toBe('test-wallet-set-id');
61
72
  expect(mockClient.createWalletSet).toHaveBeenCalledWith(params);
62
73
  });
@@ -68,7 +79,7 @@ describe('Provider', () => {
68
79
  };
69
80
  const response = { data: { wallets: ['wallet1'] } };
70
81
  mockClient.createWallets.mockResolvedValue(response);
71
- const result = await provider.circle_createWallets(params);
82
+ const result = await provider.request({ method: 'circle_createWallets', params: [params] });
72
83
  expect(result).toEqual(['wallet1']);
73
84
  expect(mockClient.createWallets).toHaveBeenCalledWith(params);
74
85
  });
@@ -76,7 +87,7 @@ describe('Provider', () => {
76
87
  const params = { walletSetId: 'test-wallet-set-id' };
77
88
  const response = { data: { wallets: ['wallet1', 'wallet2'] } };
78
89
  mockClient.listWallets.mockResolvedValue(response);
79
- const result = await provider.circle_listWallets(params);
90
+ const result = await provider.request({ method: 'circle_listWallets', params: [params] });
80
91
  expect(result).toEqual(['wallet1', 'wallet2']);
81
92
  expect(mockClient.listWallets).toHaveBeenCalledWith(params);
82
93
  });
@@ -88,7 +99,7 @@ describe('Provider', () => {
88
99
  ];
89
100
  const response = { data: { transactions } };
90
101
  mockClient.listTransactions.mockResolvedValue(response);
91
- const result = await provider.circle_listTransactions(params);
102
+ const result = await provider.request({ method: 'circle_listTransactions', params: [params] });
92
103
  expect(result).toEqual(transactions);
93
104
  expect(mockClient.listTransactions).toHaveBeenCalledWith(params);
94
105
  });
@@ -96,7 +107,7 @@ describe('Provider', () => {
96
107
  const params = { walletId: 'empty-wallet-id' };
97
108
  const response = { data: {} }; // No transactions property
98
109
  mockClient.listTransactions.mockResolvedValue(response);
99
- const result = await provider.circle_listTransactions(params);
110
+ const result = await provider.request({ method: 'circle_listTransactions', params: [params] });
100
111
  expect(result).toEqual([]);
101
112
  expect(mockClient.listTransactions).toHaveBeenCalledWith(params);
102
113
  });
@@ -115,7 +126,7 @@ describe('Provider', () => {
115
126
  },
116
127
  };
117
128
  mockClient.estimateTransferFee.mockResolvedValue(response);
118
- const result = await provider.circle_estimateTransferFee(params);
129
+ const result = await provider.request({ method: 'circle_estimateTransferFee', params: [params] });
119
130
  expect(result).toEqual({
120
131
  high: {
121
132
  gasLimit: '4',
@@ -151,7 +162,7 @@ describe('Provider', () => {
151
162
  },
152
163
  };
153
164
  mockClient.estimateTransferFee.mockResolvedValue(response);
154
- const result = await provider.circle_estimateTransferFee(params);
165
+ const result = await provider.request({ method: 'circle_estimateTransferFee', params: [params] });
155
166
  expect(result).toEqual({
156
167
  high: {
157
168
  gasLimit: '4',
@@ -185,7 +196,7 @@ describe('Provider', () => {
185
196
  const getTransactionResult = { ...createTransactionResult, state: 'COMPLETE', txHash: '0x1234' };
186
197
  mockClient.createTransaction.mockResolvedValue({ data: createTransactionResult });
187
198
  mockClient.getTransaction.mockResolvedValue({ data: { transaction: getTransactionResult } });
188
- const result = await provider.circle_createTransaction(params);
199
+ const result = await provider.request({ method: 'circle_createTransaction', params: [params] });
189
200
  expect(mockClient.createTransaction).toHaveBeenCalledWith({
190
201
  walletId: 'test-wallet-id',
191
202
  amount: ['100'],
@@ -210,7 +221,7 @@ describe('Provider', () => {
210
221
  const getTransactionResult = { ...createTransactionResult, state: 'COMPLETE', txHash: '0x1234' };
211
222
  mockClient.createTransaction.mockResolvedValue({ data: createTransactionResult });
212
223
  mockClient.getTransaction.mockResolvedValue({ data: { transaction: getTransactionResult } });
213
- const result = await provider.circle_createTransaction(params);
224
+ const result = await provider.request({ method: 'circle_createTransaction', params: [params] });
214
225
  expect(mockClient.createTransaction).toHaveBeenCalledWith({
215
226
  walletId: 'test-wallet-id',
216
227
  amount: ['100'],
@@ -244,7 +255,7 @@ describe('Provider', () => {
244
255
  });
245
256
  mockClient.createTransaction.mockResolvedValue({ data: createTransactionResult });
246
257
  mockClient.getTransaction.mockResolvedValue({ data: { transaction: getTransactionResult } });
247
- const result = await provider.circle_createTransaction(params);
258
+ const result = await provider.request({ method: 'circle_createTransaction', params: [params] });
248
259
  expect(mockClient.createTransaction).toHaveBeenCalledWith({
249
260
  destinationAddress: '0x456',
250
261
  blockchain: 'MATIC-AMOY',
@@ -270,7 +281,74 @@ describe('Provider', () => {
270
281
  mockClient.listWallets.mockResolvedValue({
271
282
  data: { wallets: [] },
272
283
  });
273
- await expect(provider.circle_createTransaction(params)).rejects.toThrowError('156001');
284
+ await expect(provider.request({ method: 'circle_createTransaction', params: [params] })).rejects.toThrowError('156001');
285
+ });
286
+ it('should wait for transaction hash when waitForTransactionHash is true', async () => {
287
+ const params = {
288
+ walletId: 'test-wallet-id',
289
+ amount: ['100'],
290
+ tokenId: '0x123',
291
+ fee: {
292
+ type: 'level',
293
+ config: {
294
+ feeLevel: 'LOW',
295
+ },
296
+ },
297
+ waitForTransactionHash: true,
298
+ };
299
+ const createTransactionResult = { id: 'transaction-id', state: 'QUEUED' };
300
+ const getTransactionResult = { id: 'transaction-id', state: 'COMPLETE', txHash: '0x123' };
301
+ mockClient.createTransaction.mockResolvedValue({ data: createTransactionResult });
302
+ mockClient.getTransaction.mockResolvedValue({ data: { transaction: getTransactionResult } });
303
+ const result = await provider.request({ method: 'circle_createTransaction', params: [params] });
304
+ expect(result).toEqual(getTransactionResult);
305
+ expect(mockClient.createTransaction).toHaveBeenCalledWith({
306
+ walletId: 'test-wallet-id',
307
+ amount: ['100'],
308
+ tokenId: '0x123',
309
+ fee: {
310
+ type: 'level',
311
+ config: {
312
+ feeLevel: 'LOW',
313
+ },
314
+ },
315
+ waitForTransactionHash: true,
316
+ });
317
+ expect(mockClient.getTransaction).toHaveBeenCalledWith({ id: 'transaction-id' });
318
+ });
319
+ it('should not wait for transaction hash when waitForTransactionHash is false', async () => {
320
+ const params = {
321
+ walletId: 'test-wallet-id',
322
+ amount: ['100'],
323
+ tokenId: '0x123',
324
+ fee: {
325
+ type: 'level',
326
+ config: {
327
+ feeLevel: 'LOW',
328
+ },
329
+ },
330
+ waitForTransactionHash: false,
331
+ };
332
+ const createTransactionResult = { id: 'transaction-id', state: 'QUEUED' };
333
+ mockClient.createTransaction.mockResolvedValue({ data: createTransactionResult });
334
+ mockClient.getTransaction.mockResolvedValue({ data: { transaction: createTransactionResult } });
335
+ const result = await provider.request({ method: 'circle_createTransaction', params: [params] });
336
+ expect(result).toEqual(createTransactionResult);
337
+ expect(mockClient.createTransaction).toHaveBeenCalledWith({
338
+ walletId: 'test-wallet-id',
339
+ amount: ['100'],
340
+ tokenId: '0x123',
341
+ fee: {
342
+ type: 'level',
343
+ config: {
344
+ feeLevel: 'LOW',
345
+ },
346
+ },
347
+ waitForTransactionHash: false,
348
+ });
349
+ // Should call getTransaction once to get the transaction structure, but not wait for txHash
350
+ expect(mockClient.getTransaction).toHaveBeenCalledWith({ id: 'transaction-id' });
351
+ expect(mockClient.getTransaction).toHaveBeenCalledTimes(1);
274
352
  });
275
353
  });
276
354
  describe('circle_getTransaction', () => {
@@ -278,7 +356,7 @@ describe('Provider', () => {
278
356
  const params = { id: 'transaction-id' };
279
357
  const getTransactionResult = { ...params, state: 'COMPLETE', txHash: '0x123' };
280
358
  mockClient.getTransaction.mockResolvedValue({ data: { transaction: getTransactionResult } });
281
- const result = await provider.circle_getTransaction(params);
359
+ const result = await provider.request({ method: 'circle_getTransaction', params: [params] });
282
360
  expect(mockClient.getTransaction).toHaveBeenCalledWith(params);
283
361
  expect(result).toMatchObject(getTransactionResult);
284
362
  });
@@ -430,7 +508,7 @@ describe('Provider', () => {
430
508
  const params = { id: 'wallet-id', blockchain: 'MATIC-AMOY' };
431
509
  const expectedResult = { id: 'wallet-id', blockchain: 'MATIC-AMOY' };
432
510
  mockClient.deriveWallet.mockResolvedValue({ data: { wallet: expectedResult } });
433
- const result = await provider.circle_deriveWallet(params);
511
+ const result = await provider.request({ method: 'circle_deriveWallet', params: [params] });
434
512
  expect(mockClient.deriveWallet).toHaveBeenCalledWith(params);
435
513
  expect(result).toEqual(expectedResult);
436
514
  });
@@ -440,7 +518,7 @@ describe('Provider', () => {
440
518
  const params = { id: 'wallet-id' };
441
519
  const expectedResult = { id: 'wallet-id', blockchain: 'ETH-SEPOLIA' };
442
520
  mockClient.getWallet.mockResolvedValue({ data: { wallet: expectedResult } });
443
- const result = await provider.circle_getWallet(params);
521
+ const result = await provider.request({ method: 'circle_getWallet', params: [params] });
444
522
  expect(mockClient.getWallet).toHaveBeenCalledWith(params);
445
523
  expect(result).toEqual(expectedResult);
446
524
  });
@@ -515,38 +593,44 @@ describe('Provider', () => {
515
593
  },
516
594
  ];
517
595
  mockClient.getWalletsWithBalances.mockResolvedValue({ data: { wallets: expectedResult } });
518
- const result = await provider.circle_getWalletsWithBalances(params);
596
+ const result = await provider.request({ method: 'circle_getWalletsWithBalances', params: [params] });
519
597
  expect(mockClient.getWalletsWithBalances).toHaveBeenCalledWith(params);
520
598
  expect(result).toEqual(expectedResult);
521
599
  });
522
600
  });
523
- describe('circle_signTypedData', () => {
524
- it('should return signed typed data', async () => {
601
+ describe('circle_signTransaction', () => {
602
+ it('should return signed transaction', async () => {
525
603
  const params = {
526
604
  walletId: '00000000-0000-0000-0000-000000000000',
527
- data: '{"types": {"Data": [{ "name": "dummy", "type": "string" }],"EIP712Domain":[{ "name": "name", "type": "string" },{ "name": "chainId", "type": "uint256" }]}, "domain": { "name": "Test", "chainId": 1337 }, "primaryType": "Data", "message": { "dummy": "dummy" }}',
605
+ transaction: '{"nonce":1,"to":"0x9e4ebf23f713268b8e72cd162337f20c536357c9","value":"10000000000000000","gas":"21000","maxFeePerGas":"42000000000","maxPriorityFeePerGas":"25000000000","chainId":80002}',
606
+ memo: 'hello world',
528
607
  };
529
608
  const expectedResult = {
530
- signature: '3W6r38STvZuBSmk2bbbct132SjEsYSARo3CJi3JQvNUaFoYu',
609
+ signature: '0xe35aff124b45a36fd438ddfc0c61306e1001fdac65d87131591e7e12ef1010707fcc4194739acd0eec173fa31dda4d3c3381967f06933adc57d5ef08176a8e0900',
610
+ signedTransaction: '0x02f87683013882018505d21dba008509c7652400825208949e4ebf23f713268b8e72cd162337f20c536357c9872386f26fc1000080c080a0e35aff124b45a36fd438ddfc0c61306e1001fdac65d87131591e7e12ef101070a07fcc4194739acd0eec173fa31dda4d3c3381967f06933adc57d5ef08176a8e09',
611
+ txHash: '0xc37b57369e8c25cc5484829d23e288dd8416107a92b5d6e2d0a9753703fc4fed',
531
612
  };
532
- mockClient.signTypedData.mockResolvedValue({ data: expectedResult });
533
- const result = await provider.circle_signTypedData(params);
534
- expect(mockClient.signTypedData).toHaveBeenCalledWith(params);
613
+ mockClient.signTransaction.mockResolvedValue({ data: expectedResult });
614
+ const result = await provider.request({ method: 'circle_signTransaction', params: [params] });
615
+ expect(mockClient.signTransaction).toHaveBeenCalledWith(params);
535
616
  expect(result).toEqual(expectedResult);
536
617
  });
537
618
  it('should resolve address and blockchain to walletId', async () => {
538
619
  const params = {
539
620
  address: '0x9e4ebf23f713268b8e72cd162337f20c536357c9',
540
- blockchain: 'ETH-SEPOLIA',
541
- data: '{"types": {"Data": [{ "name": "dummy", "type": "string" }],"EIP712Domain":[{ "name": "name", "type": "string" },{ "name": "chainId", "type": "uint256" }]}, "domain": { "name": "Test", "chainId": 1337 }, "primaryType": "Data", "message": { "dummy": "dummy" }}',
621
+ blockchain: 'EVM-TESTNET',
622
+ transaction: '{"nonce":1,"to":"0x9e4ebf23f713268b8e72cd162337f20c536357c9","value":"10000000000000000","gas":"21000","maxFeePerGas":"42000000000","maxPriorityFeePerGas":"25000000000","chainId":80002}',
623
+ memo: 'hello world',
542
624
  };
543
625
  const expectedResult = {
544
- signature: '3W6r38STvZuBSmk2bbbct132SjEsYSARo3CJi3JQvNUaFoYu',
626
+ signature: '0xe35aff124b45a36fd438ddfc0c61306e1001fdac65d87131591e7e12ef1010707fcc4194739acd0eec173fa31dda4d3c3381967f06933adc57d5ef08176a8e0900',
627
+ signedTransaction: '0x02f87683013882018505d21dba008509c7652400825208949e4ebf23f713268b8e72cd162337f20c536357c9872386f26fc1000080c080a0e35aff124b45a36fd438ddfc0c61306e1001fdac65d87131591e7e12ef101070a07fcc4194739acd0eec173fa31dda4d3c3381967f06933adc57d5ef08176a8e09',
628
+ txHash: '0xc37b57369e8c25cc5484829d23e288dd8416107a92b5d6e2d0a9753703fc4fed',
545
629
  };
546
- mockClient.signTypedData.mockResolvedValue({ data: expectedResult });
630
+ mockClient.signTransaction.mockResolvedValue({ data: expectedResult });
547
631
  mockClient.listWallets.mockResolvedValue({ data: { wallets: [{ id: 'my-wallet-id' }] } });
548
- await provider.circle_signTypedData(params);
549
- expect(mockClient.signTypedData).toHaveBeenCalledWith({
632
+ await provider.request({ method: 'circle_signTransaction', params: [params] });
633
+ expect(mockClient.signTransaction).toHaveBeenCalledWith({
550
634
  ...params,
551
635
  address: undefined,
552
636
  blockchain: undefined,
@@ -554,45 +638,154 @@ describe('Provider', () => {
554
638
  });
555
639
  });
556
640
  });
557
- describe('circle_signTransaction', () => {
558
- it('should return signed transaction', async () => {
641
+ describe('circle_signTypedData', () => {
642
+ it('should return signed typed data', async () => {
559
643
  const params = {
560
644
  walletId: '00000000-0000-0000-0000-000000000000',
561
- transaction: '{"nonce":1,"to":"0x9e4ebf23f713268b8e72cd162337f20c536357c9","value":"10000000000000000","gas":"21000","maxFeePerGas":"42000000000","maxPriorityFeePerGas":"25000000000","chainId":80002}',
562
- memo: 'hello world',
645
+ data: '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"}]},"primaryType":"Person","domain":{"name":"Ether Mail","version":"1","chainId":1,"verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"}}',
646
+ memo: 'test signature',
563
647
  };
564
648
  const expectedResult = {
565
- signature: '0xe35aff124b45a36fd438ddfc0c61306e1001fdac65d87131591e7e12ef1010707fcc4194739acd0eec173fa31dda4d3c3381967f06933adc57d5ef08176a8e0900',
566
- signedTransaction: '0x02f87683013882018505d21dba008509c7652400825208949e4ebf23f713268b8e72cd162337f20c536357c9872386f26fc1000080c080a0e35aff124b45a36fd438ddfc0c61306e1001fdac65d87131591e7e12ef101070a07fcc4194739acd0eec173fa31dda4d3c3381967f06933adc57d5ef08176a8e09',
567
- txHash: '0xc37b57369e8c25cc5484829d23e288dd8416107a92b5d6e2d0a9753703fc4fed',
649
+ signature: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12',
568
650
  };
569
- mockClient.signTransaction.mockResolvedValue({ data: expectedResult });
570
- const result = await provider.circle_signTransaction(params);
571
- expect(mockClient.signTransaction).toHaveBeenCalledWith(params);
651
+ mockClient.signTypedData.mockResolvedValue({ data: expectedResult });
652
+ const result = await provider.request({ method: 'circle_signTypedData', params: [params] });
653
+ expect(mockClient.signTypedData).toHaveBeenCalledWith(params);
572
654
  expect(result).toEqual(expectedResult);
573
655
  });
574
656
  it('should resolve address and blockchain to walletId', async () => {
575
657
  const params = {
576
658
  address: '0x9e4ebf23f713268b8e72cd162337f20c536357c9',
577
- blockchain: 'EVM-TESTNET',
578
- transaction: '{"nonce":1,"to":"0x9e4ebf23f713268b8e72cd162337f20c536357c9","value":"10000000000000000","gas":"21000","maxFeePerGas":"42000000000","maxPriorityFeePerGas":"25000000000","chainId":80002}',
579
- memo: 'hello world',
659
+ blockchain: 'ETH-SEPOLIA',
660
+ data: '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"}]},"primaryType":"Person","domain":{"name":"Ether Mail","version":"1","chainId":1,"verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"}}',
661
+ memo: 'test signature',
580
662
  };
581
663
  const expectedResult = {
582
- signature: '0xe35aff124b45a36fd438ddfc0c61306e1001fdac65d87131591e7e12ef1010707fcc4194739acd0eec173fa31dda4d3c3381967f06933adc57d5ef08176a8e0900',
583
- signedTransaction: '0x02f87683013882018505d21dba008509c7652400825208949e4ebf23f713268b8e72cd162337f20c536357c9872386f26fc1000080c080a0e35aff124b45a36fd438ddfc0c61306e1001fdac65d87131591e7e12ef101070a07fcc4194739acd0eec173fa31dda4d3c3381967f06933adc57d5ef08176a8e09',
584
- txHash: '0xc37b57369e8c25cc5484829d23e288dd8416107a92b5d6e2d0a9753703fc4fed',
664
+ signature: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12',
585
665
  };
586
- mockClient.signTransaction.mockResolvedValue({ data: expectedResult });
666
+ mockClient.signTypedData.mockResolvedValue({ data: expectedResult });
587
667
  mockClient.listWallets.mockResolvedValue({ data: { wallets: [{ id: 'my-wallet-id' }] } });
588
- await provider.circle_signTransaction(params);
589
- expect(mockClient.signTransaction).toHaveBeenCalledWith({
668
+ await provider.request({ method: 'circle_signTypedData', params: [params] });
669
+ expect(mockClient.signTypedData).toHaveBeenCalledWith({
590
670
  ...params,
591
671
  address: undefined,
592
672
  blockchain: undefined,
593
673
  walletId: 'my-wallet-id',
594
674
  });
595
675
  });
676
+ it('should throw error when wallet not found for address and blockchain', async () => {
677
+ const params = {
678
+ address: '0xNotFound',
679
+ blockchain: 'ETH-SEPOLIA',
680
+ data: '{"types":{"EIP712Domain":[]},"primaryType":"Person","domain":{},"message":{}}',
681
+ };
682
+ mockClient.listWallets.mockResolvedValue({ data: { wallets: [] } });
683
+ await expect(provider.request({ method: 'circle_signTypedData', params: [params] })).rejects.toThrowError('156001');
684
+ });
685
+ });
686
+ describe('eth_signTypedData_v4', () => {
687
+ it('should sign typed data and return signature', async () => {
688
+ const address = '0x9e4ebf23f713268b8e72cd162337f20c536357c9';
689
+ const message = '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"}]},"primaryType":"Person","domain":{"name":"Ether Mail","version":"1","chainId":1,"verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"}}';
690
+ const expectedSignature = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12';
691
+ mockClient.signTypedData.mockResolvedValue({
692
+ data: { signature: expectedSignature },
693
+ });
694
+ mockClient.listWallets.mockResolvedValue({
695
+ data: { wallets: [{ id: 'my-wallet-id' }] },
696
+ });
697
+ const result = await provider.request({ method: 'eth_signTypedData_v4', params: [address, message] });
698
+ expect(result).toBe(expectedSignature);
699
+ expect(mockClient.signTypedData).toHaveBeenCalledWith({
700
+ walletId: 'my-wallet-id',
701
+ data: message,
702
+ });
703
+ });
704
+ it('should use provider chainId regardless of message domain chainId', async () => {
705
+ const address = '0x9e4ebf23f713268b8e72cd162337f20c536357c9';
706
+ // Message contains Sepolia chainId (11155111) in domain, but provider uses mainnet (chainId: 1)
707
+ const message = '{"types":{"EIP712Domain":[{"name":"chainId","type":"uint256"}],"Person":[]},"primaryType":"Person","domain":{"chainId":11155111},"message":{}}';
708
+ const expectedSignature = '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890';
709
+ mockClient.signTypedData.mockResolvedValue({
710
+ data: { signature: expectedSignature },
711
+ });
712
+ mockClient.listWallets.mockResolvedValue({
713
+ data: { wallets: [{ id: 'mainnet-wallet-id' }] },
714
+ });
715
+ const result = await provider.request({ method: 'eth_signTypedData_v4', params: [address, message] });
716
+ expect(result).toBe(expectedSignature);
717
+ expect(mockClient.signTypedData).toHaveBeenCalledWith({
718
+ walletId: 'mainnet-wallet-id',
719
+ data: message,
720
+ });
721
+ // Verify that listWallets was called with ETH blockchain (derived from provider's chainId 1)
722
+ // not ETH-SEPOLIA (which would be derived from message domain chainId 11155111)
723
+ expect(mockClient.listWallets).toHaveBeenCalledWith({
724
+ address,
725
+ blockchain: 'ETH',
726
+ });
727
+ });
728
+ it('should throw error for unsupported provider chain ID', async () => {
729
+ // Create a provider with an unsupported chainId
730
+ const mockUnsupportedClient = {
731
+ signTypedData: vi.fn(),
732
+ listWallets: vi.fn(),
733
+ };
734
+ initiateDeveloperControlledWalletsClient.mockReturnValueOnce(mockUnsupportedClient);
735
+ const unsupportedProvider = new Provider({
736
+ apiKey: 'test-api-key',
737
+ entitySecret: 'test-entity-secret',
738
+ baseUrl: 'base-url',
739
+ chainId: 999999, // Unsupported chainId
740
+ });
741
+ const address = '0x9e4ebf23f713268b8e72cd162337f20c536357c9';
742
+ const message = '{"types":{"EIP712Domain":[{"name":"chainId","type":"uint256"}],"Person":[]},"primaryType":"Person","domain":{"chainId":1},"message":{}}';
743
+ await expect(unsupportedProvider.request({ method: 'eth_signTypedData_v4', params: [address, message] })).rejects.toThrow();
744
+ });
745
+ it('should throw error when wallet not found', async () => {
746
+ const address = '0xNotFound';
747
+ const message = '{"types":{"EIP712Domain":[{"name":"chainId","type":"uint256"}],"Person":[]},"primaryType":"Person","domain":{"chainId":1},"message":{}}';
748
+ mockClient.listWallets.mockResolvedValue({ data: { wallets: [] } });
749
+ await expect(provider.request({ method: 'eth_signTypedData_v4', params: [address, message] })).rejects.toThrowError('156001');
750
+ });
751
+ it('should use provider chainId instead of message domain chainId', async () => {
752
+ // Mock the client for the new provider instance
753
+ const mockSepoliaClient = {
754
+ signTypedData: vi.fn(),
755
+ listWallets: vi.fn(),
756
+ };
757
+ initiateDeveloperControlledWalletsClient.mockReturnValueOnce(mockSepoliaClient);
758
+ // Create provider with chainId 11155111 (Sepolia)
759
+ const sepoliaProvider = new Provider({
760
+ apiKey: 'test-api-key',
761
+ entitySecret: 'test-entity-secret',
762
+ baseUrl: 'base-url',
763
+ chainId: 11155111, // Sepolia chainId
764
+ });
765
+ const address = '0x9e4ebf23f713268b8e72cd162337f20c536357c9';
766
+ // Message has different chainId (1 = mainnet) in domain, but provider should use its own chainId (11155111)
767
+ const message = '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"chainId","type":"uint256"}],"Person":[{"name":"name","type":"string"}]},"primaryType":"Person","domain":{"name":"Test","chainId":1},"message":{"name":"Alice"}}';
768
+ const expectedSignature = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef12';
769
+ mockSepoliaClient.signTypedData.mockResolvedValue({
770
+ data: { signature: expectedSignature },
771
+ });
772
+ mockSepoliaClient.listWallets.mockResolvedValue({
773
+ data: { wallets: [{ id: 'sepolia-wallet-id' }] },
774
+ });
775
+ const result = await sepoliaProvider.request({ method: 'eth_signTypedData_v4', params: [address, message] });
776
+ expect(result).toBe(expectedSignature);
777
+ // Verify that signTypedData was called with walletId (converted from address/blockchain)
778
+ expect(mockSepoliaClient.signTypedData).toHaveBeenCalledWith({
779
+ walletId: 'sepolia-wallet-id',
780
+ data: message,
781
+ });
782
+ // Verify that listWallets was called with ETH-SEPOLIA blockchain (derived from provider's chainId 11155111)
783
+ // not ETH (which would be derived from message domain chainId 1)
784
+ expect(mockSepoliaClient.listWallets).toHaveBeenCalledWith({
785
+ address,
786
+ blockchain: 'ETH-SEPOLIA',
787
+ });
788
+ });
596
789
  });
597
790
  describe('circle_requestTestnetTokens', () => {
598
791
  it('should return successfully', async () => {
@@ -603,7 +796,7 @@ describe('Provider', () => {
603
796
  usdc: false,
604
797
  eurc: true,
605
798
  };
606
- const result = await provider.circle_requestTestnetTokens(params);
799
+ const result = await provider.request({ method: 'circle_requestTestnetTokens', params: [params] });
607
800
  expect(result).toBe(undefined);
608
801
  expect(mockClient.requestTestnetTokens).toHaveBeenCalledWith(params);
609
802
  });
@@ -635,8 +828,15 @@ describe('Provider', () => {
635
828
  },
636
829
  };
637
830
  mockClient.createTransaction.mockResolvedValue(mockResponse);
638
- mockClient.getTransaction.mockResolvedValue({ data: { transaction: mockResponse.data } });
639
- await provider.circle_createTransaction(params);
831
+ mockClient.getTransaction.mockResolvedValue({
832
+ data: {
833
+ transaction: {
834
+ ...mockResponse.data,
835
+ txHash: '0xabc123',
836
+ },
837
+ },
838
+ });
839
+ await provider.request({ method: 'circle_createTransaction', params: [params] });
640
840
  // Verify that SENTINEL_FEES are converted to level-based fee
641
841
  expect(mockClient.createTransaction).toHaveBeenCalledWith({
642
842
  walletId: 'test-wallet-id',
@@ -675,8 +875,15 @@ describe('Provider', () => {
675
875
  },
676
876
  };
677
877
  mockClient.createTransaction.mockResolvedValue(mockResponse);
678
- mockClient.getTransaction.mockResolvedValue({ data: { transaction: mockResponse.data } });
679
- await provider.circle_createTransaction(params);
878
+ mockClient.getTransaction.mockResolvedValue({
879
+ data: {
880
+ transaction: {
881
+ ...mockResponse.data,
882
+ txHash: '0xabc123',
883
+ },
884
+ },
885
+ });
886
+ await provider.request({ method: 'circle_createTransaction', params: [params] });
680
887
  // Verify that only maxFee is converted to empty string
681
888
  expect(mockClient.createTransaction).toHaveBeenCalledWith({
682
889
  walletId: 'test-wallet-id',
@@ -717,8 +924,15 @@ describe('Provider', () => {
717
924
  },
718
925
  };
719
926
  mockClient.createTransaction.mockResolvedValue(mockResponse);
720
- mockClient.getTransaction.mockResolvedValue({ data: { transaction: mockResponse.data } });
721
- await provider.circle_createTransaction(params);
927
+ mockClient.getTransaction.mockResolvedValue({
928
+ data: {
929
+ transaction: {
930
+ ...mockResponse.data,
931
+ txHash: '0xabc123',
932
+ },
933
+ },
934
+ });
935
+ await provider.request({ method: 'circle_createTransaction', params: [params] });
722
936
  // Verify that normal fees are not modified
723
937
  expect(mockClient.createTransaction).toHaveBeenCalledWith({
724
938
  walletId: 'test-wallet-id',
@@ -736,123 +950,1254 @@ describe('Provider', () => {
736
950
  });
737
951
  });
738
952
  });
739
- });
740
- describe('Provider 2', () => {
741
- let provider;
742
- const mockClient = {
743
- estimateContractExecutionFee: vi.fn(),
744
- createContractExecutionTransaction: vi.fn(),
745
- createTransaction: vi.fn(),
746
- getTransaction: vi.fn(),
747
- listWallets: vi.fn(),
748
- };
749
- const mockScp = {
750
- importContract: vi.fn(),
751
- };
752
- beforeEach(() => {
753
- ;
754
- initiateDeveloperControlledWalletsClient.mockReturnValue(mockClient);
755
- initiateSmartContractPlatformClient.mockReturnValue(mockScp);
756
- provider = new Provider({
757
- apiKey: 'test-api-key',
758
- entitySecret: 'test-entity-secret',
759
- baseUrl: 'base-url',
953
+ describe('defaultSignal getter', () => {
954
+ it('should return AbortSignal.timeout when timeout is set', () => {
955
+ const provider = new Provider({
956
+ apiKey: 'test-api-key',
957
+ entitySecret: 'test-entity-secret',
958
+ chainId: 1,
959
+ timeout: 5000,
960
+ });
961
+ const signal = provider.defaultSignal;
962
+ expect(signal).toBeInstanceOf(AbortSignal);
760
963
  });
761
- });
762
- beforeEach(() => {
763
- vi.restoreAllMocks();
764
- });
765
- test('estimate contract execution fee', async () => {
766
- const params = {
767
- abiFunctionSignature: 'value',
768
- source: {
769
- sourceAddress: 'sourceAddress',
770
- blockchain: 'ETH-SEPOLIA',
771
- },
772
- contractAddress: 'contractAddress',
773
- abiParameters: [],
774
- };
775
- mockClient.estimateContractExecutionFee.mockResolvedValue({
776
- data: {
777
- high: { gasLimit: '3', maxFee: '6', priorityFee: '9', baseFee: '12', networkFee: '15' },
778
- medium: { gasLimit: '2', maxFee: '4', priorityFee: '6', baseFee: '8', networkFee: '10' },
779
- low: { gasLimit: '1', maxFee: '2', priorityFee: '3', baseFee: '4', networkFee: '5' },
780
- },
964
+ it('should return undefined when timeout is not set', () => {
965
+ const provider = new Provider({
966
+ apiKey: 'test-api-key',
967
+ entitySecret: 'test-entity-secret',
968
+ chainId: 1,
969
+ // timeout not provided
970
+ });
971
+ const signal = provider.defaultSignal;
972
+ expect(signal).toBeUndefined();
781
973
  });
782
- const result = await provider.circle_estimateContractExecutionFee(params);
783
- expect(result).toMatchObject({
784
- high: {
785
- gasLimit: '4',
786
- maxFee: '6.300000000000001',
787
- priorityFee: '9.450000000000001',
788
- baseFee: '12',
789
- networkFee: '15',
790
- },
791
- medium: { gasLimit: '3', maxFee: '4.2', priorityFee: '6.300000000000001', baseFee: '8', networkFee: '10' },
792
- low: { gasLimit: '2', maxFee: '2.1', priorityFee: '3.1500000000000004', baseFee: '4', networkFee: '5' },
974
+ it('should return AbortSignal.timeout for zero timeout', () => {
975
+ const provider = new Provider({
976
+ apiKey: 'test-api-key',
977
+ entitySecret: 'test-entity-secret',
978
+ chainId: 1,
979
+ timeout: 0,
980
+ });
981
+ const signal = provider.defaultSignal;
982
+ expect(signal).toBeInstanceOf(AbortSignal);
793
983
  });
794
- expect(mockClient.estimateContractExecutionFee).toHaveBeenCalledWith(params);
795
984
  });
796
- test('estimate contract execution fee for SCA', async () => {
797
- const params = {
798
- abiFunctionSignature: 'value',
799
- source: {
800
- sourceAddress: 'sourceAddress',
801
- blockchain: 'ETH-SEPOLIA',
802
- },
803
- contractAddress: 'contractAddress',
804
- abiParameters: [],
805
- };
806
- mockClient.estimateContractExecutionFee.mockResolvedValue({
807
- data: {
808
- high: { gasLimit: '3', maxFee: '6', priorityFee: '9', baseFee: '12', networkFee: '15' },
809
- medium: { gasLimit: '2', maxFee: '4', priorityFee: '6', baseFee: '8', networkFee: '10' },
810
- low: { gasLimit: '1', maxFee: '2', priorityFee: '3', baseFee: '4', networkFee: '5' },
811
- callGasLimit: '11111',
812
- verificationGasLimit: '22222',
813
- preVerificationGas: '33333',
814
- },
985
+ describe('Provider constructor validation', () => {
986
+ it('should throw error when pollingInterval is negative', () => {
987
+ expect(() => new Provider({
988
+ apiKey: 'test-api-key',
989
+ entitySecret: 'test-entity-secret',
990
+ chainId: 1,
991
+ pollingInterval: -1000,
992
+ })).toThrow('Polling interval must be greater than 0');
815
993
  });
816
- const result = await provider.circle_estimateContractExecutionFee(params);
817
- expect(result).toMatchObject({
818
- high: {
819
- gasLimit: '4',
820
- maxFee: '6.300000000000001',
821
- priorityFee: '9.450000000000001',
822
- baseFee: '12',
823
- networkFee: '15',
824
- },
825
- medium: { gasLimit: '3', maxFee: '4.2', priorityFee: '6.300000000000001', baseFee: '8', networkFee: '10' },
826
- low: { gasLimit: '2', maxFee: '2.1', priorityFee: '3.1500000000000004', baseFee: '4', networkFee: '5' },
827
- callGasLimit: '11111',
828
- verificationGasLimit: '22222',
829
- preVerificationGas: '33333',
994
+ it('should throw error when pollingInterval is zero', () => {
995
+ expect(() => new Provider({
996
+ apiKey: 'test-api-key',
997
+ entitySecret: 'test-entity-secret',
998
+ chainId: 1,
999
+ pollingInterval: 0,
1000
+ })).toThrow('Polling interval must be greater than 0');
1001
+ });
1002
+ it('should accept positive pollingInterval', () => {
1003
+ expect(() => new Provider({
1004
+ apiKey: 'test-api-key',
1005
+ entitySecret: 'test-entity-secret',
1006
+ chainId: 1,
1007
+ pollingInterval: 2000,
1008
+ })).not.toThrow();
830
1009
  });
831
- expect(mockClient.estimateContractExecutionFee).toHaveBeenCalledWith(params);
832
1010
  });
833
- describe('create contract execution transaction', () => {
834
- test.each([
835
- {
836
- name: 'with wallet id',
837
- params: {
838
- walletId: 'test-wallet-id',
839
- contractAddress: '0xcontract-address',
840
- fee: {
841
- type: 'level',
842
- config: {
843
- feeLevel: 'LOW',
844
- },
845
- },
846
- },
847
- },
848
- {
849
- name: 'without wallet id',
850
- params: {
851
- contractAddress: '0xcontract-address',
852
- sourceAddress: '0xtest-address',
853
- blockchain: 'ETH-SEPOLIA',
854
- fee: {
855
- type: 'level',
1011
+ describe('Request method with fallback support', () => {
1012
+ it('should fallback to fallback provider for unsupported methods', async () => {
1013
+ const mockFallback = vi.fn().mockReturnValue({
1014
+ request: vi.fn().mockResolvedValue('0x123abc'),
1015
+ });
1016
+ const providerWithMockFallback = new Provider({
1017
+ apiKey: 'test-api-key',
1018
+ entitySecret: 'test-entity-secret',
1019
+ chainId: 1,
1020
+ fallbackTransport: mockFallback,
1021
+ });
1022
+ const result = await providerWithMockFallback.request({
1023
+ method: 'eth_blockNumber',
1024
+ params: [],
1025
+ });
1026
+ expect(result).toBe('0x123abc');
1027
+ expect(mockFallback).toHaveBeenCalledTimes(1);
1028
+ const mockProvider = mockFallback();
1029
+ expect(mockProvider.request).toHaveBeenCalledWith({
1030
+ method: 'eth_blockNumber',
1031
+ params: [],
1032
+ });
1033
+ });
1034
+ it('should throw error for unsupported chain in fallback methods', async () => {
1035
+ const providerWithUnsupportedChain = new Provider({
1036
+ apiKey: 'test-api-key',
1037
+ entitySecret: 'test-entity-secret',
1038
+ chainId: 999999, // Unsupported chain
1039
+ });
1040
+ await expect(providerWithUnsupportedChain.request({ method: 'eth_blockNumber', params: [] })).rejects.toThrow();
1041
+ });
1042
+ it('should handle fallback errors gracefully', async () => {
1043
+ const mockFallback = vi.fn().mockReturnValue({
1044
+ request: vi.fn().mockRejectedValue(new Error('Network error')),
1045
+ });
1046
+ const providerWithMockFallback = new Provider({
1047
+ apiKey: 'test-api-key',
1048
+ entitySecret: 'test-entity-secret',
1049
+ chainId: 1,
1050
+ fallbackTransport: mockFallback,
1051
+ });
1052
+ await expect(providerWithMockFallback.request({
1053
+ method: 'eth_getTransactionByHash',
1054
+ params: ['0x123'],
1055
+ })).rejects.toThrow('Network error');
1056
+ });
1057
+ it('should call super.request first before falling back', async () => {
1058
+ const mockRequest = vi.fn().mockResolvedValue('0x456def');
1059
+ const mockFallback = vi.fn().mockReturnValue({
1060
+ request: mockRequest,
1061
+ });
1062
+ const providerWithMockFallback = new Provider({
1063
+ apiKey: 'test-api-key',
1064
+ entitySecret: 'test-entity-secret',
1065
+ chainId: 1,
1066
+ fallbackTransport: mockFallback,
1067
+ });
1068
+ // Mock a supported method to ensure it doesn't fallback
1069
+ const result = await providerWithMockFallback.request({
1070
+ method: 'eth_chainId',
1071
+ params: [],
1072
+ });
1073
+ expect(result).toBe('0x1'); // Should return chainId from provider, not fallback
1074
+ expect(mockFallback).toHaveBeenCalledTimes(1);
1075
+ expect(mockRequest).not.toHaveBeenCalled();
1076
+ });
1077
+ it('should only fallback on MethodNotFoundRpcError', async () => {
1078
+ const mockRequest = vi.fn().mockResolvedValue('fallback-result');
1079
+ const mockFallback = vi.fn().mockReturnValue({
1080
+ request: mockRequest,
1081
+ });
1082
+ const providerWithMockFallback = new Provider({
1083
+ apiKey: 'test-api-key',
1084
+ entitySecret: 'test-entity-secret',
1085
+ chainId: 1,
1086
+ fallbackTransport: mockFallback,
1087
+ });
1088
+ // Test with an error that's not MethodNotFoundRpcError (should not fallback)
1089
+ await expect(providerWithMockFallback.request({
1090
+ method: 'eth_chainId',
1091
+ params: [],
1092
+ })).resolves.toBe('0x1'); // Should succeed without fallback
1093
+ expect(mockFallback).toHaveBeenCalledTimes(1);
1094
+ expect(mockRequest).not.toHaveBeenCalled();
1095
+ });
1096
+ it('should properly handle MethodNotFoundRpcError and fallback', async () => {
1097
+ const mockFallback = vi.fn().mockReturnValue({
1098
+ request: vi.fn().mockResolvedValue('0xfallback123'),
1099
+ });
1100
+ const providerWithMockFallback = new Provider({
1101
+ apiKey: 'test-api-key',
1102
+ entitySecret: 'test-entity-secret',
1103
+ chainId: 1,
1104
+ fallbackTransport: mockFallback,
1105
+ });
1106
+ // Test that unsupported methods trigger fallback
1107
+ const result = await providerWithMockFallback.request({
1108
+ method: 'eth_getTransactionByHash',
1109
+ params: ['0x123'],
1110
+ });
1111
+ expect(result).toBe('0xfallback123');
1112
+ expect(mockFallback).toHaveBeenCalledTimes(1);
1113
+ const mockProvider = mockFallback();
1114
+ expect(mockProvider.request).toHaveBeenCalledWith({
1115
+ method: 'eth_getTransactionByHash',
1116
+ params: ['0x123'],
1117
+ });
1118
+ });
1119
+ it('should handle multiple fallback methods correctly', async () => {
1120
+ const mockRequest = vi
1121
+ .fn()
1122
+ .mockResolvedValueOnce('0xblock123')
1123
+ .mockResolvedValueOnce('0xtx456')
1124
+ .mockResolvedValueOnce('0xreceipt789');
1125
+ const mockFallback = vi.fn().mockReturnValue({
1126
+ request: mockRequest,
1127
+ });
1128
+ const providerWithMockFallback = new Provider({
1129
+ apiKey: 'test-api-key',
1130
+ entitySecret: 'test-entity-secret',
1131
+ chainId: 1,
1132
+ fallbackTransport: mockFallback,
1133
+ });
1134
+ // Test multiple different fallback methods
1135
+ const blockResult = await providerWithMockFallback.request({
1136
+ method: 'eth_blockNumber',
1137
+ params: [],
1138
+ });
1139
+ const txResult = await providerWithMockFallback.request({
1140
+ method: 'eth_getTransactionByHash',
1141
+ params: ['0x123'],
1142
+ });
1143
+ const receiptResult = await providerWithMockFallback.request({
1144
+ method: 'eth_getTransactionReceipt',
1145
+ params: ['0x456'],
1146
+ });
1147
+ expect(blockResult).toBe('0xblock123');
1148
+ expect(txResult).toBe('0xtx456');
1149
+ expect(receiptResult).toBe('0xreceipt789');
1150
+ expect(mockFallback).toHaveBeenCalledTimes(1);
1151
+ expect(mockRequest).toHaveBeenCalledTimes(3);
1152
+ });
1153
+ it('should not fallback when fallback is null', async () => {
1154
+ const providerWithNullFallback = new Provider({
1155
+ apiKey: 'test-api-key',
1156
+ entitySecret: 'test-entity-secret',
1157
+ chainId: 1,
1158
+ fallbackTransport: null,
1159
+ });
1160
+ await expect(providerWithNullFallback.request({
1161
+ method: 'eth_blockNumber',
1162
+ params: [],
1163
+ })).rejects.toThrow('The method "eth_blockNumber" does not exist / is not available');
1164
+ });
1165
+ it('should fallback to fallback provider for eth_call with UnsupportedChainError', async () => {
1166
+ const mockFallback = vi.fn().mockReturnValue({
1167
+ request: vi.fn().mockResolvedValue('0x1'),
1168
+ });
1169
+ const providerWithFallback = new Provider({
1170
+ apiKey: 'api-key',
1171
+ entitySecret: 'entity-secret',
1172
+ chainId: AVAX.id, // AVAX is supported in devC, but not supported in SCP query contract API.
1173
+ fallbackTransport: mockFallback,
1174
+ });
1175
+ const params = { to: '0x742d35cc6634C0532925a3b8D0c8c0C8D8d8d8d8' };
1176
+ const result = await providerWithFallback.request({
1177
+ method: 'eth_call',
1178
+ params: [params],
1179
+ });
1180
+ expect(result).toBe('0x1');
1181
+ const mockProvider = mockFallback();
1182
+ expect(mockProvider.request).toHaveBeenCalledWith({
1183
+ method: 'eth_call',
1184
+ params: [params],
1185
+ });
1186
+ });
1187
+ it('should not fallback for eth_call with non-UnsupportedChainError', async () => {
1188
+ const mockFallback = vi.fn().mockReturnValue({
1189
+ request: vi.fn().mockResolvedValue('should-not-be-called'),
1190
+ });
1191
+ mockScp.queryContract = vi.fn();
1192
+ initiateSmartContractPlatformClient.mockReturnValue(mockScp);
1193
+ mockScp.queryContract.mockRejectedValue(new Error('Network timeout'));
1194
+ const provider = new Provider({
1195
+ apiKey: 'api-key',
1196
+ entitySecret: 'entity-secret',
1197
+ chainId: 1, // Supported chain
1198
+ fallbackTransport: mockFallback,
1199
+ });
1200
+ const params = {
1201
+ to: '0x742d35cc6634C0532925a3b8D0c8c0C8D8d8d8d8',
1202
+ data: '0x70a08231',
1203
+ };
1204
+ await expect(provider.request({
1205
+ method: 'eth_call',
1206
+ params: [params],
1207
+ })).rejects.toThrow('Network timeout');
1208
+ // Verify that fallback was not called.
1209
+ const mockProvider = mockFallback();
1210
+ expect(mockProvider.request).not.toHaveBeenCalled();
1211
+ });
1212
+ it('should not fallback for UnsupportedChainError with non-eth_call methods', async () => {
1213
+ const mockFallback = vi.fn().mockReturnValue({
1214
+ request: vi.fn().mockResolvedValue('should-not-be-called'),
1215
+ });
1216
+ const provider = new Provider({
1217
+ apiKey: 'api-key',
1218
+ entitySecret: 'entity-secret',
1219
+ chainId: 1,
1220
+ fallbackTransport: mockFallback,
1221
+ });
1222
+ // Simulate the throw of UnsupportedChainError.
1223
+ const extractChainSpy = vi.spyOn(circleWalletsIndex, 'extractChain');
1224
+ extractChainSpy.mockImplementation(() => {
1225
+ throw new UnsupportedChainError();
1226
+ });
1227
+ await expect(provider.request({
1228
+ method: 'eth_sendTransaction',
1229
+ params: [{ from: '0x123', to: '0x456', value: '0x0' }],
1230
+ })).rejects.toThrow(UnsupportedChainError);
1231
+ expect(extractChainSpy).toHaveBeenCalled();
1232
+ // Verify that fallback was not called.
1233
+ const mockProvider = mockFallback();
1234
+ expect(mockProvider.request).not.toHaveBeenCalled();
1235
+ extractChainSpy.mockRestore();
1236
+ });
1237
+ it('should not fallback for eth_call with UnsupportedChainError when fallback is null', async () => {
1238
+ const provider = new Provider({
1239
+ apiKey: 'api-key',
1240
+ entitySecret: 'entity-secret',
1241
+ chainId: AVAX.id,
1242
+ fallbackTransport: null,
1243
+ });
1244
+ const params = { to: '0x742d35cc6634C0532925a3b8D0c8c0C8D8d8d8d8' };
1245
+ await expect(provider.request({
1246
+ method: 'eth_call',
1247
+ params: [params],
1248
+ })).rejects.toThrow(MethodNotFoundRpcError);
1249
+ });
1250
+ });
1251
+ describe('eth_sendTransaction', () => {
1252
+ it('should create transaction and return hash', async () => {
1253
+ const params = {
1254
+ from: '0x123',
1255
+ to: '0x456',
1256
+ value: numberToHex(parseEther('0.01')),
1257
+ };
1258
+ mockClient.listWallets.mockResolvedValue({
1259
+ data: { wallets: [{ id: 'wallet-1' }] },
1260
+ });
1261
+ mockClient.createTransaction.mockResolvedValue({
1262
+ data: { id: 'tx-1' },
1263
+ });
1264
+ mockClient.getTransaction
1265
+ .mockResolvedValueOnce({
1266
+ data: {
1267
+ transaction: { id: 'tx-1', state: 'PENDING' },
1268
+ },
1269
+ })
1270
+ .mockResolvedValueOnce({
1271
+ data: {
1272
+ transaction: {
1273
+ id: 'tx-1',
1274
+ state: 'COMPLETE',
1275
+ txHash: '0xabc123',
1276
+ },
1277
+ },
1278
+ });
1279
+ const result = await provider.request({
1280
+ method: 'eth_sendTransaction',
1281
+ params: [params],
1282
+ });
1283
+ expect(result).toBe('0xabc123');
1284
+ expect(mockClient.createTransaction).toHaveBeenCalledWith({
1285
+ walletId: 'wallet-1',
1286
+ blockchain: 'ETH',
1287
+ amount: ['0.01'],
1288
+ destinationAddress: '0x456',
1289
+ fee: {
1290
+ type: 'level',
1291
+ config: {
1292
+ feeLevel: 'HIGH',
1293
+ },
1294
+ },
1295
+ });
1296
+ });
1297
+ it('should throw error for unsupported chain', async () => {
1298
+ const params = {
1299
+ from: '0x123',
1300
+ to: '0x456',
1301
+ value: '0x2386f26fc10000',
1302
+ };
1303
+ await expect(provider.request({
1304
+ method: 'eth_sendTransaction',
1305
+ params: [params],
1306
+ })).rejects.toThrow();
1307
+ });
1308
+ it('should handle transaction failure states', async () => {
1309
+ const params = {
1310
+ from: '0x123',
1311
+ to: '0x456',
1312
+ value: '0x2386f26fc10000',
1313
+ };
1314
+ mockClient.listWallets.mockResolvedValue({
1315
+ data: { wallets: [{ id: 'wallet-1' }] },
1316
+ });
1317
+ mockClient.createTransaction.mockResolvedValue({
1318
+ data: { id: 'tx-1' },
1319
+ });
1320
+ mockClient.getTransaction.mockResolvedValue({
1321
+ data: {
1322
+ transaction: {
1323
+ id: 'tx-1',
1324
+ state: 'FAILED',
1325
+ errorReason: '123',
1326
+ errorDetails: 'Transaction failed',
1327
+ },
1328
+ },
1329
+ });
1330
+ await expect(provider.request({
1331
+ method: 'eth_sendTransaction',
1332
+ params: [params],
1333
+ })).rejects.toThrow();
1334
+ });
1335
+ it('should handle contract execution', async () => {
1336
+ const params = {
1337
+ from: '0x123',
1338
+ to: '0x456',
1339
+ value: numberToHex(parseEther('0.01')),
1340
+ data: '0x1234567890abcdef', // Contract call data
1341
+ };
1342
+ // Mock contract execution transaction flow
1343
+ mockClient.listWallets.mockResolvedValue({
1344
+ data: { wallets: [{ id: 'wallet-1' }] },
1345
+ });
1346
+ mockClient.createContractExecutionTransaction.mockResolvedValue({
1347
+ data: { id: 'contract-tx-1' },
1348
+ });
1349
+ mockClient.getTransaction
1350
+ .mockResolvedValueOnce({
1351
+ data: {
1352
+ transaction: { id: 'contract-tx-1', state: 'PENDING' },
1353
+ },
1354
+ })
1355
+ .mockResolvedValueOnce({
1356
+ data: {
1357
+ transaction: {
1358
+ id: 'contract-tx-1',
1359
+ state: 'COMPLETE',
1360
+ txHash: '0xcontract123',
1361
+ },
1362
+ },
1363
+ });
1364
+ const result = await provider.request({
1365
+ method: 'eth_sendTransaction',
1366
+ params: [params],
1367
+ });
1368
+ expect(result).toBe('0xcontract123');
1369
+ expect(mockClient.createContractExecutionTransaction).toHaveBeenCalledWith({
1370
+ sourceAddress: '0x123',
1371
+ blockchain: 'ETH',
1372
+ contractAddress: '0x456',
1373
+ callData: '0x1234567890abcdef',
1374
+ amount: '0.01',
1375
+ fee: {
1376
+ type: 'level',
1377
+ config: {
1378
+ feeLevel: 'HIGH',
1379
+ },
1380
+ },
1381
+ walletId: 'wallet-1',
1382
+ });
1383
+ });
1384
+ it('should support legacy transaction with gas and gasPrice', async () => {
1385
+ const params = {
1386
+ from: '0x123',
1387
+ to: '0x456',
1388
+ value: numberToHex(parseEther('0.01')),
1389
+ gas: '0x5208', // 21000
1390
+ gasPrice: '0x4a817c800', // 20 gwei
1391
+ };
1392
+ mockClient.listWallets.mockResolvedValue({
1393
+ data: { wallets: [{ id: 'wallet-1' }] },
1394
+ });
1395
+ mockClient.createTransaction.mockResolvedValue({
1396
+ data: { id: 'tx-1' },
1397
+ });
1398
+ mockClient.getTransaction
1399
+ .mockResolvedValueOnce({
1400
+ data: {
1401
+ transaction: { id: 'tx-1', state: 'PENDING' },
1402
+ },
1403
+ })
1404
+ .mockResolvedValueOnce({
1405
+ data: {
1406
+ transaction: {
1407
+ id: 'tx-1',
1408
+ state: 'COMPLETE',
1409
+ txHash: '0xabc123',
1410
+ },
1411
+ },
1412
+ });
1413
+ const result = await provider.request({
1414
+ method: 'eth_sendTransaction',
1415
+ params: [params],
1416
+ });
1417
+ expect(result).toBe('0xabc123');
1418
+ expect(mockClient.createTransaction).toHaveBeenCalledWith({
1419
+ walletId: 'wallet-1',
1420
+ blockchain: 'ETH',
1421
+ amount: ['0.01'],
1422
+ destinationAddress: '0x456',
1423
+ fee: {
1424
+ type: 'gas',
1425
+ config: {
1426
+ gasLimit: '21000',
1427
+ gasPrice: '20', // 20 gwei
1428
+ },
1429
+ },
1430
+ });
1431
+ });
1432
+ it('should support EIP-1559 transaction with gas, maxFeePerGas, and maxPriorityFeePerGas', async () => {
1433
+ const params = {
1434
+ from: '0x123',
1435
+ to: '0x456',
1436
+ value: numberToHex(parseEther('0.01')),
1437
+ gas: '0x5208', // 21000
1438
+ maxFeePerGas: '0x9502f9000', // 40 gwei
1439
+ maxPriorityFeePerGas: '0x4a817c800', // 20 gwei
1440
+ };
1441
+ mockClient.listWallets.mockResolvedValue({
1442
+ data: { wallets: [{ id: 'wallet-1' }] },
1443
+ });
1444
+ mockClient.createTransaction.mockResolvedValue({
1445
+ data: { id: 'tx-1' },
1446
+ });
1447
+ mockClient.getTransaction
1448
+ .mockResolvedValueOnce({
1449
+ data: {
1450
+ transaction: { id: 'tx-1', state: 'PENDING' },
1451
+ },
1452
+ })
1453
+ .mockResolvedValueOnce({
1454
+ data: {
1455
+ transaction: {
1456
+ id: 'tx-1',
1457
+ state: 'COMPLETE',
1458
+ txHash: '0xabc123',
1459
+ },
1460
+ },
1461
+ });
1462
+ const result = await provider.request({
1463
+ method: 'eth_sendTransaction',
1464
+ params: [params],
1465
+ });
1466
+ expect(result).toBe('0xabc123');
1467
+ expect(mockClient.createTransaction).toHaveBeenCalledWith({
1468
+ walletId: 'wallet-1',
1469
+ blockchain: 'ETH',
1470
+ amount: ['0.01'],
1471
+ destinationAddress: '0x456',
1472
+ fee: {
1473
+ type: 'absolute',
1474
+ config: {
1475
+ gasLimit: '21000',
1476
+ maxFee: '40', // 40 gwei
1477
+ priorityFee: '20', // 20 gwei
1478
+ },
1479
+ },
1480
+ });
1481
+ });
1482
+ it('should estimate gas when not provided in legacy transaction', async () => {
1483
+ const params = {
1484
+ from: '0x123',
1485
+ to: '0x456',
1486
+ value: numberToHex(parseEther('0.01')),
1487
+ gasPrice: '0x4a817c800', // 20 gwei
1488
+ // gas not provided - should be estimated
1489
+ };
1490
+ mockClient.listWallets.mockResolvedValue({
1491
+ data: { wallets: [{ id: 'wallet-1' }] },
1492
+ });
1493
+ mockClient.estimateTransferFee.mockResolvedValue({
1494
+ data: {
1495
+ high: { gasLimit: '25000', maxFee: '20000000000', priorityFee: '1000000000' },
1496
+ },
1497
+ });
1498
+ mockClient.createTransaction.mockResolvedValue({
1499
+ data: { id: 'tx-1' },
1500
+ });
1501
+ mockClient.getTransaction
1502
+ .mockResolvedValueOnce({
1503
+ data: {
1504
+ transaction: { id: 'tx-1', state: 'PENDING' },
1505
+ },
1506
+ })
1507
+ .mockResolvedValueOnce({
1508
+ data: {
1509
+ transaction: {
1510
+ id: 'tx-1',
1511
+ state: 'COMPLETE',
1512
+ txHash: '0xabc123',
1513
+ },
1514
+ },
1515
+ });
1516
+ const result = await provider.request({
1517
+ method: 'eth_sendTransaction',
1518
+ params: [params],
1519
+ });
1520
+ expect(result).toBe('0xabc123');
1521
+ expect(mockClient.createTransaction).toHaveBeenCalledWith({
1522
+ walletId: 'wallet-1',
1523
+ blockchain: 'ETH',
1524
+ amount: ['0.01'],
1525
+ destinationAddress: '0x456',
1526
+ fee: {
1527
+ type: 'gas',
1528
+ config: {
1529
+ gasLimit: '26250', // 25000 * 1.05 buffer from estimate
1530
+ gasPrice: '20', // 20 gwei
1531
+ },
1532
+ },
1533
+ });
1534
+ });
1535
+ it('should estimate gas when not provided in EIP-1559 transaction', async () => {
1536
+ const params = {
1537
+ from: '0x123',
1538
+ to: '0x456',
1539
+ value: numberToHex(parseEther('0.01')),
1540
+ maxFeePerGas: '0x9502f9000', // 40 gwei
1541
+ maxPriorityFeePerGas: '0x4a817c800', // 20 gwei
1542
+ // gas not provided - should be estimated
1543
+ };
1544
+ mockClient.listWallets.mockResolvedValue({
1545
+ data: { wallets: [{ id: 'wallet-1' }] },
1546
+ });
1547
+ mockClient.estimateTransferFee.mockResolvedValue({
1548
+ data: {
1549
+ high: { gasLimit: '25000', maxFee: '20000000000', priorityFee: '1000000000' },
1550
+ },
1551
+ });
1552
+ mockClient.createTransaction.mockResolvedValue({
1553
+ data: { id: 'tx-1' },
1554
+ });
1555
+ mockClient.getTransaction
1556
+ .mockResolvedValueOnce({
1557
+ data: {
1558
+ transaction: { id: 'tx-1', state: 'PENDING' },
1559
+ },
1560
+ })
1561
+ .mockResolvedValueOnce({
1562
+ data: {
1563
+ transaction: {
1564
+ id: 'tx-1',
1565
+ state: 'COMPLETE',
1566
+ txHash: '0xabc123',
1567
+ },
1568
+ },
1569
+ });
1570
+ const result = await provider.request({
1571
+ method: 'eth_sendTransaction',
1572
+ params: [params],
1573
+ });
1574
+ expect(result).toBe('0xabc123');
1575
+ expect(mockClient.createTransaction).toHaveBeenCalledWith({
1576
+ walletId: 'wallet-1',
1577
+ blockchain: 'ETH',
1578
+ amount: ['0.01'],
1579
+ destinationAddress: '0x456',
1580
+ fee: {
1581
+ type: 'absolute',
1582
+ config: {
1583
+ gasLimit: '26250', // 25000 * 1.05 buffer from estimate
1584
+ maxFee: '40', // 40 gwei
1585
+ priorityFee: '20', // 20 gwei
1586
+ },
1587
+ },
1588
+ });
1589
+ });
1590
+ });
1591
+ describe('eth_signTransaction', () => {
1592
+ it('should sign successfully on mainnet (EVM)', async () => {
1593
+ const txParams = { from: '0x00000000000000000000000000000000000000Aa' };
1594
+ mockClient.listWallets.mockResolvedValue({
1595
+ data: { wallets: [{ id: 'wallet-1', address: '0x00000000000000000000000000000000000000aa' }] },
1596
+ });
1597
+ mockClient.signTransaction.mockResolvedValue({
1598
+ data: { signedTransaction: '0xdeadbeef', signature: '0xsig', txHash: '0xhash' },
1599
+ });
1600
+ const result = await provider.request({ method: 'eth_signTransaction', params: [txParams] });
1601
+ expect(result).toBe('0xdeadbeef');
1602
+ expect(mockClient.listWallets).toHaveBeenCalledWith({
1603
+ address: txParams.from,
1604
+ blockchain: 'EVM',
1605
+ });
1606
+ const callArg = mockClient.signTransaction.mock.calls[0][0];
1607
+ expect(callArg.walletId).toBe('wallet-1');
1608
+ const signedPayload = JSON.parse(callArg.transaction);
1609
+ expect(signedPayload.from).toBe(txParams.from);
1610
+ expect(signedPayload.chainId).toBe(numberToHex(1));
1611
+ });
1612
+ it('should use EVM-TESTNET for testnet chains', async () => {
1613
+ // Create new mock for this specific test instance
1614
+ const testnetMockClient = {
1615
+ listWallets: vi.fn(),
1616
+ signTransaction: vi.fn(),
1617
+ };
1618
+ initiateDeveloperControlledWalletsClient.mockReturnValueOnce(testnetMockClient);
1619
+ const testnetProvider = new Provider({
1620
+ apiKey: 'test-api-key',
1621
+ entitySecret: 'test-entity-secret',
1622
+ baseUrl: 'base-url',
1623
+ chainId: 11155111, // This test requires a testnet chainId
1624
+ });
1625
+ const txParams = { from: '0x00000000000000000000000000000000000000bb' };
1626
+ testnetMockClient.listWallets.mockResolvedValue({
1627
+ data: { wallets: [{ id: 'wallet-sep', address: txParams.from }] },
1628
+ });
1629
+ testnetMockClient.signTransaction.mockResolvedValue({
1630
+ data: { signedTransaction: '0xfeedface' },
1631
+ });
1632
+ const result = await testnetProvider.request({ method: 'eth_signTransaction', params: [txParams] });
1633
+ expect(result).toBe('0xfeedface');
1634
+ expect(testnetMockClient.listWallets).toHaveBeenCalledWith({
1635
+ address: txParams.from,
1636
+ blockchain: 'EVM-TESTNET',
1637
+ });
1638
+ const callArg = testnetMockClient.signTransaction.mock.calls[0][0];
1639
+ expect(callArg.walletId).toBe('wallet-sep');
1640
+ const signedPayload = JSON.parse(callArg.transaction);
1641
+ expect(signedPayload.from).toBe(txParams.from);
1642
+ expect(signedPayload.chainId).toBe(numberToHex(11155111));
1643
+ });
1644
+ it('uses provided chainId in transaction payload', async () => {
1645
+ const txParams = {
1646
+ from: '0x00000000000000000000000000000000000000CC',
1647
+ chainId: numberToHex(137),
1648
+ };
1649
+ mockClient.listWallets.mockResolvedValue({
1650
+ data: { wallets: [{ id: 'wallet-1', address: '0x00000000000000000000000000000000000000cc' }] },
1651
+ });
1652
+ mockClient.signTransaction.mockResolvedValue({
1653
+ data: { signedTransaction: '0xbead', signature: '0xsig2', txHash: '0xhash2' },
1654
+ });
1655
+ const result = await provider.request({ method: 'eth_signTransaction', params: [txParams] });
1656
+ expect(result).toBe('0xbead');
1657
+ const callArg = mockClient.signTransaction.mock.calls[0][0];
1658
+ const signedPayload = JSON.parse(callArg.transaction);
1659
+ expect(signedPayload.chainId).toBe(numberToHex(137));
1660
+ });
1661
+ it('should throw when `from` is missing', async () => {
1662
+ await expect(provider.request({ method: 'eth_signTransaction', params: [{}] })).rejects.toThrow();
1663
+ });
1664
+ it('should throw when wallet not found', async () => {
1665
+ const txParams = { from: '0x000000000000000000000000000000000000000c' };
1666
+ mockClient.listWallets.mockResolvedValue({ data: { wallets: [] } });
1667
+ await expect(provider.request({ method: 'eth_signTransaction', params: [txParams] })).rejects.toThrow();
1668
+ });
1669
+ it('throws when zero wallets found', async () => {
1670
+ const txParams = { from: '0x0000000000000000000000000000000000000d00' };
1671
+ mockClient.listWallets.mockResolvedValue({ data: { wallets: [] } });
1672
+ await expect(provider.request({ method: 'eth_signTransaction', params: [txParams] })).rejects.toThrow();
1673
+ });
1674
+ it('throws when multiple wallets found', async () => {
1675
+ const txParams = { from: '0x0000000000000000000000000000000000000d01' };
1676
+ mockClient.listWallets.mockResolvedValue({
1677
+ data: {
1678
+ wallets: [
1679
+ { id: 'w1', address: txParams.from },
1680
+ { id: 'w2', address: txParams.from },
1681
+ ],
1682
+ },
1683
+ });
1684
+ await expect(provider.request({ method: 'eth_signTransaction', params: [txParams] })).rejects.toThrow();
1685
+ });
1686
+ });
1687
+ describe('eth_chainId', () => {
1688
+ it('should throw error when chainId is not set', async () => {
1689
+ // @ts-expect-error - Testing behavior without chainId
1690
+ const provider = new Provider({
1691
+ apiKey: 'test-api-key',
1692
+ entitySecret: 'test-entity-secret',
1693
+ baseUrl: 'base-url',
1694
+ // chainId is undefined
1695
+ });
1696
+ await expect(provider.request({ method: 'eth_chainId', params: [] })).rejects.toThrowError();
1697
+ });
1698
+ it('should work with EIP-1193 interface', async () => {
1699
+ const provider = new Provider({
1700
+ apiKey: 'test-api-key',
1701
+ entitySecret: 'test-entity-secret',
1702
+ baseUrl: 'base-url',
1703
+ chainId: 1337,
1704
+ });
1705
+ const result = (await provider.request({ method: 'eth_chainId' }));
1706
+ expect(result).toBe(numberToHex(1337));
1707
+ });
1708
+ });
1709
+ describe('eth_getBalance', () => {
1710
+ it('should return native token balance for valid address', async () => {
1711
+ const address = '0x123456789abcdef123456789abcdef123456789a';
1712
+ const nativeTokenBalance = {
1713
+ token: {
1714
+ id: '979869da-9115-5f7d-917d-12d434e56ae7',
1715
+ blockchain: 'ETH',
1716
+ name: 'Ethereum',
1717
+ symbol: 'ETH',
1718
+ decimals: 18,
1719
+ isNative: true,
1720
+ updateDate: '2025-01-01T00:00:00.000Z',
1721
+ createDate: '2025-01-01T00:00:00.000Z',
1722
+ },
1723
+ amount: '1.5',
1724
+ updateDate: '2025-02-19T03:17:30Z',
1725
+ };
1726
+ mockClient.listWallets.mockResolvedValue({
1727
+ data: { wallets: [{ id: 'wallet-id', address, blockchain: 'ETH' }] },
1728
+ });
1729
+ mockClient.getWalletTokenBalance.mockResolvedValue({
1730
+ data: { tokenBalances: [nativeTokenBalance] },
1731
+ });
1732
+ const result = await provider.request({
1733
+ method: 'eth_getBalance',
1734
+ params: [address, 'latest'],
1735
+ });
1736
+ // 1.5 ETH = 1.5 * 10^18 wei = 1500000000000000000 wei = 0x14d1120d7b160000
1737
+ expect(result).toBe('0x14d1120d7b160000');
1738
+ expect(mockClient.getWalletTokenBalance).toHaveBeenCalledWith({
1739
+ id: 'wallet-id',
1740
+ tokenAddresses: ['', ''],
1741
+ });
1742
+ });
1743
+ it('should work with default block tag (latest)', async () => {
1744
+ const address = '0x123456789abcdef123456789abcdef123456789a';
1745
+ const nativeTokenBalance = {
1746
+ token: {
1747
+ id: '979869da-9115-5f7d-917d-12d434e56ae7',
1748
+ blockchain: 'ETH',
1749
+ name: 'Ethereum',
1750
+ symbol: 'ETH',
1751
+ decimals: 18,
1752
+ isNative: true,
1753
+ updateDate: '2025-01-01T00:00:00.000Z',
1754
+ createDate: '2025-01-01T00:00:00.000Z',
1755
+ },
1756
+ amount: '2.0',
1757
+ updateDate: '2025-02-19T03:17:30Z',
1758
+ };
1759
+ mockClient.listWallets.mockResolvedValue({
1760
+ data: { wallets: [{ id: 'wallet-id', address, blockchain: 'ETH' }] },
1761
+ });
1762
+ mockClient.getWalletTokenBalance.mockResolvedValue({
1763
+ data: { tokenBalances: [nativeTokenBalance] },
1764
+ });
1765
+ const result = await provider.request({
1766
+ method: 'eth_getBalance',
1767
+ params: [address], // No block tag provided
1768
+ });
1769
+ // 2.0 ETH = 2 * 10^18 wei = 2000000000000000000 wei = 0x1bc16d674ec80000
1770
+ expect(result).toBe('0x1bc16d674ec80000');
1771
+ });
1772
+ it('should throw error for unsupported block tags', async () => {
1773
+ const address = '0x123456789abcdef123456789abcdef123456789a';
1774
+ await expect(provider.request({
1775
+ method: 'eth_getBalance',
1776
+ params: [address, 'earliest'],
1777
+ })).rejects.toThrow('Only "latest" block tag is supported');
1778
+ await expect(provider.request({
1779
+ method: 'eth_getBalance',
1780
+ params: [address, '0x1'],
1781
+ })).rejects.toThrow('Only "latest" block tag is supported');
1782
+ });
1783
+ it('should throw error when chainId is not set', async () => {
1784
+ // @ts-expect-error - Testing behavior without chainId
1785
+ const provider = new Provider({
1786
+ apiKey: 'test-api-key',
1787
+ entitySecret: 'test-entity-secret',
1788
+ baseUrl: 'base-url',
1789
+ });
1790
+ const address = '0x123456789abcdef123456789abcdef123456789a';
1791
+ await expect(provider.request({
1792
+ method: 'eth_getBalance',
1793
+ params: [address, 'latest'],
1794
+ })).rejects.toThrow();
1795
+ });
1796
+ it('should throw error for unsupported chainId', async () => {
1797
+ const provider = new Provider({
1798
+ apiKey: 'test-api-key',
1799
+ entitySecret: 'test-entity-secret',
1800
+ baseUrl: 'base-url',
1801
+ chainId: 999999, // Unsupported chain
1802
+ });
1803
+ const address = '0x123456789abcdef123456789abcdef123456789a';
1804
+ await expect(provider.request({
1805
+ method: 'eth_getBalance',
1806
+ params: [address, 'latest'],
1807
+ })).rejects.toThrow();
1808
+ });
1809
+ it('should return 0 when no native token balance found', async () => {
1810
+ const address = '0x123456789abcdef123456789abcdef123456789a';
1811
+ mockClient.listWallets.mockResolvedValue({
1812
+ data: { wallets: [{ id: 'wallet-id', address, blockchain: 'ETH' }] },
1813
+ });
1814
+ // Mock getWalletTokenBalance to return empty balances
1815
+ mockClient.getWalletTokenBalance.mockResolvedValue({
1816
+ data: { tokenBalances: [] },
1817
+ });
1818
+ const result = await provider.request({
1819
+ method: 'eth_getBalance',
1820
+ params: [address, 'latest'],
1821
+ });
1822
+ expect(result).toBe(numberToHex(0));
1823
+ });
1824
+ it('should handle zero balance correctly', async () => {
1825
+ const address = '0x123456789abcdef123456789abcdef123456789a';
1826
+ const nativeTokenBalance = {
1827
+ token: {
1828
+ id: '979869da-9115-5f7d-917d-12d434e56ae7',
1829
+ blockchain: 'ETH',
1830
+ name: 'Ethereum',
1831
+ symbol: 'ETH',
1832
+ decimals: 18,
1833
+ isNative: true,
1834
+ updateDate: '2025-01-01T00:00:00.000Z',
1835
+ createDate: '2025-01-01T00:00:00.000Z',
1836
+ },
1837
+ amount: '0',
1838
+ updateDate: '2025-02-19T03:17:30Z',
1839
+ };
1840
+ mockClient.listWallets.mockResolvedValue({
1841
+ data: { wallets: [{ id: 'wallet-id', address, blockchain: 'ETH' }] },
1842
+ });
1843
+ mockClient.getWalletTokenBalance.mockResolvedValue({
1844
+ data: { tokenBalances: [nativeTokenBalance] },
1845
+ });
1846
+ const result = await provider.request({
1847
+ method: 'eth_getBalance',
1848
+ params: [address, 'latest'],
1849
+ });
1850
+ expect(result).toBe('0x0');
1851
+ });
1852
+ });
1853
+ describe('eth_call', () => {
1854
+ it('should perform contract query successfully', async () => {
1855
+ const params = {
1856
+ to: '0x742d35cc6634C0532925a3b8D0c8c0C8D8d8d8d8',
1857
+ data: '0x70a08231000000000000000000000000742d35cc6634c0532925a3b8d0c8c0c8d8d8d8d8',
1858
+ from: '0x123456789abcdef123456789abcdef123456789a',
1859
+ };
1860
+ mockScp.queryContract.mockResolvedValue({
1861
+ data: {
1862
+ outputData: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',
1863
+ },
1864
+ });
1865
+ const result = await provider.request({
1866
+ method: 'eth_call',
1867
+ params: [params],
1868
+ });
1869
+ expect(result).toBe('0x0000000000000000000000000000000000000000000000000de0b6b3a7640000');
1870
+ expect(mockScp.queryContract).toHaveBeenCalledWith({
1871
+ blockchain: 'ETH',
1872
+ address: params.to,
1873
+ callData: params.data,
1874
+ fromAddress: params.from,
1875
+ });
1876
+ });
1877
+ it('should throw UnsupportedChainError when chainId is not supported for contract queries', async () => {
1878
+ const provider = new Provider({
1879
+ apiKey: 'test-api-key',
1880
+ entitySecret: 'test-entity-secret',
1881
+ chainId: 999999, // Unsupported chain
1882
+ });
1883
+ const params = {
1884
+ to: '0x742d35cc6634C0532925a3b8D0c8c0C8D8d8d8d8',
1885
+ data: '0x70a08231',
1886
+ };
1887
+ await expect(provider.request({
1888
+ method: 'eth_call',
1889
+ params: [params],
1890
+ })).rejects.toThrow();
1891
+ });
1892
+ it('should work without from parameter', async () => {
1893
+ const params = {
1894
+ to: '0x742d35cc6634C0532925a3b8D0c8c0C8D8d8d8d8',
1895
+ data: '0x70a08231000000000000000000000000742d35cc6634c0532925a3b8d0c8c0c8d8d8d8d8',
1896
+ };
1897
+ mockScp.queryContract.mockResolvedValue({
1898
+ data: {
1899
+ outputData: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',
1900
+ },
1901
+ });
1902
+ const result = await provider.request({
1903
+ method: 'eth_call',
1904
+ params: [params],
1905
+ });
1906
+ expect(result).toBe('0x0000000000000000000000000000000000000000000000000de0b6b3a7640000');
1907
+ expect(mockScp.queryContract).toHaveBeenCalledWith({
1908
+ blockchain: 'ETH',
1909
+ address: params.to,
1910
+ callData: params.data,
1911
+ fromAddress: undefined,
1912
+ });
1913
+ });
1914
+ it('should throw error when blockIdentifier is not "latest"', async () => {
1915
+ const params = {
1916
+ to: '0x742d35cc6634C0532925a3b8D0c8c0C8D8d8d8d8',
1917
+ data: '0x70a08231',
1918
+ };
1919
+ await expect(provider.request({
1920
+ method: 'eth_call',
1921
+ params: [params, 'earliest'],
1922
+ })).rejects.toThrow('Only `latest` block identifier is supported');
1923
+ await expect(provider.request({
1924
+ method: 'eth_call',
1925
+ params: [params, '0x1234'],
1926
+ })).rejects.toThrow('Only `latest` block identifier is supported');
1927
+ });
1928
+ it('should throw error when unsupported transaction params are provided', async () => {
1929
+ const baseParams = {
1930
+ to: '0x742d35cc6634C0532925a3b8D0c8c0C8D8d8d8d8',
1931
+ data: '0x70a08231',
1932
+ };
1933
+ // Test each unsupported parameter individually
1934
+ const unsupportedParams = [
1935
+ { gas: '0x186A0' },
1936
+ { gasPrice: '0x3B9ACA00' },
1937
+ { maxFeePerGas: '0x3B9ACA00' },
1938
+ { maxPriorityFeePerGas: '0x3B9ACA00' },
1939
+ { nonce: '0x1' },
1940
+ { value: '0x0' },
1941
+ ];
1942
+ for (const param of unsupportedParams) {
1943
+ const testParams = { ...baseParams, ...param };
1944
+ await expect(provider.request({
1945
+ method: 'eth_call',
1946
+ params: [testParams],
1947
+ })).rejects.toThrow();
1948
+ }
1949
+ // Test multiple unsupported params together
1950
+ const multipleUnsupportedParams = {
1951
+ ...baseParams,
1952
+ gas: '0x186A0',
1953
+ value: '0x0',
1954
+ nonce: '0x1',
1955
+ };
1956
+ await expect(provider.request({
1957
+ method: 'eth_call',
1958
+ params: [multipleUnsupportedParams],
1959
+ })).rejects.toThrow();
1960
+ });
1961
+ });
1962
+ describe('eth_estimateGas', () => {
1963
+ test('estimate gas for transfer transaction (no data field)', async () => {
1964
+ const params = {
1965
+ from: '0x123',
1966
+ to: '0x456',
1967
+ value: '0x16345785d8a0000',
1968
+ };
1969
+ mockClient.estimateTransferFee.mockResolvedValue({
1970
+ data: {
1971
+ high: { gasLimit: '21000', maxFee: '20000000000', priorityFee: '1000000000' },
1972
+ medium: { gasLimit: '21000', maxFee: '15000000000', priorityFee: '800000000' },
1973
+ low: { gasLimit: '21000', maxFee: '10000000000', priorityFee: '500000000' },
1974
+ },
1975
+ });
1976
+ const result = await provider.request({
1977
+ method: 'eth_estimateGas',
1978
+ params: [params],
1979
+ });
1980
+ expect(result).toBe('0x5622'); // 22050 in hex (21000 * 1.05 buffer)
1981
+ expect(mockClient.estimateTransferFee).toHaveBeenCalledWith({
1982
+ sourceAddress: '0x123',
1983
+ blockchain: 'ETH',
1984
+ amount: ['0.1'],
1985
+ destinationAddress: '0x456',
1986
+ });
1987
+ });
1988
+ test('estimate gas for contract execution transaction (with data field)', async () => {
1989
+ const params = {
1990
+ from: '0x123',
1991
+ to: '0x456',
1992
+ data: '0xa9059cbb',
1993
+ value: '0x0',
1994
+ };
1995
+ mockClient.estimateContractExecutionFee.mockResolvedValue({
1996
+ data: {
1997
+ high: { gasLimit: '50000', maxFee: '20000000000', priorityFee: '1000000000' },
1998
+ medium: { gasLimit: '50000', maxFee: '15000000000', priorityFee: '800000000' },
1999
+ low: { gasLimit: '50000', maxFee: '10000000000', priorityFee: '500000000' },
2000
+ },
2001
+ });
2002
+ const result = await provider.request({
2003
+ method: 'eth_estimateGas',
2004
+ params: [params],
2005
+ });
2006
+ expect(result).toBe('0xcd14'); // 52500 in hex (50000 * 1.05 buffer)
2007
+ expect(mockClient.estimateContractExecutionFee).toHaveBeenCalledWith({
2008
+ source: {
2009
+ sourceAddress: '0x123',
2010
+ blockchain: 'ETH',
2011
+ },
2012
+ amount: '0',
2013
+ contractAddress: '0x456',
2014
+ callData: '0xa9059cbb',
2015
+ });
2016
+ });
2017
+ test('estimate gas without value field', async () => {
2018
+ const params = {
2019
+ from: '0x123',
2020
+ to: '0x456',
2021
+ };
2022
+ mockClient.estimateTransferFee.mockResolvedValue({
2023
+ data: {
2024
+ high: { gasLimit: '21000', maxFee: '20000000000', priorityFee: '1000000000' },
2025
+ medium: { gasLimit: '21000', maxFee: '15000000000', priorityFee: '800000000' },
2026
+ low: { gasLimit: '21000', maxFee: '10000000000', priorityFee: '500000000' },
2027
+ },
2028
+ });
2029
+ const result = await provider.request({
2030
+ method: 'eth_estimateGas',
2031
+ params: [params],
2032
+ });
2033
+ expect(result).toBe('0x5622');
2034
+ expect(mockClient.estimateTransferFee).toHaveBeenCalledWith({
2035
+ sourceAddress: '0x123',
2036
+ blockchain: 'ETH',
2037
+ amount: [undefined],
2038
+ destinationAddress: '0x456',
2039
+ });
2040
+ });
2041
+ test('throws error when chainId is not set', async () => {
2042
+ // @ts-expect-error - Testing behavior without chainId
2043
+ const providerWithoutChainId = new Provider({ apiKey: 'apiKey', entitySecret: 'entitySecret' });
2044
+ const params = {
2045
+ from: '0x123',
2046
+ to: '0x456',
2047
+ value: '0x16345785d8a0000',
2048
+ };
2049
+ await expect(providerWithoutChainId.request({ method: 'eth_estimateGas', params: [params] })).rejects.toThrow();
2050
+ });
2051
+ test('throws error when blockIdentifier is not latest', async () => {
2052
+ const params = {
2053
+ from: '0x123',
2054
+ to: '0x456',
2055
+ value: '0x16345785d8a0000',
2056
+ };
2057
+ await expect(provider.request({
2058
+ method: 'eth_estimateGas',
2059
+ params: [params, '0x1000'], // specific block number
2060
+ })).rejects.toThrow('Only `latest` block identifier is supported');
2061
+ });
2062
+ test('accepts latest blockIdentifier', async () => {
2063
+ const params = {
2064
+ from: '0x123',
2065
+ to: '0x456',
2066
+ value: '0x16345785d8a0000',
2067
+ };
2068
+ mockClient.estimateTransferFee.mockResolvedValue({
2069
+ data: {
2070
+ high: { gasLimit: '21000', maxFee: '20000000000', priorityFee: '1000000000' },
2071
+ medium: { gasLimit: '21000', maxFee: '15000000000', priorityFee: '800000000' },
2072
+ low: { gasLimit: '21000', maxFee: '10000000000', priorityFee: '500000000' },
2073
+ },
2074
+ });
2075
+ const result = await provider.request({
2076
+ method: 'eth_estimateGas',
2077
+ params: [params, 'latest'],
2078
+ });
2079
+ expect(result).toBe('0x5622'); // Should work normally (uses HIGH fee level with 1.05 buffer)
2080
+ });
2081
+ });
2082
+ });
2083
+ describe('Provider 2', () => {
2084
+ let provider;
2085
+ const mockClient = {
2086
+ estimateContractExecutionFee: vi.fn(),
2087
+ estimateTransferFee: vi.fn(),
2088
+ createContractExecutionTransaction: vi.fn(),
2089
+ createTransaction: vi.fn(),
2090
+ getTransaction: vi.fn(),
2091
+ listWallets: vi.fn(),
2092
+ };
2093
+ const mockScp = {
2094
+ importContract: vi.fn(),
2095
+ };
2096
+ beforeEach(() => {
2097
+ ;
2098
+ initiateDeveloperControlledWalletsClient.mockReturnValue(mockClient);
2099
+ initiateSmartContractPlatformClient.mockReturnValue(mockScp);
2100
+ provider = new Provider({
2101
+ apiKey: 'test-api-key',
2102
+ entitySecret: 'test-entity-secret',
2103
+ baseUrl: 'base-url',
2104
+ chainId: 1,
2105
+ });
2106
+ });
2107
+ beforeEach(() => {
2108
+ vi.restoreAllMocks();
2109
+ });
2110
+ test('estimate contract execution fee', async () => {
2111
+ const params = {
2112
+ abiFunctionSignature: 'value',
2113
+ source: {
2114
+ sourceAddress: 'sourceAddress',
2115
+ blockchain: 'ETH-SEPOLIA',
2116
+ },
2117
+ contractAddress: 'contractAddress',
2118
+ abiParameters: [],
2119
+ };
2120
+ mockClient.estimateContractExecutionFee.mockResolvedValue({
2121
+ data: {
2122
+ high: { gasLimit: '3', maxFee: '6', priorityFee: '9', baseFee: '12', networkFee: '15' },
2123
+ medium: { gasLimit: '2', maxFee: '4', priorityFee: '6', baseFee: '8', networkFee: '10' },
2124
+ low: { gasLimit: '1', maxFee: '2', priorityFee: '3', baseFee: '4', networkFee: '5' },
2125
+ },
2126
+ });
2127
+ const result = await provider.request({ method: 'circle_estimateContractExecutionFee', params: [params] });
2128
+ expect(result).toMatchObject({
2129
+ high: {
2130
+ gasLimit: '4',
2131
+ maxFee: '6.300000000000001',
2132
+ priorityFee: '9.450000000000001',
2133
+ baseFee: '12',
2134
+ networkFee: '15',
2135
+ },
2136
+ medium: { gasLimit: '3', maxFee: '4.2', priorityFee: '6.300000000000001', baseFee: '8', networkFee: '10' },
2137
+ low: { gasLimit: '2', maxFee: '2.1', priorityFee: '3.1500000000000004', baseFee: '4', networkFee: '5' },
2138
+ });
2139
+ expect(mockClient.estimateContractExecutionFee).toHaveBeenCalledWith(params);
2140
+ });
2141
+ test('estimate contract execution fee for SCA', async () => {
2142
+ const params = {
2143
+ abiFunctionSignature: 'value',
2144
+ source: {
2145
+ sourceAddress: 'sourceAddress',
2146
+ blockchain: 'ETH-SEPOLIA',
2147
+ },
2148
+ contractAddress: 'contractAddress',
2149
+ abiParameters: [],
2150
+ };
2151
+ mockClient.estimateContractExecutionFee.mockResolvedValue({
2152
+ data: {
2153
+ high: { gasLimit: '3', maxFee: '6', priorityFee: '9', baseFee: '12', networkFee: '15' },
2154
+ medium: { gasLimit: '2', maxFee: '4', priorityFee: '6', baseFee: '8', networkFee: '10' },
2155
+ low: { gasLimit: '1', maxFee: '2', priorityFee: '3', baseFee: '4', networkFee: '5' },
2156
+ callGasLimit: '11111',
2157
+ verificationGasLimit: '22222',
2158
+ preVerificationGas: '33333',
2159
+ },
2160
+ });
2161
+ const result = await provider.request({ method: 'circle_estimateContractExecutionFee', params: [params] });
2162
+ expect(result).toMatchObject({
2163
+ high: {
2164
+ gasLimit: '4',
2165
+ maxFee: '6.300000000000001',
2166
+ priorityFee: '9.450000000000001',
2167
+ baseFee: '12',
2168
+ networkFee: '15',
2169
+ },
2170
+ medium: { gasLimit: '3', maxFee: '4.2', priorityFee: '6.300000000000001', baseFee: '8', networkFee: '10' },
2171
+ low: { gasLimit: '2', maxFee: '2.1', priorityFee: '3.1500000000000004', baseFee: '4', networkFee: '5' },
2172
+ callGasLimit: '11111',
2173
+ verificationGasLimit: '22222',
2174
+ preVerificationGas: '33333',
2175
+ });
2176
+ expect(mockClient.estimateContractExecutionFee).toHaveBeenCalledWith(params);
2177
+ });
2178
+ describe('create contract execution transaction', () => {
2179
+ test.each([
2180
+ {
2181
+ name: 'with wallet id',
2182
+ params: {
2183
+ walletId: 'test-wallet-id',
2184
+ contractAddress: '0xcontract-address',
2185
+ fee: {
2186
+ type: 'level',
2187
+ config: {
2188
+ feeLevel: 'LOW',
2189
+ },
2190
+ },
2191
+ },
2192
+ },
2193
+ {
2194
+ name: 'without wallet id',
2195
+ params: {
2196
+ contractAddress: '0xcontract-address',
2197
+ sourceAddress: '0xtest-address',
2198
+ blockchain: 'ETH-SEPOLIA',
2199
+ fee: {
2200
+ type: 'level',
856
2201
  config: {
857
2202
  feeLevel: 'LOW',
858
2203
  },
@@ -868,20 +2213,20 @@ describe('Provider 2', () => {
868
2213
  state: 'COMPLETE',
869
2214
  transactionType: 'OUTBOUND',
870
2215
  updateDate: '2024-01-01T00:00:00Z',
2216
+ txHash: '0xabc123',
871
2217
  };
872
2218
  mockClient.createContractExecutionTransaction.mockResolvedValue(mockResponse);
873
2219
  mockClient.listWallets.mockResolvedValue({
874
2220
  data: { wallets: [{ id: 'test-wallet-id' }] },
875
2221
  });
876
- vi.spyOn(provider, 'circle_getTransaction').mockResolvedValue(mockTransaction);
877
- const result = await provider.circle_createContractExecutionTransaction(params);
2222
+ mockClient.getTransaction.mockResolvedValue({ data: { transaction: mockTransaction } });
2223
+ const result = await provider.request({ method: 'circle_createContractExecutionTransaction', params: [params] });
878
2224
  expect(result).toEqual(mockTransaction);
879
2225
  expect(mockClient.createContractExecutionTransaction).toHaveBeenCalledWith({
880
2226
  ...params,
881
2227
  walletId: 'test-wallet-id',
882
2228
  });
883
- // eslint-disable-next-line @typescript-eslint/unbound-method
884
- expect(provider.circle_getTransaction).toHaveBeenCalledWith({
2229
+ expect(mockClient.getTransaction).toHaveBeenCalledWith({
885
2230
  id: 'transaction-id',
886
2231
  });
887
2232
  });
@@ -917,8 +2262,89 @@ describe('Provider 2', () => {
917
2262
  mockClient.listWallets.mockResolvedValue({
918
2263
  data: { wallets: [undefined] },
919
2264
  });
920
- vi.spyOn(provider, 'circle_getTransaction').mockResolvedValue(mockTransaction);
921
- await expect(provider.circle_createContractExecutionTransaction(params)).rejects.toThrowError('Wallet not found');
2265
+ mockClient.getTransaction.mockResolvedValue({ data: { transaction: mockTransaction } });
2266
+ await expect(provider.request({ method: 'circle_createContractExecutionTransaction', params: [params] })).rejects.toThrowError('Wallet not found');
2267
+ });
2268
+ it('should wait for transaction hash when waitForTransactionHash is true', async () => {
2269
+ const params = {
2270
+ walletId: 'test-wallet-id',
2271
+ contractAddress: '0xcontract-address',
2272
+ callData: '0x123',
2273
+ fee: {
2274
+ type: 'level',
2275
+ config: {
2276
+ feeLevel: 'LOW',
2277
+ },
2278
+ },
2279
+ waitForTransactionHash: true,
2280
+ };
2281
+ const createTransactionResult = { id: 'transaction-id', state: 'QUEUED' };
2282
+ const getTransactionResult = {
2283
+ id: 'transaction-id',
2284
+ state: 'COMPLETE',
2285
+ txHash: '0x123',
2286
+ blockchain: 'ETH-SEPOLIA',
2287
+ createDate: '2024-01-01T00:00:00Z',
2288
+ transactionType: 'OUTBOUND',
2289
+ updateDate: '2024-01-01T00:00:00Z',
2290
+ };
2291
+ mockClient.createContractExecutionTransaction.mockResolvedValue({ data: createTransactionResult });
2292
+ mockClient.listWallets.mockResolvedValue({
2293
+ data: { wallets: [{ id: 'test-wallet-id' }] },
2294
+ });
2295
+ mockClient.getTransaction.mockResolvedValue({ data: { transaction: getTransactionResult } });
2296
+ const result = await provider.request({ method: 'circle_createContractExecutionTransaction', params: [params] });
2297
+ expect(result).toEqual(getTransactionResult);
2298
+ expect(mockClient.createContractExecutionTransaction).toHaveBeenCalledWith({
2299
+ walletId: 'test-wallet-id',
2300
+ contractAddress: '0xcontract-address',
2301
+ callData: '0x123',
2302
+ fee: {
2303
+ type: 'level',
2304
+ config: {
2305
+ feeLevel: 'LOW',
2306
+ },
2307
+ },
2308
+ waitForTransactionHash: true,
2309
+ });
2310
+ expect(mockClient.getTransaction).toHaveBeenCalledWith({ id: 'transaction-id' });
2311
+ });
2312
+ it('should not wait for transaction hash when waitForTransactionHash is false', async () => {
2313
+ const params = {
2314
+ walletId: 'test-wallet-id',
2315
+ contractAddress: '0xcontract-address',
2316
+ callData: '0x123',
2317
+ fee: {
2318
+ type: 'level',
2319
+ config: {
2320
+ feeLevel: 'LOW',
2321
+ },
2322
+ },
2323
+ waitForTransactionHash: false,
2324
+ };
2325
+ const createTransactionResult = { id: 'transaction-id', state: 'QUEUED' };
2326
+ mockClient.createContractExecutionTransaction.mockResolvedValue({ data: createTransactionResult });
2327
+ mockClient.listWallets.mockResolvedValue({
2328
+ data: { wallets: [{ id: 'test-wallet-id' }] },
2329
+ });
2330
+ mockClient.getTransaction.mockResolvedValue({ data: { transaction: createTransactionResult } });
2331
+ const result = await provider.request({ method: 'circle_createContractExecutionTransaction', params: [params] });
2332
+ expect(result).toEqual(createTransactionResult);
2333
+ expect(mockClient.createContractExecutionTransaction).toHaveBeenCalledWith({
2334
+ walletId: 'test-wallet-id',
2335
+ contractAddress: '0xcontract-address',
2336
+ callData: '0x123',
2337
+ fee: {
2338
+ type: 'level',
2339
+ config: {
2340
+ feeLevel: 'LOW',
2341
+ },
2342
+ },
2343
+ waitForTransactionHash: false,
2344
+ });
2345
+ // Should call getTransaction once to get the transaction structure, but not wait for txHash
2346
+ expect(mockClient.getTransaction).toHaveBeenCalledWith({ id: 'transaction-id' });
2347
+ expect(mockClient.getTransaction).toHaveBeenCalledTimes(1);
922
2348
  });
923
2349
  });
924
2350
  describe('import contract', () => {
@@ -927,7 +2353,7 @@ describe('Provider 2', () => {
927
2353
  const mockResponse = { data: { contract: 'contract-data' } };
928
2354
  mockScp.importContract.mockResolvedValue(mockResponse);
929
2355
  generateIdempotencyKeyMod.generateIdempotencyKey.mockReturnValue('test-idempotency-key');
930
- const result = await provider.circle_importContract(params);
2356
+ const result = await provider.request({ method: 'circle_importContract', params: [params] });
931
2357
  expect(result).toBe('contract-data');
932
2358
  expect(mockScp.importContract).toHaveBeenCalledWith({
933
2359
  ...params,
@@ -961,8 +2387,15 @@ describe('Provider 2', () => {
961
2387
  },
962
2388
  };
963
2389
  mockClient.createContractExecutionTransaction.mockResolvedValue(mockResponse);
964
- mockClient.getTransaction.mockResolvedValue({ data: { transaction: mockResponse.data } });
965
- await provider.circle_createContractExecutionTransaction(params);
2390
+ mockClient.getTransaction.mockResolvedValue({
2391
+ data: {
2392
+ transaction: {
2393
+ ...mockResponse.data,
2394
+ txHash: '0xabc123',
2395
+ },
2396
+ },
2397
+ });
2398
+ await provider.request({ method: 'circle_createContractExecutionTransaction', params: [params] });
966
2399
  // Verify that SENTINEL_FEES are converted to level-based fee
967
2400
  expect(mockClient.createContractExecutionTransaction).toHaveBeenCalledWith({
968
2401
  walletId: 'test-wallet-id',
@@ -999,8 +2432,15 @@ describe('Provider 2', () => {
999
2432
  },
1000
2433
  };
1001
2434
  mockClient.createContractExecutionTransaction.mockResolvedValue(mockResponse);
1002
- mockClient.getTransaction.mockResolvedValue({ data: { transaction: mockResponse.data } });
1003
- await provider.circle_createContractExecutionTransaction(params);
2435
+ mockClient.getTransaction.mockResolvedValue({
2436
+ data: {
2437
+ transaction: {
2438
+ ...mockResponse.data,
2439
+ txHash: '0xabc123',
2440
+ },
2441
+ },
2442
+ });
2443
+ await provider.request({ method: 'circle_createContractExecutionTransaction', params: [params] });
1004
2444
  // Verify that only maxFee is converted to empty string
1005
2445
  expect(mockClient.createContractExecutionTransaction).toHaveBeenCalledWith({
1006
2446
  walletId: 'test-wallet-id',