2024-04-14 17:34:29 +08:00

103 lines
2.7 KiB
TypeScript

import { timeoutFetch } from 'zutils/utils/net.util'
import { retry } from 'zutils/utils/promise.util'
const DEFAULT_TIMEOUT = 30000
const request = async (url: string, options: any) => {
options.timeout = options.timeout || DEFAULT_TIMEOUT
return timeoutFetch(url, options, options.timeout)
}
const requestChain = async (rpc: string, method: string, params: any) => {
const data = {
id: Date.now(),
jsonrpc: '2.0',
method,
params,
}
return request(rpc, {
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8',
},
body: JSON.stringify(data),
}).then(res => res.json())
}
export const ethBlockNumber = async (rpc: string) => {
return requestChain(rpc, 'eth_blockNumber', [])
}
export const retryEthBlockNumber = async (rpc: string) => {
const res = await retry(() => ethBlockNumber(rpc), { maxRetries: 3, whitelistErrors: [] })
if (res.error) {
throw new Error(res.error.message)
}
return res
}
export const retryEthGetBlockByNumber = async (rpc: string, blockNumber: string, all = true) => {
const res = await retry(() => ethGetBlockByNumber(rpc, blockNumber, all), { maxRetries: 3, whitelistErrors: [] })
if (res.error) {
throw new Error(res.error.message)
}
return res
}
export const ethGetBlockByNumber = async (rpc: string, blockNumber: string, all = true) => {
return requestChain(rpc, 'eth_getBlockByNumber', [blockNumber, all])
}
export const ethGetLogs = async (rpc: string, params: any) => {
return requestChain(rpc, 'eth_getLogs', params)
}
export const _batchEthBlocks = async (rpc: string, blockNumber: number, amount: number) => {
let batch = []
for (let i = 0; i < amount; i++) {
batch.push({
jsonrpc: '2.0',
method: 'eth_getBlockByNumber',
params: ['0x' + (blockNumber + i).toString(16), true],
id: blockNumber + i,
})
}
return request(rpc, {
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8',
},
body: JSON.stringify(batch),
}).then(res => res.json())
}
export const batchEthBlocks = async (rpc: string, blockNumbers: number[]) => {
let batch = []
for (let blockNum of blockNumbers) {
batch.push({
jsonrpc: '2.0',
method: 'eth_getBlockByNumber',
params: ['0x' + blockNum.toString(16), true],
id: blockNum,
})
}
return request(rpc, {
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8',
},
body: JSON.stringify(batch),
}).then(res => res.json())
}
export const batchEthLogs = async (rpc: string, params: any) => {
return request(rpc, {
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8',
},
body: JSON.stringify(params),
}).then(res => res.json())
}