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,415 @@
1
+ import { Store } from 'cadent'
2
+
3
+ import * as TestAdmin from '../../../test/Admin.js'
4
+ import * as TestApp from '../../../test/App.js'
5
+ import * as Verified from './verified-tokens.js'
6
+
7
+ /** A token used for write round-trips. */
8
+ const novel = {
9
+ address: '0x20c00000000000000000000000000000000000ff',
10
+ currency: 'GBP',
11
+ decimals: 8,
12
+ name: 'Test GBP',
13
+ symbol: 'tGBP',
14
+ } as const
15
+
16
+ const chainId = '42431' as const
17
+
18
+ /** Write-enabled admin client backed by a fresh in-memory state store. */
19
+ function writes() {
20
+ return TestAdmin.setup({ verifiedTokens: { store: Store.memory() } })
21
+ }
22
+
23
+ describe('feature gate', () => {
24
+ test('write routes return 404 when no store is configured', async () => {
25
+ const { client } = TestAdmin.setup()
26
+ const response = await client['verified-tokens'].$post({
27
+ json: { ...novel, chainId: 42431 },
28
+ })
29
+ expect(response.status).toBe(404)
30
+ const body = (await response.json()) as { error?: { code?: string } }
31
+ expect(body.error?.code).toBe('verified_tokens_not_enabled')
32
+ })
33
+ })
34
+
35
+ describe('authentication', () => {
36
+ test('denied identity → 401', async () => {
37
+ const { client } = TestAdmin.setup({
38
+ identify: () => null,
39
+ verifiedTokens: { store: Store.memory() },
40
+ })
41
+ const response = await client['verified-tokens'].$post({
42
+ json: { ...novel, chainId: 42431 },
43
+ })
44
+ expect(response.status).toBe(401)
45
+ })
46
+ })
47
+
48
+ describe('list', () => {
49
+ test('returns 404 when no store is configured', async () => {
50
+ const { client } = TestAdmin.setup()
51
+ const response = await client['verified-tokens'].$get({ query: { chainId } })
52
+ expect(response.status).toBe(404)
53
+ })
54
+
55
+ test('empty list → data [] and null version', async () => {
56
+ const { client } = writes()
57
+ const response = await client['verified-tokens'].$get({ query: { chainId } })
58
+ expect(response.status).toBe(200)
59
+ const body = await TestApp.json(response, Verified.schema.listVerifiedTokens.Response)
60
+ expect(body.data).toEqual([])
61
+ expect(body.version).toBeNull()
62
+ })
63
+
64
+ test('reflects created tokens with a version', async () => {
65
+ const { client } = writes()
66
+ await client['verified-tokens'].$post({ json: { ...novel, chainId: 42431 } })
67
+ const response = await client['verified-tokens'].$get({ query: { chainId } })
68
+ const body = await TestApp.json(response, Verified.schema.listVerifiedTokens.Response)
69
+ expect(body.data).toHaveLength(1)
70
+ expect(body.data[0]?.address).toBe(novel.address)
71
+ expect(body.version).toBeTruthy()
72
+ })
73
+ })
74
+
75
+ describe('write lifecycle', () => {
76
+ test('create → patch → delete', async () => {
77
+ const { client } = writes()
78
+
79
+ const created = await client['verified-tokens'].$post({
80
+ json: { ...novel, chainId: 42431 },
81
+ })
82
+ expect(created.status).toBe(200)
83
+ const createdBody = await TestApp.json(created, Verified.schema.createVerifiedToken.Response)
84
+ expect(createdBody.data.address).toBe(novel.address)
85
+ expect(createdBody.version).toBeTruthy()
86
+
87
+ const patched = await client['verified-tokens'][':address'].$patch({
88
+ json: { name: 'Renamed GBP' },
89
+ param: { address: novel.address },
90
+ query: { chainId },
91
+ })
92
+ const patchedBody = await TestApp.json(patched, Verified.schema.patchVerifiedToken.Response)
93
+ expect(patchedBody.data.name).toBe('Renamed GBP')
94
+
95
+ const deleted = await client['verified-tokens'][':address'].$delete({
96
+ param: { address: novel.address },
97
+ query: { chainId },
98
+ })
99
+ expect(deleted.status).toBe(200)
100
+
101
+ // Prove the delete took effect: re-creating the same address now succeeds
102
+ // instead of conflicting.
103
+ const recreated = await client['verified-tokens'].$post({
104
+ json: { ...novel, chainId: 42431 },
105
+ })
106
+ expect(recreated.status).toBe(200)
107
+ })
108
+
109
+ test('rejects a duplicate address with 409', async () => {
110
+ const { client } = writes()
111
+ await client['verified-tokens'].$post({ json: { ...novel, chainId: 42431 } })
112
+ const duplicate = await client['verified-tokens'].$post({
113
+ json: { ...novel, chainId: 42431 },
114
+ })
115
+ expect(duplicate.status).toBe(409)
116
+ const body = (await duplicate.json()) as { error?: { code?: string } }
117
+ expect(body.error?.code).toBe('duplicate_address')
118
+ })
119
+
120
+ test('returns 404 patching an unknown address', async () => {
121
+ const { client } = writes()
122
+ const response = await client['verified-tokens'][':address'].$patch({
123
+ json: { name: 'x' },
124
+ param: { address: novel.address },
125
+ query: { chainId },
126
+ })
127
+ expect(response.status).toBe(404)
128
+ const body = (await response.json()) as { error?: { code?: string } }
129
+ expect(body.error?.code).toBe('verified_token_not_found')
130
+ })
131
+
132
+ test('rejects a stale If-Match with 412', async () => {
133
+ const { client } = writes()
134
+ await client['verified-tokens'].$post({ json: { ...novel, chainId: 42431 } })
135
+ const response = await client['verified-tokens'][':address'].$patch(
136
+ { json: { name: 'x' }, param: { address: novel.address }, query: { chainId } },
137
+ { headers: { 'if-match': '"stale"' } },
138
+ )
139
+ expect(response.status).toBe(412)
140
+ const body = (await response.json()) as { error?: { code?: string } }
141
+ expect(body.error?.code).toBe('version_mismatch')
142
+ })
143
+
144
+ test('replaces the whole list via PUT', async () => {
145
+ const { client } = writes()
146
+ const response = await client['verified-tokens'].$put({
147
+ json: { tokens: [novel] },
148
+ query: { chainId },
149
+ })
150
+ expect(response.status).toBe(200)
151
+ const body = await TestApp.json(response, Verified.schema.replaceVerifiedTokens.Response)
152
+ expect(body.data.map((token) => token.address)).toEqual([novel.address])
153
+ })
154
+
155
+ test('requires an explicit chainId on query-addressed mutations', async () => {
156
+ const { client } = writes()
157
+ const response = await client['verified-tokens'].$put({
158
+ json: { tokens: [novel] },
159
+ // Cast past the typed client to exercise runtime validation.
160
+ query: {} as never,
161
+ })
162
+ expect(response.status).toBe(400)
163
+ const body = (await response.json()) as { error?: { code?: string } }
164
+ expect(body.error?.code).toBe('query_invalid')
165
+ })
166
+ })
167
+
168
+ describe('create with inline logo', () => {
169
+ const svg = '<svg xmlns="http://www.w3.org/2000/svg"/>'
170
+
171
+ /** Write-enabled setup with an in-memory asset store capturing every put. */
172
+ function setup() {
173
+ const stored: { key: string; content: { body: ArrayBuffer; contentType: string } }[] = []
174
+ const { client } = TestAdmin.setup({
175
+ assets: {
176
+ get: async (key) => stored.find((entry) => entry.key === key)?.content,
177
+ put: async (key, content) => void stored.push({ content, key }),
178
+ },
179
+ verifiedTokens: { store: Store.memory() },
180
+ })
181
+ return { client, stored }
182
+ }
183
+
184
+ /** Count of tokens currently in the chain's verified list. */
185
+ async function count(client: ReturnType<typeof setup>['client']) {
186
+ const response = await client['verified-tokens'].$get({ query: { chainId } })
187
+ const body = await TestApp.json(response, Verified.schema.listVerifiedTokens.Response)
188
+ return body.data.length
189
+ }
190
+
191
+ test('uploads the logo and creates the token', async () => {
192
+ const { client, stored } = setup()
193
+ const response = await client['verified-tokens'].$post({
194
+ json: { ...novel, chainId: 42431, logo: svg },
195
+ })
196
+ expect(response.status).toBe(200)
197
+ expect(stored).toHaveLength(1)
198
+ expect(stored[0]?.key).toBe(`42431/icons/${novel.address}`)
199
+ expect(new TextDecoder().decode(stored[0]?.content.body)).toBe(svg)
200
+ expect(await count(client)).toBe(1)
201
+ })
202
+
203
+ test('a duplicate is rejected before the logo is uploaded', async () => {
204
+ const { client, stored } = setup()
205
+ await client['verified-tokens'].$post({ json: { ...novel, chainId: 42431 } })
206
+ const response = await client['verified-tokens'].$post({
207
+ json: { ...novel, chainId: 42431, logo: svg },
208
+ })
209
+ expect(response.status).toBe(409)
210
+ // The upload must not run for a duplicate, so an existing icon is never overwritten.
211
+ expect(stored).toHaveLength(0)
212
+ })
213
+
214
+ test('a failed upload leaves no token', async () => {
215
+ const { client } = TestAdmin.setup({
216
+ assets: {
217
+ get: async () => undefined,
218
+ put: async () => {
219
+ throw new Error('upload failed')
220
+ },
221
+ },
222
+ verifiedTokens: { store: Store.memory() },
223
+ })
224
+ const response = await client['verified-tokens'].$post({
225
+ json: { ...novel, chainId: 42431, logo: svg },
226
+ })
227
+ expect(response.status).toBe(502)
228
+ expect(await count(client)).toBe(0)
229
+ })
230
+
231
+ test('a logo without an asset writer is rejected, creating no token', async () => {
232
+ const { client } = writes()
233
+ const response = await client['verified-tokens'].$post({
234
+ json: { ...novel, chainId: 42431, logo: svg },
235
+ })
236
+ expect(response.status).toBe(404)
237
+ const body = (await response.json()) as { error?: { code?: string } }
238
+ expect(body.error?.code).toBe('assets_not_enabled')
239
+ expect(await count(client)).toBe(0)
240
+ })
241
+
242
+ test('a non-SVG logo is rejected with 415, creating no token', async () => {
243
+ const { client, stored } = setup()
244
+ const response = await client['verified-tokens'].$post({
245
+ json: { ...novel, chainId: 42431, logo: 'not svg' },
246
+ })
247
+ expect(response.status).toBe(415)
248
+ expect(stored).toHaveLength(0)
249
+ expect(await count(client)).toBe(0)
250
+ })
251
+ })
252
+
253
+ describe('logoUri', () => {
254
+ test('round-trips through create and patch', async () => {
255
+ const { client } = writes()
256
+ const logoUri = 'https://example.com/logo.svg'
257
+
258
+ const created = await client['verified-tokens'].$post({
259
+ json: { ...novel, chainId: 42431, logoUri },
260
+ })
261
+ expect(created.status).toBe(200)
262
+ const createdBody = await TestApp.json(created, Verified.schema.createVerifiedToken.Response)
263
+ expect(createdBody.data.logoUri).toBe(logoUri)
264
+
265
+ const patched = await client['verified-tokens'][':address'].$patch({
266
+ json: { logoUri: 'https://example.com/logo-v2.svg' },
267
+ param: { address: novel.address },
268
+ query: { chainId },
269
+ })
270
+ const patchedBody = await TestApp.json(patched, Verified.schema.patchVerifiedToken.Response)
271
+ expect(patchedBody.data.logoUri).toBe('https://example.com/logo-v2.svg')
272
+ // Untouched fields survive the patch.
273
+ expect(patchedBody.data.symbol).toBe(novel.symbol)
274
+ })
275
+
276
+ test('rejects a non-HTTPS logoUri with 400', async () => {
277
+ const { client } = writes()
278
+ const response = await client['verified-tokens'].$post({
279
+ json: { ...novel, chainId: 42431, logoUri: 'javascript:alert(1)' },
280
+ })
281
+ expect(response.status).toBe(400)
282
+ const body = (await response.json()) as { error?: { code?: string } }
283
+ expect(body.error?.code).toBe('body_invalid')
284
+ })
285
+ })
286
+
287
+ describe('PUT /verified-tokens/:address/logo', () => {
288
+ const svg = '<svg xmlns="http://www.w3.org/2000/svg"/>'
289
+
290
+ /** Setup with an in-memory asset store capturing every put. */
291
+ function uploads() {
292
+ const stored: { key: string; content: { body: ArrayBuffer; contentType: string } }[] = []
293
+ const { client } = TestAdmin.setup({
294
+ assets: {
295
+ get: async (key) => stored.find((entry) => entry.key === key)?.content,
296
+ put: async (key, content) => {
297
+ stored.push({ content, key })
298
+ },
299
+ },
300
+ verifiedTokens: { store: Store.memory() },
301
+ })
302
+ return { client, stored }
303
+ }
304
+
305
+ test('stores the SVG under the main API icon key', async () => {
306
+ const { client, stored } = uploads()
307
+ const response = await client['verified-tokens'][':address'].logo.$put(
308
+ { param: { address: novel.address }, query: { chainId } },
309
+ { headers: { 'content-type': 'image/svg+xml' }, init: { body: svg } },
310
+ )
311
+ expect(response.status).toBe(200)
312
+ const body = await TestApp.json(response, Verified.schema.uploadVerifiedTokenLogo.Response)
313
+
314
+ const key = `42431/icons/${novel.address}`
315
+ expect(body).toEqual({ key, path: `/assets/${key}` })
316
+ expect(stored).toHaveLength(1)
317
+ expect(stored[0]?.key).toBe(key)
318
+ expect(stored[0]?.content.contentType).toBe('image/svg+xml')
319
+ expect(new TextDecoder().decode(stored[0]?.content.body)).toBe(svg)
320
+ })
321
+
322
+ test('404 when no asset writer is configured', async () => {
323
+ const { client } = writes()
324
+ const response = await client['verified-tokens'][':address'].logo.$put(
325
+ { param: { address: novel.address }, query: { chainId } },
326
+ { headers: { 'content-type': 'image/svg+xml' }, init: { body: svg } },
327
+ )
328
+ expect(response.status).toBe(404)
329
+ const body = (await response.json()) as { error?: { code?: string } }
330
+ expect(body.error?.code).toBe('assets_not_enabled')
331
+ })
332
+
333
+ test('rejects a non-SVG content type with 415', async () => {
334
+ const { client, stored } = uploads()
335
+ const response = await client['verified-tokens'][':address'].logo.$put(
336
+ { param: { address: novel.address }, query: { chainId } },
337
+ { headers: { 'content-type': 'image/png' }, init: { body: svg } },
338
+ )
339
+ expect(response.status).toBe(415)
340
+ expect(stored).toHaveLength(0)
341
+ })
342
+
343
+ test('rejects an empty body with 400', async () => {
344
+ const { client, stored } = uploads()
345
+ const response = await client['verified-tokens'][':address'].logo.$put(
346
+ { param: { address: novel.address }, query: { chainId } },
347
+ { headers: { 'content-type': 'image/svg+xml' } },
348
+ )
349
+ expect(response.status).toBe(400)
350
+ expect(stored).toHaveLength(0)
351
+ })
352
+
353
+ test('rejects an oversized body with 413', async () => {
354
+ const { client, stored } = uploads()
355
+ const response = await client['verified-tokens'][':address'].logo.$put(
356
+ { param: { address: novel.address }, query: { chainId } },
357
+ {
358
+ headers: { 'content-type': 'image/svg+xml' },
359
+ init: { body: 'x'.repeat(256 * 1024 + 1) },
360
+ },
361
+ )
362
+ expect(response.status).toBe(413)
363
+ expect(stored).toHaveLength(0)
364
+ })
365
+ })
366
+
367
+ describe('GET /verified-tokens/:address/logo', () => {
368
+ const svg = '<svg xmlns="http://www.w3.org/2000/svg"/>'
369
+
370
+ /** Setup with an in-memory asset store backing both put and get. */
371
+ function store() {
372
+ const objects = new Map<string, { body: ArrayBuffer; contentType: string }>()
373
+ const { client } = TestAdmin.setup({
374
+ assets: {
375
+ get: async (key) => objects.get(key),
376
+ put: async (key, content) => void objects.set(key, content),
377
+ },
378
+ verifiedTokens: { store: Store.memory() },
379
+ })
380
+ return { client, objects }
381
+ }
382
+
383
+ test('serves a previously uploaded SVG', async () => {
384
+ const { client } = store()
385
+ await client['verified-tokens'][':address'].logo.$put(
386
+ { param: { address: novel.address }, query: { chainId } },
387
+ { headers: { 'content-type': 'image/svg+xml' }, init: { body: svg } },
388
+ )
389
+ const response = await client['verified-tokens'][':address'].logo.$get({
390
+ param: { address: novel.address },
391
+ query: { chainId },
392
+ })
393
+ expect(response.status).toBe(200)
394
+ expect(response.headers.get('content-type')).toBe('image/svg+xml')
395
+ expect(await response.text()).toBe(svg)
396
+ })
397
+
398
+ test('404 when the logo is absent', async () => {
399
+ const { client } = store()
400
+ const response = await client['verified-tokens'][':address'].logo.$get({
401
+ param: { address: novel.address },
402
+ query: { chainId },
403
+ })
404
+ expect(response.status).toBe(404)
405
+ })
406
+
407
+ test('404 when no asset reader is configured', async () => {
408
+ const { client } = writes()
409
+ const response = await client['verified-tokens'][':address'].logo.$get({
410
+ param: { address: novel.address },
411
+ query: { chainId },
412
+ })
413
+ expect(response.status).toBe(404)
414
+ })
415
+ })