-
Notifications
You must be signed in to change notification settings - Fork 142
/
get-dispute-tokens.ts
43 lines (40 loc) · 2.31 KB
/
get-dispute-tokens.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import * as t from "io-ts";
import Knex from "knex";
import { formatBigNumberAsFixed } from "../../utils/format-big-number-as-fixed";
import { BigNumber, DisputeTokensRowWithTokenState, ReportingState, UIDisputeTokenInfo, UIDisputeTokens } from "../../types";
import { reshapeDisputeTokensRowToUIDisputeTokenInfo } from "./database";
export const DisputeTokenState = t.keyof({
ALL: null,
UNCLAIMED: null,
UNFINALIZED: null,
});
export const DisputeTokensParams = t.type({
universe: t.string,
account: t.string,
stakeTokenState: t.union([DisputeTokenState, t.null, t.undefined]),
});
export async function getDisputeTokens(db: Knex, augur: {}, params: t.TypeOf<typeof DisputeTokensParams>) {
const query: Knex.QueryBuilder = db.select(["payouts.*", "disputes.crowdsourcerId as disputeToken", "balances.balance", "market_state.reportingState"]).from("disputes");
query.join("markets", "markets.marketId", "crowdsourcers.marketId");
query.leftJoin("market_state", "markets.marketStateId", "market_state.marketStateId");
query.leftJoin("blocks", "markets.creationBlockNumber", "blocks.blockNumber");
query.join("crowdsourcers", "crowdsourcers.crowdsourcerId", "disputes.crowdsourcerId");
query.join("payouts", "payouts.payoutId", "crowdsourcers.payoutId");
query.join("balances", "crowdsourcers.crowdsourcerId", "balances.token");
query.where("universe", params.universe).where("disputes.reporter", params.account).where("balances.balance", ">", 0).where("balances.owner", params.account);
if (params.stakeTokenState == null || params.stakeTokenState === "ALL") {
// currently, do nothing, leaving this in case we want to flavor how we group or present response
} else if (params.stakeTokenState === "UNFINALIZED") {
query.whereNot("market_state.reportingState", ReportingState.FINALIZED);
} else if (params.stakeTokenState === "UNCLAIMED") {
query.where("payouts.winning", 1);
} else {
throw new Error("Invalid disputeTokenState");
}
const disputeTokens: Array<DisputeTokensRowWithTokenState<BigNumber>> = await query;
return disputeTokens.reduce((acc: UIDisputeTokens<string>, cur) => {
const tokenInfo = reshapeDisputeTokensRowToUIDisputeTokenInfo(cur);
acc[cur.disputeToken] = formatBigNumberAsFixed<UIDisputeTokenInfo<BigNumber>, UIDisputeTokenInfo<string>>(tokenInfo);
return acc;
}, {});
}