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,331 @@
1
+ import { createFileRoute } from '@tanstack/react-router'
2
+ import { useState } from 'react'
3
+ import { Button, Fields, Input, Select, useCopy } from 'regen-ui'
4
+ import { Check, Copy as CopyIcon, ExternalLink, Plus, Trash2 } from 'lucide-react'
5
+ import { isAddress } from 'viem'
6
+ import { tempo as mainnet, tempoTestnet as testnet } from 'viem/tempo/chains'
7
+ import { Hooks } from 'wagmi/tempo'
8
+
9
+ import { Card, Notice, Page } from '../components/Page'
10
+ import { Dialog } from '../components/Dialog'
11
+ import * as VerifiedTokens from '../lib/verified-tokens'
12
+
13
+ /** A chain id the admin UI manages: the two public Tempo chains. */
14
+ type ChainId = typeof mainnet.id | typeof testnet.id
15
+
16
+ /** Chain shown on first load, also prefetched by the loader. */
17
+ const defaultChain: ChainId = mainnet.id
18
+
19
+ export const Route = createFileRoute('/verified-tokens')({
20
+ loader: ({ context }) =>
21
+ context.queryClient.prefetchQuery(VerifiedTokens.get.options({ chainId: defaultChain })),
22
+ component: RouteComponent,
23
+ })
24
+
25
+ /** Chains with display labels, for the selector. */
26
+ const chains = [
27
+ { id: mainnet.id, label: 'Mainnet' },
28
+ { id: testnet.id, label: 'Testnet' },
29
+ ] as const
30
+
31
+ /** Block explorer base URL per chain, for token links. */
32
+ const explorers: Record<number, string> = {
33
+ [mainnet.id]: mainnet.blockExplorers.default.url,
34
+ [testnet.id]: testnet.blockExplorers.default.url,
35
+ }
36
+
37
+ function RouteComponent() {
38
+ const [chain, setChain] = useState<ChainId>(defaultChain)
39
+ const [open, setOpen] = useState(false)
40
+ const tokens = VerifiedTokens.get.useQuery({ chainId: chain })
41
+ const create = VerifiedTokens.create.useMutation()
42
+
43
+ return (
44
+ <Dialog.Root onOpenChange={setOpen} open={open}>
45
+ <Page
46
+ title="Verified Tokens"
47
+ description="Manage the curated verified token list"
48
+ action={
49
+ <div className="flex items-center gap-2">
50
+ <ChainSelect onChange={setChain} value={chain} />
51
+ <Dialog.Trigger
52
+ render={
53
+ <Button variant="primary">
54
+ <Plus className="size-4" />
55
+ Add token
56
+ </Button>
57
+ }
58
+ />
59
+ </div>
60
+ }
61
+ >
62
+ <TokenList
63
+ chain={chain}
64
+ error={tokens.error}
65
+ loading={tokens.isPending}
66
+ tokens={tokens.data?.data ?? []}
67
+ />
68
+ <Dialog.Popup>
69
+ <AddTokenForm
70
+ defaultChain={chain}
71
+ onSubmit={(input) =>
72
+ create.mutate(input, {
73
+ onError: (error) => alert(error.message),
74
+ onSuccess: () => setOpen(false),
75
+ })
76
+ }
77
+ pending={create.isPending}
78
+ />
79
+ </Dialog.Popup>
80
+ </Page>
81
+ </Dialog.Root>
82
+ )
83
+ }
84
+
85
+ function ChainSelect(props: {
86
+ className?: string
87
+ onChange: (chain: ChainId) => void
88
+ value: ChainId
89
+ }) {
90
+ return (
91
+ <Select
92
+ className={props.className ?? 'w-40'}
93
+ items={chains.map((c) => ({ label: c.label, value: String(c.id) }))}
94
+ onChange={(value) => props.onChange(Number(value) as ChainId)}
95
+ value={String(props.value)}
96
+ />
97
+ )
98
+ }
99
+
100
+ function AddTokenForm(props: {
101
+ defaultChain: ChainId
102
+ onSubmit: (input: VerifiedTokens.create.Input) => void
103
+ pending: boolean
104
+ }) {
105
+ const [chain, setChain] = useState<ChainId>(props.defaultChain)
106
+ const [address, setAddress] = useState('')
107
+
108
+ const metadata = Hooks.token.useGetMetadata({
109
+ chainId: chain,
110
+ token: address as `0x${string}`,
111
+ query: { enabled: isAddress(address) },
112
+ })
113
+ const token = metadata.data
114
+
115
+ function onSubmit(event: React.FormEvent<HTMLFormElement>) {
116
+ event.preventDefault()
117
+ if (!token) return
118
+ const form = new FormData(event.currentTarget)
119
+ const name = form.get('name')
120
+ const file = form.get('logo')
121
+ const logo = file instanceof File && file.size > 0 ? file : null
122
+ props.onSubmit({
123
+ address: address as `0x${string}`,
124
+ chainId: chain,
125
+ currency: token.currency,
126
+ decimals: token.decimals,
127
+ name: typeof name === 'string' ? name.trim() : '',
128
+ symbol: token.symbol,
129
+ logo,
130
+ ...(!logo && token.logoURI ? { logoUri: token.logoURI } : {}),
131
+ })
132
+ }
133
+
134
+ const invalid = address.length > 0 && !isAddress(address)
135
+
136
+ return (
137
+ <>
138
+ <Dialog.Title>Add Token</Dialog.Title>
139
+ <Dialog.Description>Add a token to the curated verified token list</Dialog.Description>
140
+ <form className="mt-6 flex flex-col gap-8" onSubmit={onSubmit}>
141
+ <Fields className="gap-6" variant="default">
142
+ <div className="flex flex-col gap-2">
143
+ <span className="label-13 text-foreground-secondary">Chain</span>
144
+ <ChainSelect className="w-full" onChange={setChain} value={chain} />
145
+ </div>
146
+ <LogoField logoUri={token?.logoURI} />
147
+ <Input
148
+ error={invalid ? 'Enter a valid address' : metadata.isError ? 'Token not found' : false}
149
+ label="Address"
150
+ onChange={(event) => setAddress(event.target.value.trim())}
151
+ placeholder="0x20c000000000000000000000b9537d11c60e8b50"
152
+ required
153
+ value={address}
154
+ />
155
+ {token ? (
156
+ <>
157
+ <div className="flex gap-2">
158
+ <div className="w-32 shrink-0">
159
+ <Input disabled label="Symbol" placeholder="USDC" value={token.symbol} />
160
+ </div>
161
+ <div className="flex-1">
162
+ <Input
163
+ defaultValue={token.name}
164
+ key={token.name}
165
+ label="Name"
166
+ name="name"
167
+ placeholder="USD Coin"
168
+ required
169
+ />
170
+ </div>
171
+ </div>
172
+ <Fields.Inline>
173
+ <Input disabled label="Decimals" placeholder="6" value={token.decimals} />
174
+ <Input disabled label="Currency" placeholder="USD" value={token.currency} />
175
+ </Fields.Inline>
176
+ </>
177
+ ) : null}
178
+ </Fields>
179
+ <div className="flex justify-end gap-2">
180
+ <Dialog.Close render={<Button type="button">Cancel</Button>} />
181
+ <Button disabled={!token} loading={props.pending} type="submit" variant="primary">
182
+ Add token
183
+ </Button>
184
+ </div>
185
+ </form>
186
+ </>
187
+ )
188
+ }
189
+
190
+ function LogoField(props: { logoUri?: string | undefined }) {
191
+ const [name, setName] = useState<string>('')
192
+ return (
193
+ <div className="flex flex-col gap-2">
194
+ <span className="label-13 text-foreground-secondary">Logo</span>
195
+ <div className="relative flex h-[40px] items-center gap-[10px] rounded-body border-[2px] border-transparent bg-secondary px-[12px] copy-14 text-foreground transition-colors hover:bg-secondary-hover">
196
+ {props.logoUri && !name ? (
197
+ <img alt="" className="size-6 shrink-0" src={props.logoUri} />
198
+ ) : null}
199
+ <span className="border border-border px-2 py-0.5 text-label-12 text-foreground-secondary">
200
+ Choose SVG
201
+ </span>
202
+ <span className="min-w-0 flex-1 truncate text-label-12 text-foreground-secondary">
203
+ {name ? name : props.logoUri ? 'Using on-chain logo' : 'No file selected'}
204
+ </span>
205
+ <input
206
+ accept="image/svg+xml,.svg"
207
+ className="absolute inset-0 cursor-pointer opacity-0"
208
+ name="logo"
209
+ onChange={(event) => setName(event.target.files?.[0]?.name ?? '')}
210
+ type="file"
211
+ />
212
+ </div>
213
+ </div>
214
+ )
215
+ }
216
+
217
+ function TokenList(props: {
218
+ chain: ChainId
219
+ error: Error | null
220
+ loading: boolean
221
+ tokens: readonly VerifiedTokens.VerifiedToken[]
222
+ }) {
223
+ return (
224
+ <Card>
225
+ {props.loading ? (
226
+ <Notice>Loading tokens…</Notice>
227
+ ) : props.error ? (
228
+ <Notice>{props.error.message}</Notice>
229
+ ) : props.tokens.length === 0 ? (
230
+ <Notice>No verified tokens yet.</Notice>
231
+ ) : (
232
+ <ul className="divide-y divide-border">
233
+ {props.tokens.map((token) => (
234
+ <TokenRow chain={props.chain} key={token.address} token={token} />
235
+ ))}
236
+ </ul>
237
+ )}
238
+ </Card>
239
+ )
240
+ }
241
+
242
+ function TokenRow(props: { chain: ChainId; token: VerifiedTokens.VerifiedToken }) {
243
+ const { chain, token } = props
244
+ const remove = VerifiedTokens.remove.useMutation()
245
+
246
+ function onRemove() {
247
+ if (!confirm(`Remove ${token.name} (${token.symbol})? This can't be undone.`)) return
248
+ remove.mutate(
249
+ { address: token.address, chainId: chain },
250
+ { onError: (error) => alert(error.message) },
251
+ )
252
+ }
253
+
254
+ return (
255
+ <li className="flex items-center justify-between gap-4 px-5 py-2.5">
256
+ <div className="flex min-w-0 items-center gap-4">
257
+ <Logo chainId={chain} token={token} />
258
+ <div className="flex min-w-0 flex-col gap-1">
259
+ <span className="text-label-14 text-foreground">
260
+ {token.name} <span className="text-foreground-secondary">{token.symbol}</span>
261
+ </span>
262
+ <Address value={token.address} />
263
+ </div>
264
+ </div>
265
+
266
+ <div className="flex items-center gap-4">
267
+ <a
268
+ className="flex items-center gap-1.5 text-label-12 text-foreground-secondary hover:text-foreground"
269
+ href={`${explorers[chain]}/token/${token.address}`}
270
+ rel="noreferrer"
271
+ target="_blank"
272
+ >
273
+ Explorer
274
+ <ExternalLink className="size-3" />
275
+ </a>
276
+ <Button.Icon
277
+ className="text-foreground-secondary hover:text-negative"
278
+ disabled={remove.isPending}
279
+ onClick={onRemove}
280
+ size="lg"
281
+ title="Remove token"
282
+ variant="plain"
283
+ >
284
+ <Trash2 />
285
+ </Button.Icon>
286
+ </div>
287
+ </li>
288
+ )
289
+ }
290
+
291
+ /** Shortens an address to `0x1234…abcdef`. */
292
+ function truncate(address: string) {
293
+ return `${address.slice(0, 6)}…${address.slice(-6)}`
294
+ }
295
+
296
+ /** Copyable truncated address. */
297
+ function Address(props: { value: string }) {
298
+ const { copy, notifying } = useCopy()
299
+ return (
300
+ <button
301
+ aria-label="Copy address"
302
+ className="flex w-fit cursor-pointer items-center gap-1.5 text-label-12 text-foreground-secondary hover:text-foreground"
303
+ onClick={() => copy(props.value)}
304
+ title="Copy address"
305
+ type="button"
306
+ >
307
+ {truncate(props.value)}
308
+ {notifying ? <Check className="size-3" /> : <CopyIcon className="size-3" />}
309
+ </button>
310
+ )
311
+ }
312
+
313
+ function Logo(props: { chainId: ChainId; token: VerifiedTokens.VerifiedToken }) {
314
+ const { chainId, token } = props
315
+ const [failed, setFailed] = useState(false)
316
+ const src = token.logoUri ?? VerifiedTokens.logoUrl({ address: token.address, chainId })
317
+ if (!failed)
318
+ return (
319
+ <img
320
+ alt=""
321
+ className="size-8 shrink-0 rounded-full bg-secondary"
322
+ onError={() => setFailed(true)}
323
+ src={src}
324
+ />
325
+ )
326
+ return (
327
+ <div className="flex size-8 shrink-0 items-center justify-center rounded-full bg-secondary text-label-12 text-foreground-secondary">
328
+ {token.symbol.slice(0, 2).toUpperCase()}
329
+ </div>
330
+ )
331
+ }
@@ -0,0 +1,20 @@
1
+ @import 'tailwindcss';
2
+ @import 'regen-ui/tailwind.css';
3
+
4
+ @font-face {
5
+ font-family: 'Pilat';
6
+ font-weight: 400;
7
+ font-display: swap;
8
+ src: url('./fonts/Pilat-Regular.woff2') format('woff2');
9
+ }
10
+
11
+ @font-face {
12
+ font-family: 'Pilat';
13
+ font-weight: 500 700;
14
+ font-display: swap;
15
+ src: url('./fonts/Pilat-Demi.woff2') format('woff2');
16
+ }
17
+
18
+ :root {
19
+ --font-body: 'Pilat', ui-sans-serif, system-ui, sans-serif;
20
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "jsx": "react-jsx",
4
+ "module": "esnext",
5
+ "moduleResolution": "bundler",
6
+ "target": "esnext",
7
+ "lib": ["dom", "dom.iterable", "esnext"],
8
+ "types": ["vite/client"],
9
+ "strict": true,
10
+ "skipLibCheck": true,
11
+ "noEmit": true,
12
+ "verbatimModuleSyntax": false,
13
+ "allowImportingTsExtensions": true
14
+ },
15
+ "include": ["src", "vite.config.ts"]
16
+ }
@@ -0,0 +1,29 @@
1
+ import tailwindcss from '@tailwindcss/vite'
2
+ import react from '@vitejs/plugin-react'
3
+ import { tanstackStart } from '@tanstack/react-start/plugin/vite'
4
+ import regen from 'regen-ui/vite'
5
+ import { defineConfig } from 'vite'
6
+
7
+ import { generated } from './plugin.ts'
8
+
9
+ // The admin SPA is built in TanStack Start's SPA mode (no SSR runtime): the
10
+ // build emits a prerendered `_shell.html` plus content-hashed JS/CSS, which the
11
+ // `generated()` plugin codegens into an asset map (`src/admin/ui.generated.ts`)
12
+ // the Hono admin app serves. `base: './'` makes the shell reference assets
13
+ // relatively so the same artifact works whether the app owns its hostname or is
14
+ // path-mounted (e.g. under `/admin`); the router `basepath` is derived at
15
+ // runtime from the served location (see `src/router.tsx`).
16
+ export default defineConfig({
17
+ base: './',
18
+ plugins: [
19
+ tanstackStart({ spa: { enabled: true } }),
20
+ // Regen provides the theme; `tailwindPlugin: false` defers to our explicit
21
+ // `tailwindcss()`. `react()` must come after the Start and Regen plugins.
22
+ regen({ tailwindPlugin: false }),
23
+ tailwindcss(),
24
+ react(),
25
+ // Must come after `tanstackStart()`: its `buildApp` post handler emits the
26
+ // asset map once TanStack's prerender has written `_shell.html`.
27
+ generated(),
28
+ ],
29
+ })