31 lines
1.2 KiB
TypeScript
31 lines
1.2 KiB
TypeScript
import { getObservableClient } from "@polkadot-api/observable-client"
|
|
import { createClient } from "@polkadot-api/substrate-client"
|
|
import { decAnyMetadata, unifyMetadata } from "@polkadot-api/substrate-bindings"
|
|
import { helper } from "@substrate/light-client-extension-helpers/extension-page"
|
|
|
|
import { getLookupFn } from "@polkadot-api/metadata-builders"
|
|
import { getViewBuilder } from "@polkadot-api/view-builder"
|
|
|
|
export const decodeCallData = async (chainId: string, callData: string) => {
|
|
const chains = await helper.getChains()
|
|
const chain = chains.find(({ genesisHash }) => genesisHash === chainId)
|
|
if (!chain) throw new Error("unknown chain")
|
|
const client = createClient(chain.provider)
|
|
try {
|
|
const metadata = await new Promise<string>((resolve, reject) =>
|
|
client._request("state_getMetadata", [], {
|
|
onSuccess: (result) => resolve(result as string),
|
|
onError: reject,
|
|
}),
|
|
)
|
|
.catch(_ => undefined)
|
|
|
|
if (!metadata) return undefined
|
|
|
|
const convertedMetadata = unifyMetadata(decAnyMetadata(metadata))
|
|
return getViewBuilder(getLookupFn(convertedMetadata)).callDecoder(callData)
|
|
} catch {
|
|
return undefined
|
|
}
|
|
}
|