-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathabi-store.ts
More file actions
52 lines (47 loc) · 1.43 KB
/
abi-store.ts
File metadata and controls
52 lines (47 loc) · 1.43 KB
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
import { ContractABI, AbiStore } from '../effect.js'
import { Effect, Layer } from 'effect'
const abiCache = new Map<string, ContractABI>()
export const make = (strategies: AbiStore['strategies']) =>
Layer.succeed(
AbiStore,
AbiStore.of({
strategies,
set: (_key, value) =>
Effect.sync(() => {
if (value.status === 'success') {
if (value.result.type === 'address') {
abiCache.set(value.result.address, value.result)
} else if (value.result.type === 'event') {
abiCache.set(value.result.event, value.result)
} else if (value.result.type === 'func') {
abiCache.set(value.result.signature, value.result)
}
}
}),
get: (key) =>
Effect.sync(() => {
if (abiCache.has(key.address)) {
return {
status: 'success',
result: abiCache.get(key.address)!,
}
}
if (key.event && abiCache.has(key.event)) {
return {
status: 'success',
result: abiCache.get(key.event)!,
}
}
if (key.signature && abiCache.has(key.signature)) {
return {
status: 'success',
result: abiCache.get(key.signature)!,
}
}
return {
status: 'empty',
result: null,
}
}),
}),
)