Skip to content

Commit ce7904a

Browse files
authored
fix: use algod for application results and fallback to indexer (#61)
* chore: fix AssetResult imports * fix: use algod for application results and fallback to indexer
1 parent 3b750d0 commit ce7904a

File tree

13 files changed

+41
-31
lines changed

13 files changed

+41
-31
lines changed

src/features/accounts/data/types.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import { ApplicationResult } from '@/features/applications/data/types'
12
import { NoStringIndex } from '@/features/common/data/types'
23
import {
3-
ApplicationResult as IndexerApplicationResult,
44
AssetHolding as IndexerAssetHolding,
55
AssetResult as IndexerAssetResult,
66
AppLocalState as IndexerAppLocalState,
@@ -12,7 +12,6 @@ export type Address = string
1212

1313
export type AppLocalState = Omit<IndexerAppLocalState, 'closed-out-at-round' | 'deleted' | 'opted-in-at-round'>
1414
export type AssetHoldingResult = Omit<IndexerAssetHolding, 'deleted' | 'opted-in-at-round' | 'opted-out-at-round'>
15-
export type ApplicationResult = Omit<IndexerApplicationResult, 'created-at-round' | 'deleted' | 'deleted-at-round'>
1615
export type AssetResult = {
1716
index: number
1817
params: IndexerAssetResult['params']

src/features/applications/data/application-metadata.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { ApplicationResult } from '@/features/accounts/data/types'
21
import { atomsInAtom } from '@/features/common/data/atoms-in-atom'
3-
import { ApplicationMetadataResult } from './types'
2+
import { ApplicationMetadataResult, ApplicationResult } from './types'
43
import { indexer } from '@/features/common/data'
54
import { flattenTransactionResult } from '@/features/transactions/utils/flatten-transaction-result'
65
import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer'
Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
1-
import { indexer } from '@/features/common/data'
2-
import { ApplicationLookupResult } from '@algorandfoundation/algokit-utils/types/indexer'
3-
import { ApplicationId } from './types'
1+
import { algod, indexer } from '@/features/common/data'
2+
import { ApplicationId, ApplicationResult } from './types'
43
import { atomsInAtom } from '@/features/common/data/atoms-in-atom'
4+
import { asError, is404 } from '@/utils/error'
55

6-
const getApplicationResult = (applicationId: ApplicationId) =>
7-
indexer
8-
.lookupApplications(applicationId)
9-
.includeAll(true)
10-
.do()
11-
.then((result) => {
12-
return (result as ApplicationLookupResult).application
13-
})
6+
const getApplicationResult = async (applicationId: ApplicationId) => {
7+
try {
8+
// Check algod first, as there can be some syncing delays to indexer
9+
return await algod
10+
.getApplicationByID(applicationId)
11+
.do()
12+
.then((result) => result as ApplicationResult)
13+
} catch (e: unknown) {
14+
if (is404(asError(e))) {
15+
// Handle deleted applications or applications that may not be available in algod potentially due to the node type
16+
return await indexer
17+
.lookupApplications(applicationId)
18+
.includeAll(true)
19+
.do()
20+
.then((result) => result.application as ApplicationResult)
21+
}
22+
throw e
23+
}
24+
}
1425

1526
export const [applicationResultsAtom, getApplicationResultAtom] = atomsInAtom(getApplicationResult, (applicationId) => applicationId)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import { ApplicationResult as IndexerApplicationResult } from '@algorandfoundation/algokit-utils/types/indexer'
2+
13
export type ApplicationId = number
24

35
export type ApplicationMetadataResult = {
46
name: string
57
} | null
8+
9+
export type ApplicationResult = Omit<IndexerApplicationResult, 'created-at-round' | 'deleted-at-round'>

src/features/applications/mappers/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { Application, ApplicationGlobalStateType, ApplicationGlobalStateValue, ApplicationSummary } from '../models'
2-
import { ApplicationResult } from '@algorandfoundation/algokit-utils/types/indexer'
32
import { getApplicationAddress, modelsv2, encodeAddress } from 'algosdk'
43
import isUtf8 from 'isutf8'
54
import { Buffer } from 'buffer'
6-
import { ApplicationMetadataResult } from '../data/types'
5+
import { ApplicationMetadataResult, ApplicationResult } from '../data/types'
76
import { asJson } from '@/utils/as-json'
87

98
export const asApplicationSummary = (application: ApplicationResult): ApplicationSummary => {

src/features/applications/pages/application-page.test.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
applicationInvalidIdMessage,
99
applicationNotFoundMessage,
1010
} from './application-page'
11-
import { indexer } from '@/features/common/data'
11+
import { algod, indexer } from '@/features/common/data'
1212
import { HttpError } from '@/tests/errors'
1313
import { applicationResultMother } from '@/tests/object-mother/application-result'
1414
import { atom, createStore } from 'jotai'
@@ -48,6 +48,7 @@ describe('application-page', () => {
4848
describe('when rendering an application with application Id that does not exist', () => {
4949
it('should display not found message', () => {
5050
vi.mocked(useParams).mockImplementation(() => ({ applicationId: '123456' }))
51+
vi.mocked(algod.getApplicationByID(0).do).mockImplementation(() => Promise.reject(new HttpError('boom', 404)))
5152
vi.mocked(indexer.lookupApplications(0).includeAll(true).do).mockImplementation(() => Promise.reject(new HttpError('boom', 404)))
5253

5354
return executeComponentTest(

src/features/assets/data/asset-metadata.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { AssetResult, TransactionResult, TransactionSearchResults } from '@algorandfoundation/algokit-utils/types/indexer'
1+
import { TransactionResult, TransactionSearchResults } from '@algorandfoundation/algokit-utils/types/indexer'
22
import { indexer } from '@/features/common/data'
33
import { flattenTransactionResult } from '@/features/transactions/utils/flatten-transaction-result'
44
import { TransactionType } from 'algosdk'
5-
import { Arc3MetadataResult, Arc69MetadataResult, AssetMetadataResult, AssetMetadataStandard } from './types'
5+
import { Arc3MetadataResult, Arc69MetadataResult, AssetMetadataResult, AssetMetadataStandard, AssetResult } from './types'
66
import { getArc19Url, isArc19Url } from '../utils/arc19'
77
import { getArc3Url, isArc3Url } from '../utils/arc3'
88
import { base64ToUtf8 } from '@/utils/base64-to-utf8'

src/features/assets/data/types.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import { AssetParams } from '@algorandfoundation/algokit-utils/types/indexer'
1+
import { AssetResult as IndexerAssetResult } from '@algorandfoundation/algokit-utils/types/indexer'
22

33
export type AssetId = number
44

5-
export type AssetResult = {
6-
index: AssetId
7-
params: AssetParams
8-
}
5+
export type AssetResult = Omit<IndexerAssetResult, 'created-at-round' | 'destroyed-at-round'>
96

107
type Arc16MetadataProperties = {
118
traits?: Record<string, unknown>

src/features/assets/mappers/asset-summary.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AssetResult } from '@algorandfoundation/algokit-utils/types/indexer'
1+
import { AssetResult } from '../data/types'
22
import { AssetSummary } from '../models'
33

44
export const asAssetSummary = (assetResult: AssetResult): AssetSummary => {

src/features/assets/mappers/asset.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { AssetResult } from '@algorandfoundation/algokit-utils/types/indexer'
21
import { asAssetSummary } from './asset-summary'
32
import { Asset, AssetMediaType, AssetStandard, AssetType } from '../models'
4-
import { AssetId, AssetMetadataResult, AssetMetadataStandard } from '../data/types'
3+
import { AssetId, AssetMetadataResult, AssetMetadataStandard, AssetResult } from '../data/types'
54
import { getArc3Url, isArc3Url } from '../utils/arc3'
65
import { replaceIpfsWithGatewayIfNeeded } from '../utils/replace-ipfs-with-gateway-if-needed'
76
import Decimal from 'decimal.js'

0 commit comments

Comments
 (0)