diff --git a/webapp/components/customTunnelsThroughPartner/index.tsx b/webapp/components/customTunnelsThroughPartner/index.tsx
new file mode 100644
index 00000000..5a794a46
--- /dev/null
+++ b/webapp/components/customTunnelsThroughPartner/index.tsx
@@ -0,0 +1,63 @@
+import { Drawer, DrawerParagraph, DrawerTitle } from 'components/drawer'
+import { ExternalLink } from 'components/externalLink'
+import hemiSocials from 'hemi-socials'
+import { hemiMainnet } from 'networks/hemiMainnet'
+import { mainnet } from 'networks/mainnet'
+import { useTranslations } from 'next-intl'
+import { Token } from 'types/token'
+import { CloseIcon } from 'ui-common/components/closeIcon'
+import { isEvmToken } from 'utils/token'
+
+import { Stargate } from './stargate'
+
+const customTunnelTokens = ['USDC', 'USDT']
+
+export const tunnelsThroughPartner = (token: Token) =>
+ customTunnelTokens.includes(token.symbol) &&
+ isEvmToken(token) &&
+ [hemiMainnet.id, mainnet.id].includes(token.chainId)
+
+type Props = {
+ onClose: () => void
+ operation: 'deposit' | 'withdraw'
+ token: Token
+}
+
+export const CustomTunnelsThroughPartner = function ({
+ onClose,
+ operation,
+ token,
+}: Props) {
+ const t = useTranslations('tunnel-page.tunnel-partners')
+
+ return (
+
+
+
+
+ {t(`${operation}.heading`, { symbol: token.symbol })}
+
+
+
+
+ {t(`${operation}.subheading`, { symbol: token.symbol })}
+
+
+
+ {t.rich('description', {
+ contact: (chunk: string) => (
+
+ {chunk}
+
+ ),
+ })}
+
+
+
+ )
+}
diff --git a/webapp/components/customTunnelsThroughPartner/partnerLink.tsx b/webapp/components/customTunnelsThroughPartner/partnerLink.tsx
new file mode 100644
index 00000000..3c2a2f45
--- /dev/null
+++ b/webapp/components/customTunnelsThroughPartner/partnerLink.tsx
@@ -0,0 +1,23 @@
+import { ExternalLink } from 'components/externalLink'
+import { Chevron } from 'components/icons/chevron'
+import { ReactNode } from 'react'
+
+export const PartnerLink = ({
+ icon,
+ text,
+ url,
+}: {
+ icon: ReactNode
+ text: string
+ url: string
+}) => (
+
+ {icon}
+ {text}
+
+
+)
diff --git a/webapp/components/customTunnelsThroughPartner/partnerLogos/stargate.svg b/webapp/components/customTunnelsThroughPartner/partnerLogos/stargate.svg
new file mode 100644
index 00000000..2e431cdc
--- /dev/null
+++ b/webapp/components/customTunnelsThroughPartner/partnerLogos/stargate.svg
@@ -0,0 +1,82 @@
+
diff --git a/webapp/components/customTunnelsThroughPartner/stargate.tsx b/webapp/components/customTunnelsThroughPartner/stargate.tsx
new file mode 100644
index 00000000..b806733b
--- /dev/null
+++ b/webapp/components/customTunnelsThroughPartner/stargate.tsx
@@ -0,0 +1,25 @@
+import Image from 'next/image'
+import { useTranslations } from 'next-intl'
+
+import { PartnerLink } from './partnerLink'
+import stargateLogo from './partnerLogos/stargate.svg'
+
+export const Stargate = function () {
+ const t = useTranslations('tunnel-page.tunnel-partners')
+ return (
+
+ }
+ text={t('tunnel-with-stargate')}
+ // TODO URL is TBD, see https://github.com/hemilabs/ui-monorepo/issues/719
+ url="https://stargate.finance"
+ />
+ )
+}
diff --git a/webapp/components/drawer.tsx b/webapp/components/drawer.tsx
index ea8f6389..779c6b3b 100644
--- a/webapp/components/drawer.tsx
+++ b/webapp/components/drawer.tsx
@@ -39,6 +39,10 @@ export const Drawer = function ({ children, onClose }: Props) {
)
}
+export const DrawerParagraph = ({ children }: { children: string }) => (
+
{children}
+)
+
export const DrawerTitle = ({ children }: { children: string }) => (
{children}
)
diff --git a/webapp/messages/en.json b/webapp/messages/en.json
index f0ea96b9..77769506 100644
--- a/webapp/messages/en.json
+++ b/webapp/messages/en.json
@@ -313,6 +313,19 @@
"withdrawal-proved": "Withdrawal proved",
"withdrawing": "Withdrawing {fromInput} {symbol}",
"withdrawn": "{fromInput} {symbol} withdrawn"
+ },
+ "tunnel-partners": {
+ "deposit": {
+ "heading": "Deposit {symbol}",
+ "subheading": "To deposit {symbol}, you’ll be redirected to one of our trusted partner bridges. Choose a bridge below to continue."
+ },
+ "description": "Once selected, you’ll be redirected to complete your deposit. For assistance,
contact us.",
+ "tunnel-with-our-partners": "Tunnel with our partners",
+ "tunnel-with-stargate": "Tunnel with our partner Stargate",
+ "withdraw": {
+ "heading": "Withdraw {symbol}",
+ "subheading": "To withdraw {symbol}, you’ll be redirected to one of our trusted partner bridges. Choose a bridge below to continue."
+ }
}
}
}
diff --git a/webapp/messages/es.json b/webapp/messages/es.json
index d475736f..6a5f97bc 100644
--- a/webapp/messages/es.json
+++ b/webapp/messages/es.json
@@ -313,6 +313,19 @@
"withdrawal-proved": "Retiro probado",
"withdrawing": "Retirando {fromInput} {symbol}",
"withdrawn": "{fromInput} {symbol} retirado"
+ },
+ "tunnel-partners": {
+ "deposit": {
+ "heading": "Depositar {symbol}",
+ "subheading": "Para depositar {symbol}, será redirigido a uno de nuestros puentes asociados de confianza. Elija un puente a continuación para continuar."
+ },
+ "description": "Una vez seleccionado, será redirigido para completar su depósito. Para asistencia,
contáctenos.",
+ "tunnel-with-our-partners": "Tunelizar con nuestros socios",
+ "tunnel-with-stargate": "Tunelizar con nuestro socio Stargate",
+ "withdraw": {
+ "heading": "Retirar {symbol}",
+ "subheading": "Para retirar {symbol}, será redirigido a uno de nuestros puentes asociados de confianza. Elija un puente a continuación para continuar."
+ }
}
}
}
diff --git a/webapp/tokenList.ts b/webapp/tokenList.ts
index 839ae783..c1dabc3f 100644
--- a/webapp/tokenList.ts
+++ b/webapp/tokenList.ts
@@ -48,6 +48,7 @@ const hemiTokens: Token[] = (hemilabsTokenList.tokens as EvmToken[])
.filter(t => t.chainId === hemiMainnet.id || t.chainId === hemiTestnet.id)
// WETH cannot be tunneled, so we must exclude it
.filter(t => t.symbol !== 'WETH')
+ .map(t => ({ ...t, symbol: t.symbol.replace('.e', '').trim() }))
// the hemiTokens only contains definitions for Hemi tokens, but we can create the L1 version with the extensions field info
const tokens: Token[] = hemiTokens.concat(hemiTokens.flatMap(getRemoteTokens))