Skip to content

Commit 74c4aaf

Browse files
committed
feat: add underlying minter addresses endpoint to statistics
1 parent 1efaf07 commit 74c4aaf

3 files changed

Lines changed: 32 additions & 10 deletions

File tree

packages/fasset-indexer-api/src/analytics/statistics.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
import { SharedAnalytics } from "./shared"
99
import { weightedAverage } from "./utils/weighted-average"
1010
import { FAssetPriceLoader } from "./utils/prices"
11-
import { LIQUIDATION_DURATION_SQL, MINTED_BY_UNDERLYING_ADDRESS, REDEEMED_BY_UNDERLYING_ADDRESS } from "./utils/raw-sql"
11+
import * as SQL from "./utils/raw-sql"
1212
import { FAssetValueResult } from "./types"
1313

1414

@@ -74,7 +74,7 @@ export class AgentStatistics extends SharedAnalytics {
7474

7575
async liquidationDurationWA(vault: string, now: number, delta: number, lim: number): Promise<[bigint, number]> {
7676
const result = await this.orm.em.getConnection('read')
77-
.execute(LIQUIDATION_DURATION_SQL, [vault, vault, now - delta, lim]) as { timestamp: number, diff: string }[]
77+
.execute(SQL.LIQUIDATION_DURATION_SQL, [vault, vault, now - delta, lim]) as { timestamp: number, diff: string }[]
7878
const timespan = result.map(r => ({ timestamp: r.timestamp, value: BigInt(r.diff) }))
7979
return [weightedAverage(timespan, now, delta), timespan.length]
8080
}
@@ -151,15 +151,21 @@ export class AgentStatistics extends SharedAnalytics {
151151
return weightedAverage(timespan, now, delta)
152152
}
153153

154-
async mintedByUnderlyingAddressDuring(address: string, start: number, end: number): Promise<any> {
154+
async mintedByUnderlyingAddressDuring(address: string, start: number, end: number): Promise<FAssetValueResult> {
155155
const em = this.orm.em.fork()
156-
const r = await em.execute(MINTED_BY_UNDERLYING_ADDRESS, [address, start, end]) as { fasset: FAssetType, val: string }[]
156+
const r = await em.execute(SQL.MINTED_BY_UNDERLYING_ADDRESS, [address, start, end]) as { fasset: FAssetType, val: string }[]
157157
return this.convertOrmResultToFAssetValueResult(r, 'val')
158158
}
159159

160-
async redeemedByUnderlyingAddressDuring(address: string, start: number, end: number): Promise<any> {
160+
async redeemedByUnderlyingAddressDuring(address: string, start: number, end: number): Promise<FAssetValueResult> {
161161
const em = this.orm.em.fork()
162-
const r = await em.execute(REDEEMED_BY_UNDERLYING_ADDRESS, [address, start, end]) as { fasset: FAssetType, val: string }[]
162+
const r = await em.execute(SQL.REDEEMED_BY_UNDERLYING_ADDRESS, [address, start, end]) as { fasset: FAssetType, val: string }[]
163163
return this.convertOrmResultToFAssetValueResult(r, 'val')
164164
}
165+
166+
async underlyingMinterAddresses(address: string): Promise<string[]> {
167+
const em = this.orm.em.fork()
168+
const minters = await em.execute(SQL.UNDERLYING_MINTERS, [address]) as { address: string }[]
169+
return minters.map(({ address }) => address)
170+
}
165171
}

packages/fasset-indexer-api/src/analytics/utils/raw-sql.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,12 @@ SELECT rp.fasset, SUM(ut.value) as val FROM redemption_performed rp
214214
JOIN underlying_block ub ON ub.height = ut.block_height
215215
WHERE ua.text = ? AND ub.timestamp >= ? AND ub.timestamp < ?
216216
GROUP BY rp.fasset
217-
`
217+
`
218+
219+
export const UNDERLYING_MINTERS = `
220+
SELECT DISTINCT ua.text as address FROM minting_executed me
221+
JOIN collateral_reserved cr ON cr.evm_log_id = me.collateral_reserved_evm_log_id
222+
JOIN evm_address ea ON ea.id = cr.minter_id
223+
JOIN underlying_reference ur ON ur.reference = cr.payment_reference
224+
JOIN underlying_address ua ON ua.id = ur.address_id
225+
WHERE ea.hex = ?`

packages/fasset-indexer-api/src/controllers/statistics.controller.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { unixnow } from "../shared/utils"
44
import { ApiResponse, apiResponse } from "../shared/api-response"
55
import { StatisticsService } from "../services/statistics.service"
66
import { DashboardService } from "../services/dashboard.service"
7-
import type { FAssetTimeSeries, StatisticAverage } from "../analytics/types"
7+
import type { FAssetTimeSeries, FAssetValueResult, StatisticAverage } from "../analytics/types"
88

99
const STAT_LIMIT = 100
1010
const DELTA = 60 * 60 * 24 * 7 // one week
@@ -102,7 +102,7 @@ export class StatisticsController {
102102
@Query('user') user: string,
103103
@Query('startTime', ParseIntPipe) start: number,
104104
@Query('endtime', ParseIntPipe) end: number,
105-
): Promise<ApiResponse<any>> {
105+
): Promise<ApiResponse<FAssetValueResult>> {
106106
return apiResponse(this.service.mintedByUnderlyingAddressDuring(user, start, end), 200)
107107
}
108108

@@ -112,10 +112,18 @@ export class StatisticsController {
112112
@Query('user') user: string,
113113
@Query('startTime', ParseIntPipe) start: number,
114114
@Query('endtime', ParseIntPipe) end: number,
115-
): Promise<ApiResponse<any>> {
115+
): Promise<ApiResponse<FAssetValueResult>> {
116116
return apiResponse(this.service.redeemedByUnderlyingAddressDuring(user, start, end), 200)
117117
}
118118

119+
@Get('/underlying-minter-addresses?')
120+
@ApiOperation({ summary: 'Underlying addresses that the given user address minted from' })
121+
getUnderlyingMinterAddresses(
122+
@Query('user') user: string
123+
): Promise<ApiResponse<string[]>> {
124+
return apiResponse(this.service.underlyingMinterAddresses(user), 200)
125+
}
126+
119127
protected async structureReturn(prms: Promise<[bigint, number]>, now: number): Promise<StatisticAverage> {
120128
return prms.then(([avg, num]) => ({
121129
average: avg,

0 commit comments

Comments
 (0)