viem 0.0.0-w-20230818210302 → 0.0.0-w-20230820223631

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/cjs/actions/getContract.js.map +1 -1
  2. package/dist/cjs/actions/public/multicall.js.map +1 -1
  3. package/dist/cjs/actions/public/readContract.js.map +1 -1
  4. package/dist/cjs/clients/decorators/public.js.map +1 -1
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/esm/actions/getContract.js.map +1 -1
  7. package/dist/esm/actions/public/multicall.js.map +1 -1
  8. package/dist/esm/actions/public/readContract.js.map +1 -1
  9. package/dist/esm/clients/decorators/public.js.map +1 -1
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/types/actions/getContract.d.ts +9 -9
  12. package/dist/types/actions/getContract.d.ts.map +1 -1
  13. package/dist/types/actions/public/multicall.d.ts +4 -3
  14. package/dist/types/actions/public/multicall.d.ts.map +1 -1
  15. package/dist/types/actions/public/readContract.d.ts +4 -4
  16. package/dist/types/actions/public/readContract.d.ts.map +1 -1
  17. package/dist/types/clients/decorators/public.d.ts +2 -2
  18. package/dist/types/clients/decorators/public.d.ts.map +1 -1
  19. package/dist/types/index.d.ts +2 -2
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/types/contract.d.ts +15 -8
  22. package/dist/types/types/contract.d.ts.map +1 -1
  23. package/dist/types/types/multicall.d.ts +18 -35
  24. package/dist/types/types/multicall.d.ts.map +1 -1
  25. package/dist/types/types/utils.d.ts +1 -1
  26. package/dist/types/types/utils.d.ts.map +1 -1
  27. package/package.json +1 -1
  28. package/src/actions/getContract.ts +185 -177
  29. package/src/actions/public/multicall.ts +4 -5
  30. package/src/actions/public/readContract.ts +29 -11
  31. package/src/clients/decorators/public.ts +7 -4
  32. package/src/index.ts +4 -1
  33. package/src/types/contract.ts +80 -27
  34. package/src/types/multicall.ts +67 -121
  35. package/src/types/utils.ts +1 -1
@@ -30,22 +30,37 @@ import type {
30
30
  UnionToTuple,
31
31
  } from './utils.js'
32
32
 
33
- export type FunctionName<
34
- abi extends Abi = Abi,
33
+ export type ContractFunctionName<
34
+ abi extends Abi | readonly unknown[] = Abi,
35
35
  mutability extends AbiStateMutability = AbiStateMutability,
36
- > = ExtractAbiFunctionNames<abi, mutability>
37
-
38
- export type Args<
39
- abi extends Abi = Abi,
36
+ > = ExtractAbiFunctionNames<
37
+ abi extends Abi ? abi : Abi,
38
+ mutability
39
+ > extends infer functionName extends string
40
+ ? [functionName] extends [never]
41
+ ? string
42
+ : functionName
43
+ : string
44
+
45
+ export type ContractFunctionArgs<
46
+ abi extends Abi | readonly unknown[] = Abi,
40
47
  mutability extends AbiStateMutability = AbiStateMutability,
41
- functionName extends ExtractAbiFunctionNames<
48
+ functionName extends ContractFunctionName<
42
49
  abi,
43
50
  mutability
44
- > = ExtractAbiFunctionNames<abi, mutability>,
51
+ > = ContractFunctionName<abi, mutability>,
45
52
  > = AbiParametersToPrimitiveTypes<
46
- ExtractAbiFunction<abi, functionName, mutability>['inputs'],
53
+ ExtractAbiFunction<
54
+ abi extends Abi ? abi : Abi,
55
+ functionName,
56
+ mutability
57
+ >['inputs'],
47
58
  'inputs'
48
- >
59
+ > extends infer args
60
+ ? [args] extends [never]
61
+ ? readonly unknown[]
62
+ : args
63
+ : readonly unknown[]
49
64
 
50
65
  export type Widen<type> =
51
66
  | ([unknown] extends [type] ? unknown : never)
@@ -75,8 +90,8 @@ export type Widen<type> =
75
90
  export type ExtractAbiFunctionForArgs<
76
91
  abi extends Abi,
77
92
  mutability extends AbiStateMutability,
78
- functionName extends FunctionName<abi, mutability>,
79
- args extends Args<abi, mutability, functionName>,
93
+ functionName extends ContractFunctionName<abi, mutability>,
94
+ args extends ContractFunctionArgs<abi, mutability, functionName>,
80
95
  > = ExtractAbiFunction<
81
96
  abi,
82
97
  functionName,
@@ -96,14 +111,59 @@ export type ExtractAbiFunctionForArgs<
96
111
  : abiFunction
97
112
  : never
98
113
 
114
+ export type ContractFunctionParameters<
115
+ abi extends Abi | readonly unknown[] = Abi,
116
+ mutability extends AbiStateMutability = AbiStateMutability,
117
+ functionName extends ContractFunctionName<
118
+ abi,
119
+ mutability
120
+ > = ContractFunctionName<abi, mutability>,
121
+ args extends ContractFunctionArgs<
122
+ abi,
123
+ mutability,
124
+ functionName
125
+ > = ContractFunctionArgs<abi, mutability, functionName>,
126
+ ///
127
+ allArgs = ContractFunctionArgs<abi, mutability, functionName>,
128
+ allFunctionNames = ContractFunctionName<abi, mutability>,
129
+ // when `args` is inferred to `readonly []` ("inputs": []) or `never` (`abi` declared as `Abi` or not inferrable), allow `args` to be optional.
130
+ // important that both branches return same structural type
131
+ > = readonly [] extends allArgs
132
+ ? {
133
+ address: Address
134
+ abi: abi
135
+ functionName:
136
+ | allFunctionNames // show all options
137
+ | (functionName extends allFunctionNames ? functionName : never) // infer value
138
+ args?:
139
+ | allArgs // show all options
140
+ | (args extends allArgs ? Widen<args> : never) // infer value, widen inferred value of `args` conditionally to match `allArgs`
141
+ | undefined
142
+ }
143
+ : {
144
+ address: Address
145
+ abi: abi
146
+ functionName:
147
+ | allFunctionNames // show all options
148
+ | (functionName extends allFunctionNames ? functionName : never) // infer value
149
+ args:
150
+ | allArgs // show all options
151
+ | Widen<args> // infer value, widen inferred value of `args` match `allArgs` (e.g. avoid union `args: readonly [123n] | readonly [bigint]`)
152
+ }
153
+
99
154
  export type ContractFunctionReturnType<
100
- contract,
101
- mutability extends AbiStateMutability,
102
- > = contract extends {
103
- abi: infer abi extends Abi
104
- functionName?: infer functionName extends string
105
- args?: infer args
106
- }
155
+ abi extends Abi | readonly unknown[] = Abi,
156
+ mutability extends AbiStateMutability = AbiStateMutability,
157
+ functionName extends ContractFunctionName<
158
+ abi,
159
+ mutability
160
+ > = ContractFunctionName<abi, mutability>,
161
+ args extends ContractFunctionArgs<
162
+ abi,
163
+ mutability,
164
+ functionName
165
+ > = ContractFunctionArgs<abi, mutability, functionName>,
166
+ > = abi extends Abi
107
167
  ? Abi extends abi
108
168
  ? unknown
109
169
  : AbiParametersToPrimitiveTypes<
@@ -111,14 +171,7 @@ export type ContractFunctionReturnType<
111
171
  abi,
112
172
  mutability,
113
173
  functionName,
114
- // fallback to `readonly []` if `args` is not defined (e.g. not required `"inputs": []`)
115
- (
116
- readonly [] extends args
117
- ? readonly []
118
- : args
119
- ) extends infer args2 extends Args<abi, mutability, functionName>
120
- ? args2
121
- : never
174
+ readonly [] extends args ? readonly [] : args
122
175
  >['outputs']
123
176
  > extends infer types
124
177
  ? types extends readonly []
@@ -1,48 +1,13 @@
1
- import type { Abi, AbiStateMutability, Address } from 'abitype'
1
+ import type { Abi, AbiStateMutability } from 'abitype'
2
2
 
3
3
  import type {
4
- Args,
4
+ ContractFunctionArgs,
5
+ ContractFunctionName,
6
+ ContractFunctionParameters,
5
7
  ContractFunctionReturnType,
6
- FunctionName,
7
- Widen,
8
8
  } from './contract.js'
9
9
  import type { MaybePartial } from './utils.js'
10
10
 
11
- export type MulticallContract<
12
- abi extends Abi | readonly unknown[] = Abi,
13
- mutability extends AbiStateMutability = AbiStateMutability,
14
- functionName extends FunctionName<
15
- abi extends Abi ? abi : Abi,
16
- mutability
17
- > = string,
18
- args extends Args<
19
- abi extends Abi ? abi : Abi,
20
- mutability,
21
- functionName
22
- > = Args<abi extends Abi ? abi : Abi, mutability, functionName>,
23
- > = readonly [] extends args
24
- ? {
25
- address: Address
26
- abi: abi
27
- functionName:
28
- | functionName
29
- | FunctionName<abi extends Abi ? abi : Abi, mutability>
30
- args?:
31
- | Widen<args>
32
- | Args<abi extends Abi ? abi : Abi, mutability, functionName>
33
- | undefined
34
- }
35
- : {
36
- address: Address
37
- abi: abi
38
- functionName:
39
- | functionName
40
- | FunctionName<abi extends Abi ? abi : Abi, mutability>
41
- args:
42
- | Widen<args>
43
- | Args<abi extends Abi ? abi : Abi, mutability, functionName>
44
- }
45
-
46
11
  export type MulticallContracts<
47
12
  contracts extends readonly unknown[],
48
13
  options extends {
@@ -52,71 +17,58 @@ export type MulticallContracts<
52
17
  } = { mutability: AbiStateMutability },
53
18
  ///
54
19
  result extends readonly any[] = [],
55
- > = contracts extends readonly []
20
+ > = contracts extends readonly [] // no contracts, return empty
56
21
  ? readonly []
57
- : contracts extends readonly [infer contract] // One contract left before returning `result`
22
+ : contracts extends readonly [infer contract] // one contract left before returning `result`
58
23
  ? readonly [
59
24
  ...result,
60
- GetMulticallContract<contract, options['mutability']> extends [never] // If `GetContract` returns `never`, then `contract` is invalid
61
- ? // Fallback to just `abi`
62
- MaybePartial<
63
- Omit<MulticallContract, 'args'> & {
64
- args?: readonly unknown[] | undefined
65
- } & options['properties'],
66
- options['optional']
67
- >
68
- : // We know `contract` is inferrable, let's get to it!
69
- MaybePartial<
70
- GetMulticallContract<contract, options['mutability']> &
71
- options['properties'],
72
- options['optional']
73
- >,
25
+ MaybePartial<
26
+ GetMulticallContractParameters<contract, options['mutability']> &
27
+ options['properties'],
28
+ options['optional']
29
+ >,
74
30
  ]
75
- : contracts extends readonly [infer contract, ...infer rest] // Grab first contract and recurse
31
+ : contracts extends readonly [infer contract, ...infer rest] // grab first contract and recurse through `rest`
76
32
  ? MulticallContracts<
77
33
  [...rest],
78
34
  options,
79
35
  [
80
36
  ...result,
81
- GetMulticallContract<contract, options['mutability']> extends [never] // If `GetContract` returns `never`, then `contract` is invalid
82
- ? // Fallback to just `abi`
83
- MaybePartial<
84
- Omit<MulticallContract, 'args'> & {
85
- args?: readonly unknown[] | undefined
86
- } & options['properties'],
87
- options['optional']
88
- >
89
- : // We know `contract` is inferrable, let's get to it!
90
- MaybePartial<
91
- GetMulticallContract<contract, options['mutability']> &
92
- options['properties'],
93
- options['optional']
94
- >,
37
+ MaybePartial<
38
+ GetMulticallContractParameters<contract, options['mutability']> &
39
+ options['properties'],
40
+ options['optional']
41
+ >,
95
42
  ]
96
43
  >
97
44
  : readonly unknown[] extends contracts
98
45
  ? contracts
99
46
  : // If `contracts` is *some* array but we couldn't assign `unknown[]` to it, then it must hold some known/homogenous type!
100
47
  // use this to infer the param types in the case of Array.map() argument
101
- contracts extends readonly MulticallContract<
48
+ contracts extends readonly ContractFunctionParameters<
102
49
  infer abi,
103
50
  infer _,
104
51
  infer functionName,
105
52
  infer args
106
53
  >[]
107
54
  ? readonly MaybePartial<
108
- MulticallContract<abi, options['mutability'], functionName, args> &
55
+ ContractFunctionParameters<
56
+ abi,
57
+ options['mutability'],
58
+ functionName,
59
+ args
60
+ > &
109
61
  options['properties'],
110
62
  options['optional']
111
63
  >[]
112
64
  : // Fallback
113
65
  readonly MaybePartial<
114
- MulticallContract & options['properties'],
66
+ ContractFunctionParameters & options['properties'],
115
67
  options['optional']
116
68
  >[]
117
69
 
118
70
  export type MulticallResults<
119
- contracts extends readonly unknown[] = readonly MulticallContract[],
71
+ contracts extends readonly unknown[] = readonly ContractFunctionParameters[],
120
72
  allowFailure extends boolean = true,
121
73
  options extends {
122
74
  error?: Error
@@ -124,14 +76,7 @@ export type MulticallResults<
124
76
  } = { error: Error; mutability: AbiStateMutability },
125
77
  > = {
126
78
  [index in keyof contracts]: MulticallResponse<
127
- ContractFunctionReturnType<
128
- contracts[index],
129
- options['mutability']
130
- > extends infer result
131
- ? [result] extends [never]
132
- ? unknown
133
- : result
134
- : unknown,
79
+ GetMulticallContractReturnType<contracts[index], options['mutability']>,
135
80
  options['error'],
136
81
  allowFailure
137
82
  >
@@ -151,54 +96,55 @@ export type MulticallResponse<
151
96
  }
152
97
  : result
153
98
 
154
- type GetMulticallContract<
99
+ // infer contract parameters from `unknown`
100
+ type GetMulticallContractParameters<
155
101
  contract,
156
102
  mutability extends AbiStateMutability,
157
- > = contract extends { abi: infer abi extends Abi } // 1. Check if `abi` is const-asserted, defined inline, or declared as `Abi`
103
+ > = contract extends { abi: infer abi extends Abi } // 1. Check if `abi` is const-asserted or defined inline
158
104
  ? // 1a. Check if `functionName` is valid for `abi`
159
105
  contract extends {
160
- functionName: infer functionName extends FunctionName<abi, mutability>
106
+ functionName: infer functionName extends ContractFunctionName<
107
+ abi,
108
+ mutability
109
+ >
161
110
  }
162
111
  ? // 1aa. Check if `args` is valid for `abi` and `functionName`
163
112
  contract extends {
164
- args: infer args extends Args<abi, mutability, functionName>
113
+ args: infer args extends ContractFunctionArgs<
114
+ abi,
115
+ mutability,
116
+ functionName
117
+ >
165
118
  }
166
- ? // 1aa. Check if `args` can be empty
167
- readonly [] extends Args<abi, mutability, functionName>
168
- ? // `args` can be empty, mark `args` as `undefined`
169
- MulticallContract<abi, mutability, functionName, readonly []>
170
- : // `contract` is valid as-is, return it
171
- MulticallContract<abi, mutability, functionName, args>
172
- : // 1ab. `args` is invalid, infer types for `args`
173
- readonly [] extends Args<abi, mutability, functionName>
174
- ? // `args` can be empty, mark `args` as `undefined`
175
- MulticallContract<abi, mutability, functionName, readonly []>
176
- : // infer `args`
177
- MulticallContract<abi, mutability, functionName>
119
+ ? ContractFunctionParameters<abi, mutability, functionName, args> // `args` valid, pass through
120
+ : ContractFunctionParameters<abi, mutability, functionName> // invalid `args`
178
121
  : // 1b. `functionName` is invalid, check if `abi` is declared as `Abi`
179
122
  Abi extends abi
180
- ? // `abi` declared as `Abi`, unable to infer types further
181
- MulticallContract
123
+ ? ContractFunctionParameters // `abi` declared as `Abi`, unable to infer types further
182
124
  : // `abi` is const-asserted or defined inline, infer types for `functionName` and `args`
183
- Omit<MulticallContract<abi, mutability>, 'args' | 'functionName'> & {
184
- // setting `functionName` directly here because `MulticallContract` will allow invalid inputs otherwise (because of `functionName: functionName`)
185
- functionName: FunctionName<abi, mutability>
186
- // setting `args` directly here because `MulticallContract` has `Widen` in its definition,
187
- // which will cause that to show up in editor autocomplete for overloaded functions
188
- args: Args<abi, mutability, FunctionName<abi, mutability>>
189
- }
190
- : // 2. Check if `abi` property exists in `contract`
191
- contract extends { abi: infer abi }
192
- ? // 2a. `abi` exists in `contract`, check if `abi` is of type `Abi`
193
- abi extends Abi
194
- ? // return `unknown` since 1 handle type inference
195
- MulticallContract
196
- : // return default type since `abi` is not inferrable
197
- Omit<MulticallContract<readonly unknown[], mutability>, 'args'> & {
198
- // setting ars directly here because `MulticallContract` has `Widen` in its definition,
199
- // which will cause `never[]` to be inferred for `args` in this case
200
- args?: readonly unknown[] | undefined
125
+ ContractFunctionParameters<abi, mutability>
126
+ : ContractFunctionParameters<readonly unknown[]> // invalid `contract['abi']`, set to `readonly unknown[]`
127
+
128
+ type GetMulticallContractReturnType<
129
+ contract,
130
+ mutability extends AbiStateMutability,
131
+ > = contract extends { abi: infer abi extends Abi } // 1. Check if `abi` is const-asserted or defined inline
132
+ ? // Check if `functionName` is valid for `abi`
133
+ contract extends {
134
+ functionName: infer functionName extends ContractFunctionName<
135
+ abi,
136
+ mutability
137
+ >
138
+ }
139
+ ? // Check if `args` is valid for `abi` and `functionName`
140
+ contract extends {
141
+ args: infer args extends ContractFunctionArgs<
142
+ abi,
143
+ mutability,
144
+ functionName
145
+ >
201
146
  }
202
- : // 2b. `abi` property does not exist in `contract`, unable to infer types further
203
- // return `never`
204
- never
147
+ ? ContractFunctionReturnType<abi, mutability, functionName, args> // `args` valid, pass through
148
+ : ContractFunctionReturnType<abi, mutability, functionName> // invalid `args`
149
+ : ContractFunctionReturnType<abi, mutability> // Invalid `functionName`
150
+ : ContractFunctionReturnType // invalid `contract['abi']` (not const-asserted or declared as `Abi`)
@@ -183,7 +183,7 @@ export type IsUnion<
183
183
  export type MaybePartial<
184
184
  type,
185
185
  enabled extends boolean | undefined,
186
- > = enabled extends true ? ExactPartial<type> : type
186
+ > = enabled extends true ? Prettify<ExactPartial<type>> : type
187
187
 
188
188
  export type ExactPartial<type> = {
189
189
  [key in keyof type]?: type[key] | undefined