@andrewkimjoseph/celina-sdk 0.9.7 → 0.9.9

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 (365) hide show
  1. package/build/analytics/mcp-tool-events.js +2 -0
  2. package/build/analytics/mcp-tool-events.js.map +1 -1
  3. package/build/index.d.ts +1 -1
  4. package/build/services/gooddollar.service.d.ts +16 -2
  5. package/build/services/gooddollar.service.js +54 -31
  6. package/build/services/gooddollar.service.js.map +1 -1
  7. package/build/src/a2a/agent-card.d.ts +37 -0
  8. package/build/src/a2a/agent-card.js +46 -0
  9. package/build/src/a2a/agent-card.js.map +1 -0
  10. package/build/src/a2a/index.d.ts +2 -0
  11. package/build/src/a2a/index.js +3 -0
  12. package/build/src/a2a/index.js.map +1 -0
  13. package/build/src/a2a/skills.d.ts +18 -0
  14. package/build/src/a2a/skills.js +101 -0
  15. package/build/src/a2a/skills.js.map +1 -0
  16. package/build/src/abis/aave-pool.d.ts +37 -0
  17. package/build/src/abis/aave-pool.js +26 -0
  18. package/build/src/abis/aave-pool.js.map +1 -0
  19. package/build/src/abis/accounts.d.ts +13 -0
  20. package/build/src/abis/accounts.js +10 -0
  21. package/build/src/abis/accounts.js.map +1 -0
  22. package/build/src/abis/election.d.ts +124 -0
  23. package/build/src/abis/election.js +88 -0
  24. package/build/src/abis/election.js.map +1 -0
  25. package/build/src/abis/gooddollar-broker.d.ts +77 -0
  26. package/build/src/abis/gooddollar-broker.js +44 -0
  27. package/build/src/abis/gooddollar-broker.js.map +1 -0
  28. package/build/src/abis/gooddollar-identity.d.ts +85 -0
  29. package/build/src/abis/gooddollar-identity.js +52 -0
  30. package/build/src/abis/gooddollar-identity.js.map +1 -0
  31. package/build/src/abis/governance.d.ts +86 -0
  32. package/build/src/abis/governance.js +68 -0
  33. package/build/src/abis/governance.js.map +1 -0
  34. package/build/src/abis/locked-gold.d.ts +10 -0
  35. package/build/src/abis/locked-gold.js +10 -0
  36. package/build/src/abis/locked-gold.js.map +1 -0
  37. package/build/src/abis/nft.d.ts +107 -0
  38. package/build/src/abis/nft.js +75 -0
  39. package/build/src/abis/nft.js.map +1 -0
  40. package/build/src/abis/permit2.d.ts +43 -0
  41. package/build/src/abis/permit2.js +30 -0
  42. package/build/src/abis/permit2.js.map +1 -0
  43. package/build/src/abis/self-registry.d.ts +194 -0
  44. package/build/src/abis/self-registry.js +120 -0
  45. package/build/src/abis/self-registry.js.map +1 -0
  46. package/build/src/abis/ubi-scheme.d.ts +91 -0
  47. package/build/src/abis/ubi-scheme.js +66 -0
  48. package/build/src/abis/ubi-scheme.js.map +1 -0
  49. package/build/src/abis/uniswap-state-view.d.ts +34 -0
  50. package/build/src/abis/uniswap-state-view.js +22 -0
  51. package/build/src/abis/uniswap-state-view.js.map +1 -0
  52. package/build/src/abis/uniswap-v4-quoter.d.ts +86 -0
  53. package/build/src/abis/uniswap-v4-quoter.js +64 -0
  54. package/build/src/abis/uniswap-v4-quoter.js.map +1 -0
  55. package/build/src/abis/universal-router.d.ts +16 -0
  56. package/build/src/abis/universal-router.js +14 -0
  57. package/build/src/abis/universal-router.js.map +1 -0
  58. package/build/src/abis/validators-minimal.d.ts +65 -0
  59. package/build/src/abis/validators-minimal.js +39 -0
  60. package/build/src/abis/validators-minimal.js.map +1 -0
  61. package/build/src/analytics/amplitude.d.ts +11 -0
  62. package/build/src/analytics/amplitude.js +76 -0
  63. package/build/src/analytics/amplitude.js.map +1 -0
  64. package/build/src/analytics/config.d.ts +7 -0
  65. package/build/src/analytics/config.js +28 -0
  66. package/build/src/analytics/config.js.map +1 -0
  67. package/build/src/analytics/consumer-package.d.ts +9 -0
  68. package/build/src/analytics/consumer-package.js +143 -0
  69. package/build/src/analytics/consumer-package.js.map +1 -0
  70. package/build/src/analytics/mcp-tool-events.d.ts +5 -0
  71. package/build/src/analytics/mcp-tool-events.js +53 -0
  72. package/build/src/analytics/mcp-tool-events.js.map +1 -0
  73. package/build/src/analytics/wallet-context.d.ts +11 -0
  74. package/build/src/analytics/wallet-context.js +81 -0
  75. package/build/src/analytics/wallet-context.js.map +1 -0
  76. package/build/src/analytics/wallet-extract.d.ts +9 -0
  77. package/build/src/analytics/wallet-extract.js +21 -0
  78. package/build/src/analytics/wallet-extract.js.map +1 -0
  79. package/build/src/analytics/wrap-service.d.ts +5 -0
  80. package/build/src/analytics/wrap-service.js +38 -0
  81. package/build/src/analytics/wrap-service.js.map +1 -0
  82. package/build/src/clients/celo-client.d.ts +17 -0
  83. package/build/src/clients/celo-client.js +28 -0
  84. package/build/src/clients/celo-client.js.map +1 -0
  85. package/build/src/clients/ens-client.d.ts +17 -0
  86. package/build/src/clients/ens-client.js +30 -0
  87. package/build/src/clients/ens-client.js.map +1 -0
  88. package/build/src/clients/mento-sdk.d.ts +2 -0
  89. package/build/src/clients/mento-sdk.js +9 -0
  90. package/build/src/clients/mento-sdk.js.map +1 -0
  91. package/build/src/clients/self-api.d.ts +82 -0
  92. package/build/src/clients/self-api.js +242 -0
  93. package/build/src/clients/self-api.js.map +1 -0
  94. package/build/src/clients/uniswap-sdk.d.ts +4 -0
  95. package/build/src/clients/uniswap-sdk.js +13 -0
  96. package/build/src/clients/uniswap-sdk.js.map +1 -0
  97. package/build/src/config/aave.d.ts +17 -0
  98. package/build/src/config/aave.js +77 -0
  99. package/build/src/config/aave.js.map +1 -0
  100. package/build/src/config/celina-tag.d.ts +4 -0
  101. package/build/src/config/celina-tag.js +13 -0
  102. package/build/src/config/celina-tag.js.map +1 -0
  103. package/build/src/config/celo-core-contracts.d.ts +8 -0
  104. package/build/src/config/celo-core-contracts.js +9 -0
  105. package/build/src/config/celo-core-contracts.js.map +1 -0
  106. package/build/src/config/chains.d.ts +937 -0
  107. package/build/src/config/chains.js +319 -0
  108. package/build/src/config/chains.js.map +1 -0
  109. package/build/src/config/gooddollar.d.ts +16 -0
  110. package/build/src/config/gooddollar.js +24 -0
  111. package/build/src/config/gooddollar.js.map +1 -0
  112. package/build/src/config/sdk-config.d.ts +33 -0
  113. package/build/src/config/sdk-config.js +31 -0
  114. package/build/src/config/sdk-config.js.map +1 -0
  115. package/build/src/config/self.d.ts +22 -0
  116. package/build/src/config/self.js +27 -0
  117. package/build/src/config/self.js.map +1 -0
  118. package/build/src/config/uniswap.d.ts +42 -0
  119. package/build/src/config/uniswap.js +76 -0
  120. package/build/src/config/uniswap.js.map +1 -0
  121. package/build/src/index.d.ts +90 -0
  122. package/build/src/index.js +65 -0
  123. package/build/src/index.js.map +1 -0
  124. package/build/src/oasf/index.d.ts +2 -0
  125. package/build/src/oasf/index.js +3 -0
  126. package/build/src/oasf/index.js.map +1 -0
  127. package/build/src/oasf/record.d.ts +39 -0
  128. package/build/src/oasf/record.js +35 -0
  129. package/build/src/oasf/record.js.map +1 -0
  130. package/build/src/oasf/taxonomy.d.ts +19 -0
  131. package/build/src/oasf/taxonomy.js +46 -0
  132. package/build/src/oasf/taxonomy.js.map +1 -0
  133. package/build/src/services/aave.service.d.ts +58 -0
  134. package/build/src/services/aave.service.js +210 -0
  135. package/build/src/services/aave.service.js.map +1 -0
  136. package/build/src/services/account.service.d.ts +22 -0
  137. package/build/src/services/account.service.js +29 -0
  138. package/build/src/services/account.service.js.map +1 -0
  139. package/build/src/services/blockchain.service.d.ts +107 -0
  140. package/build/src/services/blockchain.service.js +151 -0
  141. package/build/src/services/blockchain.service.js.map +1 -0
  142. package/build/src/services/contract.service.d.ts +78 -0
  143. package/build/src/services/contract.service.js +117 -0
  144. package/build/src/services/contract.service.js.map +1 -0
  145. package/build/src/services/ens.service.d.ts +44 -0
  146. package/build/src/services/ens.service.js +92 -0
  147. package/build/src/services/ens.service.js.map +1 -0
  148. package/build/src/services/gooddollar.service.d.ts +183 -0
  149. package/build/src/services/gooddollar.service.js +675 -0
  150. package/build/src/services/gooddollar.service.js.map +1 -0
  151. package/build/src/services/governance.service.d.ts +96 -0
  152. package/build/src/services/governance.service.js +255 -0
  153. package/build/src/services/governance.service.js.map +1 -0
  154. package/build/src/services/mento-fx.service.d.ts +80 -0
  155. package/build/src/services/mento-fx.service.js +319 -0
  156. package/build/src/services/mento-fx.service.js.map +1 -0
  157. package/build/src/services/nft.service.d.ts +58 -0
  158. package/build/src/services/nft.service.js +222 -0
  159. package/build/src/services/nft.service.js.map +1 -0
  160. package/build/src/services/self-session-store.d.ts +19 -0
  161. package/build/src/services/self-session-store.js +28 -0
  162. package/build/src/services/self-session-store.js.map +1 -0
  163. package/build/src/services/self.service.d.ts +241 -0
  164. package/build/src/services/self.service.js +699 -0
  165. package/build/src/services/self.service.js.map +1 -0
  166. package/build/src/services/staking.service.d.ts +140 -0
  167. package/build/src/services/staking.service.js +444 -0
  168. package/build/src/services/staking.service.js.map +1 -0
  169. package/build/src/services/token.service.d.ts +110 -0
  170. package/build/src/services/token.service.js +189 -0
  171. package/build/src/services/token.service.js.map +1 -0
  172. package/build/src/services/transaction.service.d.ts +68 -0
  173. package/build/src/services/transaction.service.js +198 -0
  174. package/build/src/services/transaction.service.js.map +1 -0
  175. package/build/src/services/uniswap-path-router.d.ts +40 -0
  176. package/build/src/services/uniswap-path-router.js +168 -0
  177. package/build/src/services/uniswap-path-router.js.map +1 -0
  178. package/build/src/services/uniswap-pool-discovery.d.ts +55 -0
  179. package/build/src/services/uniswap-pool-discovery.js +198 -0
  180. package/build/src/services/uniswap-pool-discovery.js.map +1 -0
  181. package/build/src/services/uniswap.service.d.ts +82 -0
  182. package/build/src/services/uniswap.service.js +352 -0
  183. package/build/src/services/uniswap.service.js.map +1 -0
  184. package/build/src/simulation/index.d.ts +5 -0
  185. package/build/src/simulation/index.js +2 -0
  186. package/build/src/simulation/index.js.map +1 -0
  187. package/build/src/simulation/simulate-prepared-step.d.ts +17 -0
  188. package/build/src/simulation/simulate-prepared-step.js +42 -0
  189. package/build/src/simulation/simulate-prepared-step.js.map +1 -0
  190. package/build/src/tools/catalog.d.ts +11 -0
  191. package/build/src/tools/catalog.js +43 -0
  192. package/build/src/tools/catalog.js.map +1 -0
  193. package/build/src/tools/domains/aave.d.ts +2 -0
  194. package/build/src/tools/domains/aave.js +115 -0
  195. package/build/src/tools/domains/aave.js.map +1 -0
  196. package/build/src/tools/domains/blockchain.d.ts +2 -0
  197. package/build/src/tools/domains/blockchain.js +86 -0
  198. package/build/src/tools/domains/blockchain.js.map +1 -0
  199. package/build/src/tools/domains/browser.d.ts +2 -0
  200. package/build/src/tools/domains/browser.js +45 -0
  201. package/build/src/tools/domains/browser.js.map +1 -0
  202. package/build/src/tools/domains/contract.d.ts +2 -0
  203. package/build/src/tools/domains/contract.js +67 -0
  204. package/build/src/tools/domains/contract.js.map +1 -0
  205. package/build/src/tools/domains/ens.d.ts +2 -0
  206. package/build/src/tools/domains/ens.js +16 -0
  207. package/build/src/tools/domains/ens.js.map +1 -0
  208. package/build/src/tools/domains/gooddollar.d.ts +2 -0
  209. package/build/src/tools/domains/gooddollar.js +171 -0
  210. package/build/src/tools/domains/gooddollar.js.map +1 -0
  211. package/build/src/tools/domains/governance.d.ts +2 -0
  212. package/build/src/tools/domains/governance.js +41 -0
  213. package/build/src/tools/domains/governance.js.map +1 -0
  214. package/build/src/tools/domains/index.d.ts +1 -0
  215. package/build/src/tools/domains/index.js +31 -0
  216. package/build/src/tools/domains/index.js.map +1 -0
  217. package/build/src/tools/domains/mento-fx.d.ts +2 -0
  218. package/build/src/tools/domains/mento-fx.js +67 -0
  219. package/build/src/tools/domains/mento-fx.js.map +1 -0
  220. package/build/src/tools/domains/nft.d.ts +2 -0
  221. package/build/src/tools/domains/nft.js +38 -0
  222. package/build/src/tools/domains/nft.js.map +1 -0
  223. package/build/src/tools/domains/self.d.ts +2 -0
  224. package/build/src/tools/domains/self.js +187 -0
  225. package/build/src/tools/domains/self.js.map +1 -0
  226. package/build/src/tools/domains/staking.d.ts +2 -0
  227. package/build/src/tools/domains/staking.js +74 -0
  228. package/build/src/tools/domains/staking.js.map +1 -0
  229. package/build/src/tools/domains/token.d.ts +2 -0
  230. package/build/src/tools/domains/token.js +74 -0
  231. package/build/src/tools/domains/token.js.map +1 -0
  232. package/build/src/tools/domains/transaction.d.ts +2 -0
  233. package/build/src/tools/domains/transaction.js +120 -0
  234. package/build/src/tools/domains/transaction.js.map +1 -0
  235. package/build/src/tools/domains/uniswap.d.ts +2 -0
  236. package/build/src/tools/domains/uniswap.js +67 -0
  237. package/build/src/tools/domains/uniswap.js.map +1 -0
  238. package/build/src/tools/filter.d.ts +2 -0
  239. package/build/src/tools/filter.js +50 -0
  240. package/build/src/tools/filter.js.map +1 -0
  241. package/build/src/tools/index.d.ts +7 -0
  242. package/build/src/tools/index.js +7 -0
  243. package/build/src/tools/index.js.map +1 -0
  244. package/build/src/tools/schemas/common.d.ts +165 -0
  245. package/build/src/tools/schemas/common.js +207 -0
  246. package/build/src/tools/schemas/common.js.map +1 -0
  247. package/build/src/tools/schemas/wallet-params.d.ts +9 -0
  248. package/build/src/tools/schemas/wallet-params.js +52 -0
  249. package/build/src/tools/schemas/wallet-params.js.map +1 -0
  250. package/build/src/tools/swap-routing.d.ts +25 -0
  251. package/build/src/tools/swap-routing.js +174 -0
  252. package/build/src/tools/swap-routing.js.map +1 -0
  253. package/build/src/tools/types.d.ts +124 -0
  254. package/build/src/tools/types.js +2 -0
  255. package/build/src/tools/types.js.map +1 -0
  256. package/build/src/tools/utils/normalize-token.d.ts +2 -0
  257. package/build/src/tools/utils/normalize-token.js +12 -0
  258. package/build/src/tools/utils/normalize-token.js.map +1 -0
  259. package/build/src/tools/utils/wallet.d.ts +4 -0
  260. package/build/src/tools/utils/wallet.js +8 -0
  261. package/build/src/tools/utils/wallet.js.map +1 -0
  262. package/build/src/tools/website-sync.d.ts +28 -0
  263. package/build/src/tools/website-sync.js +165 -0
  264. package/build/src/tools/website-sync.js.map +1 -0
  265. package/build/src/types/prepared.d.ts +28 -0
  266. package/build/src/types/prepared.js +12 -0
  267. package/build/src/types/prepared.js.map +1 -0
  268. package/build/src/utils/celo-format.d.ts +6 -0
  269. package/build/src/utils/celo-format.js +17 -0
  270. package/build/src/utils/celo-format.js.map +1 -0
  271. package/build/src/utils/erc20-allowance-storage.d.ts +20 -0
  272. package/build/src/utils/erc20-allowance-storage.js +64 -0
  273. package/build/src/utils/erc20-allowance-storage.js.map +1 -0
  274. package/build/src/utils/format-date.d.ts +2 -0
  275. package/build/src/utils/format-date.js +13 -0
  276. package/build/src/utils/format-date.js.map +1 -0
  277. package/build/src/utils/format-duration.d.ts +2 -0
  278. package/build/src/utils/format-duration.js +17 -0
  279. package/build/src/utils/format-duration.js.map +1 -0
  280. package/build/src/utils/format-unix-datetime.d.ts +4 -0
  281. package/build/src/utils/format-unix-datetime.js +18 -0
  282. package/build/src/utils/format-unix-datetime.js.map +1 -0
  283. package/build/src/utils/gooddollar-ubi-period.d.ts +23 -0
  284. package/build/src/utils/gooddollar-ubi-period.js +23 -0
  285. package/build/src/utils/gooddollar-ubi-period.js.map +1 -0
  286. package/build/src/utils/normalize-address.d.ts +7 -0
  287. package/build/src/utils/normalize-address.js +16 -0
  288. package/build/src/utils/normalize-address.js.map +1 -0
  289. package/build/src/utils/self-format.d.ts +28 -0
  290. package/build/src/utils/self-format.js +79 -0
  291. package/build/src/utils/self-format.js.map +1 -0
  292. package/build/src/utils/self-signing.d.ts +4 -0
  293. package/build/src/utils/self-signing.js +38 -0
  294. package/build/src/utils/self-signing.js.map +1 -0
  295. package/build/src/utils/transaction-errors.d.ts +3 -0
  296. package/build/src/utils/transaction-errors.js +17 -0
  297. package/build/src/utils/transaction-errors.js.map +1 -0
  298. package/build/tests/catalog/domains/blockchain.d.ts +2 -0
  299. package/build/tests/catalog/domains/blockchain.js +127 -0
  300. package/build/tests/catalog/domains/blockchain.js.map +1 -0
  301. package/build/tests/catalog/domains/chain-ext.d.ts +5 -0
  302. package/build/tests/catalog/domains/chain-ext.js +207 -0
  303. package/build/tests/catalog/domains/chain-ext.js.map +1 -0
  304. package/build/tests/catalog/domains/defi.d.ts +6 -0
  305. package/build/tests/catalog/domains/defi.js +581 -0
  306. package/build/tests/catalog/domains/defi.js.map +1 -0
  307. package/build/tests/catalog/domains/self.d.ts +2 -0
  308. package/build/tests/catalog/domains/self.js +208 -0
  309. package/build/tests/catalog/domains/self.js.map +1 -0
  310. package/build/tests/catalog/domains/token.d.ts +2 -0
  311. package/build/tests/catalog/domains/token.js +70 -0
  312. package/build/tests/catalog/domains/token.js.map +1 -0
  313. package/build/tests/catalog/domains/transaction.d.ts +2 -0
  314. package/build/tests/catalog/domains/transaction.js +96 -0
  315. package/build/tests/catalog/domains/transaction.js.map +1 -0
  316. package/build/tests/catalog/index.d.ts +2 -0
  317. package/build/tests/catalog/index.js +2 -0
  318. package/build/tests/catalog/index.js.map +1 -0
  319. package/build/tests/catalog/operations.d.ts +12 -0
  320. package/build/tests/catalog/operations.js +29 -0
  321. package/build/tests/catalog/operations.js.map +1 -0
  322. package/build/tests/catalog/types.d.ts +24 -0
  323. package/build/tests/catalog/types.js +2 -0
  324. package/build/tests/catalog/types.js.map +1 -0
  325. package/build/tests/fixtures/mainnet.d.ts +54 -0
  326. package/build/tests/fixtures/mainnet.js +53 -0
  327. package/build/tests/fixtures/mainnet.js.map +1 -0
  328. package/build/tests/helpers/assert.d.ts +4 -0
  329. package/build/tests/helpers/assert.js +24 -0
  330. package/build/tests/helpers/assert.js.map +1 -0
  331. package/build/tests/helpers/env.d.ts +11 -0
  332. package/build/tests/helpers/env.js +28 -0
  333. package/build/tests/helpers/env.js.map +1 -0
  334. package/build/tests/helpers/gating.d.ts +3 -0
  335. package/build/tests/helpers/gating.js +23 -0
  336. package/build/tests/helpers/gating.js.map +1 -0
  337. package/build/tests/testing-entry.d.ts +6 -0
  338. package/build/tests/testing-entry.js +6 -0
  339. package/build/tests/testing-entry.js.map +1 -0
  340. package/build/tools/domains/browser.js +4 -1
  341. package/build/tools/domains/browser.js.map +1 -1
  342. package/build/tools/domains/gooddollar.js +11 -7
  343. package/build/tools/domains/gooddollar.js.map +1 -1
  344. package/build/tools/schemas/common.d.ts +7 -0
  345. package/build/tools/schemas/common.js +9 -1
  346. package/build/tools/schemas/common.js.map +1 -1
  347. package/build/tools/swap-routing.d.ts +1 -0
  348. package/build/tools/swap-routing.js +2 -1
  349. package/build/tools/swap-routing.js.map +1 -1
  350. package/package.json +5 -9
  351. package/tests/README.md +0 -78
  352. package/tests/catalog/domains/blockchain.ts +0 -133
  353. package/tests/catalog/domains/chain-ext.ts +0 -219
  354. package/tests/catalog/domains/defi.ts +0 -532
  355. package/tests/catalog/domains/self.ts +0 -220
  356. package/tests/catalog/domains/token.ts +0 -74
  357. package/tests/catalog/domains/transaction.ts +0 -111
  358. package/tests/catalog/index.ts +0 -7
  359. package/tests/catalog/operations.ts +0 -53
  360. package/tests/catalog/types.ts +0 -27
  361. package/tests/fixtures/mainnet.ts +0 -93
  362. package/tests/helpers/assert.ts +0 -30
  363. package/tests/helpers/env.ts +0 -38
  364. package/tests/helpers/gating.ts +0 -36
  365. package/tests/testing-entry.ts +0 -27
@@ -0,0 +1,29 @@
1
+ /** CELO mainnet account snapshot for a wallet or contract address. */
2
+ export class AccountService {
3
+ clientFactory;
4
+ constructor(clientFactory) {
5
+ this.clientFactory = clientFactory;
6
+ }
7
+ /**
8
+ * Fetch CELO balance, nonce, and whether the address has contract bytecode.
9
+ * @param address - Wallet or contract address on Celo mainnet
10
+ * @returns Balance in wei and CELO, current nonce, and `isContract` flag
11
+ */
12
+ async getAccount(address) {
13
+ const { public: client } = this.clientFactory.getClients();
14
+ const [balance, nonce, bytecode] = await Promise.all([
15
+ client.getBalance({ address }),
16
+ client.getTransactionCount({ address }),
17
+ client.getCode({ address }),
18
+ ]);
19
+ return {
20
+ address,
21
+ network: "mainnet",
22
+ balanceWei: balance.toString(),
23
+ balanceCelo: Number(balance) / 1e18,
24
+ nonce,
25
+ isContract: bytecode !== undefined && bytecode !== "0x",
26
+ };
27
+ }
28
+ }
29
+ //# sourceMappingURL=account.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.service.js","sourceRoot":"","sources":["../../../src/services/account.service.ts"],"names":[],"mappings":"AAKA,sEAAsE;AACtE,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;IAAG,CAAC;IAEjE;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACnD,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC9B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI;YACnC,KAAK;YACL,UAAU,EAAE,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;SACxD,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Chain reads: network status, blocks, and transaction lookups on Celo mainnet.
3
+ */
4
+ import type { CeloClientFactory } from "../clients/celo-client.js";
5
+ /** Celo mainnet block and transaction queries. */
6
+ export declare class BlockchainService {
7
+ private readonly clientFactory;
8
+ constructor(clientFactory: CeloClientFactory);
9
+ /**
10
+ * Celo mainnet chain id, latest block number, and current gas price.
11
+ * @returns Network metadata including `chainId`, `blockNumber`, and `gasPriceWei`
12
+ */
13
+ getNetworkStatus(): Promise<{
14
+ network: string;
15
+ chainId: number;
16
+ blockNumber: string;
17
+ gasPriceWei: string;
18
+ }>;
19
+ /**
20
+ * Fetch a block by number, hash, or tag.
21
+ * @param blockId - Block number, hash, `latest`, or `pending`
22
+ * @param options.includeTransactions - When true, include full transaction objects
23
+ * @returns Block header fields and optional transaction list
24
+ * @throws When the block is not found
25
+ */
26
+ getBlock(blockId: number | string | "latest" | "pending", options?: {
27
+ includeTransactions?: boolean;
28
+ }): Promise<{
29
+ number: string | undefined;
30
+ hash: `0x${string}` | null;
31
+ timestamp: string;
32
+ parentHash: `0x${string}`;
33
+ gasUsed: string;
34
+ gasLimit: string;
35
+ gasUtilization: number;
36
+ miner: `0x${string}`;
37
+ transactionCount: number;
38
+ transactions: (`0x${string}` | {
39
+ hash: `0x${string}`;
40
+ from: `0x${string}`;
41
+ to: `0x${string}` | null;
42
+ value: string;
43
+ valueCelo: number;
44
+ nonce: number;
45
+ gas: string;
46
+ gasPrice: string | undefined;
47
+ gasPriceGwei: number | undefined;
48
+ input: `0x${string}`;
49
+ blockNumber: string | undefined;
50
+ transactionIndex: number | null | undefined;
51
+ type: string | undefined;
52
+ })[] | undefined;
53
+ }>;
54
+ /**
55
+ * List recent blocks ending at the chain tip (newest last in the array).
56
+ * @param count - Number of blocks to return (1–100, default 5)
57
+ * @param offset - Skip this many blocks from the tip before collecting
58
+ * @returns Summary fields per block (no full transaction payloads)
59
+ */
60
+ getLatestBlocks(count?: number, offset?: number): Promise<{
61
+ number: string;
62
+ hash: `0x${string}`;
63
+ timestamp: string;
64
+ transactionCount: number;
65
+ gasUsed: string;
66
+ gasLimit: string;
67
+ gasUtilization: number;
68
+ }[]>;
69
+ /**
70
+ * Fetch a transaction and its receipt by hash.
71
+ * @param hash - Transaction hash
72
+ * @returns Transaction fields, gas efficiency, and receipt status when mined
73
+ * @throws When the transaction is not found
74
+ */
75
+ getTransaction(hash: `0x${string}`): Promise<{
76
+ hash: `0x${string}`;
77
+ from: `0x${string}`;
78
+ to: `0x${string}` | null;
79
+ value: string;
80
+ valueCelo: number;
81
+ nonce: number;
82
+ gas: string;
83
+ gasPrice: string | undefined;
84
+ gasPriceGwei: number | undefined;
85
+ input: `0x${string}`;
86
+ blockNumber: string | undefined;
87
+ transactionIndex: number | null | undefined;
88
+ type: string | undefined;
89
+ } | {
90
+ status?: string | undefined;
91
+ gasUsed: string;
92
+ gasEfficiency: number;
93
+ hash: `0x${string}`;
94
+ from: `0x${string}`;
95
+ to: `0x${string}` | null;
96
+ value: string;
97
+ valueCelo: number;
98
+ nonce: number;
99
+ gas: string;
100
+ gasPrice: string | undefined;
101
+ gasPriceGwei: number | undefined;
102
+ input: `0x${string}`;
103
+ blockNumber: string | undefined;
104
+ transactionIndex: number | null | undefined;
105
+ type: string | undefined;
106
+ }>;
107
+ }
@@ -0,0 +1,151 @@
1
+ function serializeTransactionSummary(tx, extras) {
2
+ const base = {
3
+ hash: tx.hash,
4
+ from: tx.from,
5
+ to: tx.to,
6
+ value: tx.value.toString(),
7
+ valueCelo: Number(tx.value) / 1e18,
8
+ nonce: tx.nonce,
9
+ gas: tx.gas.toString(),
10
+ gasPrice: tx.gasPrice?.toString(),
11
+ gasPriceGwei: tx.gasPrice ? Number(tx.gasPrice) / 1e9 : undefined,
12
+ input: tx.input,
13
+ blockNumber: tx.blockNumber?.toString(),
14
+ transactionIndex: tx.transactionIndex,
15
+ type: tx.type,
16
+ };
17
+ if (!extras) {
18
+ return base;
19
+ }
20
+ const gasEfficiency = tx.gas > 0n
21
+ ? Number((extras.gasUsed * 10000n) / tx.gas) / 100
22
+ : 0;
23
+ return {
24
+ ...base,
25
+ gasUsed: extras.gasUsed.toString(),
26
+ gasEfficiency,
27
+ ...(extras.status !== undefined ? { status: extras.status } : {}),
28
+ };
29
+ }
30
+ /** Celo mainnet block and transaction queries. */
31
+ export class BlockchainService {
32
+ clientFactory;
33
+ constructor(clientFactory) {
34
+ this.clientFactory = clientFactory;
35
+ }
36
+ /**
37
+ * Celo mainnet chain id, latest block number, and current gas price.
38
+ * @returns Network metadata including `chainId`, `blockNumber`, and `gasPriceWei`
39
+ */
40
+ async getNetworkStatus() {
41
+ const { public: client } = this.clientFactory.getClients();
42
+ const [chainId, blockNumber, gasPrice] = await Promise.all([
43
+ client.getChainId(),
44
+ client.getBlockNumber(),
45
+ client.getGasPrice(),
46
+ ]);
47
+ return {
48
+ network: "mainnet",
49
+ chainId,
50
+ blockNumber: blockNumber.toString(),
51
+ gasPriceWei: gasPrice.toString(),
52
+ };
53
+ }
54
+ /**
55
+ * Fetch a block by number, hash, or tag.
56
+ * @param blockId - Block number, hash, `latest`, or `pending`
57
+ * @param options.includeTransactions - When true, include full transaction objects
58
+ * @returns Block header fields and optional transaction list
59
+ * @throws When the block is not found
60
+ */
61
+ async getBlock(blockId, options) {
62
+ const { public: client } = this.clientFactory.getClients();
63
+ const includeTransactions = options?.includeTransactions ?? false;
64
+ const blockParams = typeof blockId === "number"
65
+ ? {
66
+ blockNumber: BigInt(blockId),
67
+ includeTransactions,
68
+ }
69
+ : blockId === "latest" || blockId === "pending"
70
+ ? {
71
+ blockTag: blockId,
72
+ includeTransactions,
73
+ }
74
+ : {
75
+ blockHash: blockId,
76
+ includeTransactions,
77
+ };
78
+ const block = await client.getBlock(blockParams);
79
+ if (!block) {
80
+ throw new Error(`Block not found: ${blockId}`);
81
+ }
82
+ const gasUtilization = block.gasLimit > 0n
83
+ ? Number((block.gasUsed * 10000n) / block.gasLimit) / 100
84
+ : 0;
85
+ return {
86
+ number: block.number?.toString(),
87
+ hash: block.hash,
88
+ timestamp: block.timestamp.toString(),
89
+ parentHash: block.parentHash,
90
+ gasUsed: block.gasUsed.toString(),
91
+ gasLimit: block.gasLimit.toString(),
92
+ gasUtilization,
93
+ miner: block.miner,
94
+ transactionCount: block.transactions.length,
95
+ transactions: includeTransactions
96
+ ? block.transactions.map((tx) => typeof tx === "string"
97
+ ? tx
98
+ : serializeTransactionSummary(tx))
99
+ : undefined,
100
+ };
101
+ }
102
+ /**
103
+ * List recent blocks ending at the chain tip (newest last in the array).
104
+ * @param count - Number of blocks to return (1–100, default 5)
105
+ * @param offset - Skip this many blocks from the tip before collecting
106
+ * @returns Summary fields per block (no full transaction payloads)
107
+ */
108
+ async getLatestBlocks(count = 5, offset = 0) {
109
+ const { public: client } = this.clientFactory.getClients();
110
+ const latest = await client.getBlockNumber();
111
+ const safeCount = Math.min(Math.max(count, 1), 100);
112
+ const safeOffset = Math.max(offset, 0);
113
+ const start = latest - BigInt(safeOffset + safeCount - 1);
114
+ const blocks = await Promise.all(Array.from({ length: safeCount }, (_, index) => client.getBlock({ blockNumber: start + BigInt(index) })));
115
+ return blocks.filter(Boolean).map((block) => {
116
+ const gasUtilization = block.gasLimit > 0n
117
+ ? Number((block.gasUsed * 10000n) / block.gasLimit) / 100
118
+ : 0;
119
+ return {
120
+ number: block.number?.toString(),
121
+ hash: block.hash,
122
+ timestamp: block.timestamp.toString(),
123
+ transactionCount: block.transactions.length,
124
+ gasUsed: block.gasUsed.toString(),
125
+ gasLimit: block.gasLimit.toString(),
126
+ gasUtilization,
127
+ };
128
+ });
129
+ }
130
+ /**
131
+ * Fetch a transaction and its receipt by hash.
132
+ * @param hash - Transaction hash
133
+ * @returns Transaction fields, gas efficiency, and receipt status when mined
134
+ * @throws When the transaction is not found
135
+ */
136
+ async getTransaction(hash) {
137
+ const { public: client } = this.clientFactory.getClients();
138
+ const [tx, receipt] = await Promise.all([
139
+ client.getTransaction({ hash }),
140
+ client.getTransactionReceipt({ hash }),
141
+ ]);
142
+ if (!tx) {
143
+ throw new Error(`Transaction not found: ${hash}`);
144
+ }
145
+ return serializeTransactionSummary(tx, {
146
+ gasUsed: receipt?.gasUsed ?? 0n,
147
+ status: receipt?.status,
148
+ });
149
+ }
150
+ }
151
+ //# sourceMappingURL=blockchain.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../../../src/services/blockchain.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Generic contract reads and gas estimates — caller supplies the ABI.
3
+ */
4
+ import { type Abi } from "viem";
5
+ import type { CeloClientFactory } from "../clients/celo-client.js";
6
+ /** Parameters for a read-only or gas-estimated contract call on Celo mainnet. */
7
+ export interface ContractCallParams {
8
+ /** Target contract address. */
9
+ contractAddress: `0x${string}`;
10
+ /** ABI function name to invoke. */
11
+ functionName: string;
12
+ /** Contract ABI JSON (must include `functionName`). */
13
+ abi: Abi;
14
+ /** Positional arguments for the function (default `[]`). */
15
+ functionArgs?: unknown[];
16
+ /** Optional `msg.sender` for state-dependent view calls. */
17
+ fromAddress?: `0x${string}`;
18
+ /** Wei value as decimal string for payable calls (default `"0"`). */
19
+ value?: string;
20
+ }
21
+ /** Read-only and gas-estimation helpers for arbitrary contracts. */
22
+ export declare class ContractService {
23
+ private readonly clientFactory;
24
+ constructor(clientFactory: CeloClientFactory);
25
+ /**
26
+ * Simulate a read-only contract call (`eth_call`).
27
+ * @param params - Contract address, ABI, function name, and optional args
28
+ * @returns Decoded result on success; `{ success: false, error }` on revert
29
+ */
30
+ callFunction(params: ContractCallParams): Promise<{
31
+ network: "mainnet";
32
+ contractAddress: `0x${string}`;
33
+ functionName: string;
34
+ result: unknown;
35
+ success: boolean;
36
+ error?: undefined;
37
+ } | {
38
+ network: "mainnet";
39
+ contractAddress: `0x${string}`;
40
+ functionName: string;
41
+ result: null;
42
+ success: boolean;
43
+ error: string;
44
+ }>;
45
+ /**
46
+ * Estimate gas for a contract call from `fromAddress`.
47
+ * @param params - Same as `callFunction` plus required `fromAddress`
48
+ * @returns Gas estimate, current gas price, and total cost in wei
49
+ */
50
+ estimateGas(params: ContractCallParams & {
51
+ fromAddress: `0x${string}`;
52
+ }): Promise<{
53
+ network: "mainnet";
54
+ contractAddress: `0x${string}`;
55
+ functionName: string;
56
+ gasEstimate: string;
57
+ gasPrice: string;
58
+ totalCost: string;
59
+ success: boolean;
60
+ error?: undefined;
61
+ } | {
62
+ network: "mainnet";
63
+ contractAddress: `0x${string}`;
64
+ functionName: string;
65
+ gasEstimate: string;
66
+ gasPrice: string;
67
+ totalCost: string;
68
+ success: boolean;
69
+ error: string;
70
+ }>;
71
+ }
72
+ /**
73
+ * Decode raw calldata result bytes using a single ABI function entry.
74
+ * @param abi - Contract ABI containing `functionName`
75
+ * @param functionName - Function whose return types define decoding
76
+ * @param data - Hex return data from `eth_call`
77
+ */
78
+ export declare function decodeContractResult(abi: Abi, functionName: string, data: `0x${string}`): readonly unknown[];
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Generic contract reads and gas estimates — caller supplies the ABI.
3
+ */
4
+ import { decodeFunctionResult, encodeFunctionData, } from "viem";
5
+ import { normalizeAddress } from "../utils/normalize-address.js";
6
+ function findAbiFunction(abi, functionName) {
7
+ const fn = abi.find((item) => item.type === "function" && item.name === functionName);
8
+ if (!fn) {
9
+ throw new Error(`Function "${functionName}" not found in ABI`);
10
+ }
11
+ return fn;
12
+ }
13
+ /** Read-only and gas-estimation helpers for arbitrary contracts. */
14
+ export class ContractService {
15
+ clientFactory;
16
+ constructor(clientFactory) {
17
+ this.clientFactory = clientFactory;
18
+ }
19
+ /**
20
+ * Simulate a read-only contract call (`eth_call`).
21
+ * @param params - Contract address, ABI, function name, and optional args
22
+ * @returns Decoded result on success; `{ success: false, error }` on revert
23
+ */
24
+ async callFunction(params) {
25
+ const contractAddress = normalizeAddress(params.contractAddress, "contract address");
26
+ const fromAddress = params.fromAddress
27
+ ? normalizeAddress(params.fromAddress, "from address")
28
+ : undefined;
29
+ const { public: client } = this.clientFactory.getClients();
30
+ const args = params.functionArgs ?? [];
31
+ try {
32
+ const result = await client.readContract({
33
+ address: contractAddress,
34
+ abi: params.abi,
35
+ functionName: params.functionName,
36
+ args: args,
37
+ ...(fromAddress ? { account: fromAddress } : {}),
38
+ });
39
+ return {
40
+ network: "mainnet",
41
+ contractAddress,
42
+ functionName: params.functionName,
43
+ result,
44
+ success: true,
45
+ };
46
+ }
47
+ catch (error) {
48
+ return {
49
+ network: "mainnet",
50
+ contractAddress,
51
+ functionName: params.functionName,
52
+ result: null,
53
+ success: false,
54
+ error: error instanceof Error ? error.message : String(error),
55
+ };
56
+ }
57
+ }
58
+ /**
59
+ * Estimate gas for a contract call from `fromAddress`.
60
+ * @param params - Same as `callFunction` plus required `fromAddress`
61
+ * @returns Gas estimate, current gas price, and total cost in wei
62
+ */
63
+ async estimateGas(params) {
64
+ const contractAddress = normalizeAddress(params.contractAddress, "contract address");
65
+ const fromAddress = normalizeAddress(params.fromAddress, "from address");
66
+ const { public: client } = this.clientFactory.getClients();
67
+ const args = params.functionArgs ?? [];
68
+ const value = params.value ? BigInt(params.value) : 0n;
69
+ try {
70
+ const data = encodeFunctionData({
71
+ abi: params.abi,
72
+ functionName: params.functionName,
73
+ args: args,
74
+ });
75
+ const gasEstimate = await client.estimateGas({
76
+ account: fromAddress,
77
+ to: contractAddress,
78
+ data,
79
+ value,
80
+ });
81
+ const gasPrice = await client.getGasPrice();
82
+ const totalCost = gasEstimate * gasPrice;
83
+ return {
84
+ network: "mainnet",
85
+ contractAddress,
86
+ functionName: params.functionName,
87
+ gasEstimate: gasEstimate.toString(),
88
+ gasPrice: gasPrice.toString(),
89
+ totalCost: totalCost.toString(),
90
+ success: true,
91
+ };
92
+ }
93
+ catch (error) {
94
+ return {
95
+ network: "mainnet",
96
+ contractAddress,
97
+ functionName: params.functionName,
98
+ gasEstimate: "0",
99
+ gasPrice: "0",
100
+ totalCost: "0",
101
+ success: false,
102
+ error: error instanceof Error ? error.message : String(error),
103
+ };
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * Decode raw calldata result bytes using a single ABI function entry.
109
+ * @param abi - Contract ABI containing `functionName`
110
+ * @param functionName - Function whose return types define decoding
111
+ * @param data - Hex return data from `eth_call`
112
+ */
113
+ export function decodeContractResult(abi, functionName, data) {
114
+ const fn = findAbiFunction(abi, functionName);
115
+ return decodeFunctionResult({ abi: [fn], functionName, data });
116
+ }
117
+ //# sourceMappingURL=contract.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.service.js","sourceRoot":"","sources":["../../../src/services/contract.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type EnsClientFactory } from "../clients/ens-client.js";
2
+ /** Chain used for ENS resolution. */
3
+ export type EnsResolveChain = "celo" | "ethereum";
4
+ /** Address with optional ENS metadata when input was a name. */
5
+ export type ResolvedRecipient = {
6
+ address: `0x${string}`;
7
+ ens?: {
8
+ name: string;
9
+ normalizedName: string;
10
+ /** Present when resolved on Celo (may fall back to Ethereum records). */
11
+ resolvedVia?: "celo" | "ethereum";
12
+ };
13
+ };
14
+ /** ENS name and address resolution for send/swap recipients. */
15
+ export declare class EnsService {
16
+ private readonly ensClientFactory;
17
+ constructor(ensClientFactory: EnsClientFactory);
18
+ /**
19
+ * Resolve an ENS name on Celo or Ethereum to an address.
20
+ * @param name - ENS name (e.g. `andrewkimjoseph.celo.eth`)
21
+ * @param chain - `"celo"` tries Celo coin type first, then Ethereum; `"ethereum"` uses ETH only
22
+ * @throws When no address record exists for the name
23
+ */
24
+ resolveEns(name: string, chain?: EnsResolveChain): Promise<{
25
+ name: string;
26
+ normalizedName: string;
27
+ address: `0x${string}`;
28
+ coinType: string;
29
+ chain: "ethereum";
30
+ resolvedVia?: undefined;
31
+ } | {
32
+ name: string;
33
+ normalizedName: string;
34
+ address: `0x${string}`;
35
+ coinType: string;
36
+ chain: "celo";
37
+ resolvedVia: "celo" | "ethereum";
38
+ }>;
39
+ /**
40
+ * Accept a raw `0x` address or ENS name; returns address plus optional ENS metadata.
41
+ * @param input - Hex address or ENS name
42
+ */
43
+ resolveAddressOrEns(input: string): Promise<ResolvedRecipient>;
44
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * ENS resolution on Celo (coin type 42220) and Ethereum mainnet.
3
+ */
4
+ import { toCoinType } from "viem";
5
+ import { celo } from "viem/chains";
6
+ import { getEnsAddress, normalize } from "viem/ens";
7
+ import { ENS_CCIP_GATEWAY, } from "../clients/ens-client.js";
8
+ const ADDRESS_PATTERN = /^0x[a-fA-F0-9]{40}$/;
9
+ /** ENS name and address resolution for send/swap recipients. */
10
+ export class EnsService {
11
+ ensClientFactory;
12
+ constructor(ensClientFactory) {
13
+ this.ensClientFactory = ensClientFactory;
14
+ }
15
+ /**
16
+ * Resolve an ENS name on Celo or Ethereum to an address.
17
+ * @param name - ENS name (e.g. `andrewkimjoseph.celo.eth`)
18
+ * @param chain - `"celo"` tries Celo coin type first, then Ethereum; `"ethereum"` uses ETH only
19
+ * @throws When no address record exists for the name
20
+ */
21
+ async resolveEns(name, chain = "celo") {
22
+ const trimmedName = name.trim();
23
+ const normalizedName = normalize(trimmedName);
24
+ const client = this.ensClientFactory.getClient();
25
+ const gatewayUrls = [ENS_CCIP_GATEWAY];
26
+ if (chain === "ethereum") {
27
+ const address = await getEnsAddress(client, {
28
+ name: normalizedName,
29
+ gatewayUrls,
30
+ });
31
+ if (!address) {
32
+ throw new Error(`ENS name "${trimmedName}" has no Ethereum address record`);
33
+ }
34
+ return {
35
+ name: trimmedName,
36
+ normalizedName,
37
+ address,
38
+ coinType: "60",
39
+ chain: "ethereum",
40
+ };
41
+ }
42
+ const celoCoinType = toCoinType(celo.id);
43
+ let address = await getEnsAddress(client, {
44
+ name: normalizedName,
45
+ coinType: celoCoinType,
46
+ gatewayUrls,
47
+ });
48
+ let coinType = celoCoinType.toString();
49
+ let resolvedVia = "celo";
50
+ if (!address) {
51
+ address = await getEnsAddress(client, {
52
+ name: normalizedName,
53
+ gatewayUrls,
54
+ });
55
+ coinType = "60";
56
+ resolvedVia = "ethereum";
57
+ }
58
+ if (!address) {
59
+ throw new Error(`ENS name "${trimmedName}" could not be resolved to an address`);
60
+ }
61
+ return {
62
+ name: trimmedName,
63
+ normalizedName,
64
+ address,
65
+ coinType,
66
+ chain: "celo",
67
+ resolvedVia,
68
+ };
69
+ }
70
+ /**
71
+ * Accept a raw `0x` address or ENS name; returns address plus optional ENS metadata.
72
+ * @param input - Hex address or ENS name
73
+ */
74
+ async resolveAddressOrEns(input) {
75
+ const trimmed = input.trim();
76
+ if (ADDRESS_PATTERN.test(trimmed)) {
77
+ return { address: trimmed };
78
+ }
79
+ const resolved = await this.resolveEns(trimmed);
80
+ return {
81
+ address: resolved.address,
82
+ ens: {
83
+ name: resolved.name,
84
+ normalizedName: resolved.normalizedName,
85
+ ...(resolved.chain === "celo"
86
+ ? { resolvedVia: resolved.resolvedVia }
87
+ : {}),
88
+ },
89
+ };
90
+ }
91
+ }
92
+ //# sourceMappingURL=ens.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ens.service.js","sourceRoot":"","sources":["../../../src/services/ens.service.ts"],"names":[],"mappings":"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"}