@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.
- package/dist/app.d.ts +476 -157
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +4 -0
- package/dist/client.d.ts +529 -157
- package/dist/client.d.ts.map +1 -1
- package/dist/common/abis/erc20Whitelisted.d.ts +27 -12
- package/dist/common/abis/erc20Whitelisted.d.ts.map +1 -1
- package/dist/common/abis/erc20Whitelisted.js +192 -1
- package/dist/common/blockchain.d.ts +20 -26
- package/dist/common/blockchain.d.ts.map +1 -1
- package/dist/common/blockchain.js +22 -19
- package/dist/common/config.d.ts +43 -1
- package/dist/common/config.d.ts.map +1 -1
- package/dist/common/config.js +47 -25
- package/dist/common/context.d.ts +11 -0
- package/dist/common/context.d.ts.map +1 -0
- package/dist/common/context.js +0 -0
- package/dist/common/indexer/client.d.ts +3 -2
- package/dist/common/indexer/client.d.ts.map +1 -1
- package/dist/common/indexer/schemas.d.ts +1 -1
- package/dist/common/indexer/schemas.d.ts.map +1 -1
- package/dist/common/middleware/indexer.d.ts +3 -0
- package/dist/common/middleware/indexer.d.ts.map +1 -0
- package/dist/common/middleware/indexer.js +7 -0
- package/dist/common/models/asset.d.ts +4 -4
- package/dist/common/models/chainId.d.ts +3 -0
- package/dist/common/models/chainId.d.ts.map +1 -1
- package/dist/common/models/chainId.js +6 -14
- package/dist/common/models/numOrStr.d.ts +7 -0
- package/dist/common/models/numOrStr.d.ts.map +1 -0
- package/dist/common/models/numOrStr.js +11 -0
- package/dist/common/models/platform.d.ts +1 -1
- package/dist/common/models/platform.d.ts.map +1 -1
- package/dist/common/models/platform.js +1 -1
- package/dist/common/models/routes.d.ts +2 -2
- package/dist/common/models/transaction.d.ts +8 -8
- package/dist/common/models/transaction.d.ts.map +1 -1
- package/dist/common/models/transaction.js +1 -1
- package/dist/fractions/activity/searchActivity.route.d.ts +17 -17
- package/dist/fractions/activity/searchActivity.route.d.ts.map +1 -1
- package/dist/fractions/activity/searchActivity.route.js +1 -2
- package/dist/fractions/activity/utils.d.ts +8 -8
- package/dist/fractions/approveSale/v0/approveSale.route.d.ts +3 -3
- package/dist/fractions/approveWrapper/v0/approveWrapper.route.d.ts +9 -9
- package/dist/fractions/completeSale/v0/completeSale.route.d.ts +3 -3
- package/dist/fractions/createFractions/v0/createFractions.route.d.ts +19 -19
- package/dist/fractions/createFractions/v0/createFractions.schema.d.ts +20 -20
- package/dist/fractions/deployMarket/v0/deployMarket.routes.d.ts +25 -12
- package/dist/fractions/deployMarket/v0/deployMarket.routes.d.ts.map +1 -1
- package/dist/fractions/deployMarket/v0/deployMarket.routes.js +3 -2
- package/dist/fractions/deployMarket/v0/index.d.ts +3 -0
- package/dist/fractions/deployMarket/v0/index.d.ts.map +1 -0
- package/dist/fractions/deployMarket/v0/index.js +2 -0
- package/dist/fractions/deployMarket/v0/initNid.route.d.ts +3 -3
- package/dist/fractions/grantRole/v0/grantRole.route.d.ts +3 -3
- package/dist/fractions/index.d.ts +141 -77
- package/dist/fractions/index.d.ts.map +1 -1
- package/dist/fractions/index.js +5 -3
- package/dist/fractions/markets/common/platform.d.ts +11 -11
- package/dist/fractions/markets/getMarket/index.d.ts +19 -19
- package/dist/fractions/markets/getMarket/index.d.ts.map +1 -1
- package/dist/fractions/markets/getMarket/v0/getMarket.d.ts +17 -17
- package/dist/fractions/markets/getMarket/v0/getMarket.d.ts.map +1 -1
- package/dist/fractions/markets/getMarket/v0/getMarket.js +1 -2
- package/dist/fractions/markets/index.d.ts +22 -22
- package/dist/fractions/markets/index.d.ts.map +1 -1
- package/dist/fractions/markets/searchMarkets/index.d.ts +5 -5
- package/dist/fractions/markets/searchMarkets/index.d.ts.map +1 -1
- package/dist/fractions/markets/searchMarkets/v0/searchMarkets.d.ts +13 -13
- package/dist/fractions/markets/searchMarkets/v0/searchMarkets.d.ts.map +1 -1
- package/dist/fractions/markets/searchMarkets/v0/searchMarkets.js +1 -2
- package/dist/fractions/purchase/v0/purchase.route.d.ts +3 -3
- package/dist/fractions/purchase/v0/statistics.route.d.ts +15 -15
- package/dist/fractions/purchase/v0/statistics.route.d.ts.map +1 -1
- package/dist/fractions/purchase/v0/statistics.route.js +3 -3
- package/dist/fractions/sales/common/fractionsSale.d.ts +40 -40
- package/dist/fractions/sales/getFractionSaleStatistics.route.d.ts +13 -13
- package/dist/fractions/sales/getFractionSaleStatistics.route.d.ts.map +1 -1
- package/dist/fractions/sales/getFractionSaleStatistics.route.js +3 -3
- package/dist/fractions/sales/getVaultAddress.d.ts +4 -4
- package/dist/fractions/sales/getVaultAddress.d.ts.map +1 -1
- package/dist/fractions/sales/getVaultAddress.js +3 -3
- package/dist/fractions/sales/receiveFundsAfterNonFunded.route.d.ts +6 -6
- package/dist/fractions/sales/receiveNonPurchasedWrappedAssets.route.d.ts +3 -3
- package/dist/fractions/sales/recoverFractions.d.ts +3 -3
- package/dist/fractions/sales/rejectFractions.d.ts +3 -3
- package/dist/fractions/sales/searchSales/v0/searchSales.d.ts +32 -32
- package/dist/fractions/sales/searchSales/v0/searchSales.d.ts.map +1 -1
- package/dist/fractions/sales/searchSales/v0/searchSales.js +1 -2
- package/dist/fractions/sales/searchWithdrawal.route.d.ts +7 -7
- package/dist/fractions/sales/searchWithdrawal.route.d.ts.map +1 -1
- package/dist/fractions/sales/searchWithdrawal.route.js +1 -2
- package/dist/fractions/sales/setFeeCapLimit.d.ts +3 -3
- package/dist/fractions/sales/unlockWrappedAssets.route.d.ts +3 -3
- package/dist/fractions/sales/vesting/v0/claimStatistics.route.d.ts +17 -17
- package/dist/fractions/sales/vesting/v0/claimStatistics.route.d.ts.map +1 -1
- package/dist/fractions/sales/vesting/v0/claimStatistics.route.js +6 -5
- package/dist/fractions/sales/vesting/v0/claimVestedTokens.route.d.ts +9 -9
- package/dist/fractions/sales/vesting/v0/editCliff.route.d.ts +3 -3
- package/dist/fractions/withdraw/v0/withdraw.route.d.ts +3 -3
- package/dist/general/balanceClient.d.ts +6 -6
- package/dist/general/common.d.ts +6 -6
- package/dist/general/estimateGas.d.ts +8 -8
- package/dist/general/getBalance.d.ts +4 -4
- package/dist/general/getBalancesBatch.d.ts +4 -4
- package/dist/general/index.d.ts +5 -5
- package/dist/general/searchBalances.d.ts +4 -4
- package/dist/general/utils/tokenBalance/tokenBalance.d.ts +3 -3
- package/dist/issuance/approve.d.ts +3 -3
- package/dist/issuance/burn.d.ts +3 -3
- package/dist/issuance/common.d.ts +2 -0
- package/dist/issuance/common.d.ts.map +1 -0
- package/dist/issuance/common.js +1 -0
- package/dist/issuance/deploy.d.ts +7 -0
- package/dist/issuance/deploy.d.ts.map +1 -1
- package/dist/issuance/deploy.js +44 -3
- package/dist/issuance/getInitData.d.ts +75 -0
- package/dist/issuance/getInitData.d.ts.map +1 -0
- package/dist/issuance/getInitData.js +53 -0
- package/dist/issuance/grantRole.d.ts +9 -9
- package/dist/issuance/index.d.ts +71 -15
- package/dist/issuance/index.d.ts.map +1 -1
- package/dist/issuance/index.js +7 -2
- package/dist/issuance/mint.d.ts +3 -3
- package/dist/issuance/recover.d.ts +82 -0
- package/dist/issuance/recover.d.ts.map +1 -0
- package/dist/issuance/recover.js +38 -0
- package/dist/issuance/renounceRole.d.ts +9 -9
- package/dist/issuance/transfer.d.ts +9 -9
- package/dist/issuance/upgrade.d.ts +3 -3
- package/dist/staking/index.d.ts +10 -10
- package/dist/staking/index.d.ts.map +1 -1
- package/dist/staking/platforms/getPlatform/index.d.ts +3 -3
- package/dist/staking/platforms/getPlatform/index.d.ts.map +1 -1
- package/dist/staking/platforms/getPlatform/v0/getPlatform.d.ts +8 -8
- package/dist/staking/platforms/getPlatform/v0/getPlatform.d.ts.map +1 -1
- package/dist/staking/platforms/getPlatform/v0/getPlatform.js +3 -3
- package/dist/staking/platforms/index.d.ts +3 -3
- package/dist/staking/platforms/index.d.ts.map +1 -1
- package/dist/staking/platforms/searchPlatforms/index.d.ts +2 -2
- package/dist/staking/platforms/searchPlatforms/index.d.ts.map +1 -1
- package/dist/staking/platforms/searchPlatforms/v0/searchPlatforms.d.ts +4 -4
- package/dist/staking/platforms/searchPlatforms/v0/searchPlatforms.d.ts.map +1 -1
- package/dist/staking/platforms/searchPlatforms/v0/searchPlatforms.js +3 -3
- package/dist/staking/pools/common/pool.d.ts +4 -4
- package/dist/staking/pools/getPool/index.d.ts +3 -3
- package/dist/staking/pools/getPool/index.d.ts.map +1 -1
- package/dist/staking/pools/getPool/v0/getPool.d.ts +7 -7
- package/dist/staking/pools/getPool/v0/getPool.d.ts.map +1 -1
- package/dist/staking/pools/getPool/v0/getPool.js +3 -3
- package/dist/staking/pools/index.d.ts +3 -3
- package/dist/staking/pools/index.d.ts.map +1 -1
- package/dist/staking/pools/searchPools/index.d.ts +2 -2
- package/dist/staking/pools/searchPools/index.d.ts.map +1 -1
- package/dist/staking/pools/searchPools/v0/searchPools.d.ts +3 -3
- package/dist/staking/pools/searchPools/v0/searchPools.d.ts.map +1 -1
- package/dist/staking/pools/searchPools/v0/searchPools.js +3 -3
- package/dist/staking/roles/common/roleAssignment.d.ts +2 -2
- package/dist/staking/roles/common/roleEvent.d.ts +4 -4
- package/dist/staking/roles/grantRole/index.d.ts +1 -1
- package/dist/staking/roles/grantRole/v0/grantRole.d.ts +3 -3
- package/dist/staking/roles/index.d.ts +5 -5
- package/dist/staking/roles/index.d.ts.map +1 -1
- package/dist/staking/roles/searchRoleEvents/index.d.ts +3 -3
- package/dist/staking/roles/searchRoleEvents/index.d.ts.map +1 -1
- package/dist/staking/roles/searchRoleEvents/v0/searchRoleEvents.d.ts +7 -7
- package/dist/staking/roles/searchRoleEvents/v0/searchRoleEvents.d.ts.map +1 -1
- package/dist/staking/roles/searchRoleEvents/v0/searchRoleEvents.js +3 -3
- package/dist/staking/roles/searchRoles/index.d.ts +3 -3
- package/dist/staking/roles/searchRoles/index.d.ts.map +1 -1
- package/dist/staking/roles/searchRoles/v0/searchRoles.d.ts +7 -7
- package/dist/staking/roles/searchRoles/v0/searchRoles.d.ts.map +1 -1
- package/dist/staking/roles/searchRoles/v0/searchRoles.js +3 -3
- package/dist/staking/stakes/common/stake.d.ts +2 -2
- package/dist/staking/stakes/common/stakeEvent.d.ts +4 -4
- package/dist/staking/stakes/getStake/index.d.ts +3 -3
- package/dist/staking/stakes/getStake/index.d.ts.map +1 -1
- package/dist/staking/stakes/getStake/v0/getStake.d.ts +7 -7
- package/dist/staking/stakes/getStake/v0/getStake.d.ts.map +1 -1
- package/dist/staking/stakes/getStake/v0/getStake.js +3 -3
- package/dist/staking/stakes/index.d.ts +5 -5
- package/dist/staking/stakes/index.d.ts.map +1 -1
- package/dist/staking/stakes/searchStakeEvents/index.d.ts +3 -3
- package/dist/staking/stakes/searchStakeEvents/index.d.ts.map +1 -1
- package/dist/staking/stakes/searchStakeEvents/v0/searchStakeEvents.d.ts +7 -7
- package/dist/staking/stakes/searchStakeEvents/v0/searchStakeEvents.d.ts.map +1 -1
- package/dist/staking/stakes/searchStakeEvents/v0/searchStakeEvents.js +3 -3
- package/dist/staking/stakes/searchStakes/index.d.ts +3 -3
- package/dist/staking/stakes/searchStakes/index.d.ts.map +1 -1
- package/dist/staking/stakes/searchStakes/v0/searchStakes.d.ts +7 -7
- package/dist/staking/stakes/searchStakes/v0/searchStakes.d.ts.map +1 -1
- package/dist/staking/stakes/searchStakes/v0/searchStakes.js +3 -3
- package/dist/staking-templates/index.d.ts +42 -42
- package/dist/staking-templates/templates/common/getReward.d.ts +7 -7
- package/dist/staking-templates/templates/common/partialUnstake.d.ts +7 -7
- package/dist/staking-templates/templates/common/rewardDistribution.js +2 -2
- package/dist/staking-templates/templates/common/unstake.d.ts +7 -7
- package/dist/staking-templates/templates/reputation/index.d.ts +13 -13
- package/dist/staking-templates/templates/reputation/v0/createPlatform.d.ts +3 -3
- package/dist/staking-templates/templates/reputation/v0/createPool.d.ts +7 -7
- package/dist/staking-templates/templates/reputation/v0/index.d.ts +13 -13
- package/dist/staking-templates/templates/reputation/v0/restake.d.ts +7 -7
- package/dist/staking-templates/templates/reputation/v0/stake.d.ts +7 -7
- package/dist/staking-templates/templates/reputationLock/index.d.ts +13 -13
- package/dist/staking-templates/templates/reputationLock/v0/createPlatform.d.ts +3 -3
- package/dist/staking-templates/templates/reputationLock/v0/createPool.d.ts +7 -7
- package/dist/staking-templates/templates/reputationLock/v0/index.d.ts +13 -13
- package/dist/staking-templates/templates/reputationLock/v0/restake.d.ts +7 -7
- package/dist/staking-templates/templates/reputationLock/v0/stake.d.ts +7 -7
- package/dist/staking-templates/templates/rwa/index.d.ts +16 -16
- package/dist/staking-templates/templates/rwa/v0/createPlatform.d.ts +3 -3
- package/dist/staking-templates/templates/rwa/v0/createPool.d.ts +7 -7
- package/dist/staking-templates/templates/rwa/v0/distributeRewards.d.ts +61 -0
- package/dist/staking-templates/templates/rwa/v0/distributeRewards.d.ts.map +1 -0
- package/dist/staking-templates/templates/rwa/v0/distributeRewards.js +41 -0
- package/dist/staking-templates/templates/rwa/v0/index.d.ts +16 -16
- package/dist/staking-templates/templates/rwa/v0/index.js +2 -2
- package/dist/staking-templates/templates/rwa/v0/restake.d.ts +7 -7
- package/dist/staking-templates/templates/rwa/v0/stake.d.ts +7 -7
- package/dist/v0/fractions/index.d.ts +68 -0
- package/dist/v0/fractions/index.d.ts.map +1 -0
- package/dist/v0/fractions/index.js +9 -0
- package/dist/v0/fractions/networkStatistics.route.d.ts +176 -0
- package/dist/v0/fractions/networkStatistics.route.d.ts.map +1 -0
- package/dist/v0/fractions/networkStatistics.route.js +354 -0
- package/dist/v1/fractions/lending/buyback/buyback.routes.d.ts +65 -0
- package/dist/v1/fractions/lending/buyback/buyback.routes.d.ts.map +1 -0
- package/dist/v1/fractions/lending/buyback/buyback.routes.js +27 -0
- package/dist/v1/fractions/lending/buyback/buyback.schema.d.ts +19 -0
- package/dist/v1/fractions/lending/buyback/buyback.schema.d.ts.map +1 -0
- package/dist/v1/fractions/lending/buyback/buyback.schema.js +12 -0
- package/dist/v1/fractions/lending/createLendingSale.d.ts +585 -0
- package/dist/v1/fractions/lending/createLendingSale.d.ts.map +1 -0
- package/dist/v1/fractions/lending/createLendingSale.js +81 -0
- package/dist/v1/fractions/lending/deployMarket/lending.routes.d.ts +117 -0
- package/dist/v1/fractions/lending/deployMarket/lending.routes.d.ts.map +1 -0
- package/dist/v1/fractions/lending/deployMarket/lending.routes.js +35 -0
- package/dist/v1/fractions/lending/index.d.ts +209 -0
- package/dist/v1/fractions/lending/index.d.ts.map +1 -0
- package/dist/v1/fractions/lending/index.js +22 -0
- package/dist/v1/fractions/lending/purchase/directPurchase.route.d.ts +82 -0
- package/dist/v1/fractions/lending/purchase/directPurchase.route.d.ts.map +1 -0
- package/dist/v1/fractions/lending/purchase/directPurchase.route.js +34 -0
- package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.routes.d.ts +61 -0
- package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.routes.d.ts.map +1 -0
- package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.routes.js +27 -0
- package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.schema.d.ts +16 -0
- package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.schema.d.ts.map +1 -0
- package/dist/v1/fractions/lending/setCollateralPrice/setCollateralPrice.schema.js +10 -0
- package/dist/v1/fractions/schemas.d.ts +108 -0
- package/dist/v1/fractions/schemas.d.ts.map +1 -0
- package/dist/v1/fractions/schemas.js +35 -0
- 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" });
|