-
-
Notifications
You must be signed in to change notification settings - Fork 816
/
multicall.ts
104 lines (99 loc) · 2.91 KB
/
multicall.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
98
99
100
101
102
103
104
import type { Abi } from 'abitype'
import type {
ContractFunctionConfig,
ContractFunctionResult,
} from './contract.js'
type MAXIMUM_DEPTH = 20
export type Contract<
TAbi extends Abi | readonly unknown[] = Abi | readonly unknown[],
TFunctionName extends string = string,
> = { abi: TAbi; functionName: TFunctionName }
export type MulticallContracts<
TContracts extends Contract[],
TProperties extends Record<string, any> = object,
Result extends any[] = [],
Depth extends readonly number[] = [],
> = Depth['length'] extends MAXIMUM_DEPTH
? (ContractFunctionConfig & TProperties)[]
: TContracts extends []
? []
: TContracts extends [infer Head extends Contract]
? [
...Result,
ContractFunctionConfig<Head['abi'], Head['functionName']> & TProperties,
]
: TContracts extends [
infer Head extends Contract,
...infer Tail extends Contract[],
]
? MulticallContracts<
[...Tail],
TProperties,
[
...Result,
ContractFunctionConfig<Head['abi'], Head['functionName']> & TProperties,
],
[...Depth, 1]
>
: unknown[] extends TContracts
? TContracts
: // If `TContracts` is *some* array but we couldn't assign `unknown[]` to it, then it must hold some known/homogenous type!
// use this to infer the param types in the case of Array.map() argument
TContracts extends ContractFunctionConfig<infer TAbi, infer TFunctionName>[]
? (ContractFunctionConfig<TAbi, TFunctionName> & TProperties)[]
: (ContractFunctionConfig & TProperties)[]
export type MulticallResult<
Result,
TAllowFailure extends boolean = true,
> = TAllowFailure extends true
?
| {
error?: undefined
result: Result
status: 'success'
}
| {
error: Error
result?: undefined
status: 'error'
}
: Result
export type MulticallResults<
TContracts extends Contract[],
TAllowFailure extends boolean = true,
Result extends any[] = [],
Depth extends readonly number[] = [],
> = Depth['length'] extends MAXIMUM_DEPTH
? MulticallResult<ContractFunctionResult, TAllowFailure>[]
: TContracts extends []
? []
: TContracts extends [infer Head extends Contract]
? [
...Result,
MulticallResult<
ContractFunctionResult<Head['abi'], Head['functionName']>,
TAllowFailure
>,
]
: TContracts extends [
infer Head extends Contract,
...infer Tail extends Contract[],
]
? MulticallResults<
[...Tail],
TAllowFailure,
[
...Result,
MulticallResult<
ContractFunctionResult<Head['abi'], Head['functionName']>,
TAllowFailure
>,
],
[...Depth, 1]
>
: TContracts extends ContractFunctionConfig<infer TAbi, infer TFunctionName>[]
? MulticallResult<
ContractFunctionResult<TAbi, TFunctionName>,
TAllowFailure
>[]
: MulticallResult<ContractFunctionResult, TAllowFailure>[]