@evergonlabs/tmi-protocol-api 0.4.0 → 0.5.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 (253) hide show
  1. package/dist/app.d.ts +476 -157
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +4 -0
  4. package/dist/client.d.ts +529 -157
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/common/abis/erc20Whitelisted.d.ts +27 -12
  7. package/dist/common/abis/erc20Whitelisted.d.ts.map +1 -1
  8. package/dist/common/abis/erc20Whitelisted.js +192 -1
  9. package/dist/common/blockchain.d.ts +20 -26
  10. package/dist/common/blockchain.d.ts.map +1 -1
  11. package/dist/common/blockchain.js +22 -19
  12. package/dist/common/config.d.ts +43 -1
  13. package/dist/common/config.d.ts.map +1 -1
  14. package/dist/common/config.js +47 -25
  15. package/dist/common/context.d.ts +11 -0
  16. package/dist/common/context.d.ts.map +1 -0
  17. package/dist/common/context.js +0 -0
  18. package/dist/common/indexer/client.d.ts +3 -2
  19. package/dist/common/indexer/client.d.ts.map +1 -1
  20. package/dist/common/indexer/schemas.d.ts +1 -1
  21. package/dist/common/indexer/schemas.d.ts.map +1 -1
  22. package/dist/common/middleware/indexer.d.ts +3 -0
  23. package/dist/common/middleware/indexer.d.ts.map +1 -0
  24. package/dist/common/middleware/indexer.js +7 -0
  25. package/dist/common/models/asset.d.ts +4 -4
  26. package/dist/common/models/chainId.d.ts +3 -0
  27. package/dist/common/models/chainId.d.ts.map +1 -1
  28. package/dist/common/models/chainId.js +6 -14
  29. package/dist/common/models/numOrStr.d.ts +7 -0
  30. package/dist/common/models/numOrStr.d.ts.map +1 -0
  31. package/dist/common/models/numOrStr.js +11 -0
  32. package/dist/common/models/platform.d.ts +1 -1
  33. package/dist/common/models/platform.d.ts.map +1 -1
  34. package/dist/common/models/platform.js +1 -1
  35. package/dist/common/models/routes.d.ts +2 -2
  36. package/dist/common/models/transaction.d.ts +8 -8
  37. package/dist/common/models/transaction.d.ts.map +1 -1
  38. package/dist/common/models/transaction.js +1 -1
  39. package/dist/fractions/activity/searchActivity.route.d.ts +17 -17
  40. package/dist/fractions/activity/searchActivity.route.d.ts.map +1 -1
  41. package/dist/fractions/activity/searchActivity.route.js +1 -2
  42. package/dist/fractions/activity/utils.d.ts +8 -8
  43. package/dist/fractions/approveSale/v0/approveSale.route.d.ts +3 -3
  44. package/dist/fractions/approveWrapper/v0/approveWrapper.route.d.ts +9 -9
  45. package/dist/fractions/completeSale/v0/completeSale.route.d.ts +3 -3
  46. package/dist/fractions/createFractions/v0/createFractions.route.d.ts +19 -19
  47. package/dist/fractions/createFractions/v0/createFractions.schema.d.ts +20 -20
  48. package/dist/fractions/deployMarket/v0/deployMarket.routes.d.ts +25 -12
  49. package/dist/fractions/deployMarket/v0/deployMarket.routes.d.ts.map +1 -1
  50. package/dist/fractions/deployMarket/v0/deployMarket.routes.js +3 -2
  51. package/dist/fractions/deployMarket/v0/index.d.ts +3 -0
  52. package/dist/fractions/deployMarket/v0/index.d.ts.map +1 -0
  53. package/dist/fractions/deployMarket/v0/index.js +2 -0
  54. package/dist/fractions/deployMarket/v0/initNid.route.d.ts +3 -3
  55. package/dist/fractions/grantRole/v0/grantRole.route.d.ts +3 -3
  56. package/dist/fractions/index.d.ts +141 -77
  57. package/dist/fractions/index.d.ts.map +1 -1
  58. package/dist/fractions/index.js +5 -3
  59. package/dist/fractions/markets/common/platform.d.ts +11 -11
  60. package/dist/fractions/markets/getMarket/index.d.ts +19 -19
  61. package/dist/fractions/markets/getMarket/index.d.ts.map +1 -1
  62. package/dist/fractions/markets/getMarket/v0/getMarket.d.ts +17 -17
  63. package/dist/fractions/markets/getMarket/v0/getMarket.d.ts.map +1 -1
  64. package/dist/fractions/markets/getMarket/v0/getMarket.js +1 -2
  65. package/dist/fractions/markets/index.d.ts +22 -22
  66. package/dist/fractions/markets/index.d.ts.map +1 -1
  67. package/dist/fractions/markets/searchMarkets/index.d.ts +5 -5
  68. package/dist/fractions/markets/searchMarkets/index.d.ts.map +1 -1
  69. package/dist/fractions/markets/searchMarkets/v0/searchMarkets.d.ts +13 -13
  70. package/dist/fractions/markets/searchMarkets/v0/searchMarkets.d.ts.map +1 -1
  71. package/dist/fractions/markets/searchMarkets/v0/searchMarkets.js +1 -2
  72. package/dist/fractions/purchase/v0/purchase.route.d.ts +3 -3
  73. package/dist/fractions/purchase/v0/statistics.route.d.ts +15 -15
  74. package/dist/fractions/purchase/v0/statistics.route.d.ts.map +1 -1
  75. package/dist/fractions/purchase/v0/statistics.route.js +3 -3
  76. package/dist/fractions/sales/common/fractionsSale.d.ts +40 -40
  77. package/dist/fractions/sales/getFractionSaleStatistics.route.d.ts +13 -13
  78. package/dist/fractions/sales/getFractionSaleStatistics.route.d.ts.map +1 -1
  79. package/dist/fractions/sales/getFractionSaleStatistics.route.js +3 -3
  80. package/dist/fractions/sales/getVaultAddress.d.ts +4 -4
  81. package/dist/fractions/sales/getVaultAddress.d.ts.map +1 -1
  82. package/dist/fractions/sales/getVaultAddress.js +3 -3
  83. package/dist/fractions/sales/receiveFundsAfterNonFunded.route.d.ts +6 -6
  84. package/dist/fractions/sales/receiveNonPurchasedWrappedAssets.route.d.ts +3 -3
  85. package/dist/fractions/sales/recoverFractions.d.ts +3 -3
  86. package/dist/fractions/sales/rejectFractions.d.ts +3 -3
  87. package/dist/fractions/sales/searchSales/v0/searchSales.d.ts +32 -32
  88. package/dist/fractions/sales/searchSales/v0/searchSales.d.ts.map +1 -1
  89. package/dist/fractions/sales/searchSales/v0/searchSales.js +1 -2
  90. package/dist/fractions/sales/searchWithdrawal.route.d.ts +7 -7
  91. package/dist/fractions/sales/searchWithdrawal.route.d.ts.map +1 -1
  92. package/dist/fractions/sales/searchWithdrawal.route.js +1 -2
  93. package/dist/fractions/sales/setFeeCapLimit.d.ts +3 -3
  94. package/dist/fractions/sales/unlockWrappedAssets.route.d.ts +3 -3
  95. package/dist/fractions/sales/vesting/v0/claimStatistics.route.d.ts +17 -17
  96. package/dist/fractions/sales/vesting/v0/claimStatistics.route.d.ts.map +1 -1
  97. package/dist/fractions/sales/vesting/v0/claimStatistics.route.js +6 -5
  98. package/dist/fractions/sales/vesting/v0/claimVestedTokens.route.d.ts +9 -9
  99. package/dist/fractions/sales/vesting/v0/editCliff.route.d.ts +3 -3
  100. package/dist/fractions/withdraw/v0/withdraw.route.d.ts +3 -3
  101. package/dist/general/balanceClient.d.ts +6 -6
  102. package/dist/general/common.d.ts +6 -6
  103. package/dist/general/estimateGas.d.ts +8 -8
  104. package/dist/general/getBalance.d.ts +4 -4
  105. package/dist/general/getBalancesBatch.d.ts +4 -4
  106. package/dist/general/index.d.ts +5 -5
  107. package/dist/general/searchBalances.d.ts +4 -4
  108. package/dist/general/utils/tokenBalance/tokenBalance.d.ts +3 -3
  109. package/dist/issuance/approve.d.ts +3 -3
  110. package/dist/issuance/burn.d.ts +3 -3
  111. package/dist/issuance/common.d.ts +2 -0
  112. package/dist/issuance/common.d.ts.map +1 -0
  113. package/dist/issuance/common.js +1 -0
  114. package/dist/issuance/deploy.d.ts +7 -0
  115. package/dist/issuance/deploy.d.ts.map +1 -1
  116. package/dist/issuance/deploy.js +44 -3
  117. package/dist/issuance/getInitData.d.ts +75 -0
  118. package/dist/issuance/getInitData.d.ts.map +1 -0
  119. package/dist/issuance/getInitData.js +53 -0
  120. package/dist/issuance/grantRole.d.ts +9 -9
  121. package/dist/issuance/index.d.ts +71 -15
  122. package/dist/issuance/index.d.ts.map +1 -1
  123. package/dist/issuance/index.js +7 -2
  124. package/dist/issuance/mint.d.ts +3 -3
  125. package/dist/issuance/recover.d.ts +82 -0
  126. package/dist/issuance/recover.d.ts.map +1 -0
  127. package/dist/issuance/recover.js +38 -0
  128. package/dist/issuance/renounceRole.d.ts +9 -9
  129. package/dist/issuance/transfer.d.ts +9 -9
  130. package/dist/issuance/upgrade.d.ts +3 -3
  131. package/dist/staking/index.d.ts +10 -10
  132. package/dist/staking/index.d.ts.map +1 -1
  133. package/dist/staking/platforms/getPlatform/index.d.ts +3 -3
  134. package/dist/staking/platforms/getPlatform/index.d.ts.map +1 -1
  135. package/dist/staking/platforms/getPlatform/v0/getPlatform.d.ts +8 -8
  136. package/dist/staking/platforms/getPlatform/v0/getPlatform.d.ts.map +1 -1
  137. package/dist/staking/platforms/getPlatform/v0/getPlatform.js +3 -3
  138. package/dist/staking/platforms/index.d.ts +3 -3
  139. package/dist/staking/platforms/index.d.ts.map +1 -1
  140. package/dist/staking/platforms/searchPlatforms/index.d.ts +2 -2
  141. package/dist/staking/platforms/searchPlatforms/index.d.ts.map +1 -1
  142. package/dist/staking/platforms/searchPlatforms/v0/searchPlatforms.d.ts +4 -4
  143. package/dist/staking/platforms/searchPlatforms/v0/searchPlatforms.d.ts.map +1 -1
  144. package/dist/staking/platforms/searchPlatforms/v0/searchPlatforms.js +3 -3
  145. package/dist/staking/pools/common/pool.d.ts +4 -4
  146. package/dist/staking/pools/getPool/index.d.ts +3 -3
  147. package/dist/staking/pools/getPool/index.d.ts.map +1 -1
  148. package/dist/staking/pools/getPool/v0/getPool.d.ts +7 -7
  149. package/dist/staking/pools/getPool/v0/getPool.d.ts.map +1 -1
  150. package/dist/staking/pools/getPool/v0/getPool.js +3 -3
  151. package/dist/staking/pools/index.d.ts +3 -3
  152. package/dist/staking/pools/index.d.ts.map +1 -1
  153. package/dist/staking/pools/searchPools/index.d.ts +2 -2
  154. package/dist/staking/pools/searchPools/index.d.ts.map +1 -1
  155. package/dist/staking/pools/searchPools/v0/searchPools.d.ts +3 -3
  156. package/dist/staking/pools/searchPools/v0/searchPools.d.ts.map +1 -1
  157. package/dist/staking/pools/searchPools/v0/searchPools.js +3 -3
  158. package/dist/staking/roles/common/roleAssignment.d.ts +2 -2
  159. package/dist/staking/roles/common/roleEvent.d.ts +4 -4
  160. package/dist/staking/roles/grantRole/index.d.ts +1 -1
  161. package/dist/staking/roles/grantRole/v0/grantRole.d.ts +3 -3
  162. package/dist/staking/roles/index.d.ts +5 -5
  163. package/dist/staking/roles/index.d.ts.map +1 -1
  164. package/dist/staking/roles/searchRoleEvents/index.d.ts +3 -3
  165. package/dist/staking/roles/searchRoleEvents/index.d.ts.map +1 -1
  166. package/dist/staking/roles/searchRoleEvents/v0/searchRoleEvents.d.ts +7 -7
  167. package/dist/staking/roles/searchRoleEvents/v0/searchRoleEvents.d.ts.map +1 -1
  168. package/dist/staking/roles/searchRoleEvents/v0/searchRoleEvents.js +3 -3
  169. package/dist/staking/roles/searchRoles/index.d.ts +3 -3
  170. package/dist/staking/roles/searchRoles/index.d.ts.map +1 -1
  171. package/dist/staking/roles/searchRoles/v0/searchRoles.d.ts +7 -7
  172. package/dist/staking/roles/searchRoles/v0/searchRoles.d.ts.map +1 -1
  173. package/dist/staking/roles/searchRoles/v0/searchRoles.js +3 -3
  174. package/dist/staking/stakes/common/stake.d.ts +2 -2
  175. package/dist/staking/stakes/common/stakeEvent.d.ts +4 -4
  176. package/dist/staking/stakes/getStake/index.d.ts +3 -3
  177. package/dist/staking/stakes/getStake/index.d.ts.map +1 -1
  178. package/dist/staking/stakes/getStake/v0/getStake.d.ts +7 -7
  179. package/dist/staking/stakes/getStake/v0/getStake.d.ts.map +1 -1
  180. package/dist/staking/stakes/getStake/v0/getStake.js +3 -3
  181. package/dist/staking/stakes/index.d.ts +5 -5
  182. package/dist/staking/stakes/index.d.ts.map +1 -1
  183. package/dist/staking/stakes/searchStakeEvents/index.d.ts +3 -3
  184. package/dist/staking/stakes/searchStakeEvents/index.d.ts.map +1 -1
  185. package/dist/staking/stakes/searchStakeEvents/v0/searchStakeEvents.d.ts +7 -7
  186. package/dist/staking/stakes/searchStakeEvents/v0/searchStakeEvents.d.ts.map +1 -1
  187. package/dist/staking/stakes/searchStakeEvents/v0/searchStakeEvents.js +3 -3
  188. package/dist/staking/stakes/searchStakes/index.d.ts +3 -3
  189. package/dist/staking/stakes/searchStakes/index.d.ts.map +1 -1
  190. package/dist/staking/stakes/searchStakes/v0/searchStakes.d.ts +7 -7
  191. package/dist/staking/stakes/searchStakes/v0/searchStakes.d.ts.map +1 -1
  192. package/dist/staking/stakes/searchStakes/v0/searchStakes.js +3 -3
  193. package/dist/staking-templates/index.d.ts +42 -42
  194. package/dist/staking-templates/templates/common/getReward.d.ts +7 -7
  195. package/dist/staking-templates/templates/common/partialUnstake.d.ts +7 -7
  196. package/dist/staking-templates/templates/common/rewardDistribution.js +2 -2
  197. package/dist/staking-templates/templates/common/unstake.d.ts +7 -7
  198. package/dist/staking-templates/templates/reputation/index.d.ts +13 -13
  199. package/dist/staking-templates/templates/reputation/v0/createPlatform.d.ts +3 -3
  200. package/dist/staking-templates/templates/reputation/v0/createPool.d.ts +7 -7
  201. package/dist/staking-templates/templates/reputation/v0/index.d.ts +13 -13
  202. package/dist/staking-templates/templates/reputation/v0/restake.d.ts +7 -7
  203. package/dist/staking-templates/templates/reputation/v0/stake.d.ts +7 -7
  204. package/dist/staking-templates/templates/reputationLock/index.d.ts +13 -13
  205. package/dist/staking-templates/templates/reputationLock/v0/createPlatform.d.ts +3 -3
  206. package/dist/staking-templates/templates/reputationLock/v0/createPool.d.ts +7 -7
  207. package/dist/staking-templates/templates/reputationLock/v0/index.d.ts +13 -13
  208. package/dist/staking-templates/templates/reputationLock/v0/restake.d.ts +7 -7
  209. package/dist/staking-templates/templates/reputationLock/v0/stake.d.ts +7 -7
  210. package/dist/staking-templates/templates/rwa/index.d.ts +16 -16
  211. package/dist/staking-templates/templates/rwa/v0/createPlatform.d.ts +3 -3
  212. package/dist/staking-templates/templates/rwa/v0/createPool.d.ts +7 -7
  213. package/dist/staking-templates/templates/rwa/v0/distributeRewards.d.ts +61 -0
  214. package/dist/staking-templates/templates/rwa/v0/distributeRewards.d.ts.map +1 -0
  215. package/dist/staking-templates/templates/rwa/v0/distributeRewards.js +41 -0
  216. package/dist/staking-templates/templates/rwa/v0/index.d.ts +16 -16
  217. package/dist/staking-templates/templates/rwa/v0/index.js +2 -2
  218. package/dist/staking-templates/templates/rwa/v0/restake.d.ts +7 -7
  219. package/dist/staking-templates/templates/rwa/v0/stake.d.ts +7 -7
  220. package/dist/v0/fractions/index.d.ts +68 -0
  221. package/dist/v0/fractions/index.d.ts.map +1 -0
  222. package/dist/v0/fractions/index.js +9 -0
  223. package/dist/v0/fractions/networkStatistics.route.d.ts +176 -0
  224. package/dist/v0/fractions/networkStatistics.route.d.ts.map +1 -0
  225. package/dist/v0/fractions/networkStatistics.route.js +354 -0
  226. package/dist/v1/fractions/lending/buyback/buyback.routes.d.ts +65 -0
  227. package/dist/v1/fractions/lending/buyback/buyback.routes.d.ts.map +1 -0
  228. package/dist/v1/fractions/lending/buyback/buyback.routes.js +27 -0
  229. package/dist/v1/fractions/lending/buyback/buyback.schema.d.ts +19 -0
  230. package/dist/v1/fractions/lending/buyback/buyback.schema.d.ts.map +1 -0
  231. package/dist/v1/fractions/lending/buyback/buyback.schema.js +12 -0
  232. package/dist/v1/fractions/lending/createLendingSale.d.ts +585 -0
  233. package/dist/v1/fractions/lending/createLendingSale.d.ts.map +1 -0
  234. package/dist/v1/fractions/lending/createLendingSale.js +81 -0
  235. package/dist/v1/fractions/lending/deployMarket/lending.routes.d.ts +117 -0
  236. package/dist/v1/fractions/lending/deployMarket/lending.routes.d.ts.map +1 -0
  237. package/dist/v1/fractions/lending/deployMarket/lending.routes.js +35 -0
  238. package/dist/v1/fractions/lending/index.d.ts +209 -0
  239. package/dist/v1/fractions/lending/index.d.ts.map +1 -0
  240. package/dist/v1/fractions/lending/index.js +22 -0
  241. package/dist/v1/fractions/lending/purchase/directPurchase.route.d.ts +82 -0
  242. package/dist/v1/fractions/lending/purchase/directPurchase.route.d.ts.map +1 -0
  243. package/dist/v1/fractions/lending/purchase/directPurchase.route.js +34 -0
  244. package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.routes.d.ts +61 -0
  245. package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.routes.d.ts.map +1 -0
  246. package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.routes.js +27 -0
  247. package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.schema.d.ts +16 -0
  248. package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.schema.d.ts.map +1 -0
  249. package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.schema.js +10 -0
  250. package/dist/v1/fractions/schemas.d.ts +108 -0
  251. package/dist/v1/fractions/schemas.d.ts.map +1 -0
  252. package/dist/v1/fractions/schemas.js +35 -0
  253. package/package.json +10 -7
@@ -0,0 +1,354 @@
1
+ import { describeRoute } from "hono-openapi";
2
+ import { resolver, validator } from "hono-openapi/zod";
3
+ import { and, count, countDistinct, eq, sum } from "@ponder/client";
4
+ import { z } from "../../common/zod.js";
5
+ import { indexerSchemas } from "../../common/indexer/schemas.js";
6
+ import { TmiChainIdSchema } from "../../common/index.js";
7
+ const NetworkStatisticsRequestSchema = z.object({
8
+ chainId: TmiChainIdSchema.optional().openapi({
9
+ description: "Optional chain ID to filter statistics by specific chain. If provided, returns only that chain's data. If not provided, returns total and all per-chain breakdowns.",
10
+ }),
11
+ });
12
+ /**
13
+ * Response schema for fraction holders count endpoint
14
+ * Keys can be 'total' or chain IDs (as strings), values are holder counts
15
+ */
16
+ export const FractionHoldersCountSchema = z.record(z.union([z.literal("total"), z.string()]), z.number()).openapi({
17
+ ref: "FractionHoldersCount",
18
+ description: "Contains 'total' (when chainId not specified) and per-chain holder counts (chain IDs as string keys). When chainId is specified, only that chain's data is returned.",
19
+ });
20
+ /**
21
+ * Response schema for successful sales count endpoint
22
+ * Keys can be 'total' or chain IDs (as strings), values are sales counts
23
+ */
24
+ export const SuccessfulSalesCountSchema = z.record(z.union([z.literal("total"), z.string()]), z.number()).openapi({
25
+ ref: "SuccessfulSalesCount",
26
+ description: "Contains 'total' (when chainId not specified) and per-chain sales counts (chain IDs as string keys). When chainId is specified, only that chain's data is returned.",
27
+ });
28
+ /**
29
+ * Response schema for TTV endpoint
30
+ * Keys can be 'total' or chain IDs (as strings), values are TTV amounts as strings (bigdecimal representation)
31
+ */
32
+ export const TtvSchema = z.record(z.union([z.literal("total"), z.string()]), z.string()).openapi({
33
+ ref: "TotalTokenizedValue",
34
+ description: "Contains 'total' (when chainId not specified) and per-chain TTV values as string representations of bigdecimal (chain IDs as string keys). When chainId is specified, only that chain's data is returned.",
35
+ });
36
+ /**
37
+ * Per-chain statistics object schema
38
+ */
39
+ const ChainStatisticsSchema = z.object({
40
+ holders: z.number().openapi({
41
+ description: "Number of unique fraction holders",
42
+ }),
43
+ sales: z.number().openapi({
44
+ description: "Number of successful (finalized) fraction sales",
45
+ }),
46
+ ttv: z.string().openapi({
47
+ description: "Total Tokenized Value as string representation of bigdecimal in USDC (raw units)",
48
+ }),
49
+ });
50
+ /**
51
+ * Combined network statistics response schema
52
+ * Keys can be 'total' or chain IDs (as strings), values are statistics objects
53
+ */
54
+ export const NetworkStatisticsSchema = z
55
+ .record(z.union([z.literal("total"), z.string()]), ChainStatisticsSchema)
56
+ .openapi({
57
+ ref: "NetworkStatistics",
58
+ description: "Contains 'total' (when chainId not specified) aggregated statistics and per-chain breakdowns (chain IDs as string keys). When chainId is specified, only that chain's data is returned.",
59
+ });
60
+ /**
61
+ * Fetches all statistics grouped by chain in parallel
62
+ */
63
+ async function fetchPerChainStatistics(c, chainIdFilter) {
64
+ const { fractions: { fractionsPurchases, fractionsSales }, } = indexerSchemas;
65
+ const chainFilter = chainIdFilter ? eq(fractionsSales.chainId, chainIdFilter) : undefined;
66
+ const purchaseChainFilter = chainIdFilter ? eq(fractionsPurchases.chainId, chainIdFilter) : undefined;
67
+ const [holders, sales, ttv] = await Promise.all([
68
+ // Unique holders from finalized sales, grouped by chain
69
+ c
70
+ .get("indexerClient")
71
+ .db.select({
72
+ chainId: fractionsPurchases.chainId,
73
+ holders: countDistinct(fractionsPurchases.buyerAddress),
74
+ })
75
+ .from(fractionsPurchases)
76
+ .innerJoin(fractionsSales, and(eq(fractionsPurchases.chainId, fractionsSales.chainId), eq(fractionsPurchases.diamondAddress, fractionsSales.diamondAddress), eq(fractionsPurchases.saleId, fractionsSales.saleId)))
77
+ .where(and(purchaseChainFilter, eq(fractionsSales.status, "finalized")))
78
+ .groupBy(fractionsPurchases.chainId),
79
+ // Count of finalized sales, grouped by chain
80
+ c
81
+ .get("indexerClient")
82
+ .db.select({
83
+ chainId: fractionsSales.chainId,
84
+ sales: count(fractionsSales.saleId),
85
+ })
86
+ .from(fractionsSales)
87
+ .where(and(chainFilter, eq(fractionsSales.status, "finalized")))
88
+ .groupBy(fractionsSales.chainId),
89
+ // Sum of amountPaid from purchases of finalized sales, grouped by chain
90
+ c
91
+ .get("indexerClient")
92
+ .db.select({
93
+ chainId: fractionsPurchases.chainId,
94
+ ttv: sum(fractionsPurchases.amountPaid),
95
+ })
96
+ .from(fractionsPurchases)
97
+ .innerJoin(fractionsSales, and(eq(fractionsPurchases.chainId, fractionsSales.chainId), eq(fractionsPurchases.diamondAddress, fractionsSales.diamondAddress), eq(fractionsPurchases.saleId, fractionsSales.saleId)))
98
+ .where(and(purchaseChainFilter, eq(fractionsSales.status, "finalized")))
99
+ .groupBy(fractionsPurchases.chainId),
100
+ ]);
101
+ return { holders, sales, ttv };
102
+ }
103
+ /**
104
+ * Builds complete statistics response with total and per-chain breakdown
105
+ */
106
+ function buildCompleteStatisticsResponse(stats) {
107
+ // Build per-chain statistics map
108
+ const chainStats = {};
109
+ // Collect all unique chain IDs
110
+ const allChainIds = new Set();
111
+ stats.holders.forEach((r) => allChainIds.add(r.chainId));
112
+ stats.sales.forEach((r) => allChainIds.add(r.chainId));
113
+ stats.ttv.forEach((r) => allChainIds.add(r.chainId));
114
+ // Initialize all chains with zeros
115
+ for (const cId of allChainIds) {
116
+ chainStats[cId.toString()] = {
117
+ holders: 0,
118
+ sales: 0,
119
+ ttv: "0",
120
+ };
121
+ }
122
+ // Populate holders
123
+ for (const result of stats.holders) {
124
+ const chainIdStr = result.chainId.toString();
125
+ if (chainStats[chainIdStr]) {
126
+ chainStats[chainIdStr].holders = result.holders ?? 0;
127
+ }
128
+ }
129
+ // Populate sales
130
+ for (const result of stats.sales) {
131
+ const chainIdStr = result.chainId.toString();
132
+ if (chainStats[chainIdStr]) {
133
+ chainStats[chainIdStr].sales = result.sales ?? 0;
134
+ }
135
+ }
136
+ // Populate TTV
137
+ for (const result of stats.ttv) {
138
+ const chainIdStr = result.chainId.toString();
139
+ if (chainStats[chainIdStr]) {
140
+ chainStats[chainIdStr].ttv = result.ttv ?? "0";
141
+ }
142
+ }
143
+ // Calculate totals
144
+ let totalHolders = 0;
145
+ let totalSales = 0;
146
+ let totalTtv = BigInt(0);
147
+ for (const chainStat of Object.values(chainStats)) {
148
+ totalHolders += chainStat.holders;
149
+ totalSales += chainStat.sales;
150
+ totalTtv += BigInt(chainStat.ttv);
151
+ }
152
+ // Build final response
153
+ return {
154
+ total: {
155
+ holders: totalHolders,
156
+ sales: totalSales,
157
+ ttv: totalTtv.toString(),
158
+ },
159
+ ...chainStats,
160
+ };
161
+ }
162
+ /**
163
+ * Get the number of unique fraction holders from successful (finalized) sales
164
+ */
165
+ export function createFractionHoldersCountV0(factory) {
166
+ return factory.createHandlers(describeRoute({
167
+ summary: "Get number of fraction holders",
168
+ description: "Returns the count of unique wallet addresses that hold fractions from successful (finalized) sales. If chainId is provided, returns only that chain's data. Otherwise, returns total and all per-chain breakdowns. Used for RWA aggregator integrations.",
169
+ tags: ["RWA Statistics"],
170
+ responses: {
171
+ 200: {
172
+ description: "Number of unique fraction holders",
173
+ content: {
174
+ "application/json": {
175
+ schema: resolver(FractionHoldersCountSchema),
176
+ },
177
+ },
178
+ },
179
+ },
180
+ }), validator("json", NetworkStatisticsRequestSchema), async (c) => {
181
+ const { chainId } = c.req.valid("json");
182
+ const stats = await fetchPerChainStatistics(c, chainId ? Number(chainId) : undefined);
183
+ if (chainId) {
184
+ // Return only the specific chain's data
185
+ const holdersResponse = {};
186
+ for (const result of stats.holders) {
187
+ if (result.chainId === Number(chainId)) {
188
+ holdersResponse[result.chainId.toString()] = result.holders ?? 0;
189
+ }
190
+ }
191
+ return c.json(FractionHoldersCountSchema.parse(holdersResponse), 200);
192
+ }
193
+ else {
194
+ // Return total and all per-chain breakdowns
195
+ const response = buildCompleteStatisticsResponse(stats);
196
+ // Extract only holders data
197
+ const holdersResponse = { total: response.total.holders };
198
+ for (const [chain, data] of Object.entries(response)) {
199
+ if (chain !== "total") {
200
+ holdersResponse[chain] = data.holders;
201
+ }
202
+ }
203
+ return c.json(FractionHoldersCountSchema.parse(holdersResponse), 200);
204
+ }
205
+ });
206
+ }
207
+ /**
208
+ * Get the number of successful (finalized) fraction sales
209
+ */
210
+ export function createSuccessfulSalesCountV0(factory) {
211
+ return factory.createHandlers(describeRoute({
212
+ summary: "Get number of successful sales",
213
+ description: "Returns the count of successful (finalized) fraction sales representing RWA tokens. If chainId is provided, returns only that chain's data. Otherwise, returns total and all per-chain breakdowns. Used for RWA aggregator integrations.",
214
+ tags: ["RWA Statistics"],
215
+ responses: {
216
+ 200: {
217
+ description: "Number of successful fraction sales",
218
+ content: {
219
+ "application/json": {
220
+ schema: resolver(SuccessfulSalesCountSchema),
221
+ },
222
+ },
223
+ },
224
+ },
225
+ }), validator("json", NetworkStatisticsRequestSchema), async (c) => {
226
+ const { chainId } = c.req.valid("json");
227
+ const stats = await fetchPerChainStatistics(c, chainId ? Number(chainId) : undefined);
228
+ if (chainId) {
229
+ // Return only the specific chain's data
230
+ const salesResponse = {};
231
+ for (const result of stats.sales) {
232
+ if (result.chainId === Number(chainId)) {
233
+ salesResponse[result.chainId.toString()] = result.sales ?? 0;
234
+ }
235
+ }
236
+ return c.json(SuccessfulSalesCountSchema.parse(salesResponse), 200);
237
+ }
238
+ else {
239
+ // Return total and all per-chain breakdowns
240
+ const response = buildCompleteStatisticsResponse(stats);
241
+ // Extract only sales data
242
+ const salesResponse = { total: response.total.sales };
243
+ for (const [chain, data] of Object.entries(response)) {
244
+ if (chain !== "total") {
245
+ salesResponse[chain] = data.sales;
246
+ }
247
+ }
248
+ return c.json(SuccessfulSalesCountSchema.parse(salesResponse), 200);
249
+ }
250
+ });
251
+ }
252
+ /**
253
+ * Get the Total Tokenized Value (TTV) - sum of all amounts raised by successful sales in USDC
254
+ */
255
+ export function createTtvV0(factory) {
256
+ return factory.createHandlers(describeRoute({
257
+ summary: "Get Total Tokenized Value (TTV)",
258
+ description: "Returns the Total Tokenized Value - the sum of all amounts raised by successful (finalized) sales in USDC. If chainId is provided, returns only that chain's data. Otherwise, returns total and all per-chain breakdowns. Used for RWA aggregator integrations.",
259
+ tags: ["RWA Statistics"],
260
+ responses: {
261
+ 200: {
262
+ description: "Total Tokenized Value in USDC",
263
+ content: {
264
+ "application/json": {
265
+ schema: resolver(TtvSchema),
266
+ },
267
+ },
268
+ },
269
+ },
270
+ }), validator("json", NetworkStatisticsRequestSchema), async (c) => {
271
+ const { chainId } = c.req.valid("json");
272
+ const stats = await fetchPerChainStatistics(c, chainId ? Number(chainId) : undefined);
273
+ if (chainId) {
274
+ // Return only the specific chain's data
275
+ const ttvResponse = {};
276
+ for (const result of stats.ttv) {
277
+ if (result.chainId === Number(chainId)) {
278
+ ttvResponse[result.chainId.toString()] = result.ttv ?? "0";
279
+ }
280
+ }
281
+ return c.json(TtvSchema.parse(ttvResponse), 200);
282
+ }
283
+ else {
284
+ // Return total and all per-chain breakdowns
285
+ const response = buildCompleteStatisticsResponse(stats);
286
+ // Extract only TTV data
287
+ const ttvResponse = { total: response.total.ttv };
288
+ for (const [chain, data] of Object.entries(response)) {
289
+ if (chain !== "total") {
290
+ ttvResponse[chain] = data.ttv;
291
+ }
292
+ }
293
+ return c.json(TtvSchema.parse(ttvResponse), 200);
294
+ }
295
+ });
296
+ }
297
+ /**
298
+ * Get all network statistics in a single call
299
+ */
300
+ export function createNetworkStatisticsV0(factory) {
301
+ return factory.createHandlers(describeRoute({
302
+ summary: "Get all network statistics",
303
+ description: "Returns all network statistics in a single call: number of fraction holders, successful sales count, and TTV. If chainId is provided, returns only that chain's data. Otherwise, returns total and all per-chain breakdowns. Used for RWA aggregator integrations like RWA.XYZ.",
304
+ tags: ["RWA Statistics"],
305
+ responses: {
306
+ 200: {
307
+ description: "Network statistics including holders, sales, and TTV",
308
+ content: {
309
+ "application/json": {
310
+ schema: resolver(NetworkStatisticsSchema),
311
+ },
312
+ },
313
+ },
314
+ },
315
+ }), validator("json", NetworkStatisticsRequestSchema), async (c) => {
316
+ const { chainId } = c.req.valid("json");
317
+ const stats = await fetchPerChainStatistics(c, chainId ? Number(chainId) : undefined);
318
+ if (chainId) {
319
+ // Return only the specific chain's data
320
+ const chainIdNum = Number(chainId);
321
+ const chainIdStr = chainIdNum.toString();
322
+ let holders = 0;
323
+ let sales = 0;
324
+ let ttv = "0";
325
+ for (const result of stats.holders) {
326
+ if (result.chainId === chainIdNum) {
327
+ holders = result.holders ?? 0;
328
+ }
329
+ }
330
+ for (const result of stats.sales) {
331
+ if (result.chainId === chainIdNum) {
332
+ sales = result.sales ?? 0;
333
+ }
334
+ }
335
+ for (const result of stats.ttv) {
336
+ if (result.chainId === chainIdNum) {
337
+ ttv = result.ttv ?? "0";
338
+ }
339
+ }
340
+ return c.json(NetworkStatisticsSchema.parse({
341
+ [chainIdStr]: {
342
+ holders,
343
+ sales,
344
+ ttv,
345
+ },
346
+ }), 200);
347
+ }
348
+ else {
349
+ // Return total and all per-chain breakdowns
350
+ const response = buildCompleteStatisticsResponse(stats);
351
+ return c.json(NetworkStatisticsSchema.parse(response), 200);
352
+ }
353
+ });
354
+ }
@@ -0,0 +1,65 @@
1
+ import { Env } from "hono";
2
+ import { Factory } from "hono/factory";
3
+ export declare function createBuybackTransactionV0<E extends Env>(factory: Factory<E>): [import("hono/types").H<any, string, {}, Promise<Response & import("hono").TypedResponse<{
4
+ data: `0x${string}`;
5
+ to: `0x${string}`;
6
+ details: {
7
+ address: `0x${string}`;
8
+ functionName: string;
9
+ abi: any[];
10
+ args: any[];
11
+ };
12
+ }, import("hono/utils/http-status").ContentfulStatusCode, "json">>>, import("hono/types").H<Env, string, {
13
+ in: {
14
+ json: {
15
+ chainId: import("@evergonlabs/tmi-protocol-fractions-sdk").TmiChainId;
16
+ campaignId: bigint;
17
+ market: `0x${string}`;
18
+ buybackPacketsAmount: bigint;
19
+ };
20
+ };
21
+ out: {
22
+ json: {
23
+ chainId: import("@evergonlabs/tmi-protocol-fractions-sdk").TmiChainId;
24
+ campaignId: bigint;
25
+ market: `0x${string}`;
26
+ buybackPacketsAmount: bigint;
27
+ };
28
+ };
29
+ }, Promise<Response & import("hono").TypedResponse<{
30
+ data: `0x${string}`;
31
+ to: `0x${string}`;
32
+ details: {
33
+ address: `0x${string}`;
34
+ functionName: string;
35
+ abi: any[];
36
+ args: any[];
37
+ };
38
+ }, import("hono/utils/http-status").ContentfulStatusCode, "json">>>, import("hono/types").H<import("hono/utils/types").IfAnyThenEmptyObject<E extends Env ? Env extends E ? {} : E : E> & {}, string, {
39
+ in: {
40
+ json: {
41
+ chainId: import("@evergonlabs/tmi-protocol-fractions-sdk").TmiChainId;
42
+ campaignId: bigint;
43
+ market: `0x${string}`;
44
+ buybackPacketsAmount: bigint;
45
+ };
46
+ };
47
+ out: {
48
+ json: {
49
+ chainId: import("@evergonlabs/tmi-protocol-fractions-sdk").TmiChainId;
50
+ campaignId: bigint;
51
+ market: `0x${string}`;
52
+ buybackPacketsAmount: bigint;
53
+ };
54
+ };
55
+ }, Promise<Response & import("hono").TypedResponse<{
56
+ data: `0x${string}`;
57
+ to: `0x${string}`;
58
+ details: {
59
+ address: `0x${string}`;
60
+ functionName: string;
61
+ abi: any[];
62
+ args: any[];
63
+ };
64
+ }, import("hono/utils/http-status").ContentfulStatusCode, "json">>>];
65
+ //# sourceMappingURL=buyback.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buyback.routes.d.ts","sourceRoot":"","sources":["../../../../../src/v1/fractions/lending/buyback/buyback.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAuBvC,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEAQ5E"}
@@ -0,0 +1,27 @@
1
+ import { describeRoute } from "hono-openapi";
2
+ import { resolver, validator } from "hono-openapi/zod";
3
+ import { toTransaction, TransactionSchema } from "../../../../common/index.js";
4
+ import { buildBuybackTx } from "@evergonlabs/tmi-protocol-fractions-sdk";
5
+ import { BuybackRequestSchema } from "./buyback.schema.js";
6
+ const route = describeRoute({
7
+ summary: "Perform buyback of lending position",
8
+ description: "Returns transaction data for buying back the lending position with interest",
9
+ tags: ["Buy-back"],
10
+ responses: {
11
+ 200: {
12
+ description: "Returns transaction data for buyback operation",
13
+ content: {
14
+ "application/json": {
15
+ schema: resolver(TransactionSchema),
16
+ },
17
+ },
18
+ },
19
+ },
20
+ });
21
+ export function createBuybackTransactionV0(factory) {
22
+ return factory.createHandlers(route, validator("json", BuybackRequestSchema), async (c) => {
23
+ const { market, campaignId, buybackPacketsAmount } = c.req.valid("json");
24
+ const tx = buildBuybackTx(market, campaignId, buybackPacketsAmount);
25
+ return c.json(toTransaction(tx));
26
+ });
27
+ }
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const BuybackRequestSchema: z.ZodObject<{
3
+ chainId: z.ZodType<import("@evergonlabs/tmi-protocol-fractions-sdk").TmiChainId, z.ZodTypeDef, import("@evergonlabs/tmi-protocol-fractions-sdk").TmiChainId>;
4
+ buybackPacketsAmount: z.ZodBigInt;
5
+ } & {
6
+ market: z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>;
7
+ campaignId: z.ZodBigInt;
8
+ }, "strip", z.ZodTypeAny, {
9
+ chainId: import("@evergonlabs/tmi-protocol-fractions-sdk").TmiChainId;
10
+ campaignId: bigint;
11
+ market: `0x${string}`;
12
+ buybackPacketsAmount: bigint;
13
+ }, {
14
+ chainId: import("@evergonlabs/tmi-protocol-fractions-sdk").TmiChainId;
15
+ campaignId: bigint;
16
+ market: `0x${string}`;
17
+ buybackPacketsAmount: bigint;
18
+ }>;
19
+ //# sourceMappingURL=buyback.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buyback.schema.d.ts","sourceRoot":"","sources":["../../../../../src/v1/fractions/lending/buyback/buyback.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;EAQU,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ import { TmiChainIdSchema } from "../../../../common/index.js";
3
+ import { SaleIdSchema } from "../../../../common/models/saleId.js";
4
+ export const BuybackRequestSchema = z
5
+ .object({
6
+ chainId: TmiChainIdSchema,
7
+ buybackPacketsAmount: z.coerce.bigint().openapi({
8
+ description: "Amount of packets to buyback (with interest)",
9
+ }),
10
+ })
11
+ .extend(SaleIdSchema.shape)
12
+ .openapi({ ref: "BuybackRequestSchema" });