Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6e12445
"UPGRADE: Upgrading 3 package(s)\n\nPackages:\n @galacticcouncil/xc-…
actions-user Mar 10, 2026
50eae08
base jumpa
mrq1911 Mar 11, 2026
aabae98
good ol sdk
mrq1911 Mar 11, 2026
cb8e23a
c9
mrq1911 Mar 11, 2026
313ff6d
9b
mrq1911 Mar 11, 2026
c66eee2
Basejump
mrq1911 Mar 11, 2026
0b1842f
🪂
mrq1911 Mar 11, 2026
70240f6
bump ci
mrq1911 Mar 11, 2026
508d3d3
xcm form defaults
mrq1911 Mar 11, 2026
f6a2a11
tracking basejump status
mrq1911 Mar 15, 2026
62aa262
Merge remote-tracking branch 'origin/master' into base-jumper
mrq1911 Mar 31, 2026
dded083
basejump
mrq1911 Mar 31, 2026
e40767a
clenup
mrq1911 Mar 31, 2026
2437383
lint:fix
mrq1911 Mar 31, 2026
8c49d53
Merge branch 'master' into base-jumper
mrq1911 Mar 31, 2026
ce8434f
merge?
mrq1911 Mar 31, 2026
52b376b
fixed abi
mrq1911 Apr 1, 2026
0a7807b
Adjust design
jvonasek Apr 9, 2026
0ac5816
Merge branch 'master' into base-jumper
jvonasek Apr 9, 2026
220c474
Merge remote-tracking branch 'origin/master' into base-jumper
nohaapav Apr 15, 2026
710937f
remove suplementary routes logic
nohaapav Apr 15, 2026
202078d
shutup lint
nohaapav Apr 15, 2026
57a50a2
dest guard
nohaapav Apr 16, 2026
7d4d290
Fix source fee not available after approval
jvonasek Apr 16, 2026
33c2aee
Fix react errors
jvonasek Apr 16, 2026
a794a07
Merge branch 'master' into base-jumper
jvonasek Apr 17, 2026
e9fbf5a
Fix duplicate journeys
jvonasek Apr 17, 2026
44f6aa1
Merge branch 'master' into base-jumper
jvonasek Apr 20, 2026
7634c27
Merge branch 'master' into base-jumper
jvonasek Apr 21, 2026
7be61ad
bjscan
jvonasek Apr 21, 2026
2ee7de6
Adjust claimable journey window
jvonasek Apr 21, 2026
7e02dc6
Basejump scan link
jvonasek Apr 21, 2026
2ff60f1
Ignore xcscan basejump entry
jvonasek Apr 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 20 additions & 7 deletions apps/main/src/api/xcm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ export type XcmTransferArgs = {
readonly destAddress: string
readonly destAsset: string
readonly destChain: string
readonly bridgeTag?: string
}

export const xcmTransferQuery = (
Expand All @@ -146,6 +147,7 @@ export const xcmTransferQuery = (
destAddress,
destChain,
destAsset,
bridgeTag,
}: XcmTransferArgs,
options?: UseQueryOptions<Transfer>,
) => {
Expand All @@ -162,17 +164,28 @@ export const xcmTransferQuery = (
destAsset,
srcChain,
destChain,
bridgeTag,
],
queryFn: () =>
TransferBuilder(wallet)
queryFn: async () => {
const builder = TransferBuilder(wallet)
.withAsset(srcAsset)
.withSource(srcChain)
.withDestination(destChain)
.build({
srcAddress: srcAddress,
dstAddress: destAddress,
dstAsset: destAsset,
}),

// Do not pass invalid/stale dest asset
const validDstAsset = builder.routes.some(
(r) => r.destination.asset.key === destAsset,
)
? destAsset
: undefined

return builder.build({
srcAddress,
dstAddress: destAddress,
dstAsset: validDstAsset,
tag: bridgeTag,
})
},
enabled:
!!srcAddress &&
!!destAddress &&
Expand Down
6 changes: 6 additions & 0 deletions apps/main/src/i18n/locales/en/xcm.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,12 @@
"approve.title": "Approve spending cap",
"approve.toast.submitted": "Approving {{ amount, number }} {{ symbol }} spending cap on {{ srcChain }}",
"approve.toast.success": "Approved {{ amount, number }} {{ symbol }} spending cap on {{ srcChain }}",
"approve.pending.title": "Approval Pending",
"approve.pending.description": "Your approval transaction is being confirmed on the blockchain.",
"bridge.wormhole": "Wormhole",
"bridge.snowbridge": "Snowbridge",
"bridge.basejump": "Basejump",
"bridge.selector.label": "Via",
"chainAssetSelect.button.selectAssetChain": "Select asset & chain",
"chainAssetSelect.emptyState.noAssets": "No assets found",
"chainAssetSelect.modal.title": "Chain & asset",
Expand Down Expand Up @@ -45,6 +49,8 @@
"report.destFee.insufficientBalance": "You need to have at least {{ amount, number }} {{ symbol }} on {{ chain }}",
"report.asset.frozen": "Your account on {{ chain }} has frozen balance for {{ symbol }}",
"report.account.insufficientDeposit": "You need to have {{ amount, number }} {{ symbol }} on {{ chain }} for existential deposit",
"journey.fastDelivery": "fast delivery",
"journey.delivered": "Delivered",
"journey.status.sent": "In Progress",
"journey.status.pending": "In Progress",
"journey.status.received": "Completed",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import {
Modal,
ModalBody,
ModalFooter,
ModalHeader,
Stepper,
} from "@galacticcouncil/ui/components"
import { useEffect, useState } from "react"
import React, { useEffect, useState } from "react"
import { useTranslation } from "react-i18next"
import { isFunction, omit } from "remeda"

Expand Down Expand Up @@ -41,6 +42,7 @@ export const ReviewMultiTransaction: React.FC<ReviewMultiTransactionProps> = ({
const [resolvedTx, setResolvedTx] = useState<AnyTransaction | null>(null)
const [resolvedConfig, setResolvedConfig] =
useState<TransactionCommon | null>(null)
const [isPendingResolution, setIsPendingResolution] = useState(false)
const [isLoading, setIsLoading] = useState(false)
const [isLastSubmitted, setIsLastSubmitted] = useState(false)
const [hasUserClosedModal, setHasUserClosedModal] = useState(false)
Expand All @@ -63,12 +65,15 @@ export const ReviewMultiTransaction: React.FC<ReviewMultiTransactionProps> = ({
const tx = currentBaseConfig.tx

if (isFunction(tx)) {
setIsPendingResolution(true)
const previousResults = transactionResults.slice(0, currentIndex)
Promise.resolve(tx(previousResults)).then((resolved) => {
setIsPendingResolution(false)
setResolvedTx(resolved.tx)
setResolvedConfig(omit(resolved, ["tx"]))
})
} else {
setIsPendingResolution(false)
setResolvedTx(tx)
setResolvedConfig(null)
}
Expand Down Expand Up @@ -138,6 +143,9 @@ export const ReviewMultiTransaction: React.FC<ReviewMultiTransactionProps> = ({

const { title, description } = currentConfig

const PendingComponent =
isPendingResolution && currentBaseConfig?.pendingComponent

return (
<TransactionProvider key={currentConfig.id} transaction={currentConfig}>
<Modal
Expand Down Expand Up @@ -169,7 +177,13 @@ export const ReviewMultiTransaction: React.FC<ReviewMultiTransactionProps> = ({
title={title ?? t("transaction.title")}
description={description ?? t("transaction.description")}
/>
<ReviewTransactionContent />
{PendingComponent ? (
<ModalBody>
<PendingComponent />
</ModalBody>
) : (
<ReviewTransactionContent />
)}
<ModalFooter justify="space-between">
<ReviewTransactionFooter closable={isClosable} />
</ModalFooter>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
Text,
} from "@galacticcouncil/ui/components"
import { getToken } from "@galacticcouncil/ui/utils"
import { HYDRATION_CHAIN_KEY } from "@galacticcouncil/utils"
import { HYDRATION_CHAIN_KEY, isValidBigSource } from "@galacticcouncil/utils"
import {
useAccount,
useActiveMultisigConfig,
Expand Down Expand Up @@ -135,19 +135,26 @@ const XcmSummary = () => {
const srcChain = chainsMap.get(meta.srcChainKey)

const isPolkadotEcosystem = srcChain?.ecosystem === ChainEcosystem.Polkadot

return (
<Stack
separated
separator={<RowSeparator />}
sx={{ mb: "var(--modal-content-inset)" }}
>
<SummaryRow
label={t("transaction.summary.srcFee.label")}
content={t("currency", {
value: meta.srcChainFee,
symbol: meta.srcChainFeeSymbol,
})}
/>
{!!meta.srcChainFee && (
<SummaryRow
label={t("transaction.summary.srcFee.label")}
content={
isValidBigSource(meta.srcChainFee)
? t("currency", {
value: meta.srcChainFee,
symbol: meta.srcChainFeeSymbol,
})
: meta.srcChainFee
}
/>
)}
{Big(meta.dstChainFee || "0").gt(0) && (
<SummaryRow
label={t("transaction.summary.destFee.label")}
Expand Down
4 changes: 2 additions & 2 deletions apps/main/src/modules/xcm/XcmPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ export const XcmPage = () => {
const address = account?.address ?? ""

const claimable = useClaimableTransactions()
const { data: all, dataUpdatedAt } = useXcScan(address)
const { data: all, isLoading: isLoadingXcScan } = useXcScan(address)

const isLoading = !!account && dataUpdatedAt === 0
const isLoading = !!account && isLoadingXcScan
const isTwoColTemplate = !!account && (all.length > 0 || isLoading)

return (
Expand Down
39 changes: 34 additions & 5 deletions apps/main/src/modules/xcm/history/XcJourneyCard.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {
ArrowRight,
JetSki,
QuestionCircleRegular,
} from "@galacticcouncil/ui/assets/icons"
import {
Expand All @@ -13,7 +14,7 @@ import {
Text,
} from "@galacticcouncil/ui/components"
import { getToken } from "@galacticcouncil/ui/utils"
import { xcscan } from "@galacticcouncil/utils"
import { basejumpscan, xcscan } from "@galacticcouncil/utils"
import type { XcJourney } from "@galacticcouncil/xc-scan"
import Big from "big.js"
import { useTranslation } from "react-i18next"
Expand All @@ -23,6 +24,7 @@ import { ClaimButton } from "@/modules/xcm/history/components/ClaimButton"
import { JourneyAssetLogo } from "@/modules/xcm/history/components/JourneyAssetLogo"
import { JourneyChainLogo } from "@/modules/xcm/history/components/JourneyChainLogo"
import { JourneyDate } from "@/modules/xcm/history/components/JourneyDate"
import { JourneyProtocol } from "@/modules/xcm/history/components/JourneyProtocol"
import { JourneyStatus } from "@/modules/xcm/history/components/JourneyStatus"
import { usePendingClaimsStore } from "@/modules/xcm/history/hooks/usePendingClaimsStore"
import {
Expand All @@ -35,8 +37,15 @@ import { isOptimisticJourney } from "@/modules/xcm/history/utils/optimistic"
import { toDecimal } from "@/utils/formatting"

export const XcJourneyCard: React.FC<XcJourney> = (journey) => {
const { origin, destination, sentAt, correlationId, status, totalUsd } =
journey
const {
origin,
destination,
sentAt,
correlationId,
status,
totalUsd,
originProtocol,
} = journey
const { t } = useTranslation(["common", "xcm"])
const { pendingCorrelationIds } = usePendingClaimsStore()

Expand All @@ -45,7 +54,10 @@ export const XcJourneyCard: React.FC<XcJourney> = (journey) => {
const transferAsset = getTransferAsset(journey)
const { from, to } = getFormattedAddresses(journey)

const link = xcscan.tx(correlationId)
const link =
originProtocol === "basejump"
? basejumpscan.tx(correlationId)
: xcscan.tx(correlationId)

const isNotPending = !pendingCorrelationIds.includes(journey.correlationId)
const isClaimable = isNotPending && isJourneyClaimable(journey)
Expand Down Expand Up @@ -88,8 +100,25 @@ export const XcJourneyCard: React.FC<XcJourney> = (journey) => {
</Flex>

{sentAt && (
<Flex align="center" justify="space-between" ml="auto">
<Flex
direction={["column", "row"]}
align={["flex-end", "center"]}
gap={["xs", "m"]}
justify="space-between"
ml="auto"
>
{originProtocol === "basejump" && (
<Flex gap="s">
<Icon
component={JetSki}
size="m"
color={getToken("colors.skyBlue.600")}
/>
<JourneyProtocol fs="p5" protocol={originProtocol} />
</Flex>
)}
<JourneyDate
truncate
timestamp={sentAt}
fs="p5"
color={getToken("text.medium")}
Expand Down
14 changes: 8 additions & 6 deletions apps/main/src/modules/xcm/history/XcScanHistoryTable.columns.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
Text,
} from "@galacticcouncil/ui/components"
import { getToken } from "@galacticcouncil/ui/utils"
import { stringEquals, xcscan } from "@galacticcouncil/utils"
import { basejumpscan, stringEquals, xcscan } from "@galacticcouncil/utils"
import type { XcJourney } from "@galacticcouncil/xc-scan"
import { createColumnHelper } from "@tanstack/react-table"
import Big from "big.js"
Expand Down Expand Up @@ -188,7 +188,7 @@ export const useXcScanHistoryColumns = () => {

const durationMs = recvAt - sentAt

if (durationMs < 0) {
if (durationMs <= 0) {
return null
}

Expand All @@ -203,11 +203,13 @@ export const useXcScanHistoryColumns = () => {
const actionColumn = columnHelper.display({
id: XcScanHistoryTableColumnId.Action,
cell: ({ row }) => {
const link = xcscan.tx(row.original.correlationId)
const { correlationId, originProtocol } = row.original
const link =
originProtocol === "basejump"
? basejumpscan.tx(correlationId)
: xcscan.tx(correlationId)

const isNotPending = !pendingCorrelationIds.includes(
row.original.correlationId,
)
const isNotPending = !pendingCorrelationIds.includes(correlationId)
const isClaimable = isNotPending && isJourneyClaimable(row.original)

return (
Expand Down
11 changes: 5 additions & 6 deletions apps/main/src/modules/xcm/history/XcScanJourneyList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,12 @@ export const XcScanJourneyList = ({ data, pageSize = 10 }: Props) => {
{paginatedData.map((journey) => (
<XcJourneyCard key={journey.correlationId} {...journey} />
))}
<Pagination
totalPages={totalPages}
currentPage={currentPage}
onPageChange={handlePageChange}
/>
</Stack>

<Pagination
totalPages={totalPages}
currentPage={currentPage}
onPageChange={handlePageChange}
/>
</Stack>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,13 @@ const JourneyCardSkeleton = () => {

export const XcScanJourneyListSkeleton = () => {
return (
<Stack gap="base" maxWidth="6xl" width="100%" mx="auto">
<Stack
gap="base"
maxWidth="6xl"
width="100%"
mx="auto"
justify="flex-start"
>
{Array.from({ length: 4 }, (_, i) => (
<JourneyCardSkeleton key={i} />
))}
Expand Down
27 changes: 27 additions & 0 deletions apps/main/src/modules/xcm/history/hooks/useXcmBridgeTxStore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { create } from "zustand"
import { persist } from "zustand/middleware"

export type XcmBridgeTxEntry = {
bridgeProvider: string
/** Intended destination chain URN (may differ from xc-scan's tracked destination) */
destUrn?: string
}

type XcmBridgeTxStore = {
/** Maps originTxPrimary (txHash on source chain) → entry */
entries: Record<string, XcmBridgeTxEntry>
addEntry: (txHash: string, entry: XcmBridgeTxEntry) => void
}

export const useXcmBridgeTxStore = create<XcmBridgeTxStore>()(
persist(
(set) => ({
entries: {},
addEntry: (txHash, entry) =>
set((state) => ({
entries: { ...state.entries, [txHash]: entry },
})),
}),
{ name: "xcm-bridge-tx-store", version: 2 },
),
)
1 change: 1 addition & 0 deletions apps/main/src/modules/xcm/history/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export { useBasejumpScanSubscription } from "./useBasejumpScan"
export { useXcScanSubscription } from "./useXcScan"
export { XcScanHistory } from "./XcScanHistory"
export { xcStore } from "./xcScanStore"
Loading
Loading