tapimo 0.1.0 → 0.2.0

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 (385) hide show
  1. package/README.md +28 -15
  2. package/dist/ApiKey.d.ts +3 -1
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +1 -0
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +71 -3
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +117 -1
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +7139 -4197
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +133 -329
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +11 -4
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +12 -4
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/Webhooks.d.ts +2 -2
  19. package/dist/Webhooks.d.ts.map +1 -1
  20. package/dist/Webhooks.js +2 -2
  21. package/dist/Webhooks.js.map +1 -1
  22. package/dist/admin/App.d.ts +126 -53
  23. package/dist/admin/App.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.d.ts +104 -6
  25. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  26. package/dist/admin/apps/api-keys.js +67 -0
  27. package/dist/admin/apps/api-keys.js.map +1 -1
  28. package/dist/admin/apps/scopes.d.ts +4 -1
  29. package/dist/admin/apps/scopes.d.ts.map +1 -1
  30. package/dist/admin/apps/verified-tokens.d.ts +115 -115
  31. package/dist/admin/apps/verified-tokens.js +1 -1
  32. package/dist/admin/apps/verified-tokens.js.map +1 -1
  33. package/dist/admin/ui.generated.d.ts +1 -1
  34. package/dist/admin/ui.generated.js +1 -1
  35. package/dist/apps/data/App.d.ts +19176 -0
  36. package/dist/apps/data/App.d.ts.map +1 -0
  37. package/dist/apps/data/App.js +236 -0
  38. package/dist/apps/data/App.js.map +1 -0
  39. package/dist/apps/data/index.d.ts +3 -0
  40. package/dist/apps/data/index.d.ts.map +1 -0
  41. package/dist/apps/data/index.js +3 -0
  42. package/dist/apps/data/index.js.map +1 -0
  43. package/dist/apps/{activities.d.ts → data/routes/activities.d.ts} +32 -32
  44. package/dist/apps/{activities.d.ts.map → data/routes/activities.d.ts.map} +1 -1
  45. package/dist/apps/{activities.js → data/routes/activities.js} +13 -13
  46. package/dist/apps/data/routes/activities.js.map +1 -0
  47. package/dist/apps/{addresses.d.ts → data/routes/addresses.d.ts} +22 -22
  48. package/dist/apps/{addresses.d.ts.map → data/routes/addresses.d.ts.map} +1 -1
  49. package/dist/apps/{addresses.js → data/routes/addresses.js} +5 -5
  50. package/dist/apps/data/routes/addresses.js.map +1 -0
  51. package/dist/apps/{balances.d.ts → data/routes/balances.d.ts} +49 -49
  52. package/dist/apps/data/routes/balances.d.ts.map +1 -0
  53. package/dist/apps/{balances.js → data/routes/balances.js} +42 -11
  54. package/dist/apps/data/routes/balances.js.map +1 -0
  55. package/dist/apps/{blocks.d.ts → data/routes/blocks.d.ts} +47 -47
  56. package/dist/apps/data/routes/blocks.d.ts.map +1 -0
  57. package/dist/apps/{blocks.js → data/routes/blocks.js} +13 -13
  58. package/dist/apps/data/routes/blocks.js.map +1 -0
  59. package/dist/apps/{coingecko.d.ts → data/routes/coingecko.d.ts} +183 -183
  60. package/dist/apps/data/routes/coingecko.d.ts.map +1 -0
  61. package/dist/apps/{coingecko.js → data/routes/coingecko.js} +13 -13
  62. package/dist/apps/data/routes/coingecko.js.map +1 -0
  63. package/dist/apps/{exchanges.d.ts → data/routes/exchanges.d.ts} +460 -460
  64. package/dist/apps/data/routes/exchanges.d.ts.map +1 -0
  65. package/dist/apps/{exchanges.js → data/routes/exchanges.js} +19 -19
  66. package/dist/apps/data/routes/exchanges.js.map +1 -0
  67. package/dist/apps/{fee-amm.d.ts → data/routes/fee-amm.d.ts} +94 -94
  68. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -0
  69. package/dist/apps/{fee-amm.js → data/routes/fee-amm.js} +17 -17
  70. package/dist/apps/data/routes/fee-amm.js.map +1 -0
  71. package/dist/apps/{indexer.d.ts → data/routes/indexer.d.ts} +4 -4
  72. package/dist/apps/data/routes/indexer.d.ts.map +1 -0
  73. package/dist/apps/{indexer.js → data/routes/indexer.js} +13 -9
  74. package/dist/apps/data/routes/indexer.js.map +1 -0
  75. package/dist/apps/{receipts.d.ts → data/routes/receipts.d.ts} +49 -49
  76. package/dist/apps/data/routes/receipts.d.ts.map +1 -0
  77. package/dist/apps/{receipts.js → data/routes/receipts.js} +12 -12
  78. package/dist/apps/data/routes/receipts.js.map +1 -0
  79. package/dist/apps/{rpc.d.ts → data/routes/rpc.d.ts} +4 -4
  80. package/dist/apps/data/routes/rpc.d.ts.map +1 -0
  81. package/dist/apps/{rpc.js → data/routes/rpc.js} +6 -6
  82. package/dist/apps/data/routes/rpc.js.map +1 -0
  83. package/dist/apps/{tokenlist.d.ts → data/routes/tokenlist.d.ts} +4 -4
  84. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -0
  85. package/dist/apps/{tokenlist.js → data/routes/tokenlist.js} +8 -8
  86. package/dist/apps/data/routes/tokenlist.js.map +1 -0
  87. package/dist/apps/{tokens.d.ts → data/routes/tokens.d.ts} +468 -468
  88. package/dist/apps/data/routes/tokens.d.ts.map +1 -0
  89. package/dist/apps/{tokens.js → data/routes/tokens.js} +19 -19
  90. package/dist/apps/data/routes/tokens.js.map +1 -0
  91. package/dist/apps/{transactions.d.ts → data/routes/transactions.d.ts} +304 -304
  92. package/dist/apps/data/routes/transactions.d.ts.map +1 -0
  93. package/dist/apps/{transactions.js → data/routes/transactions.js} +13 -13
  94. package/dist/apps/data/routes/transactions.js.map +1 -0
  95. package/dist/apps/{transfers.d.ts → data/routes/transfers.d.ts} +6 -6
  96. package/dist/apps/data/routes/transfers.d.ts.map +1 -0
  97. package/dist/apps/{transfers.js → data/routes/transfers.js} +13 -13
  98. package/dist/apps/data/routes/transfers.js.map +1 -0
  99. package/dist/apps/{verified-tokens.d.ts → data/routes/verified-tokens.d.ts} +42 -42
  100. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -0
  101. package/dist/apps/{verified-tokens.js → data/routes/verified-tokens.js} +9 -9
  102. package/dist/apps/data/routes/verified-tokens.js.map +1 -0
  103. package/dist/apps/{webhooks.d.ts → data/routes/webhooks.d.ts} +62 -62
  104. package/dist/apps/{webhooks.d.ts.map → data/routes/webhooks.d.ts.map} +1 -1
  105. package/dist/apps/{webhooks.js → data/routes/webhooks.js} +30 -26
  106. package/dist/apps/data/routes/webhooks.js.map +1 -0
  107. package/dist/apps/docs/App.d.ts +27 -0
  108. package/dist/apps/docs/App.d.ts.map +1 -0
  109. package/dist/apps/docs/App.js +122 -0
  110. package/dist/apps/docs/App.js.map +1 -0
  111. package/dist/{internal/OpenApi.fonts.d.ts → apps/docs/fonts.d.ts} +1 -1
  112. package/dist/apps/docs/fonts.d.ts.map +1 -0
  113. package/dist/{internal/OpenApi.fonts.js → apps/docs/fonts.js} +1 -1
  114. package/dist/apps/docs/fonts.js.map +1 -0
  115. package/dist/apps/docs/index.d.ts +2 -0
  116. package/dist/apps/docs/index.d.ts.map +1 -0
  117. package/dist/apps/docs/index.js +2 -0
  118. package/dist/apps/docs/index.js.map +1 -0
  119. package/dist/{internal/OpenApi.logo.d.ts → apps/docs/logo.d.ts} +1 -1
  120. package/dist/apps/docs/logo.d.ts.map +1 -0
  121. package/dist/{internal/OpenApi.logo.js → apps/docs/logo.js} +1 -1
  122. package/dist/apps/docs/logo.js.map +1 -0
  123. package/dist/apps/index.d.ts +4 -0
  124. package/dist/apps/index.d.ts.map +1 -0
  125. package/dist/apps/index.js +4 -0
  126. package/dist/apps/index.js.map +1 -0
  127. package/dist/apps/metadata.d.ts +7 -0
  128. package/dist/apps/metadata.d.ts.map +1 -0
  129. package/dist/apps/metadata.js +15 -0
  130. package/dist/apps/metadata.js.map +1 -0
  131. package/dist/apps/platform/App.d.ts +2985 -0
  132. package/dist/apps/platform/App.d.ts.map +1 -0
  133. package/dist/apps/platform/App.js +74 -0
  134. package/dist/apps/platform/App.js.map +1 -0
  135. package/dist/apps/platform/index.d.ts +2 -0
  136. package/dist/apps/platform/index.d.ts.map +1 -0
  137. package/dist/apps/platform/index.js +2 -0
  138. package/dist/apps/platform/index.js.map +1 -0
  139. package/dist/apps/platform/routes/api-keys.d.ts +681 -0
  140. package/dist/apps/platform/routes/api-keys.d.ts.map +1 -0
  141. package/dist/apps/platform/routes/api-keys.js +328 -0
  142. package/dist/apps/platform/routes/api-keys.js.map +1 -0
  143. package/dist/apps/platform/routes/invitations.d.ts +733 -0
  144. package/dist/apps/platform/routes/invitations.d.ts.map +1 -0
  145. package/dist/apps/platform/routes/invitations.js +413 -0
  146. package/dist/apps/platform/routes/invitations.js.map +1 -0
  147. package/dist/apps/platform/routes/me.d.ts +95 -0
  148. package/dist/apps/platform/routes/me.d.ts.map +1 -0
  149. package/dist/apps/platform/routes/me.js +81 -0
  150. package/dist/apps/platform/routes/me.js.map +1 -0
  151. package/dist/apps/platform/routes/members.d.ts +554 -0
  152. package/dist/apps/platform/routes/members.d.ts.map +1 -0
  153. package/dist/apps/platform/routes/members.js +251 -0
  154. package/dist/apps/platform/routes/members.js.map +1 -0
  155. package/dist/apps/platform/routes/orgs.d.ts +582 -0
  156. package/dist/apps/platform/routes/orgs.d.ts.map +1 -0
  157. package/dist/apps/platform/routes/orgs.js +265 -0
  158. package/dist/apps/platform/routes/orgs.js.map +1 -0
  159. package/dist/apps/platform/routes/projects.d.ts +740 -0
  160. package/dist/apps/platform/routes/projects.d.ts.map +1 -0
  161. package/dist/apps/platform/routes/projects.js +286 -0
  162. package/dist/apps/platform/routes/projects.js.map +1 -0
  163. package/dist/apps/relay/App.d.ts +41 -0
  164. package/dist/apps/relay/App.d.ts.map +1 -0
  165. package/dist/apps/relay/App.js +103 -0
  166. package/dist/apps/relay/App.js.map +1 -0
  167. package/dist/apps/relay/Sponsorships.d.ts +107 -0
  168. package/dist/apps/relay/Sponsorships.d.ts.map +1 -0
  169. package/dist/apps/relay/Sponsorships.js +193 -0
  170. package/dist/apps/relay/Sponsorships.js.map +1 -0
  171. package/dist/apps/relay/index.d.ts +3 -0
  172. package/dist/apps/relay/index.d.ts.map +1 -0
  173. package/dist/apps/relay/index.js +3 -0
  174. package/dist/apps/relay/index.js.map +1 -0
  175. package/dist/cli/Cli.d.ts +1 -1
  176. package/dist/cli/Cli.js +1 -1
  177. package/dist/cli/commands/admin.d.ts +1 -1
  178. package/dist/cli/commands/admin.js +2 -2
  179. package/dist/cli/commands/admin.js.map +1 -1
  180. package/dist/db/Db.d.ts +10 -0
  181. package/dist/db/Db.d.ts.map +1 -1
  182. package/dist/db/Db.js +128 -0
  183. package/dist/db/Db.js.map +1 -1
  184. package/dist/db/Schema.d.ts +80 -0
  185. package/dist/db/Schema.d.ts.map +1 -1
  186. package/dist/db/Schema.js +99 -0
  187. package/dist/db/Schema.js.map +1 -1
  188. package/dist/db/tables/invitations.d.ts +84 -0
  189. package/dist/db/tables/invitations.d.ts.map +1 -0
  190. package/dist/db/tables/invitations.js +165 -0
  191. package/dist/db/tables/invitations.js.map +1 -0
  192. package/dist/db/tables/memberships.d.ts +108 -0
  193. package/dist/db/tables/memberships.d.ts.map +1 -0
  194. package/dist/db/tables/memberships.js +153 -0
  195. package/dist/db/tables/memberships.js.map +1 -0
  196. package/dist/db/tables/organizations.d.ts +44 -0
  197. package/dist/db/tables/organizations.d.ts.map +1 -1
  198. package/dist/db/tables/organizations.js +89 -0
  199. package/dist/db/tables/organizations.js.map +1 -1
  200. package/dist/db/tables/projects.d.ts +65 -0
  201. package/dist/db/tables/projects.d.ts.map +1 -0
  202. package/dist/db/tables/projects.js +75 -0
  203. package/dist/db/tables/projects.js.map +1 -0
  204. package/dist/db/tables/sponsoredTransactions.d.ts +120 -0
  205. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -0
  206. package/dist/db/tables/sponsoredTransactions.js +161 -0
  207. package/dist/db/tables/sponsoredTransactions.js.map +1 -0
  208. package/dist/db/tables/users.d.ts +48 -0
  209. package/dist/db/tables/users.d.ts.map +1 -0
  210. package/dist/db/tables/users.js +65 -0
  211. package/dist/db/tables/users.js.map +1 -0
  212. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  213. package/dist/handlers/internal/executionError.js +2 -0
  214. package/dist/handlers/internal/executionError.js.map +1 -1
  215. package/dist/handlers/internal/multisig.d.ts +2 -6
  216. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  217. package/dist/handlers/internal/multisig.js +11 -36
  218. package/dist/handlers/internal/multisig.js.map +1 -1
  219. package/dist/handlers/internal/sponsorship.d.ts +32 -2
  220. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  221. package/dist/handlers/internal/sponsorship.js +34 -9
  222. package/dist/handlers/internal/sponsorship.js.map +1 -1
  223. package/dist/handlers/relay.d.ts +6 -2
  224. package/dist/handlers/relay.d.ts.map +1 -1
  225. package/dist/handlers/relay.js +16 -2
  226. package/dist/handlers/relay.js.map +1 -1
  227. package/dist/internal/Auth.d.ts +208 -6
  228. package/dist/internal/Auth.d.ts.map +1 -1
  229. package/dist/internal/Auth.js +500 -21
  230. package/dist/internal/Auth.js.map +1 -1
  231. package/dist/internal/Log.d.ts +7 -3
  232. package/dist/internal/Log.d.ts.map +1 -1
  233. package/dist/internal/Log.js +4 -0
  234. package/dist/internal/Log.js.map +1 -1
  235. package/dist/internal/OpenApi.d.ts +0 -19
  236. package/dist/internal/OpenApi.d.ts.map +1 -1
  237. package/dist/internal/OpenApi.js +0 -57
  238. package/dist/internal/OpenApi.js.map +1 -1
  239. package/dist/internal/Store.d.ts +7 -1
  240. package/dist/internal/Store.d.ts.map +1 -1
  241. package/dist/internal/Store.js +16 -2
  242. package/dist/internal/Store.js.map +1 -1
  243. package/dist/internal/Viem.d.ts +84 -0
  244. package/dist/internal/Viem.d.ts.map +1 -1
  245. package/dist/internal/Webhooks.d.ts +1 -1
  246. package/dist/internal/Webhooks.d.ts.map +1 -1
  247. package/package.json +31 -5
  248. package/src/ApiKey.ts +1 -0
  249. package/src/ApiKeys.test.ts +104 -1
  250. package/src/ApiKeys.ts +154 -1
  251. package/src/App.test.ts +11187 -179
  252. package/src/App.ts +200 -420
  253. package/src/Client.test-d.ts +306 -15
  254. package/src/Scope.ts +13 -4
  255. package/src/Webhooks.ts +2 -2
  256. package/src/admin/apps/api-keys.test.ts +51 -0
  257. package/src/admin/apps/api-keys.ts +84 -0
  258. package/src/admin/apps/scopes.test.ts +5 -1
  259. package/src/admin/apps/verified-tokens.ts +1 -1
  260. package/src/admin/ui.generated.ts +1 -1
  261. package/src/apps/composition.test.ts +66 -0
  262. package/src/apps/data/App.ts +295 -0
  263. package/src/apps/data/index.ts +2 -0
  264. package/src/apps/{activities.test.ts → data/routes/activities.test.ts} +3 -3
  265. package/src/apps/{activities.ts → data/routes/activities.ts} +15 -15
  266. package/src/apps/{addresses.ts → data/routes/addresses.ts} +6 -6
  267. package/src/apps/{balances.test.ts → data/routes/balances.test.ts} +2 -2
  268. package/src/apps/{balances.ts → data/routes/balances.ts} +46 -12
  269. package/src/apps/{blocks.test.ts → data/routes/blocks.test.ts} +3 -3
  270. package/src/apps/{blocks.ts → data/routes/blocks.ts} +14 -14
  271. package/src/apps/{coingecko.test.ts → data/routes/coingecko.test.ts} +2 -2
  272. package/src/apps/{coingecko.ts → data/routes/coingecko.ts} +14 -14
  273. package/src/apps/{exchanges.test.ts → data/routes/exchanges.test.ts} +1 -1
  274. package/src/apps/{exchanges.ts → data/routes/exchanges.ts} +20 -20
  275. package/src/apps/{fee-amm.test.ts → data/routes/fee-amm.test.ts} +3 -3
  276. package/src/apps/{fee-amm.ts → data/routes/fee-amm.ts} +18 -18
  277. package/src/apps/{indexer.test.ts → data/routes/indexer.test.ts} +26 -5
  278. package/src/apps/{indexer.ts → data/routes/indexer.ts} +13 -10
  279. package/src/apps/{receipts.test.ts → data/routes/receipts.test.ts} +3 -3
  280. package/src/apps/{receipts.ts → data/routes/receipts.ts} +13 -13
  281. package/src/apps/{rpc.test.ts → data/routes/rpc.test.ts} +44 -5
  282. package/src/apps/{rpc.ts → data/routes/rpc.ts} +7 -7
  283. package/src/apps/{tokenlist.test.ts → data/routes/tokenlist.test.ts} +3 -3
  284. package/src/apps/{tokenlist.ts → data/routes/tokenlist.ts} +9 -9
  285. package/src/apps/{tokens.test.ts → data/routes/tokens.test.ts} +2 -2
  286. package/src/apps/{tokens.ts → data/routes/tokens.ts} +20 -20
  287. package/src/apps/{transactions.test.ts → data/routes/transactions.test.ts} +3 -3
  288. package/src/apps/{transactions.ts → data/routes/transactions.ts} +15 -15
  289. package/src/apps/{transfers.test.ts → data/routes/transfers.test.ts} +2 -2
  290. package/src/apps/{transfers.ts → data/routes/transfers.ts} +15 -15
  291. package/src/apps/{verified-tokens.test.ts → data/routes/verified-tokens.test.ts} +3 -3
  292. package/src/apps/{verified-tokens.ts → data/routes/verified-tokens.ts} +10 -10
  293. package/src/apps/{webhooks.test.ts → data/routes/webhooks.test.ts} +6 -6
  294. package/src/apps/{webhooks.ts → data/routes/webhooks.ts} +39 -35
  295. package/src/apps/docs/App.ts +136 -0
  296. package/src/apps/docs/index.ts +1 -0
  297. package/src/apps/index.ts +3 -0
  298. package/src/apps/metadata.ts +23 -0
  299. package/src/apps/platform/App.ts +130 -0
  300. package/src/apps/platform/index.ts +1 -0
  301. package/src/apps/platform/routes/api-keys.test.ts +330 -0
  302. package/src/apps/platform/routes/api-keys.ts +427 -0
  303. package/src/apps/platform/routes/invitations.test.ts +361 -0
  304. package/src/apps/platform/routes/invitations.ts +519 -0
  305. package/src/apps/platform/routes/me.test.ts +121 -0
  306. package/src/apps/platform/routes/me.ts +106 -0
  307. package/src/apps/platform/routes/members.test.ts +195 -0
  308. package/src/apps/platform/routes/members.ts +313 -0
  309. package/src/apps/platform/routes/orgs.test.ts +313 -0
  310. package/src/apps/platform/routes/orgs.ts +343 -0
  311. package/src/apps/platform/routes/projects.test.ts +181 -0
  312. package/src/apps/platform/routes/projects.ts +367 -0
  313. package/src/apps/relay/App.test.ts +484 -0
  314. package/src/apps/relay/App.ts +128 -0
  315. package/src/apps/relay/Sponsorships.test.ts +375 -0
  316. package/src/apps/relay/Sponsorships.ts +305 -0
  317. package/src/apps/relay/index.ts +2 -0
  318. package/src/cli/Cli.ts +1 -1
  319. package/src/cli/commands/admin.ts +2 -2
  320. package/src/db/Db.ts +159 -0
  321. package/src/db/Schema.ts +137 -0
  322. package/src/db/tables/invitations.ts +198 -0
  323. package/src/db/tables/memberships.ts +208 -0
  324. package/src/db/tables/organizations.test.ts +37 -1
  325. package/src/db/tables/organizations.ts +105 -0
  326. package/src/db/tables/projects.ts +107 -0
  327. package/src/db/tables/sponsoredTransactions.test.ts +218 -0
  328. package/src/db/tables/sponsoredTransactions.ts +236 -0
  329. package/src/db/tables/users.ts +85 -0
  330. package/src/handlers/internal/executionError.ts +2 -0
  331. package/src/handlers/internal/multisig.test.ts +84 -10
  332. package/src/handlers/internal/multisig.ts +15 -50
  333. package/src/handlers/internal/sponsorship.ts +74 -15
  334. package/src/handlers/{internal/relay.localnet.test.ts → relay.test.ts} +2 -2
  335. package/src/handlers/relay.ts +23 -5
  336. package/src/internal/Auth.test.ts +316 -0
  337. package/src/internal/Auth.ts +691 -25
  338. package/src/internal/Cursor.test.ts +3 -2
  339. package/src/internal/Log.test.ts +1 -1
  340. package/src/internal/Log.ts +11 -3
  341. package/src/internal/MetricSink.ts +1 -1
  342. package/src/internal/OpenApi.ts +0 -59
  343. package/src/internal/Store.test.ts +52 -0
  344. package/src/internal/Store.ts +24 -5
  345. package/src/internal/Tidx.local.test.ts +1 -1
  346. package/src/internal/VerifiedTokens.test.ts +1 -1
  347. package/src/internal/WebhookDestination.test.ts +1 -1
  348. package/src/internal/Webhooks.test.ts +4 -4
  349. package/src/internal/Webhooks.ts +1 -1
  350. package/dist/apps/activities.js.map +0 -1
  351. package/dist/apps/addresses.js.map +0 -1
  352. package/dist/apps/balances.d.ts.map +0 -1
  353. package/dist/apps/balances.js.map +0 -1
  354. package/dist/apps/blocks.d.ts.map +0 -1
  355. package/dist/apps/blocks.js.map +0 -1
  356. package/dist/apps/coingecko.d.ts.map +0 -1
  357. package/dist/apps/coingecko.js.map +0 -1
  358. package/dist/apps/exchanges.d.ts.map +0 -1
  359. package/dist/apps/exchanges.js.map +0 -1
  360. package/dist/apps/fee-amm.d.ts.map +0 -1
  361. package/dist/apps/fee-amm.js.map +0 -1
  362. package/dist/apps/indexer.d.ts.map +0 -1
  363. package/dist/apps/indexer.js.map +0 -1
  364. package/dist/apps/receipts.d.ts.map +0 -1
  365. package/dist/apps/receipts.js.map +0 -1
  366. package/dist/apps/rpc.d.ts.map +0 -1
  367. package/dist/apps/rpc.js.map +0 -1
  368. package/dist/apps/tokenlist.d.ts.map +0 -1
  369. package/dist/apps/tokenlist.js.map +0 -1
  370. package/dist/apps/tokens.d.ts.map +0 -1
  371. package/dist/apps/tokens.js.map +0 -1
  372. package/dist/apps/transactions.d.ts.map +0 -1
  373. package/dist/apps/transactions.js.map +0 -1
  374. package/dist/apps/transfers.d.ts.map +0 -1
  375. package/dist/apps/transfers.js.map +0 -1
  376. package/dist/apps/verified-tokens.d.ts.map +0 -1
  377. package/dist/apps/verified-tokens.js.map +0 -1
  378. package/dist/apps/webhooks.js.map +0 -1
  379. package/dist/internal/OpenApi.fonts.d.ts.map +0 -1
  380. package/dist/internal/OpenApi.fonts.js.map +0 -1
  381. package/dist/internal/OpenApi.logo.d.ts.map +0 -1
  382. package/dist/internal/OpenApi.logo.js.map +0 -1
  383. package/src/handlers/internal/multisig.localnet.test.ts +0 -146
  384. /package/src/{internal/OpenApi.fonts.ts → apps/docs/fonts.ts} +0 -0
  385. /package/src/{internal/OpenApi.logo.ts → apps/docs/logo.ts} +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tapimo",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "main": "./dist/index.js",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -15,18 +15,19 @@
15
15
  "dependencies": {
16
16
  "@hono/node-server": "^2.0.3",
17
17
  "@hono/standard-validator": "^0.2.2",
18
+ "accounts": "^0.14.11",
18
19
  "hono": "^4.12.26",
19
20
  "hono-openapi": "^1.3.0",
20
21
  "incur": "^0.4.7",
21
22
  "jose": "^6.2.3",
22
23
  "kysely": "^0.29.2",
23
- "mppx": "^0.8.4",
24
+ "mppx": "^0.8.5",
24
25
  "nanoid": "^5.1.11",
25
- "ox": "0.14.29",
26
+ "ox": "0.14.30",
26
27
  "pg": "^8.22.0",
27
28
  "tidx.ts": "^0.1.1",
28
- "viem": "2.54.1",
29
- "vocs": "^2.2.4",
29
+ "viem": "2.54.6",
30
+ "vocs": "^2.3.3",
30
31
  "zod": "^4.4.3"
31
32
  },
32
33
  "sideEffects": false,
@@ -38,6 +39,11 @@
38
39
  "types": "./dist/index.d.ts",
39
40
  "default": "./dist/index.js"
40
41
  },
42
+ "./apps": {
43
+ "src": "./src/apps/index.ts",
44
+ "types": "./dist/apps/index.d.ts",
45
+ "default": "./dist/apps/index.js"
46
+ },
41
47
  "./admin": {
42
48
  "src": "./src/admin/index.ts",
43
49
  "types": "./dist/admin/index.d.ts",
@@ -47,6 +53,26 @@
47
53
  "src": "./src/cloudflare.ts",
48
54
  "types": "./dist/cloudflare.d.ts",
49
55
  "default": "./dist/cloudflare.js"
56
+ },
57
+ "./data": {
58
+ "src": "./src/apps/data/index.ts",
59
+ "types": "./dist/apps/data/index.d.ts",
60
+ "default": "./dist/apps/data/index.js"
61
+ },
62
+ "./docs": {
63
+ "src": "./src/apps/docs/index.ts",
64
+ "types": "./dist/apps/docs/index.d.ts",
65
+ "default": "./dist/apps/docs/index.js"
66
+ },
67
+ "./platform": {
68
+ "src": "./src/apps/platform/index.ts",
69
+ "types": "./dist/apps/platform/index.d.ts",
70
+ "default": "./dist/apps/platform/index.js"
71
+ },
72
+ "./relay": {
73
+ "src": "./src/apps/relay/index.ts",
74
+ "types": "./dist/apps/relay/index.d.ts",
75
+ "default": "./dist/apps/relay/index.js"
50
76
  }
51
77
  }
52
78
  }
package/src/ApiKey.ts CHANGED
@@ -33,6 +33,7 @@ export namespace schema {
33
33
  id: z.string().check(z.describe('Stable key id.')),
34
34
  name: z.optional(z.string()).check(z.describe('Human-readable key name.')),
35
35
  orgId: z.string().check(z.describe('Owning organization id.')),
36
+ projectId: z.optional(z.string()).check(z.describe('Owning project id (`prj_…`).')),
36
37
  rateLimits: z
37
38
  .optional(z.record(z.string(), RateLimit.schema.Limit))
38
39
  .check(
@@ -168,8 +168,111 @@ describe('revoke', () => {
168
168
 
169
169
  // The id index entry maps id -> record key; revoke uses it directly.
170
170
  expect(await ApiKeys.revoke(state, record.id)).toBe(true)
171
- // Both the record and its id index entry are gone.
171
+ // The record and both index entries are gone.
172
172
  const { keys } = await state.list({ prefix: 'apikey' })
173
173
  expect(keys).toMatchInlineSnapshot(`[]`)
174
174
  })
175
175
  })
176
+
177
+ describe('get', () => {
178
+ test('reads a record by id, null when absent', async () => {
179
+ const state = Store.memory()
180
+ const { record } = await ApiKeys.mint(state, {
181
+ orgId: 'org_a',
182
+ projectId: 'prj_a',
183
+ scopes: ['data:read'],
184
+ })
185
+
186
+ expect((await ApiKeys.get(state, record.id))?.projectId).toBe('prj_a')
187
+ expect(await ApiKeys.get(state, 'key_missing')).toBeNull()
188
+ })
189
+ })
190
+
191
+ describe('listByOrg', () => {
192
+ beforeEach(() => vi.useFakeTimers({ now: new Date('2026-01-01T00:00:00.000Z') }))
193
+ afterEach(() => vi.useRealTimers())
194
+
195
+ test('lists through the org index, newest first, filtered by project', async () => {
196
+ const state = Store.memory()
197
+
198
+ await ApiKeys.mint(state, { name: 'a', orgId: 'org_a', projectId: 'prj_a', scopes: ['data:read'] }) // prettier-ignore
199
+ vi.setSystemTime(new Date('2026-01-01T00:00:01.000Z'))
200
+ await ApiKeys.mint(state, { name: 'b', orgId: 'org_a', projectId: 'prj_b', scopes: ['data:read'] }) // prettier-ignore
201
+ await ApiKeys.mint(state, { name: 'c', orgId: 'org_b', scopes: ['data:read'] })
202
+
203
+ expect((await ApiKeys.listByOrg(state, 'org_a')).map((record) => record.name))
204
+ .toMatchInlineSnapshot(`
205
+ [
206
+ "b",
207
+ "a",
208
+ ]
209
+ `)
210
+ expect(
211
+ (await ApiKeys.listByOrg(state, 'org_a', { projectId: 'prj_b' })).map(
212
+ (record) => record.name,
213
+ ),
214
+ ).toMatchInlineSnapshot(`
215
+ [
216
+ "b",
217
+ ]
218
+ `)
219
+ })
220
+
221
+ test('skips and lazily cleans dangling index entries', async () => {
222
+ const state = Store.memory()
223
+ await ApiKeys.mint(state, { orgId: 'org_a', scopes: ['data:read'] })
224
+
225
+ // Simulate a record evicted out-of-band (e.g. native TTL), leaving the
226
+ // index entry behind.
227
+ const recordKey = (await state.list({ prefix: 'apikey:' })).keys[0]!.name
228
+ await state.delete(recordKey)
229
+
230
+ expect(await ApiKeys.listByOrg(state, 'org_a')).toEqual([])
231
+ expect((await state.list({ prefix: 'apikey_org:' })).keys).toMatchInlineSnapshot(`[]`)
232
+ })
233
+ })
234
+
235
+ describe('attribute', () => {
236
+ test('re-attributes org and project, moving the org index', async () => {
237
+ const state = Store.memory()
238
+ const { record, token } = await ApiKeys.mint(state, { orgId: 'org_a', scopes: ['data:read'] })
239
+
240
+ const updated = await ApiKeys.attribute(state, record.id, {
241
+ orgId: 'org_b',
242
+ projectId: 'prj_b',
243
+ })
244
+ expect(updated?.orgId).toBe('org_b')
245
+ expect(updated?.projectId).toBe('prj_b')
246
+
247
+ // The original token keeps resolving, now carrying the attribution.
248
+ const resolved = await ApiKeys.resolve(state, token)
249
+ expect(resolved?.orgId).toBe('org_b')
250
+ expect(resolved?.projectId).toBe('prj_b')
251
+
252
+ expect(await ApiKeys.listByOrg(state, 'org_a')).toEqual([])
253
+ expect((await ApiKeys.listByOrg(state, 'org_b')).map(({ id }) => id)).toEqual([record.id])
254
+
255
+ expect(await ApiKeys.attribute(state, 'key_missing', { projectId: 'prj_x' })).toBeNull()
256
+ })
257
+ })
258
+
259
+ describe('backfill', () => {
260
+ test('rebuilds index entries for legacy records', async () => {
261
+ const state = Store.memory()
262
+ const { record, token } = await ApiKeys.mint(state, { orgId: 'org_a', scopes: ['data:read'] })
263
+
264
+ // Legacy state: records exist, index entries do not.
265
+ for (const { name } of (await state.list({ prefix: 'apikey_id:' })).keys)
266
+ await state.delete(name)
267
+ for (const { name } of (await state.list({ prefix: 'apikey_org:' })).keys)
268
+ await state.delete(name)
269
+ expect(await ApiKeys.listByOrg(state, 'org_a')).toEqual([])
270
+
271
+ expect(await ApiKeys.backfill(state)).toEqual({ indexed: 1, scanned: 1 })
272
+
273
+ expect((await ApiKeys.listByOrg(state, 'org_a')).map(({ id }) => id)).toEqual([record.id])
274
+ expect(await ApiKeys.resolve(state, token)).not.toBeNull()
275
+ // The id index is restored, so revoke-by-id works again.
276
+ expect(await ApiKeys.revoke(state, record.id)).toBe(true)
277
+ })
278
+ })
package/src/ApiKeys.ts CHANGED
@@ -100,6 +100,7 @@ export async function mint(state: Store.State, input: MintInput): Promise<MintRe
100
100
  ...(data.createdBy === undefined ? {} : { createdBy: data.createdBy }),
101
101
  ...(data.expiresAt === undefined ? {} : { expiresAt: data.expiresAt }),
102
102
  ...(data.name === undefined ? {} : { name: data.name }),
103
+ ...(data.projectId === undefined ? {} : { projectId: data.projectId }),
103
104
  ...(data.rateLimits === undefined ? {} : { rateLimits: data.rateLimits }),
104
105
  }
105
106
 
@@ -113,6 +114,9 @@ export async function mint(state: Store.State, input: MintInput): Promise<MintRe
113
114
  // token hash, unrecoverable from the id alone). Shares the record's TTL so
114
115
  // both entries expire together.
115
116
  await state.put(idKeyFor(record.id), recordKey, { ttl })
117
+ // Index `org → recordKey` (one entry per key, so concurrent mints never
118
+ // race a shared value) backing org-scoped listing without a full scan.
119
+ await state.put(orgKeyFor(record.orgId, record.id), recordKey, { ttl })
116
120
  return { record, token }
117
121
  }
118
122
 
@@ -129,6 +133,19 @@ export async function resolve(state: Store.State, token: string): Promise<ApiKey
129
133
  return read(state, ApiKey.keyFor(token), Date.now())
130
134
  }
131
135
 
136
+ /**
137
+ * Reads a key record by id (metadata only — never the token), or `null`.
138
+ *
139
+ * @param state - The KV state store holding key records.
140
+ * @param id - The key id (`key_…`).
141
+ * @returns The record, or `null`.
142
+ */
143
+ export async function get(state: Store.State, id: string): Promise<Record | null> {
144
+ const recordKey = await state.get(idKeyFor(id))
145
+ if (!recordKey) return null
146
+ return read(state, recordKey, Date.now())
147
+ }
148
+
132
149
  /**
133
150
  * Lists key records (metadata only — never tokens), newest first. Expired or
134
151
  * catalog-invalid records are skipped.
@@ -160,7 +177,44 @@ export declare namespace list {
160
177
  }
161
178
 
162
179
  /**
163
- * Revokes a key by id, deleting its record and index entry.
180
+ * Lists an organization's key records through the org index (no full scan),
181
+ * newest first. Dangling index entries (revoked or expired records) are
182
+ * skipped and lazily deleted.
183
+ *
184
+ * @param state - The KV state store holding key records.
185
+ * @param orgId - The owning organization id (`org_…`).
186
+ * @param options - Optional project filter.
187
+ * @returns The records.
188
+ */
189
+ export async function listByOrg(
190
+ state: Store.State,
191
+ orgId: string,
192
+ options: listByOrg.Options = {},
193
+ ): Promise<readonly Record[]> {
194
+ const { keys } = await state.list({ prefix: `${orgPrefix}${orgId}:` })
195
+ const records: Record[] = []
196
+ for (const { name } of keys) {
197
+ const recordKey = await state.get(name)
198
+ const record = recordKey ? await read(state, recordKey, Date.now()) : null
199
+ if (!record) {
200
+ await state.delete(name)
201
+ continue
202
+ }
203
+ if (!options.projectId || record.projectId === options.projectId) records.push(record)
204
+ }
205
+ return records.sort((a, b) => b.createdAt.localeCompare(a.createdAt))
206
+ }
207
+
208
+ export declare namespace listByOrg {
209
+ /** Options for {@link listByOrg}. */
210
+ type Options = {
211
+ /** Restrict results to keys attributed to this project. */
212
+ projectId?: string | undefined
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Revokes a key by id, deleting its record and index entries.
164
218
  *
165
219
  * @param state - The KV state store holding key records.
166
220
  * @param id - The key id (`key_…`).
@@ -169,11 +223,102 @@ export declare namespace list {
169
223
  export async function revoke(state: Store.State, id: string): Promise<boolean> {
170
224
  const recordKey = await state.get(idKeyFor(id))
171
225
  if (!recordKey) return false
226
+ // Parse loosely for the org index entry: even a record the catalog no
227
+ // longer validates must clean up its index on revoke.
228
+ const raw = await state.get(recordKey)
229
+ const orgId = (() => {
230
+ try {
231
+ return raw ? (JSON.parse(raw) as { orgId?: string }).orgId : undefined
232
+ } catch {
233
+ return undefined
234
+ }
235
+ })()
172
236
  await state.delete(recordKey)
173
237
  await state.delete(idKeyFor(id))
238
+ if (orgId) await state.delete(orgKeyFor(orgId, id))
174
239
  return true
175
240
  }
176
241
 
242
+ /**
243
+ * Re-attributes a key to an organization and/or project, rewriting its record
244
+ * in place (same token hash) and moving the org index entry when the org
245
+ * changes. The backfill path for legacy keys.
246
+ *
247
+ * @param state - The KV state store holding key records.
248
+ * @param id - The key id (`key_…`).
249
+ * @param input - The attribution to apply.
250
+ * @returns The updated record, or `null` when the key is absent.
251
+ */
252
+ export async function attribute(
253
+ state: Store.State,
254
+ id: string,
255
+ input: attribute.Input,
256
+ ): Promise<Record | null> {
257
+ const recordKey = await state.get(idKeyFor(id))
258
+ if (!recordKey) return null
259
+ const record = await read(state, recordKey, Date.now())
260
+ if (!record) return null
261
+
262
+ const updated: Record = {
263
+ ...record,
264
+ ...(input.orgId === undefined ? {} : { orgId: input.orgId }),
265
+ ...(input.projectId === undefined ? {} : { projectId: input.projectId }),
266
+ }
267
+ const ttl =
268
+ updated.expiresAt === undefined
269
+ ? undefined
270
+ : Math.max(1, Date.parse(updated.expiresAt) - Date.now())
271
+ await state.put(recordKey, JSON.stringify(updated), { ttl })
272
+ if (updated.orgId !== record.orgId) await state.delete(orgKeyFor(record.orgId, id))
273
+ await state.put(orgKeyFor(updated.orgId, id), recordKey, { ttl })
274
+ return updated
275
+ }
276
+
277
+ export declare namespace attribute {
278
+ /** Attribution applied by {@link attribute}; omitted fields keep their current value. */
279
+ type Input = {
280
+ /** New owning organization id (`org_…`). */
281
+ orgId?: string | undefined
282
+ /** New owning project id (`prj_…`). */
283
+ projectId?: string | undefined
284
+ }
285
+ }
286
+
287
+ /**
288
+ * Rebuilds the `id` and `org` index entries for every stored record — the
289
+ * run-once backfill making legacy keys visible to org-scoped listing. Records
290
+ * themselves are never modified, so existing tokens keep resolving.
291
+ *
292
+ * @param state - The KV state store holding key records.
293
+ * @returns Scanned and indexed record counts.
294
+ */
295
+ export async function backfill(state: Store.State): Promise<backfill.Result> {
296
+ const { keys } = await state.list({ prefix: ApiKey.recordPrefix })
297
+ let indexed = 0
298
+ for (const { name } of keys) {
299
+ const record = await read(state, name, Date.now())
300
+ if (!record) continue
301
+ const ttl =
302
+ record.expiresAt === undefined
303
+ ? undefined
304
+ : Math.max(1, Date.parse(record.expiresAt) - Date.now())
305
+ await state.put(idKeyFor(record.id), name, { ttl })
306
+ await state.put(orgKeyFor(record.orgId, record.id), name, { ttl })
307
+ indexed += 1
308
+ }
309
+ return { indexed, scanned: keys.length }
310
+ }
311
+
312
+ export declare namespace backfill {
313
+ /** Result of {@link backfill}. */
314
+ type Result = {
315
+ /** Records whose index entries were written. */
316
+ indexed: number
317
+ /** Stored records scanned (including invalid or expired ones, skipped). */
318
+ scanned: number
319
+ }
320
+ }
321
+
177
322
  /**
178
323
  * Reads and validates a stored record by storage key. Invalid, corrupt, or
179
324
  * expired records (`expiresAt <= now`) resolve to `null`.
@@ -203,3 +348,11 @@ const idPrefix = 'apikey_id:'
203
348
  function idKeyFor(id: string): string {
204
349
  return `${idPrefix}${id}`
205
350
  }
351
+
352
+ /** Storage-key prefix for the per-key `org → recordKey` listing index. */
353
+ const orgPrefix = 'apikey_org:'
354
+
355
+ /** Storage key under which a key's org index entry is persisted. */
356
+ function orgKeyFor(orgId: string, id: string): string {
357
+ return `${orgPrefix}${orgId}:${id}`
358
+ }