Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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: 4 additions & 0 deletions packages/app/next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ module.exports = {
externalDir: true,
},
webpack: (config) => {
config.resolve.alias = {
...config.resolve.alias,
'@react-native-async-storage/async-storage': false,
};
config.externals.push('pino-pretty', 'lokijs', 'encoding', '@duneanalytics/client-sdk');
return config;
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export const lifiDestinationChainIds: Record<number, number[]> = {
[ChainId.ApeChain]: [ChainId.Ethereum, ChainId.ArbitrumOne, ChainId.Superposition],
[ChainId.Superposition]: [ChainId.Ethereum, ChainId.ArbitrumOne, ChainId.ApeChain],
[ChainId.Base]: [ChainId.ArbitrumOne, ChainId.ApeChain, ChainId.Superposition],
[ChainId.Solana]: [ChainId.ArbitrumOne],
};

export const allowedLifiSourceChainIds: number[] = Object.keys(lifiDestinationChainIds).map((id) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
StepToolDetails,
createConfig,
getRoutes,
isSVMAddress,
} from '@lifi/sdk';
import { BigNumber, constants, utils } from 'ethers';
import { NextRequest, NextResponse } from 'next/server';
Expand All @@ -18,7 +19,7 @@ import { ETHER_TOKEN_LOGO, ether } from '../../../constants';
import { ChainId } from '../../../types/ChainId';
import { addressesEqual } from '../../../util/AddressUtils';
import { CrosschainTransfersRouteBase, QueryParams, Token } from './types';
import { isValidLifiTransfer } from './utils';
import { isValidLifiTransfer, solanaNativeTokenAddress } from './utils';

export const LIFI_INTEGRATOR_IDS = {
NORMAL: '_arbitrum',
Expand Down Expand Up @@ -313,14 +314,24 @@ export async function GET(

try {
// Validate parameters
if (!fromToken || !utils.isAddress(fromToken)) {
const isValidFromTokenAddress =
Number(fromChainId) === ChainId.Solana
? fromToken === solanaNativeTokenAddress || (fromToken ? isSVMAddress(fromToken) : false)
: !!fromToken && utils.isAddress(fromToken);

if (!isValidFromTokenAddress) {
return NextResponse.json(
{ message: 'fromToken is not a valid address', data: null },
{ status: 400 },
);
}

if (!toToken || !utils.isAddress(toToken)) {
const isValidToTokenAddress =
Number(toChainId) === ChainId.Solana
? toToken === solanaNativeTokenAddress || (toToken ? isSVMAddress(toToken) : false)
: !!toToken && utils.isAddress(toToken);

if (!isValidToTokenAddress) {
return NextResponse.json(
{ message: 'toToken is not a valid address', data: null },
{ status: 400 },
Expand All @@ -337,7 +348,7 @@ export async function GET(

if (
!isValidLifiTransfer({
fromToken,
fromToken: fromToken ?? undefined,
sourceChainId: Number(fromChainId),
destinationChainId: Number(toChainId),
})
Expand All @@ -363,13 +374,16 @@ export async function GET(
);
}

const normalizedFromToken = fromToken ?? '';
const normalizedToToken = toToken ?? '';

const parameters: RoutesRequest = {
fromAddress,
fromAmount,
fromTokenAddress: fromToken,
fromTokenAddress: normalizedFromToken,
fromChainId: Number(fromChainId),
toChainId: Number(toChainId),
toTokenAddress: toToken,
toTokenAddress: normalizedToToken,
toAddress,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import { addressesEqual } from '../../../util/AddressUtils';
import { CommonAddress, bridgedUsdcToken, commonUsdcToken } from '../../../util/CommonAddressUtils';
import { allowedLifiSourceChainIds, lifiDestinationChainIds } from './constants';

export const solanaNativeTokenAddress = '11111111111111111111111111111111';
export const solanaUsdcTokenAddress = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
export const solanaUsdtTokenAddress = 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB';

export function isLifiTransfer({
sourceChainId,
destinationChainId,
Expand Down Expand Up @@ -59,6 +63,10 @@ export function isValidLifiTransfer({
return true;
}

if (sourceChainId === ChainId.Solana) {
return fromToken === solanaNativeTokenAddress;
}

if (!tokensFromLists) {
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { DisabledFeatures, useArbQueryParams } from '../../hooks/useArbQueryPara
import { useDisabledFeatures } from '../../hooks/useDisabledFeatures';
import { sanitizeQueryParams } from '../../hooks/useNetworks';
import { getAccountType } from '../../util/AccountUtils';
import { isSolanaEnabled } from '../../util/featureFlag';
import { getNetworkName } from '../../util/networks';

export function useSyncConnectedChainToQueryParams() {
Expand All @@ -21,7 +22,13 @@ export function useSyncConnectedChainToQueryParams() {
DisabledFeatures.TRANSFERS_TO_NON_ARBITRUM_CHAINS,
);

const shouldDisableConnectedChainSync = isSolanaEnabled();

const setSourceChainToConnectedChain = useCallback(() => {
if (shouldDisableConnectedChainSync) {
return;
}

if (typeof chain === 'undefined') {
return;
}
Expand All @@ -34,9 +41,13 @@ export function useSyncConnectedChainToQueryParams() {
});

setQueryParams({ sourceChain, destinationChain });
}, [chain, setQueryParams, disableTransfersToNonArbitrumChains]);
}, [chain, setQueryParams, disableTransfersToNonArbitrumChains, shouldDisableConnectedChainSync]);

useEffect(() => {
if (shouldDisableConnectedChainSync) {
return;
}

async function checkCorrectChainForSmartContractWallet() {
if (typeof chain === 'undefined') {
return;
Expand All @@ -61,9 +72,21 @@ export function useSyncConnectedChainToQueryParams() {
}

checkCorrectChainForSmartContractWallet();
}, [address, chain, disconnect, setQueryParams, setSourceChainToConnectedChain, sourceChain]);
}, [
address,
chain,
disconnect,
setQueryParams,
setSourceChainToConnectedChain,
shouldDisableConnectedChainSync,
sourceChain,
]);

useEffect(() => {
if (shouldDisableConnectedChainSync) {
return;
}

if (shouldSync) {
return;
}
Expand All @@ -72,13 +95,24 @@ export function useSyncConnectedChainToQueryParams() {
if (typeof sourceChain === 'undefined' && typeof destinationChain === 'undefined') {
setShouldSync(true);
}
}, [shouldSync, sourceChain, destinationChain]);
}, [destinationChain, shouldDisableConnectedChainSync, shouldSync, sourceChain]);

useEffect(() => {
if (shouldDisableConnectedChainSync) {
return;
}

// When the chain is connected and we should sync, and we haven't synced yet, sync the connected chain to the query params
if (chain && shouldSync && !didSync) {
setSourceChainToConnectedChain();
setDidSync(true);
}
}, [chain, shouldSync, didSync, setQueryParams, setSourceChainToConnectedChain]);
}, [
chain,
didSync,
setQueryParams,
setSourceChainToConnectedChain,
shouldDisableConnectedChainSync,
shouldSync,
]);
}
Loading
Loading