/
log.ts
133 lines (128 loc) · 4.11 KB
/
log.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import type {
Abi,
AbiEvent,
Address,
ExtractAbiEvent,
ExtractAbiEventNames,
} from 'abitype'
import type {
AbiEventParametersToPrimitiveTypes,
GetEventArgs,
} from './contract.js'
import type { Hash, Hex } from './misc.js'
export type Log<
TQuantity = bigint,
TIndex = number,
TPending extends boolean = boolean,
TAbiEvent extends AbiEvent | undefined = undefined,
TStrict extends boolean | undefined = undefined,
TAbi extends Abi | readonly unknown[] | undefined = TAbiEvent extends AbiEvent
? [TAbiEvent]
: undefined,
TEventName extends string | undefined = TAbiEvent extends AbiEvent
? TAbiEvent['name']
: undefined,
> = {
/** The address from which this log originated */
address: Address
/** Hash of block containing this log or `null` if pending */
blockHash: TPending extends true ? null : Hash
/** Number of block containing this log or `null` if pending */
blockNumber: TPending extends true ? null : TQuantity
/** Contains the non-indexed arguments of the log */
data: Hex
/** Index of this log within its block or `null` if pending */
logIndex: TPending extends true ? null : TIndex
/** Hash of the transaction that created this log or `null` if pending */
transactionHash: TPending extends true ? null : Hash
/** Index of the transaction that created this log or `null` if pending */
transactionIndex: TPending extends true ? null : TIndex
/** `true` if this filter has been destroyed and is invalid */
removed: boolean
} & GetInferredLogValues<TAbiEvent, TAbi, TEventName, TStrict>
type Topics<
THead extends AbiEvent['inputs'],
TBase = [Hex],
> = THead extends readonly [
infer _Head,
...infer Tail extends AbiEvent['inputs'],
]
? _Head extends { indexed: true }
? [Hex, ...Topics<Tail>]
: Topics<Tail>
: TBase
type GetTopics<
TAbiEvent extends AbiEvent | undefined = undefined,
TAbi extends Abi | readonly unknown[] = [TAbiEvent],
TEventName extends string | undefined = TAbiEvent extends AbiEvent
? TAbiEvent['name']
: undefined,
_AbiEvent extends AbiEvent | undefined = TAbi extends Abi
? TEventName extends string
? ExtractAbiEvent<TAbi, TEventName>
: undefined
: undefined,
_Args = _AbiEvent extends AbiEvent
? AbiEventParametersToPrimitiveTypes<_AbiEvent['inputs']>
: never,
_FailedToParseArgs =
| ([_Args] extends [never] ? true : false)
| (readonly unknown[] extends _Args ? true : false),
> = true extends _FailedToParseArgs
? [Hex, ...Hex[]] | []
: TAbiEvent extends AbiEvent
? Topics<TAbiEvent['inputs']>
: _AbiEvent extends AbiEvent
? Topics<_AbiEvent['inputs']>
: [Hex, ...Hex[]] | []
type GetInferredLogValues<
TAbiEvent extends AbiEvent | undefined = undefined,
TAbi extends Abi | readonly unknown[] | undefined = TAbiEvent extends AbiEvent
? [TAbiEvent]
: undefined,
TEventName extends string | undefined = TAbiEvent extends AbiEvent
? TAbiEvent['name']
: undefined,
TStrict extends boolean | undefined = undefined,
_EventNames extends string = TAbi extends Abi
? Abi extends TAbi
? string
: ExtractAbiEventNames<TAbi>
: string,
> = TAbi extends Abi
? TEventName extends string
? {
args: GetEventArgs<
TAbi,
TEventName,
{
EnableUnion: false
IndexedOnly: false
Required: TStrict extends boolean ? TStrict : false
}
>
/** The event name decoded from `topics`. */
eventName: TEventName
/** List of order-dependent topics */
topics: GetTopics<TAbiEvent, TAbi, TEventName>
}
: {
[TName in _EventNames]: {
args: GetEventArgs<
TAbi,
TName,
{
EnableUnion: false
IndexedOnly: false
Required: TStrict extends boolean ? TStrict : false
}
>
/** The event name decoded from `topics`. */
eventName: TName
/** List of order-dependent topics */
topics: GetTopics<TAbiEvent, TAbi, TName>
}
}[_EventNames]
: {
topics: [Hex, ...Hex[]] | []
}