-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathamounts.ts
More file actions
108 lines (100 loc) · 2.35 KB
/
Copy pathamounts.ts
File metadata and controls
108 lines (100 loc) · 2.35 KB
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { OrderSide, type TickSizeValue } from '@polymarket/bindings';
import { resolveRoundingConfig } from './context';
import {
FIXED_SCALE,
mulDiv,
quantize,
Rounding,
type ScaledAmount,
type ScaledPrice,
scaledQuantum,
toScaledAmount,
} from './fixed';
function multiplyAmountByPrice(
amount: ScaledAmount,
price: ScaledPrice,
decimalPlaces: number,
rounding: Rounding,
): bigint {
const quantum = scaledQuantum(decimalPlaces);
return mulDiv(amount, price, FIXED_SCALE * quantum, rounding) * quantum;
}
function divideAmountByPrice(
amount: ScaledAmount,
price: ScaledPrice,
decimalPlaces: number,
rounding: Rounding,
): bigint {
const quantum = scaledQuantum(decimalPlaces);
return mulDiv(amount, FIXED_SCALE, price * quantum, rounding) * quantum;
}
export function computeLimitOrderAmounts(params: {
price: ScaledPrice;
side: OrderSide;
size: number;
tickSize: TickSizeValue;
}): {
offeredAmount: bigint;
requestedAmount: bigint;
} {
const roundConfig = resolveRoundingConfig(params.tickSize);
const size = quantize(
toScaledAmount(params.size),
roundConfig.size,
Rounding.Down,
);
if (params.side === OrderSide.BUY) {
return {
offeredAmount: multiplyAmountByPrice(
size,
params.price,
roundConfig.amount,
Rounding.Down,
),
requestedAmount: size,
};
}
return {
offeredAmount: size,
requestedAmount: multiplyAmountByPrice(
size,
params.price,
roundConfig.amount,
Rounding.Down,
),
};
}
export function computeMarketOrderAmounts(params: {
amount: ScaledAmount;
price: ScaledPrice;
protectPrice?: boolean;
side: OrderSide;
tickSize: TickSizeValue;
}): {
offeredAmount: bigint;
requestedAmount: bigint;
} {
const roundConfig = resolveRoundingConfig(params.tickSize);
const amount = quantize(params.amount, roundConfig.size, Rounding.Down);
const rounding = params.protectPrice ? Rounding.Up : Rounding.Down;
if (params.side === OrderSide.BUY) {
return {
offeredAmount: amount,
requestedAmount: divideAmountByPrice(
amount,
params.price,
roundConfig.amount,
rounding,
),
};
}
return {
offeredAmount: amount,
requestedAmount: multiplyAmountByPrice(
amount,
params.price,
roundConfig.amount,
rounding,
),
};
}