-
Notifications
You must be signed in to change notification settings - Fork 181
/
usecase.ts
97 lines (84 loc) · 2.38 KB
/
usecase.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import { CallOverrides, Contract, Overrides, PayableOverrides } from "ethers";
import {
CreateOrderAction,
ExchangeAction,
OrderUseCase,
TransactionMethods,
ContractMethodReturnType,
} from "../types";
export const executeAllActions = async <
T extends CreateOrderAction | ExchangeAction
>(
actions: OrderUseCase<T>["actions"]
) => {
for (let i = 0; i < actions.length - 1; i++) {
const action = actions[i];
if (action.type === "approval") {
await action.transactionMethods.transact();
}
}
const finalAction = actions[actions.length - 1] as T;
return finalAction.type === "create"
? await finalAction.createOrder()
: await finalAction.transactionMethods.transact();
};
const instanceOfOverrides = <
T extends Overrides | PayableOverrides | CallOverrides
>(
obj: Object
): obj is T => {
const validKeys = [
"gasLimit",
"gasPrice",
"maxFeePerGas",
"maxPriorityFeePerGas",
"nonce",
"type",
"accessList",
"customData",
"ccipReadEnabled",
"value",
"blockTag",
"CallOverrides",
];
return Object.keys(obj).every((key) => validKeys.includes(key));
};
export const getTransactionMethods = <
T extends Contract,
U extends keyof T["functions"]
>(
contract: T,
method: U,
args: Parameters<T["functions"][U]>
): TransactionMethods<ContractMethodReturnType<T, U>> => {
const lastArg = args[args.length - 1];
let initialOverrides: Overrides;
if (instanceOfOverrides(lastArg)) {
initialOverrides = lastArg;
args.pop();
}
return {
callStatic: (overrides?: Overrides) => {
const mergedOverrides = { ...initialOverrides, ...overrides };
return contract.callStatic[method as string](
...[...args, mergedOverrides]
);
},
estimateGas: (overrides?: Overrides) => {
const mergedOverrides = { ...initialOverrides, ...overrides };
return contract.estimateGas[method as string](
...[...args, mergedOverrides]
);
},
transact: (overrides?: Overrides) => {
const mergedOverrides = { ...initialOverrides, ...overrides };
return contract[method as string](...args, mergedOverrides);
},
buildTransaction: (overrides?: Overrides) => {
const mergedOverrides = { ...initialOverrides, ...overrides };
return contract.populateTransaction[method as string](
...[...args, mergedOverrides]
);
},
};
};