/
module.ts
125 lines (105 loc) · 2.86 KB
/
module.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
import {
type Address,
type Hex,
decodeAbiParameters,
encodeAbiParameters,
isAddressEqual,
} from 'viem'
import { type MintOrLinkModule, type MintOrLinkModuleConfig } from '../types'
import { NIL_ADDRESS } from './address'
let moduleResponseCache: MintOrLinkModule[] | undefined = undefined
let lastModuleResponseCacheTime = 0
export async function getModules<T extends MintOrLinkModule['type']>({
type,
}: { type?: T } = {}): Promise<MintOrLinkModule<T>[]> {
const now = Date.now()
const isMoreThanOneMinute = now - lastModuleResponseCacheTime > 60 * 1000
let res: MintOrLinkModule<T>[] = []
if (!moduleResponseCache || isMoreThanOneMinute) {
res = (await fetch(
'https://raw.githubusercontent.com/Crossbell-Box/Crossbell-Contracts/main/deployments/modules.json',
).then((res) => res.json())) as MintOrLinkModule<T>[]
moduleResponseCache = res
lastModuleResponseCacheTime = now
} else {
res = moduleResponseCache as MintOrLinkModule<T>[]
}
if (type) {
return res.filter((module) => module.type === type)
}
return res
}
export async function getModule(address: Address) {
const modules = await getModules()
return modules.find((module) => isAddressEqual(module.address, address))
}
export function getLinkModules() {
return getModules({ type: 'link' })
}
export async function getLinkModule(address: Address) {
const modules = await getLinkModules()
return modules.find(
(module) =>
isAddressEqual(module.address, address) && module.type === 'link',
)
}
export function getMintModules() {
return getModules({ type: 'mint' })
}
export async function getMintModule(address: Address) {
const modules = await getMintModules()
return modules.find(
(module) =>
isAddressEqual(module.address, address) && module.type === 'mint',
)
}
export async function getModuleConfig(m?: MintOrLinkModuleConfig) {
if (!m) {
return {
address: NIL_ADDRESS,
initData: NIL_ADDRESS,
}
}
const module = await getModule(m.address)
if (!module) {
throw new Error(`Invalid module address ${m.address}`)
}
const initData = encodeAbiParameters(
module.initDataStructure.map((item) => ({
type: item.type,
})),
m.data,
)
return {
address: m.address,
initData,
}
}
export async function encodeModuleInitData(
moduleAddress: Address,
data: any[],
) {
const module = await getModule(moduleAddress)
if (!module) {
throw new Error(`Invalid module address ${moduleAddress}`)
}
const result = encodeAbiParameters(
module.initDataStructure.map((item) => ({ type: item.type })),
data,
)
return result
}
export async function decodeModuleInitData(
moduleAddress: Address,
initData: Hex,
) {
const module = await getModule(moduleAddress)
if (!module) {
throw new Error(`Invalid module address ${moduleAddress}`)
}
const result = decodeAbiParameters(
module.initDataStructure.map((item) => ({ type: item.type })),
initData,
)
return result
}