@lifi/sdk 3.2.0 → 3.3.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/package.json +10 -2
  2. package/src/_cjs/core/EVM/EVMStepExecutor.js +2 -1
  3. package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
  4. package/src/_cjs/core/EVM/getAllowance.js +5 -5
  5. package/src/_cjs/core/EVM/getAllowance.js.map +1 -1
  6. package/src/_cjs/core/EVM/getEVMBalance.js +5 -5
  7. package/src/_cjs/core/EVM/getEVMBalance.js.map +1 -1
  8. package/src/_cjs/core/EVM/setAllowance.js +5 -5
  9. package/src/_cjs/core/EVM/setAllowance.js.map +1 -1
  10. package/src/_cjs/core/Solana/Solana.js +2 -2
  11. package/src/_cjs/core/Solana/Solana.js.map +1 -1
  12. package/src/_cjs/core/Solana/SolanaStepExecutor.js +7 -10
  13. package/src/_cjs/core/Solana/SolanaStepExecutor.js.map +1 -1
  14. package/src/_cjs/core/Solana/getSNSAddress.js +2 -2
  15. package/src/_cjs/core/Solana/getSNSAddress.js.map +1 -1
  16. package/src/_cjs/core/Solana/{isAddress.js → isSVMAddress.js} +3 -3
  17. package/src/_cjs/core/Solana/isSVMAddress.js.map +1 -0
  18. package/src/_cjs/core/UTXO/UTXO.js +38 -0
  19. package/src/_cjs/core/UTXO/UTXO.js.map +1 -0
  20. package/src/_cjs/core/UTXO/UTXOStepExecutor.js +219 -0
  21. package/src/_cjs/core/UTXO/UTXOStepExecutor.js.map +1 -0
  22. package/src/_cjs/core/UTXO/blockchairApi.js +169 -0
  23. package/src/_cjs/core/UTXO/blockchairApi.js.map +1 -0
  24. package/src/_cjs/core/UTXO/blockchairApiTypes.js +26 -0
  25. package/src/_cjs/core/UTXO/blockchairApiTypes.js.map +1 -0
  26. package/src/_cjs/core/UTXO/getUTXOAPIPublicClient.js +48 -0
  27. package/src/_cjs/core/UTXO/getUTXOAPIPublicClient.js.map +1 -0
  28. package/src/_cjs/core/UTXO/getUTXOBalance.js +30 -0
  29. package/src/_cjs/core/UTXO/getUTXOBalance.js.map +1 -0
  30. package/src/_cjs/core/UTXO/getUTXOPublicClient.js +36 -0
  31. package/src/_cjs/core/UTXO/getUTXOPublicClient.js.map +1 -0
  32. package/src/_cjs/core/UTXO/isUTXOAddress.js +133 -0
  33. package/src/_cjs/core/UTXO/isUTXOAddress.js.map +1 -0
  34. package/src/_cjs/core/UTXO/parseUTXOErrors.js +30 -0
  35. package/src/_cjs/core/UTXO/parseUTXOErrors.js.map +1 -0
  36. package/src/_cjs/core/UTXO/requestClient.js +63 -0
  37. package/src/_cjs/core/UTXO/requestClient.js.map +1 -0
  38. package/src/_cjs/core/UTXO/types.js +8 -0
  39. package/src/_cjs/core/UTXO/types.js.map +1 -0
  40. package/src/_cjs/core/UTXO/utxo-stack/actions/getBalance.js +11 -0
  41. package/src/_cjs/core/UTXO/utxo-stack/actions/getBalance.js.map +1 -0
  42. package/src/_cjs/core/UTXO/utxo-stack/actions/getBlockCount.js +11 -0
  43. package/src/_cjs/core/UTXO/utxo-stack/actions/getBlockCount.js.map +1 -0
  44. package/src/_cjs/core/UTXO/utxo-stack/actions/getUTXOTransaction.js +15 -0
  45. package/src/_cjs/core/UTXO/utxo-stack/actions/getUTXOTransaction.js.map +1 -0
  46. package/src/_cjs/core/UTXO/utxo-stack/actions/sendUTXOTransaction.js +15 -0
  47. package/src/_cjs/core/UTXO/utxo-stack/actions/sendUTXOTransaction.js.map +1 -0
  48. package/src/_cjs/core/UTXO/utxo-stack/actions/signPsbt.js +11 -0
  49. package/src/_cjs/core/UTXO/utxo-stack/actions/signPsbt.js.map +1 -0
  50. package/src/_cjs/core/UTXO/utxo-stack/clients/types.js +3 -0
  51. package/src/_cjs/core/UTXO/utxo-stack/clients/types.js.map +1 -0
  52. package/src/_cjs/core/UTXO/utxo-stack/decorators/UTXOAPIActions.js +10 -0
  53. package/src/_cjs/core/UTXO/utxo-stack/decorators/UTXOAPIActions.js.map +1 -0
  54. package/src/_cjs/core/UTXO/utxo-stack/decorators/UTXOActions.js +14 -0
  55. package/src/_cjs/core/UTXO/utxo-stack/decorators/UTXOActions.js.map +1 -0
  56. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/ankr.js +21 -0
  57. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/ankr.js.map +1 -0
  58. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/blockchair.js +24 -0
  59. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/blockchair.js.map +1 -0
  60. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/blockcypher.js +21 -0
  61. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/blockcypher.js.map +1 -0
  62. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.js +77 -0
  63. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.js.map +1 -0
  64. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/getRpcProviderMethods.js +22 -0
  65. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/getRpcProviderMethods.js.map +1 -0
  66. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/mempool.js +17 -0
  67. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/mempool.js.map +1 -0
  68. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/types.js +3 -0
  69. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/types.js.map +1 -0
  70. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/utxo.js +56 -0
  71. package/src/_cjs/core/UTXO/utxo-stack/transports/utxo/utxo.js.map +1 -0
  72. package/src/_cjs/core/UTXO/utxo-stack/types/transaction.js +3 -0
  73. package/src/_cjs/core/UTXO/utxo-stack/types/transaction.js.map +1 -0
  74. package/src/_cjs/core/checkBalance.js +3 -3
  75. package/src/_cjs/core/checkBalance.js.map +1 -1
  76. package/src/_cjs/core/utils.js +0 -6
  77. package/src/_cjs/core/utils.js.map +1 -1
  78. package/src/_cjs/core/waitForReceivingTransaction.js +4 -4
  79. package/src/_cjs/core/waitForReceivingTransaction.js.map +1 -1
  80. package/src/_cjs/createConfig.js +3 -1
  81. package/src/_cjs/createConfig.js.map +1 -1
  82. package/src/_cjs/index.js +10 -3
  83. package/src/_cjs/index.js.map +1 -1
  84. package/src/_cjs/request.js +3 -3
  85. package/src/_cjs/request.js.map +1 -1
  86. package/src/_cjs/services/api.js +8 -4
  87. package/src/_cjs/services/api.js.map +1 -1
  88. package/src/_cjs/services/balance.js +7 -3
  89. package/src/_cjs/services/balance.js.map +1 -1
  90. package/src/_cjs/utils/index.js +1 -1
  91. package/src/_cjs/utils/index.js.map +1 -1
  92. package/src/_cjs/utils/{utils.js → isZeroAddress.js} +2 -19
  93. package/src/_cjs/utils/isZeroAddress.js.map +1 -0
  94. package/src/_cjs/utils/sleep.js +9 -0
  95. package/src/_cjs/utils/sleep.js.map +1 -0
  96. package/src/_cjs/utils/waitForResult.js +16 -0
  97. package/src/_cjs/utils/waitForResult.js.map +1 -0
  98. package/src/_cjs/utils/withDedupe.js +37 -0
  99. package/src/_cjs/utils/withDedupe.js.map +1 -0
  100. package/src/_cjs/version.js +1 -1
  101. package/src/_cjs/version.js.map +1 -1
  102. package/src/_esm/core/EVM/EVMStepExecutor.js +2 -1
  103. package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
  104. package/src/_esm/core/EVM/getAllowance.js +1 -1
  105. package/src/_esm/core/EVM/getAllowance.js.map +1 -1
  106. package/src/_esm/core/EVM/getEVMBalance.js +1 -1
  107. package/src/_esm/core/EVM/getEVMBalance.js.map +1 -1
  108. package/src/_esm/core/EVM/setAllowance.js +1 -1
  109. package/src/_esm/core/EVM/setAllowance.js.map +1 -1
  110. package/src/_esm/core/Solana/Solana.js +2 -2
  111. package/src/_esm/core/Solana/Solana.js.map +1 -1
  112. package/src/_esm/core/Solana/SolanaStepExecutor.js +6 -9
  113. package/src/_esm/core/Solana/SolanaStepExecutor.js.map +1 -1
  114. package/src/_esm/core/Solana/getSNSAddress.js +2 -2
  115. package/src/_esm/core/Solana/getSNSAddress.js.map +1 -1
  116. package/src/_esm/core/Solana/{isAddress.js → isSVMAddress.js} +2 -2
  117. package/src/_esm/core/Solana/isSVMAddress.js.map +1 -0
  118. package/src/_esm/core/UTXO/UTXO.js +36 -0
  119. package/src/_esm/core/UTXO/UTXO.js.map +1 -0
  120. package/src/_esm/core/UTXO/UTXOStepExecutor.js +243 -0
  121. package/src/_esm/core/UTXO/UTXOStepExecutor.js.map +1 -0
  122. package/src/_esm/core/UTXO/blockchairApi.js +167 -0
  123. package/src/_esm/core/UTXO/blockchairApi.js.map +1 -0
  124. package/src/_esm/core/UTXO/blockchairApiTypes.js +23 -0
  125. package/src/_esm/core/UTXO/blockchairApiTypes.js.map +1 -0
  126. package/src/_esm/core/UTXO/getUTXOAPIPublicClient.js +50 -0
  127. package/src/_esm/core/UTXO/getUTXOAPIPublicClient.js.map +1 -0
  128. package/src/_esm/core/UTXO/getUTXOBalance.js +26 -0
  129. package/src/_esm/core/UTXO/getUTXOBalance.js.map +1 -0
  130. package/src/_esm/core/UTXO/getUTXOPublicClient.js +38 -0
  131. package/src/_esm/core/UTXO/getUTXOPublicClient.js.map +1 -0
  132. package/src/_esm/core/UTXO/isUTXOAddress.js +128 -0
  133. package/src/_esm/core/UTXO/isUTXOAddress.js.map +1 -0
  134. package/src/_esm/core/UTXO/parseUTXOErrors.js +26 -0
  135. package/src/_esm/core/UTXO/parseUTXOErrors.js.map +1 -0
  136. package/src/_esm/core/UTXO/requestClient.js +59 -0
  137. package/src/_esm/core/UTXO/requestClient.js.map +1 -0
  138. package/src/_esm/core/UTXO/types.js +6 -0
  139. package/src/_esm/core/UTXO/types.js.map +1 -0
  140. package/src/_esm/core/UTXO/utxo-stack/actions/getBalance.js +9 -0
  141. package/src/_esm/core/UTXO/utxo-stack/actions/getBalance.js.map +1 -0
  142. package/src/_esm/core/UTXO/utxo-stack/actions/getBlockCount.js +9 -0
  143. package/src/_esm/core/UTXO/utxo-stack/actions/getBlockCount.js.map +1 -0
  144. package/src/_esm/core/UTXO/utxo-stack/actions/getUTXOTransaction.js +13 -0
  145. package/src/_esm/core/UTXO/utxo-stack/actions/getUTXOTransaction.js.map +1 -0
  146. package/src/_esm/core/UTXO/utxo-stack/actions/sendUTXOTransaction.js +13 -0
  147. package/src/_esm/core/UTXO/utxo-stack/actions/sendUTXOTransaction.js.map +1 -0
  148. package/src/_esm/core/UTXO/utxo-stack/actions/signPsbt.js +9 -0
  149. package/src/_esm/core/UTXO/utxo-stack/actions/signPsbt.js.map +1 -0
  150. package/src/_esm/core/UTXO/utxo-stack/clients/types.js +2 -0
  151. package/src/_esm/core/UTXO/utxo-stack/clients/types.js.map +1 -0
  152. package/src/_esm/core/UTXO/utxo-stack/decorators/UTXOAPIActions.js +7 -0
  153. package/src/_esm/core/UTXO/utxo-stack/decorators/UTXOAPIActions.js.map +1 -0
  154. package/src/_esm/core/UTXO/utxo-stack/decorators/UTXOActions.js +11 -0
  155. package/src/_esm/core/UTXO/utxo-stack/decorators/UTXOActions.js.map +1 -0
  156. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/ankr.js +18 -0
  157. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/ankr.js.map +1 -0
  158. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/blockchair.js +21 -0
  159. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/blockchair.js.map +1 -0
  160. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/blockcypher.js +18 -0
  161. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/blockcypher.js.map +1 -0
  162. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.js +74 -0
  163. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.js.map +1 -0
  164. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/getRpcProviderMethods.js +19 -0
  165. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/getRpcProviderMethods.js.map +1 -0
  166. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/mempool.js +14 -0
  167. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/mempool.js.map +1 -0
  168. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/types.js +2 -0
  169. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/types.js.map +1 -0
  170. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/utxo.js +53 -0
  171. package/src/_esm/core/UTXO/utxo-stack/transports/utxo/utxo.js.map +1 -0
  172. package/src/_esm/core/UTXO/utxo-stack/types/transaction.js +2 -0
  173. package/src/_esm/core/UTXO/utxo-stack/types/transaction.js.map +1 -0
  174. package/src/_esm/core/checkBalance.js +2 -2
  175. package/src/_esm/core/checkBalance.js.map +1 -1
  176. package/src/_esm/core/utils.js +0 -5
  177. package/src/_esm/core/utils.js.map +1 -1
  178. package/src/_esm/core/waitForReceivingTransaction.js +4 -4
  179. package/src/_esm/core/waitForReceivingTransaction.js.map +1 -1
  180. package/src/_esm/createConfig.js +3 -1
  181. package/src/_esm/createConfig.js.map +1 -1
  182. package/src/_esm/index.js +7 -3
  183. package/src/_esm/index.js.map +1 -1
  184. package/src/_esm/request.js +3 -3
  185. package/src/_esm/request.js.map +1 -1
  186. package/src/_esm/services/api.js +8 -4
  187. package/src/_esm/services/api.js.map +1 -1
  188. package/src/_esm/services/balance.js +9 -5
  189. package/src/_esm/services/balance.js.map +1 -1
  190. package/src/_esm/utils/index.js +1 -1
  191. package/src/_esm/utils/index.js.map +1 -1
  192. package/src/_esm/utils/isZeroAddress.js +17 -0
  193. package/src/_esm/utils/isZeroAddress.js.map +1 -0
  194. package/src/_esm/utils/sleep.js +6 -0
  195. package/src/_esm/utils/sleep.js.map +1 -0
  196. package/src/_esm/utils/waitForResult.js +18 -0
  197. package/src/_esm/utils/waitForResult.js.map +1 -0
  198. package/src/_esm/utils/withDedupe.js +40 -0
  199. package/src/_esm/utils/withDedupe.js.map +1 -0
  200. package/src/_esm/version.js +1 -1
  201. package/src/_esm/version.js.map +1 -1
  202. package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
  203. package/src/_types/core/Solana/SolanaStepExecutor.d.ts.map +1 -1
  204. package/src/_types/core/Solana/isSVMAddress.d.ts +2 -0
  205. package/src/_types/core/Solana/isSVMAddress.d.ts.map +1 -0
  206. package/src/_types/core/UTXO/UTXO.d.ts +3 -0
  207. package/src/_types/core/UTXO/UTXO.d.ts.map +1 -0
  208. package/src/_types/core/UTXO/UTXOStepExecutor.d.ts +13 -0
  209. package/src/_types/core/UTXO/UTXOStepExecutor.d.ts.map +1 -0
  210. package/src/_types/core/UTXO/blockchairApi.d.ts +37 -0
  211. package/src/_types/core/UTXO/blockchairApi.d.ts.map +1 -0
  212. package/src/_types/core/UTXO/blockchairApiTypes.d.ts +229 -0
  213. package/src/_types/core/UTXO/blockchairApiTypes.d.ts.map +1 -0
  214. package/src/_types/core/UTXO/getUTXOAPIPublicClient.d.ts +10 -0
  215. package/src/_types/core/UTXO/getUTXOAPIPublicClient.d.ts.map +1 -0
  216. package/src/_types/core/UTXO/getUTXOBalance.d.ts +3 -0
  217. package/src/_types/core/UTXO/getUTXOBalance.d.ts.map +1 -0
  218. package/src/_types/core/UTXO/getUTXOPublicClient.d.ts +10 -0
  219. package/src/_types/core/UTXO/getUTXOPublicClient.d.ts.map +1 -0
  220. package/src/_types/core/UTXO/isUTXOAddress.d.ts +21 -0
  221. package/src/_types/core/UTXO/isUTXOAddress.d.ts.map +1 -0
  222. package/src/_types/core/UTXO/parseUTXOErrors.d.ts +4 -0
  223. package/src/_types/core/UTXO/parseUTXOErrors.d.ts.map +1 -0
  224. package/src/_types/core/UTXO/requestClient.d.ts +22 -0
  225. package/src/_types/core/UTXO/requestClient.d.ts.map +1 -0
  226. package/src/_types/core/UTXO/types.d.ts +10 -0
  227. package/src/_types/core/UTXO/types.d.ts.map +1 -0
  228. package/src/_types/core/UTXO/utxo-stack/actions/getBalance.d.ts +9 -0
  229. package/src/_types/core/UTXO/utxo-stack/actions/getBalance.d.ts.map +1 -0
  230. package/src/_types/core/UTXO/utxo-stack/actions/getBlockCount.d.ts +5 -0
  231. package/src/_types/core/UTXO/utxo-stack/actions/getBlockCount.d.ts.map +1 -0
  232. package/src/_types/core/UTXO/utxo-stack/actions/getUTXOTransaction.d.ts +12 -0
  233. package/src/_types/core/UTXO/utxo-stack/actions/getUTXOTransaction.d.ts.map +1 -0
  234. package/src/_types/core/UTXO/utxo-stack/actions/sendUTXOTransaction.d.ts +11 -0
  235. package/src/_types/core/UTXO/utxo-stack/actions/sendUTXOTransaction.d.ts.map +1 -0
  236. package/src/_types/core/UTXO/utxo-stack/actions/signPsbt.d.ts +4 -0
  237. package/src/_types/core/UTXO/utxo-stack/actions/signPsbt.d.ts.map +1 -0
  238. package/src/_types/core/UTXO/utxo-stack/clients/types.d.ts +44 -0
  239. package/src/_types/core/UTXO/utxo-stack/clients/types.d.ts.map +1 -0
  240. package/src/_types/core/UTXO/utxo-stack/decorators/UTXOAPIActions.d.ts +7 -0
  241. package/src/_types/core/UTXO/utxo-stack/decorators/UTXOAPIActions.d.ts.map +1 -0
  242. package/src/_types/core/UTXO/utxo-stack/decorators/UTXOActions.d.ts +11 -0
  243. package/src/_types/core/UTXO/utxo-stack/decorators/UTXOActions.d.ts.map +1 -0
  244. package/src/_types/core/UTXO/utxo-stack/transports/utxo/ankr.d.ts +3 -0
  245. package/src/_types/core/UTXO/utxo-stack/transports/utxo/ankr.d.ts.map +1 -0
  246. package/src/_types/core/UTXO/utxo-stack/transports/utxo/blockchair.d.ts +3 -0
  247. package/src/_types/core/UTXO/utxo-stack/transports/utxo/blockchair.d.ts.map +1 -0
  248. package/src/_types/core/UTXO/utxo-stack/transports/utxo/blockcypher.d.ts +3 -0
  249. package/src/_types/core/UTXO/utxo-stack/transports/utxo/blockcypher.d.ts.map +1 -0
  250. package/src/_types/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.d.ts +25 -0
  251. package/src/_types/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.d.ts.map +1 -0
  252. package/src/_types/core/UTXO/utxo-stack/transports/utxo/getRpcProviderMethods.d.ts +3 -0
  253. package/src/_types/core/UTXO/utxo-stack/transports/utxo/getRpcProviderMethods.d.ts.map +1 -0
  254. package/src/_types/core/UTXO/utxo-stack/transports/utxo/mempool.d.ts +3 -0
  255. package/src/_types/core/UTXO/utxo-stack/transports/utxo/mempool.d.ts.map +1 -0
  256. package/src/_types/core/UTXO/utxo-stack/transports/utxo/types.d.ts +45 -0
  257. package/src/_types/core/UTXO/utxo-stack/transports/utxo/types.d.ts.map +1 -0
  258. package/src/_types/core/UTXO/utxo-stack/transports/utxo/utxo.d.ts +7 -0
  259. package/src/_types/core/UTXO/utxo-stack/transports/utxo/utxo.d.ts.map +1 -0
  260. package/src/_types/core/UTXO/utxo-stack/types/transaction.d.ts +42 -0
  261. package/src/_types/core/UTXO/utxo-stack/types/transaction.d.ts.map +1 -0
  262. package/src/_types/core/utils.d.ts +0 -1
  263. package/src/_types/core/utils.d.ts.map +1 -1
  264. package/src/_types/core/waitForReceivingTransaction.d.ts +1 -1
  265. package/src/_types/core/waitForReceivingTransaction.d.ts.map +1 -1
  266. package/src/_types/createConfig.d.ts.map +1 -1
  267. package/src/_types/index.d.ts +7 -3
  268. package/src/_types/index.d.ts.map +1 -1
  269. package/src/_types/request.d.ts.map +1 -1
  270. package/src/_types/services/api.d.ts.map +1 -1
  271. package/src/_types/services/balance.d.ts +3 -3
  272. package/src/_types/services/balance.d.ts.map +1 -1
  273. package/src/_types/utils/index.d.ts +1 -1
  274. package/src/_types/utils/index.d.ts.map +1 -1
  275. package/src/_types/utils/isZeroAddress.d.ts +3 -0
  276. package/src/_types/utils/isZeroAddress.d.ts.map +1 -0
  277. package/src/_types/utils/sleep.d.ts +2 -0
  278. package/src/_types/utils/sleep.d.ts.map +1 -0
  279. package/src/_types/utils/waitForResult.d.ts +8 -0
  280. package/src/_types/utils/waitForResult.d.ts.map +1 -0
  281. package/src/_types/utils/withDedupe.d.ts +20 -0
  282. package/src/_types/utils/withDedupe.d.ts.map +1 -0
  283. package/src/_types/version.d.ts +1 -1
  284. package/src/_types/version.d.ts.map +1 -1
  285. package/src/core/EVM/EVMStepExecutor.ts +2 -4
  286. package/src/core/EVM/getAllowance.ts +1 -1
  287. package/src/core/EVM/getEVMBalance.ts +1 -1
  288. package/src/core/EVM/setAllowance.ts +1 -1
  289. package/src/core/Solana/Solana.ts +2 -2
  290. package/src/core/Solana/SolanaStepExecutor.ts +14 -17
  291. package/src/core/Solana/getSNSAddress.ts +2 -2
  292. package/src/core/Solana/{isAddress.ts → isSVMAddress.ts} +1 -1
  293. package/src/core/UTXO/UTXO.ts +43 -0
  294. package/src/core/UTXO/UTXOStepExecutor.ts +351 -0
  295. package/src/core/UTXO/blockchairApi.ts +273 -0
  296. package/src/core/UTXO/blockchairApiTypes.ts +253 -0
  297. package/src/core/UTXO/getUTXOAPIPublicClient.ts +71 -0
  298. package/src/core/UTXO/getUTXOBalance.ts +31 -0
  299. package/src/core/UTXO/getUTXOPublicClient.ts +60 -0
  300. package/src/core/UTXO/isUTXOAddress.ts +166 -0
  301. package/src/core/UTXO/parseUTXOErrors.ts +36 -0
  302. package/src/core/UTXO/requestClient.ts +84 -0
  303. package/src/core/UTXO/types.ts +15 -0
  304. package/src/core/UTXO/utxo-stack/actions/getBalance.ts +26 -0
  305. package/src/core/UTXO/utxo-stack/actions/getBlockCount.ts +20 -0
  306. package/src/core/UTXO/utxo-stack/actions/getUTXOTransaction.ts +30 -0
  307. package/src/core/UTXO/utxo-stack/actions/sendUTXOTransaction.ts +29 -0
  308. package/src/core/UTXO/utxo-stack/actions/signPsbt.ts +23 -0
  309. package/src/core/UTXO/utxo-stack/clients/types.ts +48 -0
  310. package/src/core/UTXO/utxo-stack/decorators/UTXOAPIActions.ts +21 -0
  311. package/src/core/UTXO/utxo-stack/decorators/UTXOActions.ts +37 -0
  312. package/src/core/UTXO/utxo-stack/transports/utxo/ankr.ts +30 -0
  313. package/src/core/UTXO/utxo-stack/transports/utxo/blockchair.ts +27 -0
  314. package/src/core/UTXO/utxo-stack/transports/utxo/blockcypher.ts +32 -0
  315. package/src/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.ts +122 -0
  316. package/src/core/UTXO/utxo-stack/transports/utxo/getRpcProviderMethods.ts +22 -0
  317. package/src/core/UTXO/utxo-stack/transports/utxo/mempool.ts +34 -0
  318. package/src/core/UTXO/utxo-stack/transports/utxo/types.ts +55 -0
  319. package/src/core/UTXO/utxo-stack/transports/utxo/utxo.ts +84 -0
  320. package/src/core/UTXO/utxo-stack/types/transaction.ts +43 -0
  321. package/src/core/checkBalance.ts +2 -2
  322. package/src/core/utils.ts +0 -6
  323. package/src/core/waitForReceivingTransaction.ts +5 -4
  324. package/src/createConfig.ts +3 -1
  325. package/src/index.ts +7 -3
  326. package/src/request.ts +3 -3
  327. package/src/services/api.ts +26 -16
  328. package/src/services/balance.ts +11 -6
  329. package/src/utils/index.ts +1 -1
  330. package/src/utils/isZeroAddress.ts +20 -0
  331. package/src/utils/sleep.ts +5 -0
  332. package/src/utils/waitForResult.ts +21 -0
  333. package/src/utils/withDedupe.ts +46 -0
  334. package/src/version.ts +1 -1
  335. package/src/_cjs/core/Solana/isAddress.js.map +0 -1
  336. package/src/_cjs/utils/utils.js.map +0 -1
  337. package/src/_esm/core/Solana/isAddress.js.map +0 -1
  338. package/src/_esm/utils/utils.js +0 -38
  339. package/src/_esm/utils/utils.js.map +0 -1
  340. package/src/_types/core/Solana/isAddress.d.ts +0 -2
  341. package/src/_types/core/Solana/isAddress.d.ts.map +0 -1
  342. package/src/_types/utils/utils.d.ts +0 -11
  343. package/src/_types/utils/utils.d.ts.map +0 -1
  344. package/src/utils/utils.ts +0 -48
@@ -0,0 +1,273 @@
1
+ import type {
2
+ BlockchairAddressResponse,
3
+ BlockchairMultipleBalancesResponse,
4
+ BlockchairOutputsResponse,
5
+ BlockchairRawTransactionResponse,
6
+ BlockchairResponse,
7
+ UTXOChain,
8
+ UTXOType,
9
+ } from './blockchairApiTypes.js'
10
+ import { Chain } from './blockchairApiTypes.js'
11
+ import { RequestClient } from './requestClient.js'
12
+
13
+ type BlockchairParams<T> = T & { chain: Chain; apiKey?: string }
14
+
15
+ const baseUrl = (chain: Chain) =>
16
+ `https://api.blockchair.com/${mapChainToBlockchairChain(chain)}`
17
+
18
+ const getDefaultTxFeeByChain = (chain: Chain) => {
19
+ switch (chain) {
20
+ case Chain.Bitcoin:
21
+ return 5
22
+ case Chain.Dogecoin:
23
+ return 10000
24
+ case Chain.Litecoin:
25
+ return 1
26
+ default:
27
+ return 2
28
+ }
29
+ }
30
+
31
+ const mapChainToBlockchairChain = (chain: Chain) => {
32
+ switch (chain) {
33
+ case Chain.BitcoinCash:
34
+ return 'bitcoin-cash'
35
+ case Chain.Litecoin:
36
+ return 'litecoin'
37
+ case Chain.Dash:
38
+ return 'dash'
39
+ case Chain.Dogecoin:
40
+ return 'dogecoin'
41
+ case Chain.Polkadot:
42
+ return 'polkadot'
43
+ default:
44
+ return 'bitcoin'
45
+ }
46
+ }
47
+
48
+ const getSuggestedTxFee = async (chain: Chain) => {
49
+ try {
50
+ //Use Bitgo API for fee estimation
51
+ //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate
52
+ const { feePerKb } = await RequestClient.get<{
53
+ feePerKb: number
54
+ cpfpFeePerKb: number
55
+ numBlocks: number
56
+ feeByBlockTarget: { 1: number; 3: number }
57
+ }>(`https://app.bitgo.com/api/v2/${chain.toLowerCase()}/tx/fee`)
58
+ const suggestedFee = feePerKb / 1000
59
+
60
+ return Math.max(suggestedFee, getDefaultTxFeeByChain(chain))
61
+ } catch (_error) {
62
+ return getDefaultTxFeeByChain(chain)
63
+ }
64
+ }
65
+
66
+ const blockchairRequest = async <T>(
67
+ url: string,
68
+ apiKey?: string
69
+ ): Promise<T> => {
70
+ try {
71
+ const response = await RequestClient.get<BlockchairResponse<T>>(url)
72
+ if (!response || response.context.code !== 200) {
73
+ throw new Error(`failed to query ${url}`)
74
+ }
75
+
76
+ return response.data as T
77
+ } catch (error) {
78
+ if (!apiKey) {
79
+ throw error
80
+ }
81
+ const response = await RequestClient.get<BlockchairResponse<T>>(
82
+ `${url}${apiKey ? `&key=${apiKey}` : ''}`
83
+ )
84
+
85
+ if (!response || response.context.code !== 200) {
86
+ throw new Error(`failed to query ${url}`)
87
+ }
88
+
89
+ return response.data as T
90
+ }
91
+ }
92
+
93
+ const baseAddressData = {
94
+ utxo: [],
95
+ address: { balance: 0, transaction_count: 0 },
96
+ }
97
+ const getAddressData = async ({
98
+ address,
99
+ chain,
100
+ apiKey,
101
+ }: BlockchairParams<{ address?: string }>) => {
102
+ if (!address) {
103
+ throw new Error('address is required')
104
+ }
105
+
106
+ try {
107
+ const response = await blockchairRequest<BlockchairAddressResponse>(
108
+ `${baseUrl(chain)}/dashboards/address/${address}?transaction_details=true`,
109
+ apiKey
110
+ )
111
+
112
+ return response[address]
113
+ } catch (_error) {
114
+ return baseAddressData
115
+ }
116
+ }
117
+
118
+ const getUnconfirmedBalance = async ({
119
+ address,
120
+ chain,
121
+ apiKey,
122
+ }: BlockchairParams<{ address?: string }>) => {
123
+ const response = await getAddressData({ address, chain, apiKey })
124
+
125
+ return response?.address.balance
126
+ }
127
+
128
+ const getConfirmedBalance = async ({
129
+ chain,
130
+ address,
131
+ apiKey,
132
+ }: BlockchairParams<{ address?: string }>) => {
133
+ if (!address) {
134
+ throw new Error('address is required')
135
+ }
136
+ try {
137
+ const response =
138
+ await blockchairRequest<BlockchairMultipleBalancesResponse>(
139
+ `${baseUrl(chain)}/addresses/balances?addresses=${address}`,
140
+ apiKey
141
+ )
142
+
143
+ return response[address] || 0
144
+ } catch (_error) {
145
+ return 0
146
+ }
147
+ }
148
+
149
+ const getRawTx = async ({
150
+ chain,
151
+ apiKey,
152
+ txHash,
153
+ }: BlockchairParams<{ txHash?: string }>) => {
154
+ if (!txHash) {
155
+ throw new Error('txHash is required')
156
+ }
157
+
158
+ try {
159
+ const rawTxResponse =
160
+ await blockchairRequest<BlockchairRawTransactionResponse>(
161
+ `${baseUrl(chain)}/raw/transaction/${txHash}`,
162
+ apiKey
163
+ )
164
+ return rawTxResponse?.[txHash]?.raw_transaction
165
+ } catch (error) {
166
+ console.error(error)
167
+ return ''
168
+ }
169
+ }
170
+
171
+ const getUnspentTxs = async ({
172
+ chain,
173
+ address,
174
+ apiKey,
175
+ offset = 0,
176
+ }: BlockchairParams<{ offset?: number; address: string }>): Promise<
177
+ (UTXOType & { script_hex: string; is_confirmed: boolean })[]
178
+ > => {
179
+ if (!address) {
180
+ throw new Error('address is required')
181
+ }
182
+ try {
183
+ const response = await blockchairRequest<BlockchairOutputsResponse[]>(
184
+ `${baseUrl(
185
+ chain
186
+ )}/outputs?q=is_spent(false),recipient(${address})&limit=100&offset=${offset}`,
187
+ apiKey
188
+ )
189
+
190
+ const txs = response
191
+ .filter(({ is_spent }) => !is_spent)
192
+ .map(
193
+ ({
194
+ script_hex,
195
+ block_id,
196
+ transaction_hash,
197
+ index,
198
+ value,
199
+ spending_signature_hex,
200
+ }) => ({
201
+ hash: transaction_hash,
202
+ index,
203
+ value,
204
+ txHex: spending_signature_hex,
205
+ script_hex,
206
+ is_confirmed: block_id !== -1,
207
+ })
208
+ ) as (UTXOType & { script_hex: string; is_confirmed: boolean })[]
209
+
210
+ if (response.length !== 100) {
211
+ return txs
212
+ }
213
+
214
+ const nextBatch = await getUnspentTxs({
215
+ address,
216
+ chain,
217
+ apiKey,
218
+ offset: response?.[99]?.transaction_id,
219
+ })
220
+
221
+ return txs.concat(nextBatch)
222
+ } catch (error) {
223
+ console.error(error)
224
+ return []
225
+ }
226
+ }
227
+
228
+ const scanUTXOs = async ({
229
+ address,
230
+ chain,
231
+ apiKey,
232
+ fetchTxHex = true,
233
+ }: BlockchairParams<{ address: string; fetchTxHex?: boolean }>) => {
234
+ const utxos = await getUnspentTxs({ chain, address, apiKey })
235
+ const results = []
236
+
237
+ for (const { hash, index, script_hex, value } of utxos) {
238
+ let txHex: string | undefined
239
+ if (fetchTxHex) {
240
+ txHex = await getRawTx({ txHash: hash, chain, apiKey })
241
+ }
242
+ results.push({
243
+ address,
244
+ hash,
245
+ index,
246
+ txHex,
247
+ value,
248
+ witnessUtxo: { value, script: Buffer.from(script_hex, 'hex') },
249
+ })
250
+ }
251
+ return results
252
+ }
253
+
254
+ export const blockchairApi = ({
255
+ apiKey,
256
+ chain,
257
+ }: {
258
+ apiKey?: string
259
+ chain: UTXOChain
260
+ }) => ({
261
+ getConfirmedBalance: (address: string) =>
262
+ getConfirmedBalance({ chain, address, apiKey }),
263
+ getRawTx: (txHash: string) => getRawTx({ txHash, chain, apiKey }),
264
+ getSuggestedTxFee: () => getSuggestedTxFee(chain),
265
+ getBalance: (address: string) =>
266
+ getUnconfirmedBalance({ address, chain, apiKey }),
267
+ getAddressData: (address: string) =>
268
+ getAddressData({ address, chain, apiKey }),
269
+ scanUTXOs: (params: { address: string; fetchTxHex?: boolean }) =>
270
+ scanUTXOs({ ...params, chain, apiKey }),
271
+ })
272
+
273
+ export type BlockchairApiType = ReturnType<typeof blockchairApi>
@@ -0,0 +1,253 @@
1
+ export enum Chain {
2
+ Arbitrum = 'ARB',
3
+ Avalanche = 'AVAX',
4
+ BinanceSmartChain = 'BSC',
5
+ Bitcoin = 'BTC',
6
+ BitcoinCash = 'BCH',
7
+ Cosmos = 'GAIA',
8
+ Dash = 'DASH',
9
+ Dogecoin = 'DOGE',
10
+ Ethereum = 'ETH',
11
+ Kujira = 'KUJI',
12
+ Litecoin = 'LTC',
13
+ Maya = 'MAYA',
14
+ Optimism = 'OP',
15
+ Polkadot = 'DOT',
16
+ Chainflip = 'FLIP',
17
+ Polygon = 'MATIC',
18
+ Radix = 'XRD',
19
+ THORChain = 'THOR',
20
+ Solana = 'SOL',
21
+ }
22
+
23
+ export type UTXOChain =
24
+ | Chain.Bitcoin
25
+ | Chain.BitcoinCash
26
+ | Chain.Dash
27
+ | Chain.Dogecoin
28
+ | Chain.Litecoin
29
+
30
+ export type UTXOType = {
31
+ hash: string
32
+ index: number
33
+ value: number
34
+ txHex?: string
35
+ witnessUtxo?: any
36
+ }
37
+
38
+ export type BlockchairApiParams<T> = T & {
39
+ chain: Chain
40
+ apiKey: string
41
+ }
42
+
43
+ export interface BlockchairMultipleBalancesResponse {
44
+ [key: string]: number
45
+ }
46
+
47
+ export interface BlockchairVin {
48
+ txid: string
49
+ vout: number
50
+ scriptSig: {
51
+ asm: string
52
+ hex: string
53
+ }
54
+ sequence: number
55
+ }
56
+
57
+ export interface BlockchairVout {
58
+ value: number
59
+ n: number
60
+ scriptPubKey: {
61
+ asm: string
62
+ hex: string
63
+ address: string
64
+ type: string
65
+ addresses: string[]
66
+ reqSigs: number
67
+ }
68
+ }
69
+
70
+ export interface BlockchairTransaction {
71
+ block_id: number
72
+ hash: string
73
+ time: string
74
+ balance_change: number
75
+ }
76
+
77
+ export interface BlockchairUtxo {
78
+ block_id: number
79
+ transaction_hash: string
80
+ index: number
81
+ value: number
82
+ }
83
+
84
+ export interface BlockchairAddressCoreData {
85
+ type: string
86
+ script_hex: string
87
+ balance: number
88
+ balance_usd: number
89
+ received: number
90
+ received_usd: number
91
+ spent: number
92
+ spent_usd: number
93
+ output_count: number
94
+ unspent_output_count: number
95
+ first_seen_receiving: string
96
+ last_seen_receiving: string
97
+ first_seen_spending: null | string
98
+ last_seen_spending: null | string
99
+ transaction_count: number
100
+ scripthash_type: null | string
101
+ }
102
+
103
+ export interface BlockchairInputOutputCommonData {
104
+ block_id: number
105
+ transaction_id: number
106
+ index: number
107
+ transaction_hash: string
108
+ date: string
109
+ time: string
110
+ value: number
111
+ value_usd: number
112
+ recipient: string
113
+ type: string
114
+ script_hex: string
115
+ is_from_coinbase: boolean
116
+ is_spendable: boolean | null
117
+ is_spent: boolean
118
+ lifespan: number | null
119
+ cdd: number | null
120
+ }
121
+ export interface BlockchairTransactionInputOutput
122
+ extends BlockchairSpendingBlockData,
123
+ BlockchairInputOutputCommonData {
124
+ scripthash_type: null | string
125
+ }
126
+
127
+ export interface BlockchairSpendingBlockData {
128
+ spending_block_id: number | null
129
+ spending_transaction_id: number | null
130
+ spending_index: number | null
131
+ spending_transaction_hash: string | null
132
+ spending_date: string | null
133
+ spending_time: string | null
134
+ spending_value_usd: number | null
135
+ spending_sequence: number | null
136
+ spending_signature_hex: string | null
137
+ spending_witness: string | null
138
+ }
139
+
140
+ export interface BlockchairAddressResponse {
141
+ [key: string]: {
142
+ address: BlockchairAddressCoreData
143
+ transactions: BlockchairTransaction[]
144
+ utxo: BlockchairUtxo[]
145
+ }
146
+ }
147
+
148
+ export interface BlockchairOutputsResponse
149
+ extends BlockchairSpendingBlockData,
150
+ BlockchairInputOutputCommonData {}
151
+
152
+ export interface BlockchairRawTransactionResponse {
153
+ [key: string]: {
154
+ raw_transaction: string
155
+ decoded_raw_transaction: {
156
+ txid: string
157
+ hash: string
158
+ version: number
159
+ size: number
160
+ vsize: number
161
+ weight: number
162
+ locktime: number
163
+ vin: BlockchairVin[]
164
+ vout: BlockchairVout[]
165
+ }
166
+ }
167
+ }
168
+
169
+ export interface BlockchairMultipleAddressesResponse {
170
+ addresses: {
171
+ [key: string]: BlockchairAddressCoreData
172
+ }
173
+ transactions: BlockchairTransaction[]
174
+ utxo: BlockchairUtxo[]
175
+ set: {
176
+ address_count: number
177
+ balance: number
178
+ balance_usd: number
179
+ received: number
180
+ spent: number
181
+ output_count: number
182
+ unspent_output_count: number
183
+ first_seen_receiving: string
184
+ last_seen_receiving: string
185
+ first_seen_spending: null | string
186
+ last_seen_spending: null | string
187
+ transaction_count: number
188
+ }
189
+ }
190
+
191
+ export interface BlockchairResponse<T> {
192
+ data: T
193
+ context: {
194
+ code: number
195
+ source: string
196
+ results: number
197
+ state: number
198
+ market_price_usd: number
199
+ cache: {
200
+ live: boolean
201
+ duration: number
202
+ since: string
203
+ until: string
204
+ time: any
205
+ }
206
+ api: {
207
+ version: string
208
+ last_major_update: string
209
+ next_major_update: null | string
210
+ documentation: string
211
+ notice: string
212
+ }
213
+ servers: string
214
+ time: number
215
+ render_time: number
216
+ full_time: number
217
+ request_cost: number
218
+ }
219
+ }
220
+
221
+ export interface BlockchairDashboardTransactionResponse {
222
+ [key: string]: {
223
+ transaction: {
224
+ block_id: number
225
+ id: number
226
+ hash: string
227
+ date: string
228
+ time: string
229
+ size: number
230
+ weight: number
231
+ version: number
232
+ lock_time: number
233
+ is_coinbase: boolean
234
+ has_witness: boolean
235
+ input_count: number
236
+ output_count: number
237
+ input_total: number
238
+ input_total_usd: number
239
+ output_total: number
240
+ output_total_usd: number
241
+ fee: number
242
+ fee_usd: number
243
+ fee_per_kb: number
244
+ fee_per_kb_usd: number
245
+ fee_per_kwu: number
246
+ fee_per_kwu_usd: number
247
+ cdd_total: number
248
+ is_rbf: boolean
249
+ }
250
+ inputs: BlockchairTransactionInputOutput[]
251
+ outputs: BlockchairTransactionInputOutput[]
252
+ }
253
+ }
@@ -0,0 +1,71 @@
1
+ import {
2
+ createClient,
3
+ fallback,
4
+ rpcSchema,
5
+ type Chain,
6
+ type Client,
7
+ type FallbackTransport,
8
+ type HttpTransport,
9
+ } from 'viem'
10
+ import { config } from '../../config.js'
11
+ import { UTXOAPIActions } from './utxo-stack/decorators/UTXOAPIActions.js'
12
+ import type { UTXOAPISchema } from './utxo-stack/transports/utxo/types.js'
13
+ import { utxo } from './utxo-stack/transports/utxo/utxo.js'
14
+
15
+ // cached providers
16
+ const publicAPIClients: Record<
17
+ number,
18
+ Client<
19
+ FallbackTransport<readonly HttpTransport[]>,
20
+ Chain,
21
+ undefined,
22
+ UTXOAPISchema,
23
+ UTXOAPIActions
24
+ >
25
+ > = {}
26
+
27
+ /**
28
+ * Get an instance of a provider for a specific chain
29
+ * @param chainId - Id of the chain the provider is for
30
+ * @returns The public client for the given chain
31
+ */
32
+ export const getUTXOAPIPublicClient = async (chainId: number) => {
33
+ if (!publicAPIClients[chainId]) {
34
+ const _chain = await config.getChainById(chainId)
35
+ const chain: Chain = {
36
+ ..._chain,
37
+ ..._chain.metamask,
38
+ name: _chain.metamask.chainName,
39
+ rpcUrls: {
40
+ default: { http: _chain.metamask.rpcUrls },
41
+ public: { http: _chain.metamask.rpcUrls },
42
+ },
43
+ }
44
+ const client = createClient({
45
+ chain,
46
+ rpcSchema: rpcSchema<UTXOAPISchema>(),
47
+ transport: fallback([
48
+ utxo('https://api.blockchair.com', {
49
+ key: 'blockchair',
50
+ includeChainToURL: true,
51
+ }),
52
+ utxo('https://rpc.ankr.com/http/btc_blockbook/api/v2', {
53
+ key: 'ankr',
54
+ }),
55
+ utxo('https://api.blockcypher.com/v1/btc/main', {
56
+ key: 'blockcypher',
57
+ }),
58
+ utxo('https://mempool.space/api', {
59
+ key: 'mempool',
60
+ }),
61
+ ]),
62
+ }).extend(UTXOAPIActions)
63
+ publicAPIClients[chainId] = client
64
+ }
65
+
66
+ if (!publicAPIClients[chainId]) {
67
+ throw new Error(`Unable to configure provider for chain ${chainId}`)
68
+ }
69
+
70
+ return publicAPIClients[chainId]
71
+ }
@@ -0,0 +1,31 @@
1
+ import { ChainId, type Token, type TokenAmount } from '@lifi/types'
2
+ import { getUTXOAPIPublicClient } from './getUTXOAPIPublicClient.js'
3
+ import { getUTXOPublicClient } from './getUTXOPublicClient.js'
4
+
5
+ export const getUTXOBalance = async (
6
+ walletAddress: string,
7
+ tokens: Token[]
8
+ ): Promise<TokenAmount[]> => {
9
+ if (tokens.length === 0) {
10
+ return []
11
+ }
12
+ const { chainId } = tokens[0]
13
+ tokens.forEach((token) => {
14
+ if (token.chainId !== chainId) {
15
+ console.warn(`Requested tokens have to be on the same chain.`)
16
+ }
17
+ })
18
+
19
+ const apiClient = await getUTXOAPIPublicClient(ChainId.BTC)
20
+ const client = await getUTXOPublicClient(ChainId.BTC)
21
+ const [balance, blockCount] = await Promise.all([
22
+ apiClient.getBalance({ address: walletAddress }),
23
+ client.getBlockCount(),
24
+ ])
25
+
26
+ return tokens.map((token) => ({
27
+ ...token,
28
+ amount: balance,
29
+ blockNumber: BigInt(blockCount),
30
+ }))
31
+ }
@@ -0,0 +1,60 @@
1
+ import {
2
+ createClient,
3
+ fallback,
4
+ http,
5
+ rpcSchema,
6
+ type Chain,
7
+ type Client,
8
+ type FallbackTransport,
9
+ type HttpTransport,
10
+ } from 'viem'
11
+ import { config } from '../../config.js'
12
+ import { getRpcUrls } from '../rpc.js'
13
+ import { UTXOActions } from './utxo-stack/decorators/UTXOActions.js'
14
+ import type { UTXOSchema } from './utxo-stack/transports/utxo/types.js'
15
+
16
+ // cached providers
17
+ const publicClients: Record<
18
+ number,
19
+ Client<
20
+ FallbackTransport<readonly HttpTransport[]>,
21
+ Chain,
22
+ undefined,
23
+ UTXOSchema,
24
+ UTXOActions
25
+ >
26
+ > = {}
27
+
28
+ /**
29
+ * Get an instance of a provider for a specific chain
30
+ * @param chainId - Id of the chain the provider is for
31
+ * @returns The public client for the given chain
32
+ */
33
+ export const getUTXOPublicClient = async (chainId: number) => {
34
+ if (!publicClients[chainId]) {
35
+ const urls = await getRpcUrls(chainId)
36
+ const fallbackTransports = urls.map((url) => http(url))
37
+ const _chain = await config.getChainById(chainId)
38
+ const chain: Chain = {
39
+ ..._chain,
40
+ ..._chain.metamask,
41
+ name: _chain.metamask.chainName,
42
+ rpcUrls: {
43
+ default: { http: _chain.metamask.rpcUrls },
44
+ public: { http: _chain.metamask.rpcUrls },
45
+ },
46
+ }
47
+ const client = createClient({
48
+ chain,
49
+ rpcSchema: rpcSchema<UTXOSchema>(),
50
+ transport: fallback(fallbackTransports),
51
+ }).extend(UTXOActions)
52
+ publicClients[chainId] = client
53
+ }
54
+
55
+ if (!publicClients[chainId]) {
56
+ throw new Error(`Unable to configure provider for chain ${chainId}`)
57
+ }
58
+
59
+ return publicClients[chainId]
60
+ }