Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
eccce0f
add workflow (#41)
TaprootFreak Sep 9, 2025
007bc99
Select but dont work (#39) (#43)
TaprootFreak Sep 9, 2025
ac7d7f9
Trading mechanism without Uniswap API
Danswar Sep 9, 2025
e722543
color and logo rebranding
lapatric Sep 11, 2025
1cf27de
copy rebrand: Uniswap -> JuiceSwap
lapatric Sep 12, 2025
1c3b4ba
update hardcoded naming
lapatric Sep 12, 2025
4076108
remove dropdown menu
lapatric Sep 12, 2025
e7235b3
[NO-TASK]: TX state (#60)
Danswar Sep 12, 2025
1a355bb
[NO-TASK]: TFC listing (#62)
Danswar Sep 12, 2025
8744344
[NO-TASK]: Fix multi-hop routing (#63)
Danswar Sep 12, 2025
f3083d3
configure URLs and components
lapatric Sep 12, 2025
a72ac4e
more naming and URL changes
lapatric Sep 12, 2025
2515c7b
update social media preview image for JuiceSwap branding (#64)
TaprootFreak Sep 12, 2025
c8dac85
feat: update social media icon hover colors to Citrea yellow (#65)
TaprootFreak Sep 12, 2025
7dcfc06
fix: handle undefined locale to prevent runtime errors (#61)
TaprootFreak Sep 12, 2025
8d44e66
fix: prevent settings menu crash when languageInfo is undefined (#72)
TaprootFreak Sep 15, 2025
402a440
feat: update landing page copy to emphasize Citrea branding (#73)
NoahPay Sep 16, 2025
92ba26c
[NO-TASK]: Configure V3-only routing as default (#70)
TaprootFreak Sep 16, 2025
64634fe
[NO-TASK]: Add custom crypto token backgrounds (#71)
TaprootFreak Sep 16, 2025
5882bdd
Add Brand Assets link to footer (#66)
TaprootFreak Sep 16, 2025
9a8862e
Remove footer navigation sections (#67)
TaprootFreak Sep 16, 2025
9957622
FAQ-Sektion hinzugefügt (#76)
NoahPay Sep 16, 2025
2c56405
Add Open Graph meta tags for social media previews
TaprootFreak Sep 16, 2025
ff80a7d
Fix Twitter meta tags to use 'name' instead of 'property'
TaprootFreak Sep 16, 2025
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
4 changes: 1 addition & 3 deletions .github/workflows/tag_and_release.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
name: "Tag and release"
on:
push:
branches:
- 'main'
workflow_dispatch:

jobs:
deploy-to-prod:
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/web-dev.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: JuiceSwap Web DEV CI/CD

on:
push:
branches: [develop]
paths:
- 'apps/web/**'
- 'packages/**'
- 'yarn.lock'
- 'package.json'
workflow_dispatch:

env:
AZURE_ACCOUNT_NAME: 'stjswappdev'
AZURE_CDN_PROFILE: 'afd-dfx-api-dev'
AZURE_CDN_ENDPOINT: 'fde-jsw-swp-dev'
AZURE_RESOURCE_GROUP: 'rg-dfx-api-dev'

jobs:
build-and-deploy:
name: Build and deploy Web App to DEV
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22.13.1'
cache: 'yarn'
cache-dependency-path: yarn.lock

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Build web app
run: yarn web build:production
env:
NODE_ENV: production

- name: Log in to Azure
uses: azure/login@v2
with:
creds: ${{ secrets.AZURE_DEV_CREDENTIALS }}

- name: Upload to Azure Storage
uses: azure/CLI@v2
with:
inlineScript: |
az storage blob upload-batch --account-name ${{ env.AZURE_ACCOUNT_NAME }} -d '$web' -s ./apps/web/build --overwrite
51 changes: 51 additions & 0 deletions .github/workflows/web-prd.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: JuiceSwap Web PRODUCTION CI/CD

on:
push:
branches: [main]
paths:
- 'apps/web/**'
- 'packages/**'
- 'yarn.lock'
- 'package.json'
workflow_dispatch:

env:
AZURE_ACCOUNT_NAME: 'stjswappprd'
AZURE_CDN_PROFILE: 'afd-dfx-api-prd'
AZURE_CDN_ENDPOINT: 'fde-jsw-swp-prd'
AZURE_RESOURCE_GROUP: 'rg-dfx-api-prd'

jobs:
build-and-deploy:
name: Build and deploy Web App to PRODUCTION
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22.13.1'
cache: 'yarn'
cache-dependency-path: yarn.lock

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Build web app
run: yarn web build:production
env:
NODE_ENV: production

- name: Log in to Azure
uses: azure/login@v2
with:
creds: ${{ secrets.AZURE_PRD_CREDENTIALS }}

- name: Upload to Azure Storage
uses: azure/CLI@v2
with:
inlineScript: |
az storage blob upload-batch --account-name ${{ env.AZURE_ACCOUNT_NAME }} -d '$web' -s ./apps/web/build --overwrite
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export function RemoveRecoveryPhraseVerify(): JSX.Element {
await Keyring.removePassword()

await removeAllDappConnectionsFromExtension()
await dispatch(setIsTestnetModeEnabled(false))
await dispatch(setIsTestnetModeEnabled())

await dispatch(
editAccountActions.trigger({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ export function SettingsScreen(): JSX.Element {
await fireAnalytic()
}

dispatch(setIsTestnetModeEnabled(isChecked))
dispatch(setIsTestnetModeEnabled())
setIsTestnetModalOpen(isChecked)

// trigger after toggling off (ie enabling analytics)
Expand Down
Binary file modified apps/extension/src/assets/icon128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/extension/src/assets/icon16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/extension/src/assets/icon32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/extension/src/assets/icon48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/extension/src/assets/icon64.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 10 additions & 6 deletions apps/extension/src/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export function TestnetSwitchModal({ route }: AppStackScreenProp<typeof ModalNam

const onToggleTestnetMode = (): void => {
onClose()
dispatch(setIsTestnetModeEnabled(switchToMode === 'testnet'))
dispatch(setIsTestnetModeEnabled())

sendAnalyticsEvent(WalletEventName.TestnetModeToggled, {
enabled: switchToMode === 'testnet',
Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/src/screens/Onboarding/LandingScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export function LandingScreen({ navigation }: Props): JSX.Element {
// Disables testnet mode on mount if enabled (eg upon removing a wallet)
useEffect(() => {
if (isTestnetModeEnabled) {
dispatch(setIsTestnetModeEnabled(false))
dispatch(setIsTestnetModeEnabled())
}
}, [dispatch, isTestnetModeEnabled])

Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/src/screens/SettingsScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ export function SettingsScreen(): JSX.Element {
navigation.navigate(ModalName.TestnetMode, {})
}

dispatch(setIsTestnetModeEnabled(newIsTestnetMode))
dispatch(setIsTestnetModeEnabled())

// trigger after toggling off (ie enabling analytics)
if (!newIsTestnetMode) {
Expand Down
3 changes: 2 additions & 1 deletion apps/web/.env
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ REACT_APP_STATSIG_API_KEY="statsig_api_key"
REACT_APP_STATSIG_PROXY_URL="https://interface.gateway.uniswap.org/v1/statsig-proxy"
REACT_APP_TEMP_API_URL="https://temp.gateway.uniswap.org/v1"
REACT_APP_UNISWAP_BASE_API_URL="https://interface.gateway.uniswap.org"
REACT_APP_UNISWAP_GATEWAY_DNS="https://interface.gateway.uniswap.org/v2"
REACT_APP_UNISWAP_GATEWAY_DNS="https://dev.api.juiceswap.xyz"
REACT_APP_WALLET_CONNECT_PROJECT_ID="c6c9bacd35afa3eb9e6cccf6d8464395"
REACT_APP_TRADING_API_KEY="TRADING_API_KEY"
REACT_APP_CUSTOM_QUOTE_API_URL="https://dev.api.juiceswap.xyz"
REACT_APP_IS_UNISWAP_INTERFACE=true
4 changes: 4 additions & 0 deletions apps/web/.env.production
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@
REACT_APP_AWS_API_ENDPOINT="https://interface.gateway.uniswap.org/v1/graphql"
REACT_APP_INFURA_KEY="099fc58e0de9451d80b18d7c74caa7c1"
REACT_APP_ANALYTICS_ENABLED=true
REACT_APP_CUSTOM_QUOTE_API_URL="https://api.juiceswap.xyz"
REACT_APP_UNISWAP_GATEWAY_DNS="https://api.juiceswap.xyz"
REACT_APP_TRADING_API_KEY="TRADING_API_KEY"
REACT_APP_IS_UNISWAP_INTERFACE=true
2 changes: 1 addition & 1 deletion apps/web/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co

## Project Overview

This is the Uniswap Web Interface - a React-based decentralized exchange application that's part of the Uniswap Universe monorepo. The web app enables users to swap tokens, provide liquidity, and interact with the Uniswap protocol across multiple blockchain networks.
This is the JuiceSwap Web Interface - a React-based decentralized exchange application that's part of the JuiceSwap Universe monorepo. The web app enables users to swap tokens, provide liquidity, and interact with the JuiceSwap protocol across multiple blockchain networks.

## Essential Development Commands

Expand Down
16 changes: 8 additions & 8 deletions apps/web/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Uniswap Labs Web Interface
# JuiceSwap Labs Web Interface

## Accessing the Uniswap Interface
## Accessing the JuiceSwap Interface

To access the Uniswap Interface, use an IPFS gateway link from the
To access the JuiceSwap Interface, use an IPFS gateway link from the
[latest release](https://github.com/Uniswap/uniswap-interface/releases/latest),
or visit [app.uniswap.org](https://app.uniswap.org).

Expand Down Expand Up @@ -35,16 +35,16 @@ yarn web i18n:download

Which will download the translations to `./apps/web/src/i18n/locales/translations`.

## Accessing Uniswap V2
## Accessing JuiceSwap V2

The Uniswap Interface supports swapping, adding liquidity, removing liquidity and migrating liquidity for Uniswap protocol V2.
The JuiceSwap Interface supports swapping, adding liquidity, removing liquidity and migrating liquidity for JuiceSwap protocol V2.

- Swap on Uniswap V2: <https://app.uniswap.org/swap?use=v2>
- Swap on JuiceSwap V2: <https://app.uniswap.org/swap?use=v2>
- View V2 liquidity: <https://app.uniswap.org/pools/v2>
- Add V2 liquidity: <https://app.uniswap.org/add/v2>
- Migrate V2 liquidity to V3: <https://app.uniswap.org/migrate/v2>

## Accessing Uniswap V1
## Accessing JuiceSwap V1

The Uniswap V1 interface for mainnet and testnets is accessible via IPFS gateways
The JuiceSwap V1 interface for mainnet and testnets is accessible via IPFS gateways
linked from the [v1.0.0 release](https://github.com/Uniswap/uniswap-interface/releases/tag/v1.0.0).
2 changes: 1 addition & 1 deletion apps/web/functions/[[index]].ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export const onRequest: PagesFunction = async ({ request, next }) => {
const requestURL = new URL(request.url)
const imageUri = requestURL.origin + '/images/1200x630_Rich_Link_Preview_Image.png'
const data = {
title: 'Uniswap Interface',
title: 'JuiceSwap Interface',
image: imageUri,
url: request.url,
description:
Expand Down
2 changes: 1 addition & 1 deletion apps/web/functions/api/image/pools/[[index]].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ export const onRequest: PagesFunction = async ({ params, request, env }) => {
>
{data.poolData?.feeTier}
</div>
<img src={WATERMARK_URL} alt="Uniswap" height="72px" width="324px" />
<img src={WATERMARK_URL} alt="JuiceSwap" height="72px" width="324px" />
</div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/functions/api/image/tokens/[[index]].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export const onRequest: PagesFunction = async ({ params, request, env }) => {
>
{data.tokenData?.symbol}
</div>
<img src={WATERMARK_URL} alt="Uniswap" height="72px" width="324px" />
<img src={WATERMARK_URL} alt="JuiceSwap" height="72px" width="324px" />
</div>
</div>
</div>
Expand Down
8 changes: 4 additions & 4 deletions apps/web/functions/default.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const defaultUrls = ['http://127.0.0.1:3000/', 'http://127.0.0.1:3000/swap', 'ht

test.each(defaultUrls)('should inject metadata for valid collections', async (defaultUrl) => {
const body = await fetch(new Request(defaultUrl)).then((res) => res.text())
expect(body).toContain(`<meta property="og:title" content="Uniswap Interface"`)
expect(body).toContain(`<meta property="og:title" content="JuiceSwap Interface"`)
expect(body).toContain(
`<meta property="og:description" content="Swap crypto on Ethereum, Base, Arbitrum, Polygon, Unichain and more. The DeFi platform trusted by millions."`,
)
Expand All @@ -15,11 +15,11 @@ test.each(defaultUrls)('should inject metadata for valid collections', async (de
expect(body).toContain(`<meta property="og:image:width" content="1200"`)
expect(body).toContain(`<meta property="og:image:height" content="630"`)
expect(body).toContain(`<meta property="og:type" content="website"`)
expect(body).toContain(`<meta property="og:image:alt" content="Uniswap Interface"`)
expect(body).toContain(`<meta property="og:image:alt" content="JuiceSwap Interface"`)
expect(body).toContain(`<meta property="twitter:card" content="summary_large_image"`)
expect(body).toContain(`<meta property="twitter:title" content="Uniswap Interface"`)
expect(body).toContain(`<meta property="twitter:title" content="JuiceSwap Interface"`)
expect(body).toContain(
`<meta property="twitter:image" content="http://127.0.0.1:3000/images/1200x630_Rich_Link_Preview_Image.png"`,
)
expect(body).toContain(`<meta property="twitter:image:alt" content="Uniswap Interface"`)
expect(body).toContain(`<meta property="twitter:image:alt" content="JuiceSwap Interface"`)
})
8 changes: 4 additions & 4 deletions apps/web/functions/explore/pools/pool.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,19 @@ test.each(pools)('should inject metadata for valid pools', async (pool) => {
const url = 'http://127.0.0.1:3000/explore/pools/' + pool.network + '/' + pool.address
const body = await fetch(new Request(url)).then((res) => res.text())
expect(body).toMatchSnapshot()
expect(body).toContain(`<meta property="og:title" content="${pool.name} on Uniswap" data-rh="true">`)
expect(body).toContain(`<meta property="og:title" content="${pool.name} on JuiceSwap" data-rh="true">`)
expect(body).not.toContain(`<meta property="og:description"`)
expect(body).not.toContain(`<meta name="description"`)
expect(body).toContain(`<meta property="og:image" content="${pool.image}" data-rh="true">`)
expect(body).toContain(`<meta property="og:image:width" content="1200" data-rh="true">`)
expect(body).toContain(`<meta property="og:image:height" content="630" data-rh="true">`)
expect(body).toContain(`<meta property="og:type" content="website" data-rh="true">`)
expect(body).toContain(`<meta property="og:url" content="${url}" data-rh="true">`)
expect(body).toContain(`<meta property="og:image:alt" content="${pool.name} on Uniswap" data-rh="true">`)
expect(body).toContain(`<meta property="og:image:alt" content="${pool.name} on JuiceSwap" data-rh="true">`)
expect(body).toContain(`<meta property="twitter:card" content="summary_large_image" data-rh="true">`)
expect(body).toContain(`<meta property="twitter:title" content="${pool.name} on Uniswap" data-rh="true">`)
expect(body).toContain(`<meta property="twitter:title" content="${pool.name} on JuiceSwap" data-rh="true">`)
expect(body).toContain(`<meta property="twitter:image" content="${pool.image}" data-rh="true">`)
expect(body).toContain(`<meta property="twitter:image:alt" content="${pool.name} on Uniswap" data-rh="true">`)
expect(body).toContain(`<meta property="twitter:image:alt" content="${pool.name} on JuiceSwap" data-rh="true">`)
})

const invalidPools = [
Expand Down
10 changes: 6 additions & 4 deletions apps/web/functions/explore/tokens/token.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ test.each(tokens)('should inject metadata for valid tokens', async (token) => {
const url = 'http://127.0.0.1:3000/explore/tokens/' + token.network + '/' + token.address
const body = await fetch(new Request(url)).then((res) => res.text())
expect(body).toMatchSnapshot()
expect(body).toContain(`<meta property="og:title" content="Get ${token.tokenData.symbol} on Uniswap" data-rh="true">`)
expect(body).toContain(
`<meta property="og:title" content="Get ${token.tokenData.symbol} on JuiceSwap" data-rh="true">`,
)
expect(body).not.toContain(`<meta property="og:description"`)
expect(body).not.toContain(`<meta name="description"`)
expect(body).toContain(`<meta property="og:image" content="${token.image}" data-rh="true">`)
Expand All @@ -40,15 +42,15 @@ test.each(tokens)('should inject metadata for valid tokens', async (token) => {
expect(body).toContain(`<meta property="og:type" content="website" data-rh="true">`)
expect(body).toContain(`<meta property="og:url" content="${url}" data-rh="true">`)
expect(body).toContain(
`<meta property="og:image:alt" content="Get ${token.tokenData.symbol} on Uniswap" data-rh="true">`,
`<meta property="og:image:alt" content="Get ${token.tokenData.symbol} on JuiceSwap" data-rh="true">`,
)
expect(body).toContain(`<meta property="twitter:card" content="summary_large_image" data-rh="true">`)
expect(body).toContain(
`<meta property="twitter:title" content="Get ${token.tokenData.symbol} on Uniswap" data-rh="true">`,
`<meta property="twitter:title" content="Get ${token.tokenData.symbol} on JuiceSwap" data-rh="true">`,
)
expect(body).toContain(`<meta property="twitter:image" content="${token.image}" data-rh="true">`)
expect(body).toContain(
`<meta property="twitter:image:alt" content="Get ${token.tokenData.symbol} on Uniswap" data-rh="true">`,
`<meta property="twitter:image:alt" content="Get ${token.tokenData.symbol} on JuiceSwap" data-rh="true">`,
)
})

Expand Down
2 changes: 1 addition & 1 deletion apps/web/functions/utils/getPool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export default async function getPool({
const token0 = data.token0
const token1 = data.token1
const name = `${token0?.symbol}/${token1?.symbol}`
const title = `${name} on Uniswap`
const title = `${name} on JuiceSwap`

const formattedAsset: Data = {
title,
Expand Down
Loading