-
Notifications
You must be signed in to change notification settings - Fork 3
/
fee.service.ts
72 lines (59 loc) · 2.62 KB
/
fee.service.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
import { Contracts, IoC, Services } from "@ardenthq/sdk";
import { BigNumber } from "@ardenthq/sdk-helpers";
import { Request } from "./request.js";
export class FeeService extends Services.AbstractFeeService {
readonly #request: Request;
public constructor(container: IoC.IContainer) {
super(container);
this.#request = new Request(
container.get(IoC.BindingType.ConfigRepository),
container.get(IoC.BindingType.HttpClient),
container.get(IoC.BindingType.NetworkHostSelector),
);
}
public override async all(): Promise<Services.TransactionFees> {
const node = await this.#request.get("node/fees");
const type = await this.#request.get("transactions/fees");
const staticFees: object = type.data;
const dynamicFees: object = node.data;
return {
delegateRegistration: this.#transform("delegateRegistration", 1, staticFees, dynamicFees),
delegateResignation: this.#transform("delegateResignation", 1, staticFees, dynamicFees),
ipfs: this.#transform("ipfs", 1, staticFees, dynamicFees),
multiPayment: this.#transform("multiPayment", 1, staticFees, dynamicFees),
multiSignature: this.#transform("multiSignature", 1, staticFees, dynamicFees),
secondSignature: this.#transform("secondSignature", 1, staticFees, dynamicFees),
transfer: this.#transform("transfer", 1, staticFees, dynamicFees),
vote: this.#transform("vote", 1, staticFees, dynamicFees),
};
}
public override async calculate(
transaction: Contracts.RawTransactionData,
options?: Services.TransactionFeeOptions,
): Promise<BigNumber> {
const { multiSignature } = await this.all();
if (Array.isArray(transaction.data()?.asset?.multiSignature?.publicKeys)) {
return multiSignature.static.times(transaction.data().asset.multiSignature.publicKeys.length + 1);
}
return BigNumber.ZERO;
}
#transform(type: string, typeGroup: number, staticFees: object, dynamicFees: object): Services.TransactionFee {
const dynamicFee = (dynamicFees[typeGroup] ?? staticFees[typeGroup])[type] ?? "0";
let minimumFee = this.bigNumberService.make(dynamicFee?.min ?? "0");
let averageFee = this.bigNumberService.make(dynamicFee?.avg ?? "0");
const maximumFee = this.bigNumberService.make(staticFees[typeGroup][type] ?? "0");
if (type === "multiPayment") {
minimumFee = maximumFee;
averageFee = maximumFee;
}
return {
avg: averageFee.isGreaterThan(maximumFee) ? maximumFee : averageFee,
isDynamic:
this.configRepository.get<string>("network.transactions.fees.type") !== "static" &&
type !== "multiSignature",
max: maximumFee,
min: minimumFee.isGreaterThan(maximumFee) ? maximumFee : minimumFee,
static: maximumFee,
};
}
}