-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathPerpMarketTrade.ts
76 lines (63 loc) · 2.29 KB
/
PerpMarketTrade.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import dayjs, { Dayjs } from "dayjs";
import { Address, isBech32 } from "fuels";
import { Nullable } from "tsdef";
import { BN } from "@compolabs/spark-orderbook-ts-sdk";
import { DEFAULT_DECIMALS } from "@constants";
import { FuelNetwork } from "@blockchain";
import { Token } from "./Token";
interface PerpMarketTradeParams {
baseToken: string;
seller: string;
buyer: string;
tradeSize: string;
tradePrice: string;
sellOrderId: string;
buyOrderId: string;
timestamp: number;
id?: string;
userAddress?: string;
}
const getType = (buyer: string, seller: string, userAddress?: string) => {
if (!userAddress) return null;
const address = isBech32(userAddress) ? new Address(userAddress as `fuel${string}`).toB256() : userAddress;
return address.toLowerCase() === seller.toLowerCase()
? "SELL"
: address.toLowerCase() === buyer.toLowerCase()
? "BUY"
: null;
};
export class PerpMarketTrade {
readonly id: PerpMarketTradeParams["id"];
readonly baseToken: Token;
readonly seller: PerpMarketTradeParams["seller"];
readonly buyer: PerpMarketTradeParams["buyer"];
readonly sellOrderId: PerpMarketTradeParams["sellOrderId"];
readonly buyOrderId: PerpMarketTradeParams["buyOrderId"];
readonly tradeSize: PerpMarketTradeParams["tradeSize"];
readonly tradePrice: PerpMarketTradeParams["tradePrice"];
readonly timestamp: Dayjs;
readonly type: Nullable<"SELL" | "BUY"> = null;
constructor(params: PerpMarketTradeParams) {
const bcNetwork = FuelNetwork.getInstance();
const baseToken = bcNetwork.getTokenByAssetId(params.baseToken);
this.id = params.id;
this.baseToken = baseToken;
this.seller = params.seller;
this.buyer = params.buyer;
this.sellOrderId = params.sellOrderId;
this.buyOrderId = params.buyOrderId;
this.tradeSize = params.tradeSize;
this.tradePrice = params.tradePrice;
this.timestamp = dayjs.unix(params.timestamp);
this.type = getType(this.buyer, this.seller, params.userAddress);
}
get formatPrice() {
return BN.formatUnits(this.tradePrice, DEFAULT_DECIMALS).toSignificant(2);
}
get formatTradeAmount() {
return BN.formatUnits(this.tradeSize, this.baseToken.decimals).toSignificant(2);
}
// get marketSymbol() {
// return `${this.baseToken.symbol}-${this.quoteToken.symbol}`;
// }
}