-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathauction-price.ts
62 lines (51 loc) · 1.82 KB
/
auction-price.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
import Decimal from 'decimal.js-light';
import { addHours, isBefore, fromUnixTime } from 'date-fns';
import { ZooMetadata } from '../utils/zoo_contract/ZooLib';
export interface AuctionPriceItem {
price: Decimal;
time: Date;
}
export class AuctionPrice {
private _auctionStartPrice: Decimal;
private _auctionEndPrice: Decimal;
private _auctionStartTime: Date;
private _auctionEndTime: Date;
constructor(opts: ZooMetadata) {
this._auctionStartTime = fromUnixTime(opts.auctionStartTime.toNumber());
this._auctionEndTime = fromUnixTime(opts.auctionEndTime.toNumber());
this._auctionStartPrice = new Decimal(opts.auctionStartPrice.toString());
this._auctionEndPrice = new Decimal(opts.auctionEndPrice.toString());
}
getPriceForTime(timestamp: Date): Decimal {
if (timestamp.getTime() >= this._auctionEndTime.getTime()) {
return this._auctionEndPrice;
}
//// Compute price delta
const minAmount = this._auctionEndPrice;
const amountDelta = this._auctionStartPrice.sub(minAmount);
// Compute time delta
const auctionDurationSeconds = new Decimal(
(this._auctionEndTime.getTime() - this._auctionStartTime.getTime()) /
1000,
);
const remainingDurationSeconds = new Decimal(
(this._auctionEndTime.getTime() - timestamp.getTime()) / 1000,
);
return minAmount.add(
remainingDurationSeconds.mul(amountDelta).div(auctionDurationSeconds),
);
}
generateHourlyAuctionPriceSeries(interval: number): AuctionPriceItem[] {
let prices = [];
let currentTime = this._auctionStartTime;
while (isBefore(currentTime, this._auctionEndTime)) {
const price = this.getPriceForTime(currentTime);
prices.push({
price,
time: currentTime,
});
currentTime = addHours(currentTime, interval);
}
return prices;
}
}