Skip to content

Commit ab6d92f

Browse files
committed
Add 8004.scan navigation link
1 parent 0d85f61 commit ab6d92f

5 files changed

Lines changed: 44 additions & 10 deletions

File tree

src/constants/rofl-8004.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@ export const ROFL_8004_SUPPORTED_CHAINS = {
1717
}
1818

1919
export const ERC_8004_ETHEREUM_EIP_URL = 'https://eips.ethereum.org/EIPS/eip-8004'
20+
export const get8004ScanUrl = (chainName: string, agentId: string) =>
21+
`https://www.8004scan.io/${chainName}/agent/${agentId}`

src/pages/Dashboard/AppDetails/AppERC8004.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,24 @@ import axios from 'axios'
44
import { Skeleton } from '@oasisprotocol/ui-library/src/components/ui/skeleton'
55
import { RoflInstance } from '../../../nexus/generated/api.ts'
66
import { useERC8004TokenURI } from '../../../hooks/useERC8004TokenURI.ts'
7-
import { fromMetadataToAgentId, tokenURIToLink } from '../../../utils/rofl-8004.ts'
7+
import { fromMetadataToAgentMetadata, tokenURIToLink } from '../../../utils/rofl-8004.ts'
88
import { CodeDisplay } from '../../../components/CodeDisplay'
99

1010
type Props = {
11-
roflInstances: RoflInstance[]
11+
instancesWithERC8004Token: RoflInstance[]
1212
}
1313

14-
export const AppERC8004: FC<Props> = ({ roflInstances }) => {
15-
const [instance] = roflInstances
16-
const [chainId, tokenId] = fromMetadataToAgentId(instance.metadata)
14+
export const AppERC8004: FC<Props> = ({ instancesWithERC8004Token }) => {
15+
const [instance] = instancesWithERC8004Token
16+
const agentMetadata = fromMetadataToAgentMetadata(instance.metadata)
17+
const agentChainId = agentMetadata?.chainId
18+
const agentTokenId = agentMetadata?.agentId
19+
1720
const {
1821
isLoading: isLoadingTokenURI,
1922
data: tokenURI,
2023
error: tokenURIError,
21-
} = useERC8004TokenURI(chainId!, tokenId!, !!chainId && !!tokenId)
24+
} = useERC8004TokenURI(agentChainId!, agentTokenId!, !!agentChainId && !!agentTokenId)
2225

2326
const {
2427
data: metadata,

src/pages/Dashboard/AppDetails/AppMetadata.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
useGetRuntimeRoflAppsIdTransactions,
66
useGetRuntimeRoflmarketInstances,
77
type RoflAppPolicy,
8+
RoflInstance,
89
} from '../../../nexus/api'
910
import { useNetwork } from '../../../hooks/useNetwork'
1011
import { isUrlSafe } from '../../../utils/url'
@@ -25,6 +26,8 @@ import { cn } from '@oasisprotocol/ui-library/src/lib/utils'
2526
import { useAccount } from 'wagmi'
2627
import { getEvmBech32Address } from '../../../utils/helpers'
2728
import { useRoflAppDomains } from '../../../backend/useRoflAppDomains'
29+
import { fromMetadataToAgentMetadata } from '../../../utils/rofl-8004.ts'
30+
import { get8004ScanUrl } from '../../../constants/rofl-8004.ts'
2831

2932
type AppMetadataProps = {
3033
id: string
@@ -33,6 +36,7 @@ type AppMetadataProps = {
3336
policy: RoflAppPolicy
3437
setViewMetadataState: (state: ViewMetadataState) => void
3538
editEnabled?: boolean
39+
instancesWithERC8004Token: RoflInstance[]
3640
}
3741

3842
export const AppMetadata: FC<AppMetadataProps> = ({
@@ -42,6 +46,7 @@ export const AppMetadata: FC<AppMetadataProps> = ({
4246
policy,
4347
setViewMetadataState,
4448
editEnabled,
49+
instancesWithERC8004Token,
4550
}) => {
4651
const network = useNetwork()
4752
const { data } = useGetRuntimeRoflAppsIdTransactions(network, 'sapphire', id, {
@@ -64,6 +69,11 @@ export const AppMetadata: FC<AppMetadataProps> = ({
6469

6570
const appDomains = useRoflAppDomains(network, id)
6671

72+
const [instance] = instancesWithERC8004Token
73+
const agentMetadata = fromMetadataToAgentMetadata(instance.metadata)
74+
const agentChainName = agentMetadata?.chainName
75+
const agentTokenId = agentMetadata?.agentId
76+
6777
return (
6878
<div className="space-y-4">
6979
{isMachineLoading && <Skeleton className="w-full h-60px]" />}
@@ -188,6 +198,18 @@ export const AppMetadata: FC<AppMetadataProps> = ({
188198
))}
189199
</div>
190200
</DetailsSectionRow>
201+
{agentChainName && agentTokenId && (
202+
<DetailsSectionRow label="ERC-8004 agent registration">
203+
<a
204+
href={get8004ScanUrl(agentChainName, agentTokenId.toString())}
205+
target="_blank"
206+
rel="noopener noreferrer"
207+
className="text-primary"
208+
>
209+
{get8004ScanUrl(agentChainName, agentTokenId.toString())}
210+
</a>
211+
</DetailsSectionRow>
212+
)}
191213
<div className="text-xl font-bold">Policy</div>
192214
<DetailsSectionRow label="Who can run this app">
193215
<Endorsements endorsements={policy.endorsements} />

src/pages/Dashboard/AppDetails/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ export const AppDetails: FC = () => {
195195
policy={roflApp.policy}
196196
setViewMetadataState={setViewMetadataState}
197197
editEnabled={editEnabled}
198+
instancesWithERC8004Token={instancesWithERC8004Token}
198199
/>
199200
</TabsContent>
200201
<TabsContent value="secrets" className="relative pt-10">
@@ -220,7 +221,7 @@ export const AppDetails: FC = () => {
220221
</TabsContent>
221222
{hasInstancesWithERC8004Token && (
222223
<TabsContent value="erc-8004">
223-
<AppERC8004 roflInstances={instancesWithERC8004Token} />
224+
<AppERC8004 instancesWithERC8004Token={instancesWithERC8004Token} />
224225
</TabsContent>
225226
)}
226227
</Tabs>

src/utils/rofl-8004.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import { AppData, ERC8004FormData } from '../pages/CreateApp/types.ts'
1010
import * as yaml from 'yaml'
1111
import { parse } from 'yaml'
1212

13-
export const fromMetadataToAgentId = (metadata: RoflInstance['metadata']): [number | null, bigint | null] => {
13+
export const fromMetadataToAgentMetadata = (
14+
metadata: RoflInstance['metadata'],
15+
): { chainId: number | null; agentId: bigint | null; chainName: string | null } | null => {
1416
const agentId = metadata?.[ROFL_8004_METADATA_KEY] as string
1517
const splitAgentId = agentId?.split(':')
1618
const chainId = Number(splitAgentId[0])
@@ -20,10 +22,14 @@ export const fromMetadataToAgentId = (metadata: RoflInstance['metadata']): [numb
2022
`Invalid chainId: ${chainId}. Expected: ${Object.keys(ROFL_8004_SUPPORTED_CHAINS).join(',')}`,
2123
)
2224
// Silently fail
23-
return [null, null]
25+
return null
2426
}
2527

26-
return [chainId, BigInt(splitAgentId[1])]
28+
return {
29+
chainId,
30+
chainName: ROFL_8004_SUPPORTED_CHAINS[chainId.toString()].chain.name.toLowerCase(),
31+
agentId: BigInt(splitAgentId[1]),
32+
}
2733
}
2834

2935
export const tokenURIToLink = (tokenURI: string) => tokenURI.replace('ipfs://', 'https://ipfs.io/ipfs/')

0 commit comments

Comments
 (0)