tapimo 0.0.0 → 0.0.2

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 (422) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/ApiKey.d.ts +65 -0
  4. package/dist/ApiKey.d.ts.map +1 -0
  5. package/dist/ApiKey.js +105 -0
  6. package/dist/ApiKey.js.map +1 -0
  7. package/dist/ApiKeySource.d.ts +166 -0
  8. package/dist/ApiKeySource.d.ts.map +1 -0
  9. package/dist/ApiKeySource.js +234 -0
  10. package/dist/ApiKeySource.js.map +1 -0
  11. package/dist/App.d.ts +19317 -0
  12. package/dist/App.d.ts.map +1 -0
  13. package/dist/App.js +612 -0
  14. package/dist/App.js.map +1 -0
  15. package/dist/Assets.d.ts +44 -0
  16. package/dist/Assets.d.ts.map +1 -0
  17. package/dist/Assets.js +23 -0
  18. package/dist/Assets.js.map +1 -0
  19. package/dist/Auth.d.ts +2 -0
  20. package/dist/Auth.d.ts.map +1 -0
  21. package/dist/Auth.js +2 -0
  22. package/dist/Auth.js.map +1 -0
  23. package/dist/Cli.d.ts +21 -0
  24. package/dist/Cli.d.ts.map +1 -0
  25. package/dist/Cli.js +13 -0
  26. package/dist/Cli.js.map +1 -0
  27. package/dist/Client.d.ts +20 -0
  28. package/dist/Client.d.ts.map +1 -0
  29. package/dist/Client.js +24 -0
  30. package/dist/Client.js.map +1 -0
  31. package/dist/Metrics.d.ts +70 -0
  32. package/dist/Metrics.d.ts.map +1 -0
  33. package/dist/Metrics.js +91 -0
  34. package/dist/Metrics.js.map +1 -0
  35. package/dist/Scope.d.ts +35 -0
  36. package/dist/Scope.d.ts.map +1 -0
  37. package/dist/Scope.js +38 -0
  38. package/dist/Scope.js.map +1 -0
  39. package/dist/Webhooks.d.ts +79 -0
  40. package/dist/Webhooks.d.ts.map +1 -0
  41. package/dist/Webhooks.js +107 -0
  42. package/dist/Webhooks.js.map +1 -0
  43. package/dist/admin/Access.d.ts +41 -0
  44. package/dist/admin/Access.d.ts.map +1 -0
  45. package/dist/admin/Access.js +75 -0
  46. package/dist/admin/Access.js.map +1 -0
  47. package/dist/admin/App.d.ts +1221 -0
  48. package/dist/admin/App.d.ts.map +1 -0
  49. package/dist/admin/App.js +113 -0
  50. package/dist/admin/App.js.map +1 -0
  51. package/dist/admin/apps/api-keys.d.ts +209 -0
  52. package/dist/admin/apps/api-keys.d.ts.map +1 -0
  53. package/dist/admin/apps/api-keys.js +129 -0
  54. package/dist/admin/apps/api-keys.js.map +1 -0
  55. package/dist/admin/apps/scopes.d.ts +46 -0
  56. package/dist/admin/apps/scopes.d.ts.map +1 -0
  57. package/dist/admin/apps/scopes.js +41 -0
  58. package/dist/admin/apps/scopes.js.map +1 -0
  59. package/dist/admin/apps/verified-tokens.d.ts +1206 -0
  60. package/dist/admin/apps/verified-tokens.d.ts.map +1 -0
  61. package/dist/admin/apps/verified-tokens.js +485 -0
  62. package/dist/admin/apps/verified-tokens.js.map +1 -0
  63. package/dist/admin/index.d.ts +3 -0
  64. package/dist/admin/index.d.ts.map +1 -0
  65. package/dist/admin/index.js +3 -0
  66. package/dist/admin/index.js.map +1 -0
  67. package/dist/admin/ui.generated.d.ts +11 -0
  68. package/dist/admin/ui.generated.d.ts.map +1 -0
  69. package/dist/admin/ui.generated.js +43 -0
  70. package/dist/admin/ui.generated.js.map +1 -0
  71. package/dist/apps/activities.d.ts +18725 -0
  72. package/dist/apps/activities.d.ts.map +1 -0
  73. package/dist/apps/activities.js +3138 -0
  74. package/dist/apps/activities.js.map +1 -0
  75. package/dist/apps/addresses.d.ts +3662 -0
  76. package/dist/apps/addresses.d.ts.map +1 -0
  77. package/dist/apps/addresses.js +22 -0
  78. package/dist/apps/addresses.js.map +1 -0
  79. package/dist/apps/balances.d.ts +342 -0
  80. package/dist/apps/balances.d.ts.map +1 -0
  81. package/dist/apps/balances.js +393 -0
  82. package/dist/apps/balances.js.map +1 -0
  83. package/dist/apps/blocks.d.ts +931 -0
  84. package/dist/apps/blocks.d.ts.map +1 -0
  85. package/dist/apps/blocks.js +689 -0
  86. package/dist/apps/blocks.js.map +1 -0
  87. package/dist/apps/coingecko.d.ts +1053 -0
  88. package/dist/apps/coingecko.d.ts.map +1 -0
  89. package/dist/apps/coingecko.js +1015 -0
  90. package/dist/apps/coingecko.js.map +1 -0
  91. package/dist/apps/exchanges.d.ts +3000 -0
  92. package/dist/apps/exchanges.d.ts.map +1 -0
  93. package/dist/apps/exchanges.js +3570 -0
  94. package/dist/apps/exchanges.js.map +1 -0
  95. package/dist/apps/fee-amm.d.ts +640 -0
  96. package/dist/apps/fee-amm.d.ts.map +1 -0
  97. package/dist/apps/fee-amm.js +815 -0
  98. package/dist/apps/fee-amm.js.map +1 -0
  99. package/dist/apps/indexer.d.ts +116 -0
  100. package/dist/apps/indexer.d.ts.map +1 -0
  101. package/dist/apps/indexer.js +270 -0
  102. package/dist/apps/indexer.js.map +1 -0
  103. package/dist/apps/receipts.d.ts +1438 -0
  104. package/dist/apps/receipts.d.ts.map +1 -0
  105. package/dist/apps/receipts.js +874 -0
  106. package/dist/apps/receipts.js.map +1 -0
  107. package/dist/apps/rpc.d.ts +173 -0
  108. package/dist/apps/rpc.d.ts.map +1 -0
  109. package/dist/apps/rpc.js +191 -0
  110. package/dist/apps/rpc.js.map +1 -0
  111. package/dist/apps/tokenlist.d.ts +192 -0
  112. package/dist/apps/tokenlist.d.ts.map +1 -0
  113. package/dist/apps/tokenlist.js +153 -0
  114. package/dist/apps/tokenlist.js.map +1 -0
  115. package/dist/apps/tokens.d.ts +2246 -0
  116. package/dist/apps/tokens.d.ts.map +1 -0
  117. package/dist/apps/tokens.js +1789 -0
  118. package/dist/apps/tokens.js.map +1 -0
  119. package/dist/apps/transactions.d.ts +2327 -0
  120. package/dist/apps/transactions.d.ts.map +1 -0
  121. package/dist/apps/transactions.js +975 -0
  122. package/dist/apps/transactions.js.map +1 -0
  123. package/dist/apps/transfers.d.ts +589 -0
  124. package/dist/apps/transfers.d.ts.map +1 -0
  125. package/dist/apps/transfers.js +769 -0
  126. package/dist/apps/transfers.js.map +1 -0
  127. package/dist/apps/verified-tokens.d.ts +544 -0
  128. package/dist/apps/verified-tokens.d.ts.map +1 -0
  129. package/dist/apps/verified-tokens.js +234 -0
  130. package/dist/apps/verified-tokens.js.map +1 -0
  131. package/dist/apps/webhooks.d.ts +7684 -0
  132. package/dist/apps/webhooks.d.ts.map +1 -0
  133. package/dist/apps/webhooks.js +2112 -0
  134. package/dist/apps/webhooks.js.map +1 -0
  135. package/dist/cloudflare.d.ts +32 -0
  136. package/dist/cloudflare.d.ts.map +1 -0
  137. package/dist/cloudflare.js +45 -0
  138. package/dist/cloudflare.js.map +1 -0
  139. package/dist/index.d.ts +16 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +16 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/internal/Auth.d.ts +298 -0
  144. package/dist/internal/Auth.d.ts.map +1 -0
  145. package/dist/internal/Auth.js +618 -0
  146. package/dist/internal/Auth.js.map +1 -0
  147. package/dist/internal/Cache.d.ts +74 -0
  148. package/dist/internal/Cache.d.ts.map +1 -0
  149. package/dist/internal/Cache.js +215 -0
  150. package/dist/internal/Cache.js.map +1 -0
  151. package/dist/internal/Cursor.d.ts +79 -0
  152. package/dist/internal/Cursor.d.ts.map +1 -0
  153. package/dist/internal/Cursor.js +116 -0
  154. package/dist/internal/Cursor.js.map +1 -0
  155. package/dist/internal/EdgeCache.d.ts +59 -0
  156. package/dist/internal/EdgeCache.d.ts.map +1 -0
  157. package/dist/internal/EdgeCache.js +174 -0
  158. package/dist/internal/EdgeCache.js.map +1 -0
  159. package/dist/internal/Log.d.ts +104 -0
  160. package/dist/internal/Log.d.ts.map +1 -0
  161. package/dist/internal/Log.js +118 -0
  162. package/dist/internal/Log.js.map +1 -0
  163. package/dist/internal/MetricSink.d.ts +65 -0
  164. package/dist/internal/MetricSink.d.ts.map +1 -0
  165. package/dist/internal/MetricSink.js +146 -0
  166. package/dist/internal/MetricSink.js.map +1 -0
  167. package/dist/internal/Mpp.d.ts +71 -0
  168. package/dist/internal/Mpp.d.ts.map +1 -0
  169. package/dist/internal/Mpp.js +105 -0
  170. package/dist/internal/Mpp.js.map +1 -0
  171. package/dist/internal/OpenApi.d.ts +313 -0
  172. package/dist/internal/OpenApi.d.ts.map +1 -0
  173. package/dist/internal/OpenApi.fonts.d.ts +2 -0
  174. package/dist/internal/OpenApi.fonts.d.ts.map +1 -0
  175. package/dist/internal/OpenApi.fonts.js +39 -0
  176. package/dist/internal/OpenApi.fonts.js.map +1 -0
  177. package/dist/internal/OpenApi.js +335 -0
  178. package/dist/internal/OpenApi.js.map +1 -0
  179. package/dist/internal/OpenApi.logo.d.ts +6 -0
  180. package/dist/internal/OpenApi.logo.d.ts.map +1 -0
  181. package/dist/internal/OpenApi.logo.js +19 -0
  182. package/dist/internal/OpenApi.logo.js.map +1 -0
  183. package/dist/internal/Path.d.ts +5 -0
  184. package/dist/internal/Path.d.ts.map +1 -0
  185. package/dist/internal/Path.js +16 -0
  186. package/dist/internal/Path.js.map +1 -0
  187. package/dist/internal/RateLimit.d.ts +60 -0
  188. package/dist/internal/RateLimit.d.ts.map +1 -0
  189. package/dist/internal/RateLimit.js +48 -0
  190. package/dist/internal/RateLimit.js.map +1 -0
  191. package/dist/internal/Response.d.ts +132 -0
  192. package/dist/internal/Response.d.ts.map +1 -0
  193. package/dist/internal/Response.js +72 -0
  194. package/dist/internal/Response.js.map +1 -0
  195. package/dist/internal/Schema.d.ts +257 -0
  196. package/dist/internal/Schema.d.ts.map +1 -0
  197. package/dist/internal/Schema.js +360 -0
  198. package/dist/internal/Schema.js.map +1 -0
  199. package/dist/internal/Store.d.ts +204 -0
  200. package/dist/internal/Store.d.ts.map +1 -0
  201. package/dist/internal/Store.js +291 -0
  202. package/dist/internal/Store.js.map +1 -0
  203. package/dist/internal/Tidx.d.ts +120 -0
  204. package/dist/internal/Tidx.d.ts.map +1 -0
  205. package/dist/internal/Tidx.js +156 -0
  206. package/dist/internal/Tidx.js.map +1 -0
  207. package/dist/internal/Timing.d.ts +22 -0
  208. package/dist/internal/Timing.d.ts.map +1 -0
  209. package/dist/internal/Timing.js +32 -0
  210. package/dist/internal/Timing.js.map +1 -0
  211. package/dist/internal/Ttl.d.ts +25 -0
  212. package/dist/internal/Ttl.d.ts.map +1 -0
  213. package/dist/internal/Ttl.js +49 -0
  214. package/dist/internal/Ttl.js.map +1 -0
  215. package/dist/internal/Value.d.ts +47 -0
  216. package/dist/internal/Value.d.ts.map +1 -0
  217. package/dist/internal/Value.js +122 -0
  218. package/dist/internal/Value.js.map +1 -0
  219. package/dist/internal/VerifiedTokens.d.ts +228 -0
  220. package/dist/internal/VerifiedTokens.d.ts.map +1 -0
  221. package/dist/internal/VerifiedTokens.js +450 -0
  222. package/dist/internal/VerifiedTokens.js.map +1 -0
  223. package/dist/internal/Viem.d.ts +2082 -0
  224. package/dist/internal/Viem.d.ts.map +1 -0
  225. package/dist/internal/Viem.js +63 -0
  226. package/dist/internal/Viem.js.map +1 -0
  227. package/dist/internal/WebhookDestination.d.ts +198 -0
  228. package/dist/internal/WebhookDestination.d.ts.map +1 -0
  229. package/dist/internal/WebhookDestination.js +170 -0
  230. package/dist/internal/WebhookDestination.js.map +1 -0
  231. package/dist/internal/Webhooks.d.ts +433 -0
  232. package/dist/internal/Webhooks.d.ts.map +1 -0
  233. package/dist/internal/Webhooks.js +489 -0
  234. package/dist/internal/Webhooks.js.map +1 -0
  235. package/dist/internal/webhookDestinations/betterStack.d.ts +26 -0
  236. package/dist/internal/webhookDestinations/betterStack.d.ts.map +1 -0
  237. package/dist/internal/webhookDestinations/betterStack.js +76 -0
  238. package/dist/internal/webhookDestinations/betterStack.js.map +1 -0
  239. package/dist/internal/webhookDestinations/slack.d.ts +59 -0
  240. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -0
  241. package/dist/internal/webhookDestinations/slack.js +422 -0
  242. package/dist/internal/webhookDestinations/slack.js.map +1 -0
  243. package/dist/internal/webhookDestinations/url.d.ts +17 -0
  244. package/dist/internal/webhookDestinations/url.d.ts.map +1 -0
  245. package/dist/internal/webhookDestinations/url.js +130 -0
  246. package/dist/internal/webhookDestinations/url.js.map +1 -0
  247. package/dist/openrpc.json +5302 -0
  248. package/package.json +46 -4
  249. package/seeds/31318/icons/0x20c0000000000000000000000000000000000000.svg +1 -0
  250. package/seeds/31318/icons/0x20c0000000000000000000000000000000000001.svg +1 -0
  251. package/seeds/31318/icons/0x20c0000000000000000000000000000000000002.svg +1 -0
  252. package/seeds/31318/icons/0x20c0000000000000000000000000000000000003.svg +1 -0
  253. package/seeds/31318/verified-tokens.json +30 -0
  254. package/seeds/4217/icons/0x20c0000000000000000000000000000000000000.svg +25 -0
  255. package/seeds/4217/icons/0x20c000000000000000000000048c8f36df1c9a4a.svg +1 -0
  256. package/seeds/4217/icons/0x20c0000000000000000000000520792dcccccccc.svg +1 -0
  257. package/seeds/4217/icons/0x20c0000000000000000000000a6da882d075a4c3.svg +4 -0
  258. package/seeds/4217/icons/0x20c000000000000000000000111111111e910f0f.svg +30 -0
  259. package/seeds/4217/icons/0x20c00000000000000000000014f22ca97301eb73.svg +1 -0
  260. package/seeds/4217/icons/0x20c0000000000000000000001621e21f71cf12fb.svg +1 -0
  261. package/seeds/4217/icons/0x20c0000000000000000000002f52d5cc21a3207b.svg +1 -0
  262. package/seeds/4217/icons/0x20c0000000000000000000003158081efd85bfc2.svg +11 -0
  263. package/seeds/4217/icons/0x20c0000000000000000000003554d28269e0f3c2.svg +1 -0
  264. package/seeds/4217/icons/0x20c000000000000000000000383a23bacb546ab9.svg +1 -0
  265. package/seeds/4217/icons/0x20c00000000000000000000042109aef2f8b28e1.png +0 -0
  266. package/seeds/4217/icons/0x20c0000000000000000000005c0bac7cef389a11.svg +1 -0
  267. package/seeds/4217/icons/0x20c0000000000000000000006fd9a167923ba194.png +0 -0
  268. package/seeds/4217/icons/0x20c0000000000000000000007f7ba549dd0251b9.svg +1 -0
  269. package/seeds/4217/icons/0x20c0000000000000000000008191667423f70e67.svg +5 -0
  270. package/seeds/4217/icons/0x20c0000000000000000000008ee4fcff88888888.svg +1 -0
  271. package/seeds/4217/icons/0x20c0000000000000000000009a4a4b17e0dc6651.svg +1 -0
  272. package/seeds/4217/icons/0x20c000000000000000000000ab02d39df30bd17e.svg +1 -0
  273. package/seeds/4217/icons/0x20c000000000000000000000ae247a1130450f09.svg +1 -0
  274. package/seeds/4217/icons/0x20c000000000000000000000aeed2ec36a54d0e5.svg +1 -0
  275. package/seeds/4217/icons/0x20c000000000000000000000b9537d11c60e8b50.svg +1 -0
  276. package/seeds/4217/icons/0x20c000000000000000000000bd95bfb69fbe6ce3.svg +1 -0
  277. package/seeds/4217/icons/0x20c000000000000000000000c412ec89d0c08be5.svg +1 -0
  278. package/seeds/4217/icons/0x20c000000000000000000000f047dd7018e50367.png +0 -0
  279. package/seeds/4217/verified-tokens.json +177 -0
  280. package/seeds/42431/icons/0x20c0000000000000000000000000000000000000.svg +25 -0
  281. package/seeds/42431/icons/0x20c0000000000000000000000000000000000001.svg +1 -0
  282. package/seeds/42431/icons/0x20c0000000000000000000000000000000000002.svg +1 -0
  283. package/seeds/42431/icons/0x20c0000000000000000000000000000000000003.svg +1 -0
  284. package/seeds/42431/icons/0x20c0000000000000000000009e8d7eb59b783726.svg +1 -0
  285. package/seeds/42431/icons/0x20c000000000000000000000d72572838bbee59c.svg +1 -0
  286. package/seeds/42431/verified-tokens.json +44 -0
  287. package/seeds/openrpc/README.md +27 -0
  288. package/seeds/openrpc/execution-apis.json +8989 -0
  289. package/src/ApiKey.test.ts +91 -0
  290. package/src/ApiKey.ts +122 -0
  291. package/src/ApiKeySource.test-d.ts +11 -0
  292. package/src/ApiKeySource.test.ts +295 -0
  293. package/src/ApiKeySource.ts +303 -0
  294. package/src/App.test-d.ts +38 -0
  295. package/src/App.test.ts +65927 -0
  296. package/src/App.ts +855 -0
  297. package/src/Assets.ts +58 -0
  298. package/src/Auth.ts +1 -0
  299. package/src/Cli.test.ts +81 -0
  300. package/src/Cli.ts +38 -0
  301. package/src/Client.test-d.ts +1438 -0
  302. package/src/Client.test.ts +134 -0
  303. package/src/Client.ts +45 -0
  304. package/src/Metrics.ts +154 -0
  305. package/src/Scope.ts +50 -0
  306. package/src/Webhooks.test.ts +49 -0
  307. package/src/Webhooks.ts +172 -0
  308. package/src/admin/Access.test.ts +130 -0
  309. package/src/admin/Access.ts +87 -0
  310. package/src/admin/App.test.ts +225 -0
  311. package/src/admin/App.ts +216 -0
  312. package/src/admin/apps/api-keys.test.ts +156 -0
  313. package/src/admin/apps/api-keys.ts +157 -0
  314. package/src/admin/apps/scopes.test.ts +52 -0
  315. package/src/admin/apps/scopes.ts +47 -0
  316. package/src/admin/apps/verified-tokens.test.ts +415 -0
  317. package/src/admin/apps/verified-tokens.ts +566 -0
  318. package/src/admin/index.ts +2 -0
  319. package/src/admin/ui/plugin.ts +135 -0
  320. package/src/admin/ui/src/components/Checkbox.tsx +22 -0
  321. package/src/admin/ui/src/components/Dialog.tsx +32 -0
  322. package/src/admin/ui/src/components/MobileProfile.tsx +31 -0
  323. package/src/admin/ui/src/components/Page.tsx +53 -0
  324. package/src/admin/ui/src/components/TempoLogo.tsx +37 -0
  325. package/src/admin/ui/src/fonts/Pilat-Demi.woff2 +0 -0
  326. package/src/admin/ui/src/fonts/Pilat-Regular.woff2 +0 -0
  327. package/src/admin/ui/src/lib/api-keys.ts +63 -0
  328. package/src/admin/ui/src/lib/client.ts +15 -0
  329. package/src/admin/ui/src/lib/config.ts +57 -0
  330. package/src/admin/ui/src/lib/query-client.ts +26 -0
  331. package/src/admin/ui/src/lib/scopes.ts +25 -0
  332. package/src/admin/ui/src/lib/verified-tokens.ts +89 -0
  333. package/src/admin/ui/src/lib/wagmi.ts +18 -0
  334. package/src/admin/ui/src/routeTree.gen.ts +104 -0
  335. package/src/admin/ui/src/router.tsx +25 -0
  336. package/src/admin/ui/src/routes/__root.tsx +219 -0
  337. package/src/admin/ui/src/routes/api-keys.tsx +329 -0
  338. package/src/admin/ui/src/routes/index.tsx +7 -0
  339. package/src/admin/ui/src/routes/verified-tokens.tsx +331 -0
  340. package/src/admin/ui/src/styles.css +20 -0
  341. package/src/admin/ui/tsconfig.json +16 -0
  342. package/src/admin/ui/vite.config.ts +29 -0
  343. package/src/admin/ui.generated.ts +60 -0
  344. package/src/apps/activities.test.ts +1020 -0
  345. package/src/apps/activities.ts +3934 -0
  346. package/src/apps/addresses.ts +24 -0
  347. package/src/apps/balances.test.ts +274 -0
  348. package/src/apps/balances.ts +533 -0
  349. package/src/apps/blocks.test.ts +385 -0
  350. package/src/apps/blocks.ts +896 -0
  351. package/src/apps/coingecko.test.ts +218 -0
  352. package/src/apps/coingecko.ts +1383 -0
  353. package/src/apps/exchanges.test.ts +958 -0
  354. package/src/apps/exchanges.ts +4773 -0
  355. package/src/apps/fee-amm.test.ts +321 -0
  356. package/src/apps/fee-amm.ts +1121 -0
  357. package/src/apps/indexer.test.ts +153 -0
  358. package/src/apps/indexer.ts +330 -0
  359. package/src/apps/receipts.test.ts +285 -0
  360. package/src/apps/receipts.ts +1193 -0
  361. package/src/apps/rpc.test.ts +302 -0
  362. package/src/apps/rpc.ts +222 -0
  363. package/src/apps/tokenlist.test.ts +80 -0
  364. package/src/apps/tokenlist.ts +207 -0
  365. package/src/apps/tokens.test.ts +1062 -0
  366. package/src/apps/tokens.ts +2292 -0
  367. package/src/apps/transactions.test.ts +408 -0
  368. package/src/apps/transactions.ts +1363 -0
  369. package/src/apps/transfers.test.ts +371 -0
  370. package/src/apps/transfers.ts +1116 -0
  371. package/src/apps/verified-tokens.test.ts +114 -0
  372. package/src/apps/verified-tokens.ts +295 -0
  373. package/src/apps/webhooks.test.ts +1937 -0
  374. package/src/apps/webhooks.ts +2926 -0
  375. package/src/cloudflare.ts +55 -0
  376. package/src/index.ts +15 -0
  377. package/src/internal/Auth.test.ts +980 -0
  378. package/src/internal/Auth.ts +1012 -0
  379. package/src/internal/Cache.test.ts +240 -0
  380. package/src/internal/Cache.ts +262 -0
  381. package/src/internal/Cursor.test.ts +100 -0
  382. package/src/internal/Cursor.ts +149 -0
  383. package/src/internal/EdgeCache.test.ts +234 -0
  384. package/src/internal/EdgeCache.ts +224 -0
  385. package/src/internal/Errors.ts +14 -0
  386. package/src/internal/Log.test.ts +244 -0
  387. package/src/internal/Log.ts +216 -0
  388. package/src/internal/MetricSink.ts +220 -0
  389. package/src/internal/Mpp.test.ts +64 -0
  390. package/src/internal/Mpp.ts +141 -0
  391. package/src/internal/OpenApi.fonts.ts +38 -0
  392. package/src/internal/OpenApi.logo.ts +18 -0
  393. package/src/internal/OpenApi.ts +488 -0
  394. package/src/internal/Path.test.ts +14 -0
  395. package/src/internal/Path.ts +15 -0
  396. package/src/internal/RateLimit.test.ts +93 -0
  397. package/src/internal/RateLimit.ts +93 -0
  398. package/src/internal/Response.ts +131 -0
  399. package/src/internal/Schema.test.ts +34 -0
  400. package/src/internal/Schema.ts +523 -0
  401. package/src/internal/Store.test.ts +545 -0
  402. package/src/internal/Store.ts +526 -0
  403. package/src/internal/Tidx.local.test.ts +33 -0
  404. package/src/internal/Tidx.test.ts +294 -0
  405. package/src/internal/Tidx.ts +238 -0
  406. package/src/internal/Timing.test.ts +22 -0
  407. package/src/internal/Timing.ts +62 -0
  408. package/src/internal/Ttl.test.ts +18 -0
  409. package/src/internal/Ttl.ts +59 -0
  410. package/src/internal/Value.ts +114 -0
  411. package/src/internal/VerifiedTokens.test.ts +333 -0
  412. package/src/internal/VerifiedTokens.ts +645 -0
  413. package/src/internal/Viem.test.ts +115 -0
  414. package/src/internal/Viem.ts +165 -0
  415. package/src/internal/WebhookDestination.test.ts +648 -0
  416. package/src/internal/WebhookDestination.ts +331 -0
  417. package/src/internal/Webhooks.test.ts +668 -0
  418. package/src/internal/Webhooks.ts +940 -0
  419. package/src/internal/webhookDestinations/betterStack.ts +91 -0
  420. package/src/internal/webhookDestinations/slack.ts +496 -0
  421. package/src/internal/webhookDestinations/url.ts +128 -0
  422. package/src/openrpc.json +5302 -0
@@ -0,0 +1,114 @@
1
+ import { Store } from 'cadent'
2
+
3
+ import * as TestApp from '../../test/App.js'
4
+ import * as Runtime from '../../test/runtime.js'
5
+ import * as VerifiedTokens from '../internal/VerifiedTokens.js'
6
+ import * as Verified from './verified-tokens.js'
7
+
8
+ // Mutations live in the admin API (`cadent/admin`) and are covered in
9
+ // `../admin/apps/verified-tokens.test.ts`; these tests cover the public reads,
10
+ // seeded by publishing a snapshot through the same core module the admin
11
+ // writes use.
12
+
13
+ /** Reader key for the data routes. */
14
+ const reader = {
15
+ id: 'key_reader',
16
+ orgId: 'org_test',
17
+ scopes: ['data:read'],
18
+ token: 'secret_reader',
19
+ } satisfies TestApp.source.Key
20
+
21
+ /** An address not present in the seed list. */
22
+ const unknownAddress = '0x20c00000000000000000000000000000000000ff'
23
+
24
+ /** A known list published into the store before exercising the read endpoints. */
25
+ const seedList = [
26
+ { address: '0x20c0000000000000000000000000000000000001', currency: 'USD', decimals: 6, logoUri: 'https://example.com/susd.svg', name: 'Seed USD', symbol: 'sUSD' }, // prettier-ignore
27
+ { address: '0x20c0000000000000000000000000000000000002', currency: 'EUR', decimals: 2, name: 'Seed EUR', symbol: 'sEUR' }, // prettier-ignore
28
+ { address: '0x20c0000000000000000000000000000000000003', currency: 'USD', decimals: 6, name: 'Seed USD Two', symbol: 'sUSD2' }, // prettier-ignore
29
+ ] as const
30
+ const chainId = Runtime.get().chainId
31
+
32
+ /** RequestInit carrying a bearer token for the given key. */
33
+ function as(key: { token: string }) {
34
+ return { headers: { authorization: `Bearer ${key.token}` } } as const
35
+ }
36
+
37
+ /** Client whose verified-token store holds a published {@link seedList} snapshot. */
38
+ async function seeded() {
39
+ const store = Store.memory()
40
+ await VerifiedTokens.replace(store, chainId, seedList)
41
+ return TestApp.client({
42
+ auth: { source: TestApp.source({ keys: [reader] }) },
43
+ verifiedTokens: { store },
44
+ })
45
+ }
46
+
47
+ describe('GET /verified-tokens', () => {
48
+ test('returns the verified list', async () => {
49
+ const response = await (await seeded()).v1['verified-tokens'].$get({ query: {} }, as(reader))
50
+ expect(response.status).toBe(200)
51
+ const body = await TestApp.json(response, Verified.schema.listVerifiedTokens.Response)
52
+ expect(body.data.map((token) => token.address)).toEqual(seedList.map((token) => token.address))
53
+ // The curated `logoUri` rides along when set, and is absent otherwise.
54
+ expect(body.data[0]?.logoUri).toBe('https://example.com/susd.svg')
55
+ expect(body.data[1]?.logoUri).toBeUndefined()
56
+ })
57
+
58
+ test('filters by currency (case-insensitive)', async () => {
59
+ const response = await (
60
+ await seeded()
61
+ ).v1['verified-tokens'].$get({ query: { currency: 'usd' } }, as(reader))
62
+ const body = await TestApp.json(response, Verified.schema.listVerifiedTokens.Response)
63
+ expect(body.data.length).toBe(2)
64
+ expect(body.data.every((token) => token.currency.toLowerCase() === 'usd')).toBe(true)
65
+ })
66
+
67
+ test('returns 304 for a matching If-None-Match', async () => {
68
+ const client = await seeded()
69
+ const first = await client.v1['verified-tokens'].$get({ query: {} }, as(reader))
70
+ const etag = first.headers.get('ETag')
71
+ expect(etag).toBeTruthy()
72
+ const second = await client.v1['verified-tokens'].$get(
73
+ { query: {} },
74
+ { headers: { 'if-none-match': etag! } },
75
+ )
76
+ expect(second.status).toBe(304)
77
+ })
78
+ })
79
+
80
+ describe('GET /verified-tokens/currencies', () => {
81
+ test('returns the sorted distinct currencies', async () => {
82
+ const response = await (
83
+ await seeded()
84
+ ).v1['verified-tokens'].currencies.$get({ query: {} }, as(reader))
85
+ const body = await TestApp.json(response, Verified.schema.getVerifiedTokenCurrencies.Response)
86
+ expect([...body.data]).toEqual(['EUR', 'USD'])
87
+ })
88
+ })
89
+
90
+ describe('GET /verified-tokens/:address', () => {
91
+ test('returns a seeded entry', async () => {
92
+ const client = await seeded()
93
+ const address = seedList[0].address
94
+ const response = await client.v1['verified-tokens'][':address'].$get(
95
+ { param: { address }, query: {} },
96
+ as(reader),
97
+ )
98
+ expect(response.status).toBe(200)
99
+ const body = await TestApp.json(response, Verified.schema.Token)
100
+ expect(body.address).toBe(address)
101
+ })
102
+
103
+ test('returns 404 for an unknown address', async () => {
104
+ const response = await (
105
+ await seeded()
106
+ ).v1['verified-tokens'][':address'].$get(
107
+ { param: { address: unknownAddress }, query: {} },
108
+ as(reader),
109
+ )
110
+ expect(response.status).toBe(404)
111
+ const body = (await response.json()) as { error?: { code?: string } }
112
+ expect(body.error?.code).toBe('verified_token_not_found')
113
+ })
114
+ })
@@ -0,0 +1,295 @@
1
+ import { type Context, Hono } from 'hono'
2
+ import * as z from 'zod/mini'
3
+
4
+ import type * as App from '../App.js'
5
+ import * as Auth from '../internal/Auth.js'
6
+ import * as Cache from '../internal/Cache.js'
7
+ import * as OpenApi from '../internal/OpenApi.js'
8
+ import * as Response from '../internal/Response.js'
9
+ import * as Schema from '../internal/Schema.js'
10
+ import * as VerifiedTokens from '../internal/VerifiedTokens.js'
11
+
12
+ /** Zod schemas owned by the verified-tokens resource. */
13
+ export namespace schema {
14
+ // Shared, validated entry fields (everything but the address). Reused across
15
+ // the response entry, the create body, and the bulk-replace body.
16
+ const fields = {
17
+ currency: z
18
+ .string()
19
+ .check(
20
+ z.minLength(1),
21
+ z.describe(
22
+ 'The currency label for this token, such as `USD` for USD-denominated stablecoins.',
23
+ ),
24
+ ),
25
+ decimals: z
26
+ .number()
27
+ .check(
28
+ z.int(),
29
+ z.gte(0),
30
+ z.lte(255),
31
+ z.describe(
32
+ 'The number of decimal places the token uses; Tempo stablecoins typically use 6.',
33
+ ),
34
+ ),
35
+ logoUri: z
36
+ .optional(z.url({ protocol: /^https$/ }))
37
+ .check(z.describe('The curated HTTPS URL for this token’s logo image, when one is set.')),
38
+ name: z.string().check(z.minLength(1), z.describe('The token’s human-readable name.')),
39
+ symbol: z
40
+ .string()
41
+ .check(
42
+ z.minLength(1),
43
+ z.describe('The short ticker symbol wallets and apps show for this token.'),
44
+ ),
45
+ }
46
+
47
+ /**
48
+ * Verified-token write/input fields, without the server-derived `id`. Reused
49
+ * as the base for the create body, the patch body, and the bulk-replace body
50
+ * so clients never supply `id` (it is always derived from `address`).
51
+ */
52
+ export const Input = Schema.describe(
53
+ z.object({
54
+ address: Schema.Address.check(z.describe('The TIP-20 token contract address on Tempo.')),
55
+ currency: fields.currency,
56
+ decimals: fields.decimals,
57
+ logoUri: fields.logoUri,
58
+ name: fields.name,
59
+ symbol: fields.symbol,
60
+ }),
61
+ 'The fields used to create or update a curated verified TIP-20 token entry.',
62
+ )
63
+
64
+ /**
65
+ * A curated verified TIP-20 token entry (response shape). The `id` is the
66
+ * stable resource id, always derived server-side from `address`.
67
+ */
68
+ export const Token = Schema.describe(
69
+ z.extend(Input, {
70
+ id: z
71
+ .string()
72
+ .check(z.describe('A stable resource ID for this token, equal to its contract address.')),
73
+ }),
74
+ 'One curated, verified TIP-20 token that wallets and apps can present as trusted.',
75
+ )
76
+
77
+ /** Path parameters addressing a single verified token. */
78
+ export const Params = z
79
+ .object({
80
+ address: Schema.TokenAddress.check(z.describe('The TIP-20 token contract address on Tempo.')),
81
+ })
82
+ .check(z.describe('Path parameters for looking up one verified token.'))
83
+
84
+ /** Schemas for the listVerifiedTokens operation. */
85
+ export namespace listVerifiedTokens {
86
+ /** Query parameters for the verified-token list. */
87
+ export const Query = z
88
+ .strictObject({
89
+ chainId: Schema.ChainIdQuery,
90
+ currency: z.optional(z.string()).check(
91
+ z.meta({ examples: VerifiedTokens.currencies }),
92
+ z.describe('Only include verified tokens denominated in this currency, such as `USD`. Matching is case-insensitive.'), // prettier-ignore
93
+ ),
94
+ })
95
+ .check(z.describe('Query parameters for listing verified tokens.'))
96
+
97
+ /** Non-paginated list of curated verified tokens. */
98
+ export const Response = Schema.describe(
99
+ z.object({ data: z.array(Token).check(z.describe('The curated verified TIP-20 tokens.')) }),
100
+ 'A non-paginated list of curated, verified TIP-20 tokens.',
101
+ )
102
+ }
103
+
104
+ /** Schemas for the getVerifiedTokenCurrencies operation. */
105
+ export namespace getVerifiedTokenCurrencies {
106
+ /** Query parameters for the verified-token currencies endpoint. */
107
+ export const Query = z
108
+ .strictObject({ chainId: Schema.ChainIdQuery })
109
+ .check(z.describe('Query parameters for listing currencies used by verified tokens.'))
110
+
111
+ /** Sorted, distinct currencies present in a chain's verified list. */
112
+ export const Response = Schema.describe(
113
+ z.object({
114
+ data: z
115
+ .array(z.string())
116
+ .check(
117
+ z.describe('The sorted, unique currency labels used by tokens in the verified list.'),
118
+ ),
119
+ }),
120
+ 'The distinct currencies present in a chain’s verified token list.',
121
+ )
122
+ }
123
+
124
+ /** Schemas for the getVerifiedToken operation. */
125
+ export namespace getVerifiedToken {
126
+ /** Query parameters for a single verified token. */
127
+ export const Query = z
128
+ .strictObject({ chainId: Schema.ChainIdQuery })
129
+ .check(z.describe('Query parameters for looking up one verified token.'))
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Mounts the `/verified-tokens` resource (public reads). Mutations live in the
135
+ * admin API (`tapimo/admin`), which manages the same store these reads serve
136
+ * their snapshots from.
137
+ */
138
+ export function verifiedTokens() {
139
+ return new Hono<App.Environment>()
140
+ .get(
141
+ '/',
142
+ Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
143
+ OpenApi.validate('query', schema.listVerifiedTokens.Query, {
144
+ code: 'query_invalid',
145
+ message: 'Invalid query parameters',
146
+ }),
147
+ OpenApi.describeRoute({
148
+ hide: true,
149
+ operationId: 'listVerifiedTokens',
150
+ responses: OpenApi.responses({
151
+ success: {
152
+ description: 'The curated verified TIP-20 tokens.',
153
+ schema: schema.listVerifiedTokens.Response,
154
+ },
155
+ }),
156
+ summary: 'List verified tokens',
157
+ tags: ['Verified Tokens'],
158
+ }),
159
+ Cache.response<App.Environment>({
160
+ cacheControl: Cache.policies.stable,
161
+ name: 'tempo-api:verified-tokens:v1',
162
+ key: (c) => Cache.urlKey(c, schema.listVerifiedTokens.Query),
163
+ }),
164
+ async (c) => {
165
+ if (Auth.narrowAccess) return Auth.paidAccessError(c)
166
+ if (OpenApi.narrowValidation)
167
+ return OpenApi.validationError(c, {
168
+ code: 'query_invalid',
169
+ message: 'Invalid query parameters',
170
+ })
171
+
172
+ const query = c.req.valid('query')
173
+ const chainId = query.chainId ?? c.get('chainId')
174
+ try {
175
+ const snapshot = await VerifiedTokens.snapshot(c, chainId)
176
+ const data = query.currency
177
+ ? (snapshot.byCurrency.get(query.currency.toLowerCase()) ?? [])
178
+ : snapshot.list
179
+ return c.json(Response.validated(schema.listVerifiedTokens.Response, { data }), 200)
180
+ } catch (cause) {
181
+ return Response.upstream(c, cause)
182
+ }
183
+ },
184
+ )
185
+ .get(
186
+ '/currencies',
187
+ Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
188
+ OpenApi.validate('query', schema.getVerifiedTokenCurrencies.Query, {
189
+ code: 'query_invalid',
190
+ message: 'Invalid query parameters',
191
+ }),
192
+ OpenApi.describeRoute({
193
+ hide: true,
194
+ operationId: 'getVerifiedTokenCurrencies',
195
+ responses: OpenApi.responses({
196
+ success: {
197
+ description: 'The distinct currencies used by verified tokens.',
198
+ schema: schema.getVerifiedTokenCurrencies.Response,
199
+ },
200
+ }),
201
+ summary: 'List verified currencies',
202
+ tags: ['Verified Tokens'],
203
+ }),
204
+ Cache.response<App.Environment>({
205
+ cacheControl: Cache.policies.stable,
206
+ name: 'tempo-api:verified-tokens:v1',
207
+ key: (c) => Cache.urlKey(c, schema.getVerifiedTokenCurrencies.Query),
208
+ }),
209
+ async (c) => {
210
+ if (Auth.narrowAccess) return Auth.paidAccessError(c)
211
+ if (OpenApi.narrowValidation)
212
+ return OpenApi.validationError(c, {
213
+ code: 'query_invalid',
214
+ message: 'Invalid query parameters',
215
+ })
216
+
217
+ const query = c.req.valid('query')
218
+ const chainId = query.chainId ?? c.get('chainId')
219
+ try {
220
+ const snapshot = await VerifiedTokens.snapshot(c, chainId)
221
+ return c.json(
222
+ Response.validated(schema.getVerifiedTokenCurrencies.Response, {
223
+ data: snapshot.currencies,
224
+ }),
225
+ 200,
226
+ )
227
+ } catch (cause) {
228
+ return Response.upstream(c, cause)
229
+ }
230
+ },
231
+ )
232
+ .get(
233
+ '/:address',
234
+ Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
235
+ OpenApi.validate('param', schema.Params, {
236
+ code: 'address_invalid',
237
+ message: 'Invalid token address',
238
+ }),
239
+ OpenApi.validate('query', schema.getVerifiedToken.Query, {
240
+ code: 'query_invalid',
241
+ message: 'Invalid query parameters',
242
+ }),
243
+ OpenApi.describeRoute({
244
+ hide: true,
245
+ operationId: 'getVerifiedToken',
246
+ responses: OpenApi.responses({
247
+ errors: { 404: 'No verified token was found for this address.' },
248
+ success: {
249
+ description: 'One verified TIP-20 token from Tempo’s curated list.',
250
+ schema: schema.Token,
251
+ },
252
+ }),
253
+ summary: 'Get verified token',
254
+ tags: ['Verified Tokens'],
255
+ }),
256
+ Cache.response<App.Environment>({
257
+ cacheControl: Cache.policies.stable,
258
+ name: 'tempo-api:verified-tokens:v1',
259
+ key: (c) => Cache.urlKey(c, schema.getVerifiedToken.Query),
260
+ }),
261
+ async (c) => {
262
+ if (Auth.narrowAccess) return Auth.paidAccessError(c)
263
+ if (OpenApi.narrowValidation)
264
+ return OpenApi.validationError(c, {
265
+ code: 'address_invalid',
266
+ message: 'Invalid token address',
267
+ })
268
+ if (OpenApi.narrowValidation)
269
+ return OpenApi.validationError(c, {
270
+ code: 'query_invalid',
271
+ message: 'Invalid query parameters',
272
+ })
273
+
274
+ const { address } = c.req.valid('param')
275
+ const query = c.req.valid('query')
276
+ const chainId = query.chainId ?? c.get('chainId')
277
+ try {
278
+ const snapshot = await VerifiedTokens.snapshot(c, chainId)
279
+ const token = snapshot.byAddress.get(address.toLowerCase())
280
+ if (!token) return notFound(c)
281
+ return c.json(Response.validated(schema.Token, token), 200)
282
+ } catch (cause) {
283
+ return Response.upstream(c, cause)
284
+ }
285
+ },
286
+ )
287
+ }
288
+
289
+ function notFound(c: Context<App.Environment>) {
290
+ return Response.error(c, {
291
+ code: 'verified_token_not_found',
292
+ message: 'Verified token not found',
293
+ status: 404,
294
+ })
295
+ }