diff --git a/apps/maestro/package.json b/apps/maestro/package.json index 98ea71fda..8dd932cbd 100644 --- a/apps/maestro/package.json +++ b/apps/maestro/package.json @@ -34,7 +34,7 @@ "release": "tsx scripts/release.ts" }, "dependencies": { - "@axelar-network/axelarjs-sdk": "0.15.0", + "@axelar-network/axelarjs-sdk": "0.17.1-alpha.12", "@axelarjs/api": "workspace:*", "@axelarjs/core": "workspace:*", "@axelarjs/evm": "workspace:*", diff --git a/apps/maestro/src/config/evm-chains.ts b/apps/maestro/src/config/evm-chains.ts index 1bf6f803c..e082aa99b 100644 --- a/apps/maestro/src/config/evm-chains.ts +++ b/apps/maestro/src/config/evm-chains.ts @@ -80,6 +80,10 @@ export const ALL_CHAINS: ExtendedWagmiChainConfig[] = [ }, { ...sepolia, + rpcUrls: { + default: { http: ["https://endpoints.omniatech.io/v1/eth/sepolia/public", "https://1rpc.io/sepolia"] }, // Temporarily using this url + public: { http: ["https://endpoints.omniatech.io/v1/eth/sepolia/public", "https://1rpc.io/sepolia"] }, + }, axelarChainId: "ethereum-sepolia", axelarChainName: "ethereum-sepolia", environment: ENVIRONMENTS.testnet, diff --git a/apps/maestro/src/features/CanonicalTokenDeployment/hooks/useDeployAndRegisterRemoteCanonicalTokenMutation.ts b/apps/maestro/src/features/CanonicalTokenDeployment/hooks/useDeployAndRegisterRemoteCanonicalTokenMutation.ts index d379a4491..d4a73996c 100644 --- a/apps/maestro/src/features/CanonicalTokenDeployment/hooks/useDeployAndRegisterRemoteCanonicalTokenMutation.ts +++ b/apps/maestro/src/features/CanonicalTokenDeployment/hooks/useDeployAndRegisterRemoteCanonicalTokenMutation.ts @@ -18,7 +18,7 @@ import { import { trpc } from "~/lib/trpc"; import { isValidEVMAddress } from "~/lib/utils/validation"; import { RecordInterchainTokenDeploymentInput } from "~/server/routers/interchainToken/recordInterchainTokenDeployment"; -import { useEVMChainConfigsQuery } from "~/services/axelarscan/hooks"; +import { useAllChainConfigsQuery } from "~/services/axelarscan/hooks"; import type { DeployAndRegisterTransactionState } from "../CanonicalTokenDeployment.state"; export interface UseDeployAndRegisterCanonicalTokenInput { @@ -43,7 +43,7 @@ export function useDeployAndRegisterRemoteCanonicalTokenMutation( const { address: deployerAddress } = useAccount(); const chainId = useChainId(); - const { computed } = useEVMChainConfigsQuery(); + const { combinedComputed } = useAllChainConfigsQuery(); const { mutateAsync: recordDeploymentAsync } = trpc.interchainToken.recordInterchainTokenDeployment.useMutation(); @@ -64,7 +64,7 @@ export function useDeployAndRegisterRemoteCanonicalTokenMutation( }); const { originalChainName, destinationChainNames } = useMemo(() => { - const index = computed.indexedById; + const index = combinedComputed.indexedById; const originalChainName = index[input?.sourceChainId ?? chainId]?.chain_name ?? "Unknown"; @@ -80,7 +80,7 @@ export function useDeployAndRegisterRemoteCanonicalTokenMutation( }; }, [ chainId, - computed.indexedById, + combinedComputed.indexedById, input?.destinationChainIds, input?.sourceChainId, ]); diff --git a/apps/maestro/src/features/CanonicalTokenDeployment/steps/deploy-and-register/DeployAndRegister.state.ts b/apps/maestro/src/features/CanonicalTokenDeployment/steps/deploy-and-register/DeployAndRegister.state.ts index 672431463..0524726c8 100644 --- a/apps/maestro/src/features/CanonicalTokenDeployment/steps/deploy-and-register/DeployAndRegister.state.ts +++ b/apps/maestro/src/features/CanonicalTokenDeployment/steps/deploy-and-register/DeployAndRegister.state.ts @@ -1,4 +1,4 @@ -import type { EVMChainConfig } from "@axelarjs/api/axelarscan"; +import type { EVMChainConfig, VMChainConfig } from "@axelarjs/api/axelarscan"; import { useEffect, useState } from "react"; import { formatEther } from "viem"; @@ -9,7 +9,7 @@ import { NEXT_PUBLIC_INTERCHAIN_DEPLOYMENT_GAS_LIMIT, } from "~/config/env"; import { useEstimateGasFeeMultipleChainsQuery } from "~/services/axelarjsSDK/hooks"; -import { useEVMChainConfigsQuery } from "~/services/axelarscan/hooks"; +import { useAllChainConfigsQuery } from "~/services/axelarscan/hooks"; import { useCanonicalTokenDeploymentStateContainer } from "../../CanonicalTokenDeployment.state"; export type UseStep3ChainSelectionStateProps = { @@ -17,13 +17,16 @@ export type UseStep3ChainSelectionStateProps = { }; export function useStep3ChainSelectionState() { - const { data: evmChains } = useEVMChainConfigsQuery(); + const { allChains } = useAllChainConfigsQuery(); const chainId = useChainId(); const [isDeploying, setIsDeploying] = useState(false); const [totalGasFee, $setTotalGasFee] = useState(formatEther(0n)); - const [sourceChainId, setSourceChainId] = useState( - evmChains?.find((evmChain: EVMChainConfig) => evmChain.chain_id === chainId) - ?.id as string + + // Find source chain from both EVM and VM chains + const currentChain = allChains?.find((chain: EVMChainConfig | VMChainConfig) => chain.chain_id === chainId); + + const [sourceChainId, setSourceChainId] = useState( + currentChain?.id || "" ); const { state: rootState } = useCanonicalTokenDeploymentStateContainer(); @@ -58,20 +61,17 @@ export function useStep3ChainSelectionState() { }; useEffect(() => { - const candidateChain = evmChains?.find( - (evmChain) => evmChain.chain_id === chainId - ); - if (!candidateChain || candidateChain.chain_name === sourceChainId) return; + if (!currentChain || currentChain.chain_name === sourceChainId) return; - setSourceChainId(candidateChain.chain_name); - }, [evmChains, chainId, sourceChainId]); + setSourceChainId(currentChain.chain_name); + }, [currentChain, chainId, sourceChainId]); return { state: { isDeploying, totalGasFee, sourceChainId, - evmChains, + allChains, isEstimatingGasFees: isRemoteDeploymentGasFeeLoading, hasGasFeesEstimationError: isRemoteDeploymentGasFeeError, remoteDeploymentGasFees, diff --git a/apps/maestro/src/features/CanonicalTokenDeployment/steps/deploy-and-register/DeployAndRegister.tsx b/apps/maestro/src/features/CanonicalTokenDeployment/steps/deploy-and-register/DeployAndRegister.tsx index 8b311167b..2ce3b318f 100644 --- a/apps/maestro/src/features/CanonicalTokenDeployment/steps/deploy-and-register/DeployAndRegister.tsx +++ b/apps/maestro/src/features/CanonicalTokenDeployment/steps/deploy-and-register/DeployAndRegister.tsx @@ -30,9 +30,10 @@ export const Step3: FC = () => { const chainId = useChainId(); - const sourceChain = state.evmChains.find((x) => x.chain_id === chainId); + // Support both EVM and VM chains + const sourceChain = state.allChains?.find((chain) => chain.chain_id === chainId); - const [validDestinationChainIds, erroredDestinationChainIds] = useMemo( + const [validDestinationChainIds, erroredDestinationChainIds] = useMemo( () => (state.remoteDeploymentGasFees?.gasFees ?? []).reduce( ([succeeded, errored], x): [string[], string[]] => @@ -135,19 +136,19 @@ export const Step3: FC = () => { addTransaction, ] ); - - const eligibleChains = useMemo( - () => state.evmChains?.filter((chain) => chain.chain_id !== chainId), - [state.evmChains, chainId] - ); - + const eligibleChains = state.allChains.filter(chain => chain.chain_id !== chainId); const formSubmitRef = useRef>(null); const { address } = useAccount(); const { data: balance } = useBalance({ address }); - const nativeTokenSymbol = getNativeToken(state.sourceChainId); + const nativeTokenSymbol = useMemo(() => { + if (sourceChain?.chain_type === 'vm') { + return sourceChain.native_token.symbol; + } + return getNativeToken(state.sourceChainId); + }, [sourceChain, state.sourceChainId]); const hasInsufficientGasBalance = useMemo(() => { if (!balance || !state.remoteDeploymentGasFees) { diff --git a/apps/maestro/src/features/CanonicalTokenDeployment/steps/review/Review.tsx b/apps/maestro/src/features/CanonicalTokenDeployment/steps/review/Review.tsx index 6976b49e3..49d91d610 100644 --- a/apps/maestro/src/features/CanonicalTokenDeployment/steps/review/Review.tsx +++ b/apps/maestro/src/features/CanonicalTokenDeployment/steps/review/Review.tsx @@ -6,14 +6,13 @@ import { ExternalLinkIcon, LinkButton, } from "@axelarjs/ui"; -import { maskAddress, Maybe } from "@axelarjs/utils"; -import { useCallback, useEffect, useState, type FC } from "react"; +import { maskAddress } from "@axelarjs/utils"; +import { useCallback, useEffect, useState, useMemo, type FC } from "react"; import { useRouter } from "next/router"; - import { useAccount } from "wagmi"; import { useChainFromRoute } from "~/lib/hooks"; -import { useEVMChainConfigsQuery } from "~/services/axelarscan/hooks"; +import { useAllChainConfigsQuery } from "~/services/axelarscan/hooks"; import { useInterchainTokensQuery } from "~/services/gmp/hooks"; import GMPTxStatusMonitor from "~/ui/compounds/GMPTxStatusMonitor"; import { ShareHaikuButton } from "~/ui/compounds/MultiStepForm"; @@ -26,7 +25,7 @@ const Review: FC = () => { const { chain } = useAccount(); const routeChain = useChainFromRoute(); - const { computed } = useEVMChainConfigsQuery(); + const { combinedComputed } = useAllChainConfigsQuery(); const [shouldFetch, setShouldFetch] = useState(false); @@ -47,26 +46,28 @@ const Review: FC = () => { chain.id, state.txState.txHash, state.selectedChains.map( - (axelarChainId) => computed.indexedById[axelarChainId].chain_id + (axelarChainId) => combinedComputed.indexedById[axelarChainId].chain_id ) ); } - }, [chain, computed.indexedById, state.selectedChains, state.txState]); + }, [chain, combinedComputed.indexedById, state.selectedChains, state.txState]); - const chainConfig = Maybe.of(chain).mapOrUndefined( - (chain) => computed.indexedByChainId[chain.id] - ); + const chainConfig = useMemo(() => { + if (!chain) return undefined; + return combinedComputed.indexedByChainId[chain.id]; + }, [chain, combinedComputed.indexedByChainId]); const handleGoToTokenPage = useCallback(async () => { if (chainConfig && state.txState.type === "deployed") { actions.reset(); - await router.push( `/${chainConfig.chain_name.toLowerCase()}/${state.txState.tokenAddress}` ); } }, [actions, chainConfig, router, state.txState]); + const isVMChain = chainConfig?.chain_type === 'vm'; + return ( <>
@@ -105,32 +106,32 @@ const Review: FC = () => { {state.selectedChains.length > 0 ? ( ) : ( - - View transaction{" "} - - {maskAddress(state.txState.txHash ?? "")} - {" "} - on {chain?.blockExplorers?.default.name}{" "} - - + !isVMChain && chain?.blockExplorers?.default && ( + + View transaction{" "} + + {maskAddress(state.txState.txHash ?? "")} + {" "} + on {chain.blockExplorers.default.name}{" "} + + + ) )} )}
{routeChain ? ( - // if the chain is not the same as the route, we need to refresh the page { setShouldFetch(true); - // refresh the page to show the new token await router.replace(router.asPath); }} > @@ -140,7 +141,7 @@ const Review: FC = () => { )} {eligibleChains.map((chain) => ( @@ -231,19 +238,18 @@ const EVMChainsDropdown: FC = (props) => { chain.chain_id === selectedChain?.chain_id, })} > - { + ))} @@ -251,4 +257,5 @@ const EVMChainsDropdown: FC = (props) => { ); }; -export default withEVMChainsDropdownProvider(EVMChainsDropdown); + +export default withChainsDropdownProvider(ChainsDropdown); diff --git a/apps/maestro/src/ui/components/ChainsDropdown/index.ts b/apps/maestro/src/ui/components/ChainsDropdown/index.ts new file mode 100644 index 000000000..d560d4d1b --- /dev/null +++ b/apps/maestro/src/ui/components/ChainsDropdown/index.ts @@ -0,0 +1,2 @@ +export * from "./ChainsDropdown"; +export { default } from "./ChainsDropdown"; diff --git a/apps/maestro/src/ui/components/EVMChainsDropdown/EVMChainsDropdown.state.tsx b/apps/maestro/src/ui/components/EVMChainsDropdown/EVMChainsDropdown.state.tsx deleted file mode 100644 index db0d69e8a..000000000 --- a/apps/maestro/src/ui/components/EVMChainsDropdown/EVMChainsDropdown.state.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { createContainer, useSessionStorageState } from "@axelarjs/utils/react"; -import { type FC } from "react"; - -export const INITIAL_STATE = { - selectedChainId: null as number | null, -}; - -function useEVMChainsDropdownState(initialState = INITIAL_STATE) { - const [state, setState] = useSessionStorageState( - "@maestro/evm-chains-dropdown", - initialState - ); - - const actions = { - selectChainId: (chainId: number | null) => { - setState((state) => { - state.selectedChainId = chainId; - }); - }, - }; - - return [state, actions] as const; -} - -export const { - Provider: EVMChainsDropdownProvider, - useContainer: useEVMChainsDropdownContainer, -} = createContainer(useEVMChainsDropdownState); - -export function withEVMChainsDropdownProvider(Component: FC) { - const Inner = (props: TProps) => ( - - - - ); - Inner.displayName = `withEVMChainsDropdownProvider(${ - Component.displayName ?? Component.name ?? "Component" - })`; - return Inner; -} diff --git a/apps/maestro/src/ui/components/EVMChainsDropdown/index.ts b/apps/maestro/src/ui/components/EVMChainsDropdown/index.ts deleted file mode 100644 index 843645e45..000000000 --- a/apps/maestro/src/ui/components/EVMChainsDropdown/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./EVMChainsDropdown"; -export { default } from "./EVMChainsDropdown"; diff --git a/apps/maestro/src/ui/compounds/ChainPicker/ChainPicker.tsx b/apps/maestro/src/ui/compounds/ChainPicker/ChainPicker.tsx index cae7c65c7..d8c8714dc 100644 --- a/apps/maestro/src/ui/compounds/ChainPicker/ChainPicker.tsx +++ b/apps/maestro/src/ui/compounds/ChainPicker/ChainPicker.tsx @@ -1,10 +1,12 @@ -import type { EVMChainConfig } from "@axelarjs/api"; +import type { EVMChainConfig, VMChainConfig } from "@axelarjs/api"; import { Button, cn, Loading, Tooltip } from "@axelarjs/ui"; import { useCallback, type FC } from "react"; import Image from "next/image"; +type ChainConfig = EVMChainConfig | VMChainConfig; + export type ChainPickerProps = { - eligibleChains: EVMChainConfig[]; + eligibleChains: ChainConfig[]; selectedChains: string[]; erroredChains?: string[]; onChainClick: (chainId: string) => void; @@ -43,11 +45,16 @@ const ChainPicker: FC = ({ ); }, [eligibleChains, onChainClick, selectedChains]); + const getChainName = (chain: ChainConfig) => { + return chain.name + }; + return (
{eligibleChains?.map((chain) => { const isSelected = selectedChains.includes(chain.id); + const chainName = getChainName(chain); const buttonVariant = isSelected ? erroredChains?.includes(chain.id) @@ -60,15 +67,17 @@ const ChainPicker: FC = ({ key={chain.chain_name} tip={ buttonVariant !== "error" - ? `Deploy on ${chain.name}` + ? `Deploy on ${chainName}` : "Failed to estimate gas fees" } $variant={buttonVariant === "error" ? "warning" : undefined} $position="top" > ); })}
-
diff --git a/apps/maestro/src/ui/compounds/GMPTxStatusMonitor/GMPTxStatusMonitor.tsx b/apps/maestro/src/ui/compounds/GMPTxStatusMonitor/GMPTxStatusMonitor.tsx index 8df17a9a9..144aafdd0 100644 --- a/apps/maestro/src/ui/compounds/GMPTxStatusMonitor/GMPTxStatusMonitor.tsx +++ b/apps/maestro/src/ui/compounds/GMPTxStatusMonitor/GMPTxStatusMonitor.tsx @@ -1,4 +1,4 @@ -import type { EVMChainConfig } from "@axelarjs/api"; +import type { EVMChainConfig, VMChainConfig } from "@axelarjs/api"; import type { GMPTxStatus } from "@axelarjs/api/gmp"; import { Badge, cn, Progress, Tooltip, type BadgeProps } from "@axelarjs/ui"; import { useEffect, useMemo, type FC } from "react"; @@ -9,11 +9,14 @@ import { useBlockNumber, useChainId, useTransaction } from "wagmi"; import { NEXT_PUBLIC_EXPLORER_URL } from "~/config/env"; import { useChainInfoQuery } from "~/services/axelarjsSDK/hooks"; -import { useEVMChainConfigsQuery } from "~/services/axelarscan/hooks"; +import { + useAllChainConfigsQuery, +} from "~/services/axelarscan/hooks"; import { useGetTransactionStatusOnDestinationChainsQuery } from "~/services/gmp/hooks"; -import { ChainIcon } from "~/ui/components/EVMChainsDropdown"; +import { ChainIcon } from "~/ui/components/ChainsDropdown"; export type ExtendedGMPTxStatus = GMPTxStatus | "pending"; +type ChainConfig = EVMChainConfig | VMChainConfig; const STATUS_LABELS: Partial> = { called: "Initialized", @@ -42,14 +45,15 @@ const STATUS_COLORS: Partial< }; export function useGMPTxProgress(txHash: `0x${string}`, chainId: number) { - const { computed } = useEVMChainConfigsQuery(); + const { combinedComputed } = useAllChainConfigsQuery(); + const { data: txInfo } = useTransaction({ hash: txHash, chainId, }); const { data: chainInfo } = useChainInfoQuery({ - axelarChainId: computed.indexedByChainId[chainId]?.id, + axelarChainId: combinedComputed.indexedByChainId[chainId]?.id, }); const { data: currentBlockNumber } = useBlockNumber({ @@ -136,21 +140,25 @@ const GMPTxStatusMonitor = ({ txHash, onAllChainsExecuted }: Props) => { const chainId = useChainId(); - const { computed } = useEVMChainConfigsQuery(); + const { combinedComputed } = useAllChainConfigsQuery(); const statusList = Object.values(statuses ?? {}); + const pendingItsHubTx = + Object.keys(statuses).includes("axelarnet") || + Object.keys(statuses).includes("axelar"); useEffect(() => { if ( statusList.length && + !pendingItsHubTx && statusList?.every((s) => s.status === "executed") ) { onAllChainsExecuted?.(); } - }, [statusList, onAllChainsExecuted]); + }, [pendingItsHubTx, statusList, onAllChainsExecuted]); - if (!statuses || Object.keys(statuses).length === 0) { - if (!isLoading) { + if (!statuses || Object.keys(statuses).length === 0 || pendingItsHubTx) { + if (!isLoading && !pendingItsHubTx) { // nothing to show return null; } @@ -180,7 +188,7 @@ const GMPTxStatusMonitor = ({ txHash, onAllChainsExecuted }: Props) => {
    {[...Object.entries(statuses ?? {})].map( ([axelarChainId, { status, logIndex }]) => { - const chain = computed.indexedById[axelarChainId]; + const chain = combinedComputed.indexedById[axelarChainId]; return ( & { logIndexes: number[]; - chains: EVMChainConfig[]; + chains: ChainConfig[]; }; const CollapsedChains: FC<{ - chains: EVMChainConfig[]; + chains: ChainConfig[]; offset: number; }> = ({ chains, offset }) => { if (chains.length > offset) { @@ -254,9 +262,13 @@ export const CollapsedChainStatusGroup: FC = ({
    {leading.map((chain, i) => ( - + = ({ target="_blank" rel="noopener noreferrer" > - + {chain && ( + + )} {" "} @@ -289,17 +303,18 @@ export const ChainStatusItem: FC = ({ className, compact, }) => { + const chainName = chain?.name || "chain"; return (
  • - + {" "} - {!compact && chain.name} + {!compact && chainName}
  • diff --git a/apps/maestro/src/ui/compounds/MultiStepForm/MultiStepForm.tsx b/apps/maestro/src/ui/compounds/MultiStepForm/MultiStepForm.tsx index 583d5efb8..6b5e0f62b 100644 --- a/apps/maestro/src/ui/compounds/MultiStepForm/MultiStepForm.tsx +++ b/apps/maestro/src/ui/compounds/MultiStepForm/MultiStepForm.tsx @@ -32,8 +32,8 @@ import { useSession } from "next-auth/react"; import { useAccount } from "wagmi"; import { trpc } from "~/lib/trpc"; -import { useEVMChainConfigsQuery } from "~/services/axelarscan/hooks"; -import EVMChainsDropdown from "~/ui/components/EVMChainsDropdown"; +import { useAllChainConfigsQuery } from "~/services/axelarscan/hooks"; +import ChainsDropdownComponent from "~/ui/components/ChainsDropdown"; import ConnectWalletButton from "../ConnectWalletButton"; type ButtonProps = ComponentProps; @@ -126,7 +126,7 @@ export const ChainsDropdown: FC<{ disabled?: boolean; shift?: boolean }> = ( ) => { const { width } = useWindowSize(); return ( - { return props.additionalChainNames.map((chainName) => { - const chain = computed.indexedById[chainName]; + const chain = combinedComputed.indexedById[chainName]; return chain?.name ?? ""; }); - }, [computed, props.additionalChainNames]); + }, [combinedComputed.indexedById, props.additionalChainNames]); const handleShareHaiku = useCallback(async () => { try { diff --git a/apps/maestro/src/ui/layouts/MainLayout/Appbar.tsx b/apps/maestro/src/ui/layouts/MainLayout/Appbar.tsx index 4270808d6..963e798c5 100644 --- a/apps/maestro/src/ui/layouts/MainLayout/Appbar.tsx +++ b/apps/maestro/src/ui/layouts/MainLayout/Appbar.tsx @@ -27,7 +27,7 @@ import { useAccount, useDisconnect } from "wagmi"; import { APP_NAME } from "~/config/app"; import { NEXT_PUBLIC_NETWORK_ENV } from "~/config/env"; import Transactions from "~/features/Transactions/Transactions"; -import EVMChainsDropdown from "~/ui/components/EVMChainsDropdown"; +import ChainsDropdown from "~/ui/components/ChainsDropdown"; import ConnectWalletButton from "~/ui/compounds/ConnectWalletButton"; import { useLayoutStateContainer } from "./MainLayout.state"; import MainMenu from "./MainMenu"; @@ -101,7 +101,7 @@ const Appbar: FC = (props) => { <> {isConnected && address ? ( <> - @@ -186,7 +186,7 @@ const Appbar: FC = (props) => {
    {isConnected && address ? ( <> - +
    )}
    - ( )} @@ -218,8 +222,8 @@ const Page: FC = ({ mustBeConnected, handleTokenFound, children, - evmChain, - evmChainFromRoute, + currentChain, + currentChainFromRoute, chain?.id, switchChain, ]); diff --git a/apps/maestro/src/ui/pages/InterchainTokenDetailsPage/ConnectedInterchainTokensPage.tsx b/apps/maestro/src/ui/pages/InterchainTokenDetailsPage/ConnectedInterchainTokensPage.tsx index 00f40406d..e13900cae 100644 --- a/apps/maestro/src/ui/pages/InterchainTokenDetailsPage/ConnectedInterchainTokensPage.tsx +++ b/apps/maestro/src/ui/pages/InterchainTokenDetailsPage/ConnectedInterchainTokensPage.tsx @@ -20,7 +20,9 @@ import { logger } from "~/lib/logger"; import { trpc } from "~/lib/trpc"; import { getNativeToken } from "~/lib/utils/getNativeToken"; import { useEstimateGasFeeMultipleChainsQuery } from "~/services/axelarjsSDK/hooks"; -import { useEVMChainConfigsQuery } from "~/services/axelarscan/hooks"; +import { + useAllChainConfigsQuery, +} from "~/services/axelarscan/hooks"; import { useGetTransactionsStatusesOnDestinationChainsQuery, useInterchainTokensQuery, @@ -158,7 +160,8 @@ const ConnectedInterchainTokensPage: FC = ( txHashes: sessionState.deployTokensTxHashes, }); - const { computed } = useEVMChainConfigsQuery(); + const { combinedComputed } = useAllChainConfigsQuery(); + const { switchChainAsync } = useSwitchChain(); const statusesByChain = useMemo(() => { @@ -287,16 +290,16 @@ const ConnectedInterchainTokensPage: FC = ( [interchainToken] ); - const runninChainIds = useMemo( + const runningChainIds = useMemo( () => Object.entries(statusesByChain).map( - ([axelarChainId]) => computed.indexedById[axelarChainId]?.chain_id + ([axelarChainId]) => combinedComputed.indexedById[axelarChainId]?.chain_id ), - [computed.indexedById, statusesByChain] + [combinedComputed.indexedById, statusesByChain] ); const nonRunningSelectedChainIds = sessionState.selectedChainIds.filter( - (x) => !runninChainIds.includes(x) + (x) => !runningChainIds.includes(x) ); const isRestrictedToDeployer = diff --git a/apps/maestro/src/ui/pages/InterchainTokenDetailsPage/TokenDetailsSection.tsx b/apps/maestro/src/ui/pages/InterchainTokenDetailsPage/TokenDetailsSection.tsx index 68396bf8d..98275c60b 100644 --- a/apps/maestro/src/ui/pages/InterchainTokenDetailsPage/TokenDetailsSection.tsx +++ b/apps/maestro/src/ui/pages/InterchainTokenDetailsPage/TokenDetailsSection.tsx @@ -1,4 +1,4 @@ -import type { EVMChainConfig } from "@axelarjs/api"; +import type { EVMChainConfig, VMChainConfig } from "@axelarjs/api"; import { Alert, Badge, @@ -30,12 +30,12 @@ import { z } from "zod"; import { trpc } from "~/lib/trpc"; import { hex64Literal } from "~/lib/utils/validation"; -import { ChainIcon } from "~/ui/components/EVMChainsDropdown"; +import { ChainIcon } from "~/ui/components/ChainsDropdown"; export type TokenDetailsSectionProps = { name: string; symbol: string; - chain: EVMChainConfig; + chain: EVMChainConfig | VMChainConfig; tokenAddress: `0x${string}`; wasDeployedByAccount?: boolean; decimals: number; diff --git a/apps/maestro/src/ui/pages/InterchainTokensPage/TokenList.tsx b/apps/maestro/src/ui/pages/InterchainTokensPage/TokenList.tsx index 39b627a05..38a70c612 100644 --- a/apps/maestro/src/ui/pages/InterchainTokensPage/TokenList.tsx +++ b/apps/maestro/src/ui/pages/InterchainTokensPage/TokenList.tsx @@ -9,8 +9,8 @@ import { filter, map } from "rambda"; import { WAGMI_CHAIN_CONFIGS } from "~/config/wagmi"; import { trpc } from "~/lib/trpc"; -import { useEVMChainConfigsQuery } from "~/services/axelarscan/hooks"; -import { ChainIcon } from "~/ui/components/EVMChainsDropdown"; +import { useAllChainConfigsQuery } from "~/services/axelarscan/hooks"; +import { ChainIcon } from "~/ui/components/ChainsDropdown"; import Pagination from "~/ui/components/Pagination"; import Page from "~/ui/layouts/Page"; @@ -53,8 +53,8 @@ const TokenList: FC = ({ sessionAddress }) => { } ); - const { computed } = useEVMChainConfigsQuery(); - + const { combinedComputed } = useAllChainConfigsQuery(); + const maybeTokens = Maybe.of(data).map((data) => data.items); const totalPages = Maybe.of(data).mapOr(0, (data) => data.totalPages); @@ -64,14 +64,14 @@ const TokenList: FC = ({ sessionAddress }) => { .map( map( (token) => - [token, computed.indexedById[token.axelarChainId]] as const + [token, combinedComputed.indexedById[token.axelarChainId]] as const ) ) .mapOr( [], filter(([token, chain]) => Boolean(token) && Boolean(chain)) ), - [computed.indexedById, maybeTokens] + [combinedComputed.indexedById, maybeTokens] ); const totalTokens = Maybe.of(data).mapOr(0, (data) => data.totalItems); diff --git a/packages/api/src/axelarscan/isomorphic.ts b/packages/api/src/axelarscan/isomorphic.ts index 8f8b045d8..f77f193d6 100644 --- a/packages/api/src/axelarscan/isomorphic.ts +++ b/packages/api/src/axelarscan/isomorphic.ts @@ -1,5 +1,3 @@ -import { partition } from "rambda"; - import { RestService, type RestServiceOptions } from "../lib/rest-service"; import type { AxelarAssetPrice, @@ -10,6 +8,7 @@ import type { LinkRequestRawResponse, LinkRequestResponse, SearchBatchesResponse, + VMChainConfig, } from "./types"; export type AxelarApiParams> = T & { @@ -21,7 +20,7 @@ export type GetAssetsResponse = AxelarScanAsset[]; export type GetAssetsPriceResponse = AxelarAssetPrice[]; -export type GetChainConfigsResponse = (EVMChainConfig | CosmosChainConfig)[]; +export type GetChainConfigsResponse = (EVMChainConfig | CosmosChainConfig | VMChainConfig)[]; export class AxelarscanClient extends RestService { static init(options: RestServiceOptions) { @@ -47,18 +46,26 @@ export class AxelarscanClient extends RestService { disabledChains?: string[]; } = {} ) { - const [evm, cosmos] = partition( - (c) => c.chain_type === "evm", - await this.client.get("/api/getChains").json() - ); + const chains = await this.client + .get("/api/getChains") + .json(); - const isEligible = (a: EVMChainConfig | CosmosChainConfig) => + const isEligible = ( + a: EVMChainConfig | CosmosChainConfig | VMChainConfig + ) => (!a?.deprecated || params.isStaging) && !params.disabledChains?.includes(a.id); return { - evm: evm.filter(isEligible) as EVMChainConfig[], - cosmos: cosmos.filter(isEligible) as CosmosChainConfig[], + evm: chains.filter( + (c) => c.chain_type === "evm" && isEligible(c) + ) as EVMChainConfig[], + cosmos: chains.filter( + (c) => c.chain_type === "cosmos" && isEligible(c) + ) as CosmosChainConfig[], + vm: chains.filter( + (c) => c.chain_type === "vm" && isEligible(c) + ) as VMChainConfig[], }; } diff --git a/packages/api/src/axelarscan/types.ts b/packages/api/src/axelarscan/types.ts index 4157c651c..1e968230e 100644 --- a/packages/api/src/axelarscan/types.ts +++ b/packages/api/src/axelarscan/types.ts @@ -32,6 +32,57 @@ export type AxelarAssetPrice = Pick< updated_at: number; }; +export type VMChainConfig = { + chain_id: number; + chain_name: string; + maintainer_id: string; + deprecated?: boolean; + multisig_prover: { + address: string; + }; + voting_verifier: { + address: string; + }; + endpoints: { + rpc: string[]; + }; + native_token: { + name: string; + symbol: string; + decimals: number; + }; + name: string; + short_name: string; + image: string; + color: string; + explorer: { + name: string; + url: string; + icon: string; + block_path: string; + address_path: string; + contract_path: string; + transaction_path: string; + }; + id: string; + chain_type: "vm"; + provider_params: [ + { + chainId: string; + chainName: string; + rpcUrls: string[]; + nativeCurrency: { + name: string; + symbol: string; + decimals: number; + }; + blockExplorerUrls: string[]; + }, + ]; + no_inflation: boolean; + no_tvl: boolean; +}; + export type EVMChainConfig = { chain_id: number; chain_name: string; diff --git a/packages/api/src/gmp/types.ts b/packages/api/src/gmp/types.ts index 483832e59..bc8e56a8f 100644 --- a/packages/api/src/gmp/types.ts +++ b/packages/api/src/gmp/types.ts @@ -101,6 +101,36 @@ export type SearchGMPCall = { }; }; +export type SearchGMPCallback = { + chain: string; + chain_type: ChainType; + destination_chain_type: ChainType; + created_at: GMPTxCreatedAt; + eventIndex: number; + returnValues: { + sourceChain: string; + destinationChain: string; + sourceAddress: string; + destinationAddress: string; + destinationContractAddress: string; + sender: string; + payload: string; + messageID: string; + messageId: string; + payloadHash: string; + }; + messageIdIndex: number; + blockNumber: number; + block_timestamp: number; + parentMessageID: string; + receipt: SearchGMPReceipt; + _id: string; + id: string; + messageIdHash: string; + event: string; + transaction: SearchGMPTransaction; +}; + type SearchGMPReceipt = { gasUsed: string; blockNumber: number; @@ -280,6 +310,7 @@ export type SearchGMPResponseData = { interchain_transfer?: InterchainTransferEvent; interchain_token_deployment_started?: InterchainTokenDeploymentStartedEvent; token_manager_deployment_started?: TokenManagerDeploymentStartedEvent; + callback?: SearchGMPCallback; }; export type SearchGMPTimespent = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c12582c23..39b1e261e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,8 +93,8 @@ importers: apps/maestro: dependencies: '@axelar-network/axelarjs-sdk': - specifier: 0.15.0 - version: 0.15.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: 0.17.1-alpha.12 + version: 0.17.1-alpha.12(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3) '@axelarjs/api': specifier: workspace:* version: link:../../packages/api @@ -344,7 +344,7 @@ importers: version: link:../../packages/utils next: specifier: ^14.1.4 - version: 14.1.4(@babel/core@7.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.1.4(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -1025,6 +1025,20 @@ importers: packages: + '@0no-co/graphql.web@1.0.13': + resolution: {integrity: sha512-jqYxOevheVTU1S36ZdzAkJIdvRp2m3OYIG5SEoKDw5NI8eVwkoI0D/Q3DYNGmXCxkA6CQuoa7zvMiDPTLqUNuw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + + '@0no-co/graphqlsp@1.12.16': + resolution: {integrity: sha512-B5pyYVH93Etv7xjT6IfB7QtMBdaaC07yjbhN6v8H7KgFStMkPvi+oWYBTibMFRMY89qwc9H8YixXg8SXDVgYWw==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} @@ -1054,10 +1068,6 @@ packages: peerDependencies: zod: ^3.20.2 - '@axelar-network/axelar-cgp-solidity@4.5.0': - resolution: {integrity: sha512-4F4rmHei0cmzeUR7/mW4Bap5rc/KlPV2crD9HA7HTRfl15mVcN6/3z8p+pAm9We6bOrQplNW9KBZ3HJFP3C1Gw==} - engines: {node: ^16.0.0 || ^18.0.0} - '@axelar-network/axelar-cgp-solidity@6.4.0': resolution: {integrity: sha512-Xnw5xi234B1cmTCzgudV8zq+DDjJ1d1U362CM0vKH1FWmZprKIdqgmOYkiRyu+QiVhnznKiBURiSEHVrNjtYpw==} engines: {node: '>=18'} @@ -1070,8 +1080,8 @@ packages: resolution: {integrity: sha512-o8pv+krIAlEwzid0Ac8qwykDsavc+1DRPvyFQ3V0R0zTQFtYLJIIXXXt7FRb8b+LJDAuX+E0bB3N2X+hlcxk/g==} engines: {node: '>=18'} - '@axelar-network/axelarjs-sdk@0.15.0': - resolution: {integrity: sha512-7DSO/loMu/3p592WZ7rXtL0uUyLgSi5c7JH26OCR2WElzhobScM6twb1JUi+Gu9u3OcrFPJZyBLd/COIVY6S7A==} + '@axelar-network/axelarjs-sdk@0.17.1-alpha.12': + resolution: {integrity: sha512-yQz3zFOfMjYlAzl1/sN/p6nIkKpDbFu9XjA4ynMCR4EqZav8alscRpRLDNrxZP3LPk1cvB1Ppx6jRBHfRFupzA==} '@axelar-network/axelarjs-types@0.33.0': resolution: {integrity: sha512-aCbX/5G+tgWPjr9tl3dQfJftWwRMkILz61ytach7dKqxtO9G9jlxpNvELJQ6gKVOodUtSY8qBCO/fWU19v4hdQ==} @@ -2066,6 +2076,7 @@ packages: '@confio/ics23@0.6.8': resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} + deprecated: Unmaintained. The codebase for this package was moved to https://github.com/cosmos/ics23 but then the JS implementation was removed in https://github.com/cosmos/ics23/pull/353. Please consult the maintainers of https://github.com/cosmos for further assistance. '@cosmjs/amino@0.31.3': resolution: {integrity: sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw==} @@ -3252,6 +3263,31 @@ packages: '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@gql.tada/cli-utils@1.6.3': + resolution: {integrity: sha512-jFFSY8OxYeBxdKi58UzeMXG1tdm4FVjXa8WHIi66Gzu9JWtCE6mqom3a8xkmSw+mVaybFW5EN2WXf1WztJVNyQ==} + peerDependencies: + '@0no-co/graphqlsp': ^1.12.13 + '@gql.tada/svelte-support': 1.0.1 + '@gql.tada/vue-support': 1.0.1 + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + '@gql.tada/svelte-support': + optional: true + '@gql.tada/vue-support': + optional: true + + '@gql.tada/internal@1.0.8': + resolution: {integrity: sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} @@ -3549,6 +3585,13 @@ packages: resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion + '@mysten/bcs@1.2.0': + resolution: {integrity: sha512-LuKonrGdGW7dq/EM6U2L9/as7dFwnhZnsnINzB/vu08Xfrj0qzWwpLOiXagAa5yZOPLK7anRZydMonczFkUPzA==} + + '@mysten/sui@1.18.0': + resolution: {integrity: sha512-cFh5LxXZrXb/ZAD1dkKeQxzhgRYFXreyFGmI7w/JQWwdl+/0FrHJBwaWyTmGxJ/6ZC9SlaOPOk63flN7DbUurg==} + engines: {node: '>=18'} + '@neondatabase/serverless@0.7.2': resolution: {integrity: sha512-wU3WA2uTyNO7wjPs3Mg0G01jztAxUxzd9/mskMmtPwPTjf7JKWi9AW5/puOGXLxmZ9PVgRFeBVRVYq5nBPhsCg==} @@ -4581,6 +4624,10 @@ packages: resolution: {integrity: sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==} engines: {node: '>= 8'} + '@simplewebauthn/typescript-types@7.4.0': + resolution: {integrity: sha512-8/ZjHeUPe210Bt5oyaOIGx4h8lHdsQs19BiOT44gi/jBEgK7uBGA0Fy7NRsyh777al3m6WM0mBf0UR7xd4R7WQ==} + deprecated: This package has been renamed to @simplewebauthn/types. Please install @simplewebauthn/types instead to ensure you receive future updates. + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -4651,6 +4698,15 @@ packages: '@stablelib/x25519@1.0.3': resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + '@stellar/js-xdr@3.1.2': + resolution: {integrity: sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==} + + '@stellar/stellar-base@13.0.1': + resolution: {integrity: sha512-Xbd12mc9Oj/130Tv0URmm3wXG77XMshZtZ2yNCjqX5ZbMD5IYpbBs3DVCteLU/4SLj/Fnmhh1dzhrQXnk4r+pQ==} + + '@stellar/stellar-sdk@13.1.0': + resolution: {integrity: sha512-ARQkUdyGefXdTgwSF0eONkzv/geAqUfyfheJ9Nthz6GAr5b41fNwWW9UtE8JpXC4IpvE3t5elIUN5hKJzASN9w==} + '@storybook/addon-actions@8.4.7': resolution: {integrity: sha512-mjtD5JxcPuW74T6h7nqMxWTvDneFtokg88p6kQ5OnC1M259iAXb//yiSZgu/quunMHPCXSiqn4FNOSgASTSbsA==} peerDependencies: @@ -4860,6 +4916,9 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@suchipi/femver@1.0.0': + resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} + '@svgr/babel-plugin-add-jsx-attribute@7.0.0': resolution: {integrity: sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==} engines: {node: '>=14'} @@ -5696,6 +5755,7 @@ packages: '@web3modal/core@4.2.3': resolution: {integrity: sha512-UykKZTELBpb6ey+IV6fkHWsLkjrIdILmRYzhlznyTPbm9qX5pOR9tH0Z3QGUo7YPFmUqMRH1tC9Irsr3SgIbbw==} + deprecated: Web3Modal is now Reown AppKit. Please follow the upgrade guide at https://docs.reown.com/appkit/upgrade/from-w3m-to-reown '@web3modal/polyfills@4.2.3': resolution: {integrity: sha512-RiGxh2hMLSD1s2aTjoejNK/UL377CJhGf5tzmdF1m5xsYHpil+Dnulpio8Yojnm27cOqQD+QiaYUKnHOxErLjQ==} @@ -5727,9 +5787,11 @@ packages: '@web3modal/siwe@4.2.3': resolution: {integrity: sha512-uPma0U/OxAy3LwnF7pCYYX8tn+ONBYNcssuVZxEGsusJD1kF4ueS8lK7eyQogyK5nXqOGdNESOjY1NImNNjMVw==} + deprecated: Web3Modal is now Reown AppKit. Please follow the upgrade guide at https://docs.reown.com/appkit/upgrade/from-w3m-to-reown '@web3modal/ui@4.2.3': resolution: {integrity: sha512-QPPgE0hii1gpAldTdnrP63D/ryI78Ohz99zRBp8vi81lawot7rbdUbryMoX13hMPCW9vW7JYyvX+jJN7uO3QwA==} + deprecated: Web3Modal is now Reown AppKit. Please follow the upgrade guide at https://docs.reown.com/appkit/upgrade/from-w3m-to-reown '@web3modal/wagmi@4.2.3': resolution: {integrity: sha512-oisBCMrOYn8TBgNaSPrumvMmTGox6+3Ii92zxQJalW5U/K9iBTxoejHT033Ss7mFEFybilcfXBAvGNFXfQmtkA==} @@ -6102,6 +6164,13 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base-x@5.0.0: + resolution: {integrity: sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==} + + base32.js@0.1.0: + resolution: {integrity: sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==} + engines: {node: '>=0.12.0'} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -6174,6 +6243,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -7445,6 +7517,10 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource@2.0.2: + resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} + engines: {node: '>=12.0.0'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -7531,6 +7607,9 @@ packages: picomatch: optional: true + feaxios@0.0.23: + resolution: {integrity: sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==} + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -7867,6 +7946,12 @@ packages: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} + gql.tada@1.8.10: + resolution: {integrity: sha512-FrvSxgz838FYVPgZHGOSgbpOjhR+yq44rCzww3oOPJYi0OvBJjAgCiP6LEokZIYND2fUTXzQAyLgcvgw1yNP5A==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -7879,6 +7964,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql@16.10.0: + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -8322,6 +8411,10 @@ packages: resolution: {integrity: sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==} engines: {node: '>= 0.4'} + is-retry-allowed@3.0.0: + resolution: {integrity: sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==} + engines: {node: '>=12'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -8534,6 +8627,9 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -9884,6 +9980,9 @@ packages: resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} engines: {node: '>=12.0.0'} + poseidon-lite@0.2.1: + resolution: {integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -10806,6 +10905,9 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} + sodium-native@4.3.1: + resolution: {integrity: sha512-YdP64gAdpIKHfL4ttuX4aIfjeunh9f+hNeQJpE9C8UMndB3zkgZ7YmmGT4J2+v6Ibyp6Wem8D1TcSrtdW0bqtg==} + sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} @@ -11272,6 +11374,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -11439,6 +11544,9 @@ packages: resolution: {integrity: sha512-r02GtNmkOPcQvUzVE6lg474QVLyU02r3yh3lUGqrFHf5h5ZEjgDGWILsAUqplVqjri1Y/oOkTssks4CObTAaiw==} hasBin: true + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -11707,6 +11815,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -11769,6 +11880,9 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + valibot@0.36.0: + resolution: {integrity: sha512-CjF1XN4sUce8sBK9TixrDqFM7RwNkuXdJu174/AwmQUB62QbCQADg5lLe8ldBalFgtj1uKj+pKwDJiNo4Mn+eQ==} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -12302,6 +12416,16 @@ packages: snapshots: + '@0no-co/graphql.web@1.0.13(graphql@16.10.0)': + optionalDependencies: + graphql: 16.10.0 + + '@0no-co/graphqlsp@1.12.16(graphql@16.10.0)(typescript@5.4.3)': + dependencies: + '@gql.tada/internal': 1.0.8(graphql@16.10.0)(typescript@5.4.3) + graphql: 16.10.0 + typescript: 5.4.3 + '@aashutoshrathi/word-wrap@1.2.6': {} '@adobe/css-tools@4.3.3': {} @@ -12324,8 +12448,6 @@ snapshots: openapi3-ts: 4.4.0 zod: 3.24.1 - '@axelar-network/axelar-cgp-solidity@4.5.0': {} - '@axelar-network/axelar-cgp-solidity@6.4.0': dependencies: '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 @@ -12334,15 +12456,17 @@ snapshots: '@axelar-network/axelar-gmp-sdk-solidity@6.0.4': {} - '@axelar-network/axelarjs-sdk@0.15.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + '@axelar-network/axelarjs-sdk@0.17.1-alpha.12(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)': dependencies: - '@axelar-network/axelar-cgp-solidity': 4.5.0 + '@axelar-network/axelar-cgp-solidity': 6.4.0 '@axelar-network/axelarjs-types': 0.33.0 '@cosmjs/json-rpc': 0.30.1 '@cosmjs/stargate': 0.31.0-alpha.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/networks': 5.7.1 '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@mysten/sui': 1.18.0(typescript@5.4.3) + '@stellar/stellar-sdk': 13.1.0 '@types/uuid': 8.3.4 bech32: 2.0.0 clone-deep: 4.0.1 @@ -12354,10 +12478,13 @@ snapshots: uuid: 8.3.2 ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - bufferutil - debug - encoding - supports-color + - typescript - utf-8-validate '@axelar-network/axelarjs-types@0.33.0': @@ -14848,6 +14975,23 @@ snapshots: '@floating-ui/utils@0.2.8': {} + '@gql.tada/cli-utils@1.6.3(@0no-co/graphqlsp@1.12.16(graphql@16.10.0)(typescript@5.4.3))(graphql@16.10.0)(typescript@5.4.3)': + dependencies: + '@0no-co/graphqlsp': 1.12.16(graphql@16.10.0)(typescript@5.4.3) + '@gql.tada/internal': 1.0.8(graphql@16.10.0)(typescript@5.4.3) + graphql: 16.10.0 + typescript: 5.4.3 + + '@gql.tada/internal@1.0.8(graphql@16.10.0)(typescript@5.4.3)': + dependencies: + '@0no-co/graphql.web': 1.0.13(graphql@16.10.0) + graphql: 16.10.0 + typescript: 5.4.3 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.10.0)': + dependencies: + graphql: 16.10.0 + '@hapi/bourne@3.0.0': {} '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -15353,6 +15497,31 @@ snapshots: '@motionone/dom': 10.18.0 tslib: 2.8.1 + '@mysten/bcs@1.2.0': + dependencies: + bs58: 6.0.0 + + '@mysten/sui@1.18.0(typescript@5.4.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) + '@mysten/bcs': 1.2.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + '@simplewebauthn/typescript-types': 7.4.0 + '@suchipi/femver': 1.0.0 + bech32: 2.0.0 + gql.tada: 1.8.10(graphql@16.10.0)(typescript@5.4.3) + graphql: 16.10.0 + jose: 5.9.6 + poseidon-lite: 0.2.1 + valibot: 0.36.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + '@neondatabase/serverless@0.7.2': dependencies: '@types/pg': 8.6.6 @@ -16382,6 +16551,8 @@ snapshots: - encoding - supports-color + '@simplewebauthn/typescript-types@7.4.0': {} + '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@5.6.0': {} @@ -16478,6 +16649,32 @@ snapshots: '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 + '@stellar/js-xdr@3.1.2': {} + + '@stellar/stellar-base@13.0.1': + dependencies: + '@stellar/js-xdr': 3.1.2 + base32.js: 0.1.0 + bignumber.js: 9.1.2 + buffer: 6.0.3 + sha.js: 2.4.11 + tweetnacl: 1.0.3 + optionalDependencies: + sodium-native: 4.3.1 + + '@stellar/stellar-sdk@13.1.0': + dependencies: + '@stellar/stellar-base': 13.0.1 + axios: 1.7.9 + bignumber.js: 9.1.2 + eventsource: 2.0.2 + feaxios: 0.0.23 + randombytes: 2.1.0 + toml: 3.0.0 + urijs: 1.19.11 + transitivePeerDependencies: + - debug + '@storybook/addon-actions@8.4.7(storybook@8.4.7(bufferutil@4.0.8)(prettier@3.2.5)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 @@ -16797,6 +16994,8 @@ snapshots: dependencies: storybook: 8.4.7(bufferutil@4.0.8)(prettier@3.2.5)(utf-8-validate@6.0.3) + '@suchipi/femver@1.0.0': {} + '@svgr/babel-plugin-add-jsx-attribute@7.0.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -19143,6 +19342,10 @@ snapshots: balanced-match@1.0.2: {} + base-x@5.0.0: {} + + base32.js@0.1.0: {} + base64-js@1.5.1: {} bech32@1.1.4: {} @@ -19210,6 +19413,10 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.2) + bs58@6.0.0: + dependencies: + base-x: 5.0.0 + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -20870,6 +21077,8 @@ snapshots: events@3.3.0: {} + eventsource@2.0.2: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -20975,6 +21184,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + feaxios@0.0.23: + dependencies: + is-retry-allowed: 3.0.0 + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -21375,6 +21588,18 @@ snapshots: p-cancelable: 3.0.0 responselike: 3.0.0 + gql.tada@1.8.10(graphql@16.10.0)(typescript@5.4.3): + dependencies: + '@0no-co/graphql.web': 1.0.13(graphql@16.10.0) + '@0no-co/graphqlsp': 1.12.16(graphql@16.10.0)(typescript@5.4.3) + '@gql.tada/cli-utils': 1.6.3(@0no-co/graphqlsp@1.12.16(graphql@16.10.0)(typescript@5.4.3))(graphql@16.10.0)(typescript@5.4.3) + '@gql.tada/internal': 1.0.8(graphql@16.10.0)(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - graphql + graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} @@ -21383,6 +21608,8 @@ snapshots: graphemer@1.4.0: {} + graphql@16.10.0: {} + gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -21811,6 +22038,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-retry-allowed@3.0.0: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.2: @@ -22087,6 +22316,8 @@ snapshots: jose@4.15.9: {} + jose@5.9.6: {} + joycon@3.1.1: {} js-file-download@0.4.12: {} @@ -23129,7 +23360,7 @@ snapshots: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.5.3 + ufo: 1.5.4 mlly@1.6.1: dependencies: @@ -23211,31 +23442,6 @@ snapshots: next-tick@1.1.0: {} - next@14.1.4(@babel/core@7.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 14.1.4 - '@swc/helpers': 0.5.2 - busboy: 1.6.0 - caniuse-lite: 1.0.30001687 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.24.0)(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.1.4 - '@next/swc-darwin-x64': 14.1.4 - '@next/swc-linux-arm64-gnu': 14.1.4 - '@next/swc-linux-arm64-musl': 14.1.4 - '@next/swc-linux-x64-gnu': 14.1.4 - '@next/swc-linux-x64-musl': 14.1.4 - '@next/swc-win32-arm64-msvc': 14.1.4 - '@next/swc-win32-ia32-msvc': 14.1.4 - '@next/swc-win32-x64-msvc': 14.1.4 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@14.1.4(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.1.4 @@ -23820,6 +24026,8 @@ snapshots: pony-cause@2.1.11: {} + poseidon-lite@0.2.1: {} + possible-typed-array-names@1.0.0: {} postcss-import@15.1.0(postcss@8.4.49): @@ -24871,6 +25079,11 @@ snapshots: transitivePeerDependencies: - supports-color + sodium-native@4.3.1: + dependencies: + node-gyp-build: 4.8.4 + optional: true + sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 @@ -25150,13 +25363,6 @@ snapshots: clsx: 2.1.1 typescript: 5.4.3 - styled-jsx@5.1.1(@babel/core@7.24.0)(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - optionalDependencies: - '@babel/core': 7.24.0 - styled-jsx@5.1.1(@babel/core@7.26.0)(react@18.3.1): dependencies: client-only: 0.0.1 @@ -25417,6 +25623,8 @@ snapshots: toidentifier@1.0.1: {} + toml@3.0.0: {} + totalist@3.0.1: {} tr46@0.0.3: {} @@ -25620,6 +25828,8 @@ snapshots: turbo-windows-64: 1.13.0 turbo-windows-arm64: 1.13.0 + tweetnacl@1.0.3: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -25882,6 +26092,8 @@ snapshots: dependencies: punycode: 2.3.1 + urijs@1.19.11: {} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 @@ -25937,6 +26149,8 @@ snapshots: v8-compile-cache-lib@3.0.1: {} + valibot@0.36.0: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0