Skip to content

Commit

Permalink
feat: Check if originChain matches activeChain for fetching PSP22s
Browse files Browse the repository at this point in the history
  • Loading branch information
ical10 committed Nov 8, 2023
1 parent ea3f322 commit ef9702b
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 84 deletions.
163 changes: 84 additions & 79 deletions src/helpers/getPSP22Balances.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,57 +27,57 @@ export const PSP22_TOKEN_BALANCE_SUBSCRIPTION_INTERVAL = 60000
export const getPSP22Balances = async (
api: ApiPromise,
address: string | AccountId | undefined,
activeChain: string,
formatterOptions?: BalanceFormatterOptions,
): Promise<PSP22BalanceData[]> => {
const psp22ContractMap: Record<string, ContractPromise> = {}

Object.entries(allPSP22Assets).forEach(([slug, tokenInfo]) => {
psp22ContractMap[slug] = new ContractPromise(api, psp22Abi, tokenInfo.metadata?.contractAddress)
})

if (!address) {
const result = Object.values(allPSP22Assets).map(({ slug, decimals, symbol, iconPath }) => {
return {
tokenSlug: slug,
tokenDecimals: decimals,
tokenSymbol: symbol,
iconPath,
}
})

const result = Object.values(allPSP22Assets)
.filter(({ originChain }) => originChain === activeChain)
.map(({ slug, decimals, symbol, iconPath }) => {
return {
tokenSlug: slug,
tokenDecimals: decimals,
tokenSymbol: symbol,
iconPath,
}
})
return result
}

const result = await Promise.all(
Object.values(allPSP22Assets).map(async ({ slug, decimals, symbol, iconPath }) => {
let balance = new BN(0)

const contract = psp22ContractMap[slug]
const _balanceOf = await contract.query['psp22::balanceOf'](
address,
{ gasLimit: getMaxGasLimit(api) },
address,
)
const balanceObj = _balanceOf?.output?.toPrimitive() as Record<string, any>

balance = new BN(
_balanceOf.output ? (balanceObj.ok as string) || (balanceObj.Ok as string) : '0',
)

const data = {
tokenDecimals: decimals,
tokenSymbol: symbol,
balance,
}

const balanceFormatted = parsePSP22Balance(data, formatterOptions)
return {
balanceFormatted,
tokenSlug: slug,
iconPath,
...data,
}
}),
Object.values(allPSP22Assets)
.filter(({ originChain }) => originChain === activeChain)
.map(async ({ slug, decimals, symbol, iconPath }) => {
let balance = new BN(0)

const contract = psp22ContractMap[slug]
const _balanceOf = await contract.query['psp22::balanceOf'](
address,
{ gasLimit: getMaxGasLimit(api) },
address,
)
const balanceObj = _balanceOf?.output?.toPrimitive() as Record<string, any>

balance = new BN(
_balanceOf.output ? (balanceObj.ok as string) || (balanceObj.Ok as string) : '0',
)

const data = {
tokenDecimals: decimals,
tokenSymbol: symbol,
balance,
}

const balanceFormatted = parsePSP22Balance(data, formatterOptions)
return {
balanceFormatted,
tokenSlug: slug,
iconPath,
...data,
}
}),
)

return result
Expand All @@ -91,6 +91,7 @@ export const watchPSP22Balances = (
api: ApiPromise,
address: string | AccountId | undefined,
callback: (data: PSP22BalanceData[]) => void,
activeChain: string,
formatterOptions?: BalanceFormatterOptions,
): VoidFunction | null => {
const psp22ContractMap: Record<string, ContractPromise> = {}
Expand All @@ -100,14 +101,16 @@ export const watchPSP22Balances = (
})

if (!address) {
const result = Object.values(allPSP22Assets).map(({ slug, decimals, symbol, iconPath }) => {
return {
tokenSlug: slug,
tokenDecimals: decimals,
tokenSymbol: symbol,
iconPath,
}
})
const result = Object.values(allPSP22Assets)
.filter(({ originChain }) => originChain === activeChain)
.map(({ slug, decimals, symbol, iconPath }) => {
return {
tokenSlug: slug,
tokenDecimals: decimals,
tokenSymbol: symbol,
iconPath,
}
})
callback(result)
return null
}
Expand All @@ -116,35 +119,37 @@ export const watchPSP22Balances = (
const fetchTokenBalances = async () =>
callback(
await Promise.all(
Object.values(allPSP22Assets).map(async ({ slug, decimals, symbol, iconPath }) => {
let balance = new BN(0)

const contract = psp22ContractMap[slug]
const _balanceOf = await contract.query['psp22::balanceOf'](
address,
{ gasLimit: getMaxGasLimit(api) },
address,
)
const balanceObj = _balanceOf?.output?.toPrimitive() as Record<string, any>

balance = new BN(
_balanceOf.output ? (balanceObj.ok as string) || (balanceObj.Ok as string) : '0',
)

const data = {
tokenDecimals: decimals,
tokenSymbol: symbol,
balance,
}

const balanceFormatted = parsePSP22Balance(data, formatterOptions)
return {
balanceFormatted,
tokenSlug: slug,
iconPath,
...data,
}
}),
Object.values(allPSP22Assets)
.filter(({ originChain }) => originChain === activeChain)
.map(async ({ slug, decimals, symbol, iconPath }) => {
let balance = new BN(0)

const contract = psp22ContractMap[slug]
const _balanceOf = await contract.query['psp22::balanceOf'](
address,
{ gasLimit: getMaxGasLimit(api) },
address,
)
const balanceObj = _balanceOf?.output?.toPrimitive() as Record<string, any>

balance = new BN(
_balanceOf.output ? (balanceObj.ok as string) || (balanceObj.Ok as string) : '0',
)

const data = {
tokenDecimals: decimals,
tokenSymbol: symbol,
balance,
}

const balanceFormatted = parsePSP22Balance(data, formatterOptions)
return {
balanceFormatted,
tokenSlug: slug,
iconPath,
...data,
}
}),
),
)

Expand Down
16 changes: 11 additions & 5 deletions src/hooks/usePSP22Balances.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export const usePSP22Balances = (
watch?: boolean,
formatterOptions?: BalanceFormatterOptions,
): PSP22BalanceData[] => {
const { api } = useInkathon()
const { api, activeChain } = useInkathon()
const [balanceData, setBalanceData] = useState<PSP22BalanceData[]>(
[] satisfies PSP22BalanceData[],
)
Expand All @@ -27,23 +27,29 @@ export const usePSP22Balances = (
setBalanceData(() => data)
}

if (!api) {
if (!api || !activeChain) {
setBalanceData([] as PSP22BalanceData[])
return
}

if (watch) {
const unsubscribe = watchPSP22Balances(api, address, updateBalanceData, formatterOptions)
const unsubscribe = watchPSP22Balances(
api,
address,
updateBalanceData,
activeChain.network,
formatterOptions,
)
unsubscribe && setUnsubscribes((prev) => [...prev, unsubscribe])
} else {
getPSP22Balances(api, address, formatterOptions).then(updateBalanceData)
getPSP22Balances(api, address, activeChain.network, formatterOptions).then(updateBalanceData)
}

return () => {
unsubscribes.forEach((unsubscribe) => unsubscribe?.())
setUnsubscribes(() => [])
}
}, [api, address])
}, [api, address, activeChain])

return balanceData
}

0 comments on commit ef9702b

Please sign in to comment.