tapimo 0.10.2 → 0.12.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 (386) hide show
  1. package/dist/App.d.ts +4896 -2166
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +2 -2
  4. package/dist/App.js.map +1 -1
  5. package/dist/Assets.d.ts +15 -0
  6. package/dist/Assets.d.ts.map +1 -1
  7. package/dist/Assets.js +7 -0
  8. package/dist/Assets.js.map +1 -1
  9. package/dist/Webhooks.d.ts +0 -75
  10. package/dist/Webhooks.d.ts.map +1 -1
  11. package/dist/Webhooks.js +1 -143
  12. package/dist/Webhooks.js.map +1 -1
  13. package/dist/admin/App.d.ts +127 -78
  14. package/dist/admin/App.d.ts.map +1 -1
  15. package/dist/admin/apps/earn-vaults.d.ts +115 -1
  16. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  17. package/dist/admin/apps/earn-vaults.js +59 -6
  18. package/dist/admin/apps/earn-vaults.js.map +1 -1
  19. package/dist/admin/apps/organizations.d.ts +3 -3
  20. package/dist/admin/apps/organizations.d.ts.map +1 -1
  21. package/dist/admin/apps/organizations.js +4 -2
  22. package/dist/admin/apps/organizations.js.map +1 -1
  23. package/dist/admin/apps/verified-tokens.d.ts +83 -83
  24. package/dist/admin/ui.generated.d.ts +1 -1
  25. package/dist/admin/ui.generated.d.ts.map +1 -1
  26. package/dist/admin/ui.generated.js +151 -151
  27. package/dist/admin/ui.generated.js.map +1 -1
  28. package/dist/apps/data/App.d.ts +5924 -4310
  29. package/dist/apps/data/App.d.ts.map +1 -1
  30. package/dist/apps/data/App.js +61 -9
  31. package/dist/apps/data/App.js.map +1 -1
  32. package/dist/apps/data/ZoneSelection.d.ts +62 -0
  33. package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
  34. package/dist/apps/data/ZoneSelection.js +44 -0
  35. package/dist/apps/data/ZoneSelection.js.map +1 -0
  36. package/dist/apps/data/routes/activities.d.ts +2368 -5
  37. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  38. package/dist/apps/data/routes/activities.js +423 -114
  39. package/dist/apps/data/routes/activities.js.map +1 -1
  40. package/dist/apps/data/routes/addresses.d.ts +131 -0
  41. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  42. package/dist/apps/data/routes/balances.d.ts +25 -25
  43. package/dist/apps/data/routes/balances.js +1 -1
  44. package/dist/apps/data/routes/balances.js.map +1 -1
  45. package/dist/apps/data/routes/blocks.d.ts +1 -1
  46. package/dist/apps/data/routes/blocks.js +1 -1
  47. package/dist/apps/data/routes/blocks.js.map +1 -1
  48. package/dist/apps/data/routes/earn.d.ts +135 -10
  49. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  50. package/dist/apps/data/routes/earn.js +157 -25
  51. package/dist/apps/data/routes/earn.js.map +1 -1
  52. package/dist/apps/data/routes/exchanges.d.ts +829 -123
  53. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  54. package/dist/apps/data/routes/exchanges.js +16 -13
  55. package/dist/apps/data/routes/exchanges.js.map +1 -1
  56. package/dist/apps/data/routes/fee-amm.d.ts +26 -26
  57. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  58. package/dist/apps/data/routes/fee-amm.js +9 -11
  59. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  60. package/dist/apps/data/routes/receipts.d.ts +54 -54
  61. package/dist/apps/data/routes/receipts.js +1 -1
  62. package/dist/apps/data/routes/receipts.js.map +1 -1
  63. package/dist/apps/data/routes/rpc.js +24 -10
  64. package/dist/apps/data/routes/rpc.js.map +1 -1
  65. package/dist/apps/data/routes/tokenlist.d.ts +12 -12
  66. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  67. package/dist/apps/data/routes/tokenlist.js +16 -15
  68. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  69. package/dist/apps/data/routes/tokens.d.ts +17 -3
  70. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  71. package/dist/apps/data/routes/tokens.js +34 -15
  72. package/dist/apps/data/routes/tokens.js.map +1 -1
  73. package/dist/apps/data/routes/transactions.d.ts +1 -1
  74. package/dist/apps/data/routes/transactions.js +1 -1
  75. package/dist/apps/data/routes/transactions.js.map +1 -1
  76. package/dist/apps/data/routes/transfers.d.ts +13 -13
  77. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  78. package/dist/apps/data/routes/transfers.js +7 -9
  79. package/dist/apps/data/routes/transfers.js.map +1 -1
  80. package/dist/apps/data/routes/valuation.d.ts +21 -21
  81. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  82. package/dist/apps/data/routes/webhooks.d.ts +1011 -151
  83. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  84. package/dist/apps/data/routes/webhooks.js +126 -739
  85. package/dist/apps/data/routes/webhooks.js.map +1 -1
  86. package/dist/apps/data/routes/zones.d.ts +15 -15
  87. package/dist/apps/funding/App.d.ts +27 -27
  88. package/dist/apps/funding/routes/chains.d.ts.map +1 -1
  89. package/dist/apps/funding/routes/chains.js +5 -4
  90. package/dist/apps/funding/routes/chains.js.map +1 -1
  91. package/dist/apps/funding/routes/deposit-addresses.d.ts +18 -18
  92. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  93. package/dist/apps/funding/routes/deposit-addresses.js +8 -8
  94. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  95. package/dist/apps/funding/routes/providers.d.ts.map +1 -1
  96. package/dist/apps/funding/routes/providers.js +3 -2
  97. package/dist/apps/funding/routes/providers.js.map +1 -1
  98. package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
  99. package/dist/apps/funding/routes/quotes.js +2 -2
  100. package/dist/apps/funding/routes/quotes.js.map +1 -1
  101. package/dist/apps/funding/routes/transfers.d.ts +33 -33
  102. package/dist/apps/management/App.d.ts +1433 -322
  103. package/dist/apps/management/App.d.ts.map +1 -1
  104. package/dist/apps/management/Billing.d.ts.map +1 -1
  105. package/dist/apps/management/Billing.js +19 -6
  106. package/dist/apps/management/Billing.js.map +1 -1
  107. package/dist/apps/management/routes/api-keys.d.ts +154 -94
  108. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  109. package/dist/apps/management/routes/api-keys.js +76 -30
  110. package/dist/apps/management/routes/api-keys.js.map +1 -1
  111. package/dist/apps/management/routes/billing.d.ts +103 -30
  112. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  113. package/dist/apps/management/routes/billing.js +91 -32
  114. package/dist/apps/management/routes/billing.js.map +1 -1
  115. package/dist/apps/management/routes/faucet.d.ts +12 -12
  116. package/dist/apps/management/routes/faucet.d.ts.map +1 -1
  117. package/dist/apps/management/routes/faucet.js +23 -12
  118. package/dist/apps/management/routes/faucet.js.map +1 -1
  119. package/dist/apps/management/routes/invitations.d.ts +46 -13
  120. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  121. package/dist/apps/management/routes/invitations.js +79 -29
  122. package/dist/apps/management/routes/invitations.js.map +1 -1
  123. package/dist/apps/management/routes/invite-links.d.ts +128 -83
  124. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  125. package/dist/apps/management/routes/invite-links.js +100 -41
  126. package/dist/apps/management/routes/invite-links.js.map +1 -1
  127. package/dist/apps/management/routes/me.d.ts +5 -5
  128. package/dist/apps/management/routes/me.d.ts.map +1 -1
  129. package/dist/apps/management/routes/me.js +14 -10
  130. package/dist/apps/management/routes/me.js.map +1 -1
  131. package/dist/apps/management/routes/members.d.ts +68 -47
  132. package/dist/apps/management/routes/members.d.ts.map +1 -1
  133. package/dist/apps/management/routes/members.js +37 -18
  134. package/dist/apps/management/routes/members.js.map +1 -1
  135. package/dist/apps/management/routes/orgs.d.ts +48 -8
  136. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  137. package/dist/apps/management/routes/orgs.js +48 -19
  138. package/dist/apps/management/routes/orgs.js.map +1 -1
  139. package/dist/apps/management/routes/projects.d.ts +130 -68
  140. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  141. package/dist/apps/management/routes/projects.js +72 -21
  142. package/dist/apps/management/routes/projects.js.map +1 -1
  143. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  144. package/dist/apps/management/routes/scopes.js +8 -5
  145. package/dist/apps/management/routes/scopes.js.map +1 -1
  146. package/dist/apps/management/routes/usage.d.ts +38 -38
  147. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  148. package/dist/apps/management/routes/usage.js +41 -31
  149. package/dist/apps/management/routes/usage.js.map +1 -1
  150. package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
  151. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  152. package/dist/apps/management/routes/verified-token-requests.js +36 -17
  153. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  154. package/dist/apps/management/routes/webhooks.d.ts +1186 -197
  155. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  156. package/dist/apps/management/routes/webhooks.js +106 -38
  157. package/dist/apps/management/routes/webhooks.js.map +1 -1
  158. package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
  159. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  160. package/dist/apps/mpp/internal/Adapter.js +12 -0
  161. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  162. package/dist/db/Db.d.ts +2 -0
  163. package/dist/db/Db.d.ts.map +1 -1
  164. package/dist/db/Db.js +61 -0
  165. package/dist/db/Db.js.map +1 -1
  166. package/dist/db/Schema.d.ts +30 -2
  167. package/dist/db/Schema.d.ts.map +1 -1
  168. package/dist/db/Schema.js +28 -3
  169. package/dist/db/Schema.js.map +1 -1
  170. package/dist/db/tables/earnVaults.d.ts +5 -1
  171. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  172. package/dist/db/tables/earnVaults.js +5 -0
  173. package/dist/db/tables/earnVaults.js.map +1 -1
  174. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
  175. package/dist/db/tables/webhookDeliveries.js +10 -0
  176. package/dist/db/tables/webhookDeliveries.js.map +1 -1
  177. package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
  178. package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
  179. package/dist/db/tables/webhookQueueCompletions.js +32 -0
  180. package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
  181. package/dist/db/tables/webhookQueueEvents.d.ts +16 -20
  182. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  183. package/dist/db/tables/webhookQueueEvents.js +68 -43
  184. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  185. package/dist/db/tables/webhookSubscriptions.d.ts +47 -72
  186. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  187. package/dist/db/tables/webhookSubscriptions.js +92 -105
  188. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  189. package/dist/internal/Auth.d.ts +8 -1
  190. package/dist/internal/Auth.d.ts.map +1 -1
  191. package/dist/internal/Auth.js +13 -3
  192. package/dist/internal/Auth.js.map +1 -1
  193. package/dist/internal/Cache.d.ts.map +1 -1
  194. package/dist/internal/Cache.js +11 -7
  195. package/dist/internal/Cache.js.map +1 -1
  196. package/dist/internal/EarnVaults.d.ts +41 -2
  197. package/dist/internal/EarnVaults.d.ts.map +1 -1
  198. package/dist/internal/EarnVaults.js +167 -0
  199. package/dist/internal/EarnVaults.js.map +1 -1
  200. package/dist/internal/MetricSink.d.ts +35 -125
  201. package/dist/internal/MetricSink.d.ts.map +1 -1
  202. package/dist/internal/MetricSink.js +50 -121
  203. package/dist/internal/MetricSink.js.map +1 -1
  204. package/dist/internal/OpenApi.d.ts +26 -22
  205. package/dist/internal/OpenApi.d.ts.map +1 -1
  206. package/dist/internal/OpenApi.js +128 -39
  207. package/dist/internal/OpenApi.js.map +1 -1
  208. package/dist/internal/Response.d.ts +13 -8
  209. package/dist/internal/Response.d.ts.map +1 -1
  210. package/dist/internal/Response.js +16 -5
  211. package/dist/internal/Response.js.map +1 -1
  212. package/dist/internal/Schema.d.ts +8 -8
  213. package/dist/internal/Schema.d.ts.map +1 -1
  214. package/dist/internal/Schema.js +10 -9
  215. package/dist/internal/Schema.js.map +1 -1
  216. package/dist/internal/Store.d.ts +15 -6
  217. package/dist/internal/Store.d.ts.map +1 -1
  218. package/dist/internal/Store.js +45 -15
  219. package/dist/internal/Store.js.map +1 -1
  220. package/dist/internal/Tidx.d.ts +2 -0
  221. package/dist/internal/Tidx.d.ts.map +1 -1
  222. package/dist/internal/Tidx.js +16 -4
  223. package/dist/internal/Tidx.js.map +1 -1
  224. package/dist/internal/WebhookTransfer.d.ts +1 -55
  225. package/dist/internal/WebhookTransfer.d.ts.map +1 -1
  226. package/dist/internal/WebhookTransfer.js +1 -239
  227. package/dist/internal/WebhookTransfer.js.map +1 -1
  228. package/dist/internal/Webhooks.d.ts +112 -56
  229. package/dist/internal/Webhooks.d.ts.map +1 -1
  230. package/dist/internal/Webhooks.js +124 -93
  231. package/dist/internal/Webhooks.js.map +1 -1
  232. package/dist/internal/funding/Deposit.d.ts +2 -2
  233. package/dist/internal/funding/Deposit.d.ts.map +1 -1
  234. package/dist/internal/funding/Deposit.js +9 -8
  235. package/dist/internal/funding/Deposit.js.map +1 -1
  236. package/dist/internal/funding/DepositAddress.d.ts +4 -4
  237. package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
  238. package/dist/internal/funding/DepositAddress.js +9 -8
  239. package/dist/internal/funding/DepositAddress.js.map +1 -1
  240. package/dist/internal/funding/DepositWebhook.d.ts +25 -0
  241. package/dist/internal/funding/DepositWebhook.d.ts.map +1 -0
  242. package/dist/internal/funding/DepositWebhook.js +74 -0
  243. package/dist/internal/funding/DepositWebhook.js.map +1 -0
  244. package/dist/internal/funding/Provider.d.ts.map +1 -1
  245. package/dist/internal/funding/Provider.js +13 -12
  246. package/dist/internal/funding/Provider.js.map +1 -1
  247. package/dist/internal/funding/Reconciliation.d.ts +6 -0
  248. package/dist/internal/funding/Reconciliation.d.ts.map +1 -1
  249. package/dist/internal/funding/Reconciliation.js +42 -10
  250. package/dist/internal/funding/Reconciliation.js.map +1 -1
  251. package/dist/internal/funding/index.d.ts +1 -0
  252. package/dist/internal/funding/index.d.ts.map +1 -1
  253. package/dist/internal/funding/index.js +1 -0
  254. package/dist/internal/funding/index.js.map +1 -1
  255. package/dist/internal/funding/providers/stargate.d.ts +19 -0
  256. package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
  257. package/dist/internal/funding/providers/stargate.js +143 -0
  258. package/dist/internal/funding/providers/stargate.js.map +1 -0
  259. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
  260. package/dist/internal/webhookDestinations/slack.js +16 -0
  261. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  262. package/dist/providers/index.d.ts +7 -0
  263. package/dist/providers/index.d.ts.map +1 -1
  264. package/dist/providers/index.js +3 -0
  265. package/dist/providers/index.js.map +1 -1
  266. package/package.json +2 -2
  267. package/src/App.test.ts +48 -0
  268. package/src/App.ts +7 -2
  269. package/src/Assets.test.ts +18 -0
  270. package/src/Assets.ts +22 -0
  271. package/src/Client.test-d.ts +287 -17
  272. package/src/Webhooks.ts +1 -220
  273. package/src/admin/apps/earn-vaults.test.ts +143 -0
  274. package/src/admin/apps/earn-vaults.ts +83 -6
  275. package/src/admin/apps/organizations.ts +6 -2
  276. package/src/admin/ui/src/routes/api-keys.tsx +36 -0
  277. package/src/admin/ui.generated.ts +151 -189
  278. package/src/apps/data/App.test.ts +31 -0
  279. package/src/apps/data/App.ts +64 -10
  280. package/src/apps/data/ZoneSelection.test.ts +196 -0
  281. package/src/apps/data/ZoneSelection.ts +108 -0
  282. package/src/apps/data/routes/activities.test.ts +435 -12
  283. package/src/apps/data/routes/activities.ts +562 -125
  284. package/src/apps/data/routes/balances.ts +1 -1
  285. package/src/apps/data/routes/blocks.ts +1 -1
  286. package/src/apps/data/routes/earn.test.ts +183 -23
  287. package/src/apps/data/routes/earn.ts +225 -29
  288. package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
  289. package/src/apps/data/routes/exchanges.test.ts +31 -1
  290. package/src/apps/data/routes/exchanges.ts +19 -15
  291. package/src/apps/data/routes/fee-amm.ts +18 -11
  292. package/src/apps/data/routes/receipts.ts +1 -1
  293. package/src/apps/data/routes/rpc.test.ts +75 -0
  294. package/src/apps/data/routes/rpc.ts +23 -9
  295. package/src/apps/data/routes/tokenlist.ts +21 -18
  296. package/src/apps/data/routes/tokens.test.ts +29 -0
  297. package/src/apps/data/routes/tokens.ts +38 -15
  298. package/src/apps/data/routes/transactions.ts +1 -1
  299. package/src/apps/data/routes/transfers.test.ts +3 -3
  300. package/src/apps/data/routes/transfers.ts +12 -9
  301. package/src/apps/data/routes/webhooks.test.ts +179 -1497
  302. package/src/apps/data/routes/webhooks.ts +156 -976
  303. package/src/apps/data/routes/zones.test.ts +19 -13
  304. package/src/apps/funding/routes/chains.test.ts +211 -7
  305. package/src/apps/funding/routes/chains.ts +19 -12
  306. package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
  307. package/src/apps/funding/routes/deposit-addresses.ts +84 -72
  308. package/src/apps/funding/routes/providers.ts +9 -5
  309. package/src/apps/funding/routes/quotes.test.ts +46 -0
  310. package/src/apps/funding/routes/quotes.ts +8 -5
  311. package/src/apps/funding/routes/transfers.test.ts +35 -32
  312. package/src/apps/management/Billing.test.ts +26 -0
  313. package/src/apps/management/Billing.ts +24 -7
  314. package/src/apps/management/routes/api-keys.test.ts +178 -0
  315. package/src/apps/management/routes/api-keys.ts +203 -144
  316. package/src/apps/management/routes/billing.test.ts +209 -0
  317. package/src/apps/management/routes/billing.ts +254 -177
  318. package/src/apps/management/routes/faucet.test.ts +39 -0
  319. package/src/apps/management/routes/faucet.ts +75 -41
  320. package/src/apps/management/routes/invitations.test.ts +216 -0
  321. package/src/apps/management/routes/invitations.ts +186 -109
  322. package/src/apps/management/routes/invite-links.test.ts +263 -1
  323. package/src/apps/management/routes/invite-links.ts +295 -214
  324. package/src/apps/management/routes/me.test.ts +49 -0
  325. package/src/apps/management/routes/me.ts +42 -32
  326. package/src/apps/management/routes/members.test.ts +124 -1
  327. package/src/apps/management/routes/members.ts +81 -51
  328. package/src/apps/management/routes/orgs.test.ts +176 -0
  329. package/src/apps/management/routes/orgs.ts +101 -59
  330. package/src/apps/management/routes/projects.test.ts +183 -0
  331. package/src/apps/management/routes/projects.ts +124 -60
  332. package/src/apps/management/routes/scopes.test.ts +44 -0
  333. package/src/apps/management/routes/scopes.ts +37 -28
  334. package/src/apps/management/routes/usage.test.ts +92 -0
  335. package/src/apps/management/routes/usage.ts +186 -151
  336. package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
  337. package/src/apps/management/routes/verified-token-requests.ts +166 -133
  338. package/src/apps/management/routes/webhooks.test.ts +313 -1
  339. package/src/apps/management/routes/webhooks.ts +220 -71
  340. package/src/apps/mpp/internal/Adapter.ts +13 -1
  341. package/src/db/Db.test.ts +42 -5
  342. package/src/db/Db.ts +85 -0
  343. package/src/db/Schema.ts +41 -3
  344. package/src/db/tables/earnVaults.test.ts +22 -0
  345. package/src/db/tables/earnVaults.ts +11 -1
  346. package/src/db/tables/organizations.test.ts +5 -2
  347. package/src/db/tables/webhookDeliveries.ts +13 -0
  348. package/src/db/tables/webhookQueueCompletions.ts +55 -0
  349. package/src/db/tables/webhookQueueEvents.ts +97 -57
  350. package/src/db/tables/webhookSubscriptions.ts +134 -144
  351. package/src/internal/Auth.ts +23 -5
  352. package/src/internal/Cache.ts +14 -7
  353. package/src/internal/EarnVaults.capabilities.test.ts +33 -0
  354. package/src/internal/EarnVaults.test.ts +79 -0
  355. package/src/internal/EarnVaults.ts +277 -0
  356. package/src/internal/MetricSink.test.ts +41 -373
  357. package/src/internal/MetricSink.ts +92 -273
  358. package/src/internal/OpenApi.ts +165 -49
  359. package/src/internal/Response.test.ts +95 -0
  360. package/src/internal/Response.ts +40 -2
  361. package/src/internal/Schema.test.ts +34 -0
  362. package/src/internal/Schema.ts +20 -9
  363. package/src/internal/Store.test.ts +186 -0
  364. package/src/internal/Store.ts +57 -17
  365. package/src/internal/Tidx.test.ts +19 -0
  366. package/src/internal/Tidx.ts +16 -4
  367. package/src/internal/WebhookTransfer.ts +1 -351
  368. package/src/internal/Webhooks.test.ts +222 -145
  369. package/src/internal/Webhooks.ts +234 -135
  370. package/src/internal/funding/Deposit.ts +71 -64
  371. package/src/internal/funding/DepositAddress.ts +50 -43
  372. package/src/internal/funding/DepositWebhook.test.ts +131 -0
  373. package/src/internal/funding/DepositWebhook.ts +101 -0
  374. package/src/internal/funding/Provider.ts +164 -142
  375. package/src/internal/funding/Reconciliation.test.ts +14 -0
  376. package/src/internal/funding/Reconciliation.ts +161 -86
  377. package/src/internal/funding/index.test.ts +1 -0
  378. package/src/internal/funding/index.ts +1 -0
  379. package/src/internal/funding/providers/index.test.ts +185 -0
  380. package/src/internal/funding/providers/stargate.ts +184 -0
  381. package/src/internal/webhookDestinations/slack.ts +15 -0
  382. package/src/providers/index.test.ts +1 -0
  383. package/src/providers/index.ts +9 -0
  384. package/src/Webhooks.bench.ts +0 -714
  385. package/src/Webhooks.memory.bench.ts +0 -250
  386. package/src/Webhooks.test.ts +0 -146
@@ -1,3 +1,4 @@
1
+ import { HonoRequest } from 'hono/request'
1
2
  import { Store } from 'tapimo'
2
3
  import * as TestStore from '../../test/Store.js'
3
4
 
@@ -754,6 +755,18 @@ describe('durableObject', () => {
754
755
  })
755
756
  })
756
757
 
758
+ describe('withRequest', () => {
759
+ test('preserves the source store contract', async () => {
760
+ const source = new ReceiverStore()
761
+ const store = Store.withRequest(source, new HonoRequest(new Request('https://api.tempo.xyz')))
762
+
763
+ await store.put('value', 'stored')
764
+
765
+ expect(store.type).toMatchInlineSnapshot(`"cache"`)
766
+ expect(await source.get('value')).toMatchInlineSnapshot(`"stored"`)
767
+ })
768
+ })
769
+
757
770
  describe('memoize', () => {
758
771
  test('coalesces concurrent cache misses for the same key', async () => {
759
772
  const store = Store.memory()
@@ -836,6 +849,126 @@ describe('memoize', () => {
836
849
  `)
837
850
  })
838
851
 
852
+ test('refreshes the entry when request headers send no-cache', async () => {
853
+ const store = Store.memory()
854
+ let calls = 0
855
+ const fetch = async () => ({ value: ++calls })
856
+
857
+ await Store.memoize(fetch, { key: 'memo:test', store, ttl: 60_000 })
858
+ const refreshed = await Store.memoize(fetch, {
859
+ key: 'memo:test',
860
+ store: Store.withRequest(
861
+ store,
862
+ new HonoRequest(
863
+ new Request('https://api.tempo.xyz', {
864
+ headers: { 'cache-control': 'no-cache' },
865
+ }),
866
+ ),
867
+ ),
868
+ ttl: 60_000,
869
+ })
870
+ const after = await Store.memoize(fetch, { key: 'memo:test', store, ttl: 60_000 })
871
+
872
+ expect(calls).toMatchInlineSnapshot(`2`)
873
+ expect(refreshed).toMatchInlineSnapshot(`
874
+ {
875
+ "value": 2,
876
+ }
877
+ `)
878
+ expect(after).toEqual(refreshed)
879
+ })
880
+
881
+ test('propagates no-cache through nested memoizers', async () => {
882
+ const source = Store.memory()
883
+ let calls = 0
884
+ const fetch = async () => ({ value: ++calls })
885
+
886
+ await Store.memoize(fetch, { key: 'memo:inner', store: source, ttl: 60_000 })
887
+ const store = Store.withRequest(
888
+ source,
889
+ new HonoRequest(
890
+ new Request('https://api.tempo.xyz', {
891
+ headers: { 'cache-control': 'no-cache' },
892
+ }),
893
+ ),
894
+ )
895
+ const value = await Store.memoize(
896
+ () => Store.memoize(fetch, { key: 'memo:inner', store, ttl: 60_000 }),
897
+ { key: 'memo:outer', store, ttl: 60_000 },
898
+ )
899
+
900
+ expect(calls).toMatchInlineSnapshot(`2`)
901
+ expect(value).toMatchInlineSnapshot(`
902
+ {
903
+ "value": 2,
904
+ }
905
+ `)
906
+ })
907
+
908
+ test('bypasses without replacing the entry when request headers send no-store', async () => {
909
+ const store = Store.memory()
910
+ let calls = 0
911
+ const fetch = async () => ({ value: ++calls })
912
+
913
+ const first = await Store.memoize(fetch, { key: 'memo:test', store, ttl: 60_000 })
914
+ const bypassed = await Store.memoize(fetch, {
915
+ key: 'memo:test',
916
+ store: Store.withRequest(
917
+ store,
918
+ new HonoRequest(
919
+ new Request('https://api.tempo.xyz', {
920
+ headers: { 'cache-control': 'no-store' },
921
+ }),
922
+ ),
923
+ ),
924
+ ttl: 60_000,
925
+ })
926
+ const after = await Store.memoize(fetch, { key: 'memo:test', store, ttl: 60_000 })
927
+
928
+ expect(calls).toMatchInlineSnapshot(`2`)
929
+ expect(bypassed).toMatchInlineSnapshot(`
930
+ {
931
+ "value": 2,
932
+ }
933
+ `)
934
+ expect(after).toEqual(first)
935
+ })
936
+
937
+ test('honors Pragma no-cache only without Cache-Control', async () => {
938
+ const store = Store.memory()
939
+ let calls = 0
940
+ const fetch = async () => ({ value: ++calls })
941
+
942
+ await Store.memoize(fetch, { key: 'memo:test', store, ttl: 60_000 })
943
+ await Store.memoize(fetch, {
944
+ key: 'memo:test',
945
+ store: Store.withRequest(
946
+ store,
947
+ new HonoRequest(new Request('https://api.tempo.xyz', { headers: { pragma: 'no-cache' } })),
948
+ ),
949
+ ttl: 60_000,
950
+ })
951
+ const cached = await Store.memoize(fetch, {
952
+ key: 'memo:test',
953
+ store: Store.withRequest(
954
+ store,
955
+ new HonoRequest(
956
+ new Request('https://api.tempo.xyz', {
957
+ headers: { 'cache-control': 'max-age=0', pragma: 'no-cache' },
958
+ }),
959
+ ),
960
+ ),
961
+ ttl: 60_000,
962
+ })
963
+
964
+ expect(calls).toMatchInlineSnapshot(`2`)
965
+ expect(cached).toMatchInlineSnapshot(`
966
+ {
967
+ "value": 2,
968
+ }
969
+ `)
970
+ })
971
+
839
972
  test('preserves bigint values and collision-shaped strings on cache hits', async () => {
840
973
  const store = Store.memory()
841
974
  let calls = 0
@@ -877,6 +1010,34 @@ describe('memoize', () => {
877
1010
  expect(calls).toBe(2)
878
1011
  })
879
1012
 
1013
+ test('coalesces values excluded by the cache predicate without storing them', async () => {
1014
+ const store = Store.memory()
1015
+ const pending = deferred<void>()
1016
+ let calls = 0
1017
+ const fetch = async () => {
1018
+ calls += 1
1019
+ await pending.promise
1020
+ return { cacheable: false, value: 'fresh' }
1021
+ }
1022
+ const options = {
1023
+ key: 'memo:test',
1024
+ shouldCache: (value: Awaited<ReturnType<typeof fetch>>) => value.cacheable,
1025
+ store,
1026
+ ttl: 60_000,
1027
+ }
1028
+ const requests = [Store.memoize(fetch, options), Store.memoize(fetch, options)]
1029
+
1030
+ await Promise.resolve()
1031
+ pending.resolve()
1032
+
1033
+ expect(await Promise.all(requests)).toStrictEqual([
1034
+ { cacheable: false, value: 'fresh' },
1035
+ { cacheable: false, value: 'fresh' },
1036
+ ])
1037
+ expect(await store.get('memo:test')).toBeNull()
1038
+ expect(calls).toBe(1)
1039
+ })
1040
+
880
1041
  test('refreshes legacy untagged cache entries', async () => {
881
1042
  const store = Store.memory({ entries: [['memo:test', '{"value":"123#__bigint"}']] })
882
1043
  let calls = 0
@@ -945,3 +1106,28 @@ function durableObjectStorage(): Store.durableObject.Storage & { cells: Map<stri
945
1106
  },
946
1107
  }
947
1108
  }
1109
+
1110
+ class ReceiverStore implements Store.Store {
1111
+ #cells = new Map<string, string>()
1112
+ type = 'cache' as const
1113
+
1114
+ async delete(key: string) {
1115
+ this.#cells.delete(key)
1116
+ }
1117
+
1118
+ async get(key: string) {
1119
+ return this.#cells.get(key) ?? null
1120
+ }
1121
+
1122
+ async list(options: { prefix?: string | undefined } = {}) {
1123
+ return {
1124
+ keys: [...this.#cells.keys()]
1125
+ .filter((key) => options.prefix === undefined || key.startsWith(options.prefix))
1126
+ .map((name) => ({ name })),
1127
+ }
1128
+ }
1129
+
1130
+ async put(key: string, value: string) {
1131
+ this.#cells.set(key, value)
1132
+ }
1133
+ }
@@ -575,26 +575,62 @@ export declare namespace durableObject {
575
575
  }
576
576
  }
577
577
 
578
+ /** Associates request cache directives with a store used by request handlers. */
579
+ export function withRequest(store: Store, request: withRequest.Request): Store {
580
+ const source = requestStores.get(store)?.store ?? store
581
+ const scoped = {
582
+ delete: source.delete.bind(source),
583
+ ...(source.deleteIf ? { deleteIf: source.deleteIf.bind(source) } : {}),
584
+ get: source.get.bind(source),
585
+ ...(source.increment ? { increment: source.increment.bind(source) } : {}),
586
+ list: source.list.bind(source),
587
+ put: source.put.bind(source),
588
+ ...(source.swap ? { swap: source.swap.bind(source) } : {}),
589
+ type: source.type,
590
+ }
591
+ requestStores.set(scoped, { request, store: source })
592
+ return scoped
593
+ }
594
+
595
+ export declare namespace withRequest {
596
+ /** Request surface needed to read cache directives. */
597
+ type Request = {
598
+ /** Reads one request header. */
599
+ header(name: string): string | undefined
600
+ }
601
+ }
602
+
578
603
  /**
579
- * Wraps an async producer with store-backed caching. Returns the cached value if
580
- * present and valid; otherwise runs `fetch`, stores the JSON-encoded result
581
- * under `key` with `ttl` milliseconds, and returns it. Undefined results are
582
- * returned without being cached.
604
+ * Returns a cached value when present. Otherwise, runs `fetch` and stores its
605
+ * result unless undefined or rejected by `shouldCache`.
583
606
  */
584
607
  export async function memoize<value>(
585
608
  fetch: () => Promise<value>,
586
- options: memoize.Options,
609
+ options: memoize.Options<value>,
587
610
  ): Promise<value> {
588
- const { key, store, ttl } = options
589
-
590
- const raw = await store.get(key)
591
- // Old cache entries used ambiguous untagged bigint strings. Refresh them
592
- // instead of guessing whether a matching string was originally a bigint.
593
- if (raw?.startsWith(jsonCodecPrefix)) {
594
- try {
595
- return jsonDecode(raw) as value
596
- } catch {
597
- // Corrupt entries are treated as misses so the next call refreshes.
611
+ const scoped = requestStores.get(options.store)
612
+ const { key, ttl } = options
613
+ const request = scoped?.request
614
+ const store = scoped?.store ?? options.store
615
+
616
+ // Request cache directives follow the same semantics as the response cache:
617
+ // no-cache refreshes the entry, while no-store bypasses it entirely.
618
+ const cacheControl = request?.header('cache-control')
619
+ const directives = (cacheControl ?? request?.header('pragma') ?? '').toLowerCase()
620
+ const noStore = directives.includes('no-store')
621
+ const noCache = noStore || directives.includes('no-cache')
622
+ if (noStore) return fetch()
623
+
624
+ if (!noCache) {
625
+ const raw = await store.get(key)
626
+ // Old cache entries used ambiguous untagged bigint strings. Refresh them
627
+ // instead of guessing whether a matching string was originally a bigint.
628
+ if (raw?.startsWith(jsonCodecPrefix)) {
629
+ try {
630
+ return jsonDecode(raw) as value
631
+ } catch {
632
+ // Corrupt entries are treated as misses so the next call refreshes.
633
+ }
598
634
  }
599
635
  }
600
636
 
@@ -606,8 +642,9 @@ export async function memoize<value>(
606
642
  // boundary; this only prevents a local cold-key stampede while the first
607
643
  // fetch is still in flight.
608
644
  const flight = (async () => {
645
+ if (noCache) await store.delete(key)
609
646
  const value = await fetch()
610
- if (value === undefined) return value
647
+ if (value === undefined || options.shouldCache?.(value) === false) return value
611
648
  await store.put(key, jsonEncode(value), { ttl })
612
649
  return value
613
650
  })()
@@ -622,9 +659,11 @@ export async function memoize<value>(
622
659
 
623
660
  export declare namespace memoize {
624
661
  /** Options for {@link memoize}. */
625
- type Options = {
662
+ type Options<value = unknown> = {
626
663
  /** Cache key. Callers are responsible for namespacing/versioning. */
627
664
  key: string
665
+ /** Returns whether a fetched value should be stored. Single-flight callers still share it. */
666
+ shouldCache?: ((value: value) => boolean) | undefined
628
667
  /** Store used to persist cache entries. */
629
668
  store: Store
630
669
  /** Time-to-live in milliseconds. */
@@ -632,6 +671,7 @@ export declare namespace memoize {
632
671
  }
633
672
  }
634
673
 
674
+ const requestStores = new WeakMap<Store, { request: withRequest.Request; store: Store }>()
635
675
  const flights = new WeakMap<Store, Map<string, Promise<unknown>>>()
636
676
 
637
677
  function flightsFor(store: Store) {
@@ -59,10 +59,16 @@ describe('providerFailure', () => {
59
59
 
60
60
  test('classifies timeout and rate-limit statuses', () => {
61
61
  expect([
62
+ Tidx.providerFailure(appError('query timed out')),
62
63
  Tidx.providerFailure(appError('secret upstream detail', 408)),
63
64
  Tidx.providerFailure(appError('secret upstream detail', 429)),
64
65
  ]).toMatchInlineSnapshot(`
65
66
  [
67
+ {
68
+ "failure": "timeout",
69
+ "id": "tidx",
70
+ "operation": "query",
71
+ },
66
72
  {
67
73
  "failure": "timeout",
68
74
  "id": "tidx",
@@ -135,6 +141,19 @@ describe('isQueryRejection', () => {
135
141
  })
136
142
  })
137
143
 
144
+ describe('isQueryTimeout', () => {
145
+ test('matches explicit indexer query timeout failures only', () => {
146
+ expect([
147
+ Tidx.isQueryTimeout(appError('Request timeout', 408)),
148
+ Tidx.isQueryTimeout(appError('query timed out')),
149
+ Tidx.isQueryTimeout(appError('error sending request for url (...)')),
150
+ Tidx.isQueryTimeout(appError('db error')),
151
+ Tidx.isQueryTimeout(appError('Request timeout', 429)),
152
+ Tidx.isQueryTimeout(new DOMException('query timed out', 'TimeoutError')),
153
+ ]).toEqual([true, true, true, false, false, false])
154
+ })
155
+ })
156
+
138
157
  describe('escape', () => {
139
158
  test('doubles quotes for ANSI string literals, leaving backslashes alone', () => {
140
159
  expect(Tidx.escape('USD')).toMatchInlineSnapshot(`"USD"`)
@@ -142,8 +142,10 @@ const transientRetryDelay = 250
142
142
  * dropped at the server's execution cap — typically a cold object-storage
143
143
  * cache read that warms across attempts, so retrying genuinely helps.
144
144
  */
145
- const transientErrorPattern =
146
- /db error|timeout|timed out|connection reset|connection refused|error sending request/i
145
+ const transientErrorPattern = /db error|connection reset|connection refused/i
146
+
147
+ /** Indexer failures caused by the query execution deadline. */
148
+ const queryTimeoutPattern = /timeout|timed out|error sending request/i
147
149
 
148
150
  /**
149
151
  * Escapes a free-form string for safe embedding inside a single-quoted SQL
@@ -239,8 +241,11 @@ export function providerFailure(cause: unknown): Log.ProviderFailure {
239
241
  return { ...base, failure: 'timeout' }
240
242
 
241
243
  const status = Errors.getStatus(cause)
244
+ if (isQueryTimeout(cause))
245
+ return status === 408
246
+ ? { ...base, failure: 'timeout', status }
247
+ : { ...base, failure: 'timeout' }
242
248
  if (status !== undefined && status >= 200 && status < 300) return { ...base, failure: 'payload' }
243
- if (status === 408) return { ...base, failure: 'timeout', status }
244
249
  if (status === 422) return { ...base, failure: 'query', status }
245
250
  if (status === 429) return { ...base, failure: 'rate_limit', status }
246
251
  if (status !== undefined) return { ...base, failure: 'http', status }
@@ -270,6 +275,13 @@ export function isQueryRejection(cause: unknown): boolean {
270
275
  return status === 400 || status === 422
271
276
  }
272
277
 
278
+ /** Whether a failed TIDX request exhausted its query execution deadline. */
279
+ export function isQueryTimeout(cause: unknown): boolean {
280
+ if (!(cause instanceof Tidx.FetchRequestError)) return false
281
+ if (cause.status === 408) return true
282
+ return cause.status >= 200 && cause.status < 300 && queryTimeoutPattern.test(cause.message)
283
+ }
284
+
273
285
  /**
274
286
  * True for deterministic indexer failures a retry cannot fix: a
275
287
  * `FetchRequestError` outside {@link isTransientError}'s transient classes,
@@ -294,7 +306,7 @@ export function isDeterministicError(error: unknown): boolean {
294
306
  */
295
307
  function isTransientError(error: unknown): boolean {
296
308
  if (!(error instanceof Tidx.FetchRequestError)) return false
297
- if (error.status === 408 || error.status === 429 || error.status >= 500) return true
309
+ if (isQueryTimeout(error) || error.status === 429 || error.status >= 500) return true
298
310
  return error.status >= 200 && error.status < 300 && transientErrorPattern.test(error.message)
299
311
  }
300
312