update: remove api and moved to new server

This commit is contained in:
venuswhispers
2024-11-13 10:16:17 -05:00
parent ccaf115181
commit 7b87390012
40 changed files with 210 additions and 3260 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ export const parameters = {
const preview: Preview = {
loaders: [
async () => ({
settings: await (await fetch(`https://bridge-api.layerswap.io/api/settings?version=sandbox`)).json(),
settings: await (await fetch(`${process.env.NEXT_PUBLIC_BACKEND_API}/settings?version=sandbox`)).json(),
}),
],
parameters: {
+1 -1
View File
@@ -8,7 +8,7 @@ export const parameters = {
const preview: Preview = {
loaders: [
async () => ({
settings: await (await fetch(`https://api-bridge.lux.network/settings?version=sandbox`)).json(),
settings: await (await fetch(`${process.env.NEXT_PUBLIC_BACKEND_API}/settings?version=sandbox`)).json(),
}),
],
parameters: {
@@ -1,30 +0,0 @@
import type { NextRequest, NextResponse } from 'next/server'
/**
* get limit data for swap
* /limits/from/fromCurrency/to/toCurrency?version=
*
* @param req { amount, version, params: [source, source_asset, destination, destination_asset] }
* @param res
*/
export async function GET(
req: NextRequest
) {
//const { amount, version, params } = req.query;
//const [source, source_asset, destination, destination_asset] = params as string[];
return Response.json(
{ data: {
manual_min_amount: 0.1,
manual_min_amount_in_usd: 0,
max_amount: 100,
max_amount_in_usd: 0,
wallet_min_amount: 0,
wallet_min_amount_in_usd: 0
}},
{
status: 200,
}
)
}
@@ -1,71 +0,0 @@
import type { NextRequest } from 'next/server';
import { getTokenPrice } from "@/util/tokenHelper";
// https://github.com/vercel/next.js/discussions/62725
export const dynamic = 'force-dynamic'
/**
* get quote swap information
* api/quote?source_network=&source_token=&destination_network=&destination_token=&amount=&refuel=&use_deposit_address=
* @param req
* @param res
* @returns
*/
export async function GET(
req: NextRequest,
) {
// source_network=ETHEREUM_SEPOLIA&source_token=USDC&destination_network=ARBITRUM_SEPOLIA&destination_token=USDC&amount=1.245766&refuel=false&use_deposit_address=false
try {
const searchParams = req.nextUrl.searchParams
const source_token = searchParams.get('source_token')!
const destination_token = searchParams.get('destination_token')!
const amount = searchParams.get('amount')!
/*
const {
source_network,
source_token,
destination_network,
destination_token,
amount,
refuel,
use_deposit_address,
} = req.query;
*/
const [sourcePrice, destinationPrice] = await Promise.all([
getTokenPrice(String(source_token)),
getTokenPrice(String(destination_token))
]);
return Response.json(
{
data: {
quote: {
receive_amount: Number(amount) * sourcePrice / destinationPrice,
min_receive_amount: 0.975,
blockchain_fee: 0.145766, //we need to estimate blockchain fee.
service_fee: 0.01, //our bridge service fee is 1%. or We should make no fee for our bridge currently.
avg_completion_time: "00:00:47.4595530", // it should be about 20 min for btc, and 3 ~ 4 mins for evm chains.
refuel_in_source: null,
slippage: 0.025,
total_fee: 0.245766,
total_fee_in_usd: 0.245766,
},
refuel: null,
reward: {},
}
},
{
status: 200,
}
)
}
catch (error: any) {
console.error("Error in fetching destinations", error);
return new Response(null, {status: 500, statusText: error.message ?? "Error in fetching destinations"})
}
}
@@ -1,54 +0,0 @@
import type { NextRequest, NextResponse } from 'next/server'
import { getTokenPrice } from "@/util/tokenHelper";
/**
* get rate information for the swap
* /rate/source_network/source_asset/destination_network/destination_asset?amount=&version=
* @param req
* @param res
*/
export default async function handler(
req: NextRequest,
res: NextResponse<{
data: {
wallet_fee_in_usd: number,
wallet_fee: number,
wallet_receive_amount: number,
manual_fee_in_usd: number,
manual_fee: number,
manual_receive_amount: number,
avg_completion_time: {
total_minutes: number,
total_seconds: number,
total_hours: number
},
fee_usd_price: number
}
}>
) {
const { amount, version, params } = req.query;
const [source, source_asset, destination, destination_asset] = params as string[];
const [sourcePrice, destinationPrice] = await Promise.all([
getTokenPrice(source_asset),
getTokenPrice(destination_asset)
]);
res.status(200).json({
data: {
wallet_fee_in_usd: 10,
wallet_fee: 0.1,
wallet_receive_amount: Number(amount),
manual_fee_in_usd: 0,
manual_fee: 0,
manual_receive_amount: Number(amount) * sourcePrice / destinationPrice,
avg_completion_time: {
total_minutes: 2,
total_seconds: 0,
total_hours: 0,
},
fee_usd_price: 10,
}
});
}
-14
View File
@@ -1,14 +0,0 @@
import type { NextRequest } from 'next/server';
import { mainnetSettings, testnetSettings } from "@/settings";
export async function GET (
req: NextRequest,
) {
// const versionFromQuery = req.query.version as string;
// const isMainnet =
// versionFromQuery === "mainnet" ||
// process.env.NEXT_PUBLIC_API_VERSION === "mainnet";
// const settings = isMainnet ? mainnetSettings : testnetSettings;
return Response.json(mainnetSettings, {status: 200})
}
+3 -3
View File
@@ -1,16 +1,16 @@
'use client';
import React from 'react';
import AuthWizard from '@/components/Wizard/AuthWizard';
import getBridgeSettings from '@/util/getBridgeSettings';
import { redirect } from 'next/navigation';
import { useSettingsContainer } from '@/context/settings';
import { FormWizardProvider } from '@/context/formWizardProvider';
import { AuthStep } from '@/Models/Wizard';
import AuthWizard from '@/components/Wizard/AuthWizard';
import { SwapDataProvider } from '@/context/swap';
import { BridgeAppSettings } from '@/Models/BridgeAppSettings';
import getBridgeSettings from '@/util/getBridgeSettings';
const AuthPage: React.FC = async () => {
const AuthPage = async () => {
try {
const settings = await getBridgeSettings();
const settingsContainer = useSettingsContainer();
-1
View File
@@ -1,5 +1,4 @@
import React from 'react'
import Swapper from "@/components/Swapper"
const Page: React.FC = () => (
+7 -1
View File
@@ -1,7 +1,7 @@
'use client'
import { ErrorBoundary } from 'react-error-boundary'
import { useSearchParams } from 'next/navigation'
import axios from 'axios'
import * as Sentry from '@sentry/nextjs'
import { TooltipProvider } from '@hanzo/ui/primitives'
@@ -30,6 +30,7 @@ import type { ErrorInfo, PropsWithChildren } from 'react'
const INTERCOM_APP_ID = 'o1kmvctg'
import '@rainbow-me/rainbowkit/styles.css'
import { ToastProvider } from '@/context/toast-provider'
import useAsyncEffect from 'use-async-effect'
const Contexts: React.FC<
{
@@ -38,6 +39,11 @@ const Contexts: React.FC<
> = ({ settings, children }) => {
const searchParams = useSearchParams()
useAsyncEffect(async() => {
const settings = await axios.get(`${process.env.NEXT_PUBLIC_BACKEND_API}/networks?version=mainnet`)
console.log("::settings;;;", settings)
}, [])
// :aa These were was all that getServerSideProps() ever returned.
// So seems clearest to just do it this way.
const _settings = settings ?? {
+34 -167
View File
@@ -1,132 +1,18 @@
// import React, { type PropsWithChildren } from "react";
// import {
// Chain,
// WagmiConfig,
// configureChains,
// createConfig,
// mainnet,
// sepolia,
// } from "wagmi";
// import { publicProvider } from "wagmi/providers/public";
// import {
// connectorsForWallets,
// RainbowKitProvider,
// DisclaimerComponent,
// AvatarComponent,
// } from "@rainbow-me/rainbowkit";
// import {
// walletConnectWallet,
// rainbowWallet,
// metaMaskWallet,
// coinbaseWallet,
// bitgetWallet,
// argentWallet,
// phantomWallet,
// } from "@rainbow-me/rainbowkit/wallets";
// import { useSettingsState } from "../context/settings";
// import { NetworkType } from "../Models/CryptoNetwork";
// import resolveChain from "../lib/resolveChain";
// import AddressIcon from "./AddressIcon";
// import configureRKTheme from "../styles/configureRKTheme";
// networks
// import mainnets from "@/settings/mainnet/networks.json";
// import testnets from "@/settings/testnet/networks.json";
// const rkTheme = configureRKTheme();
// const projectId = process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID || "";
// const RainbowKitComponent: React.FC<PropsWithChildren> = ({ children }) => {
// const settings = useSettingsState();
// const isChain = (c: Chain | undefined): c is Chain => c != undefined;
// const networks = [...mainnets, ...testnets]
// .filter((n) => n.type === NetworkType.EVM)
// .sort((a, b) => Number(a.chain_id) - Number(b.chain_id))
// .map(resolveChain)
// .filter(isChain);
// const { chains, publicClient } = configureChains(
// networks?.length > 0 ? [...networks] : [mainnet],
// [publicProvider()]
// );
// const connectors = connectorsForWallets([
// {
// groupName: "Popular",
// wallets: [
// metaMaskWallet({ projectId, chains }),
// walletConnectWallet({ projectId, chains }),
// ],
// },
// {
// groupName: "Wallets",
// wallets: [
// coinbaseWallet({ chains, appName: "Bridge" }),
// argentWallet({ projectId, chains }),
// bitgetWallet({ projectId, chains }),
// rainbowWallet({ projectId, chains }),
// phantomWallet({ chains }),
// ],
// },
// ]);
// const wagmiConfig = createConfig({
// autoConnect: true,
// connectors,
// publicClient,
// });
// const disclaimer: DisclaimerComponent = ({ Text }) => (
// <Text>Thanks for choosing the Lux Bridge!</Text>
// );
// const CustomAvatar: AvatarComponent = ({ address, size }) => {
// return <AddressIcon address={address} size={size} />;
// };
// return (
// <WagmiConfig config={wagmiConfig}>
// <RainbowKitProvider
// avatar={CustomAvatar}
// // modalSize="compact"
// chains={chains}
// theme={rkTheme}
// appInfo={{
// appName: "LuxBridge",
// learnMoreUrl: "https://docs.bridge.lux.network/",
// disclaimer: disclaimer,
// }}
// >
// {children}
// </RainbowKitProvider>
// </WagmiConfig>
// );
// };
// export default RainbowKitComponent;
"use client";
import React from "react";
import { useTheme } from "next-themes";
'use client'
import React from 'react'
import Image from 'next/image'
import resolveChain from '@/lib/resolveChain'
import mainnets from '@/settings/mainnet/networks.json'
import testnets from '@/settings/testnet/networks.json'
import {
RainbowKitProvider,
darkTheme,
lightTheme,
type AvatarComponent,
type DisclaimerComponent,
} from "@rainbow-me/rainbowkit";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { WagmiProvider } from "wagmi";
import { useAtom } from "jotai";
import Image from "next/image";
import { NetworkType } from "@/Models/CryptoNetwork";
import resolveChain from "@/lib/resolveChain";
import mainnets from "@/settings/mainnet/networks.json";
import testnets from "@/settings/testnet/networks.json";
} from '@rainbow-me/rainbowkit'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { WagmiProvider } from 'wagmi'
import { NetworkType } from '@/Models/CryptoNetwork'
import {
metaMaskWallet,
@@ -136,69 +22,51 @@ import {
ledgerWallet,
phantomWallet,
okxWallet,
} from "@rainbow-me/rainbowkit/wallets";
import { type Chain } from "viem";
} from '@rainbow-me/rainbowkit/wallets'
//types
import { type Chain } from 'viem'
import { type Config } from 'wagmi'
import { getDefaultWallets, getDefaultConfig } from '@rainbow-me/rainbowkit'
import { getDefaultWallets, getDefaultConfig } from "@rainbow-me/rainbowkit";
import { sepolia, arbitrum, bsc, base, mainnet } from "wagmi/chains";
import { type Config } from "wagmi";
const { wallets } = getDefaultWallets();
const chains: Chain[] = [
arbitrum,
bsc,
base,
sepolia,
mainnet,
// ...(process.env.NEXT_PUBLIC_ENABLE_TESTNETS === 'true' ? [sepolia] : []),
];
const queryClient = new QueryClient();
const { wallets } = getDefaultWallets()
const queryClient = new QueryClient()
const RainbowProvider = ({ children }: { children: React.ReactNode }) => {
const CustomAvatar: AvatarComponent = ({ address, ensImage, size }) => (
<Image
src={"/favicon.svg"}
src={'/favicon.svg'}
width={size}
height={size}
alt="avatar"
className="rounded-full"
/>
);
)
const disclaimer: DisclaimerComponent = ({ Text }) => (
<Text>Thanks for choosing the Lux Bridge!</Text>
);
)
const isChain = (c: Chain | undefined): c is Chain => c != undefined
const isChain = (c: Chain | undefined): c is Chain => c != undefined;
const networks = [...mainnets, ...testnets]
const chains = [...mainnets, ...testnets]
.filter((n) => n.type === NetworkType.EVM)
.sort((a, b) => Number(a.chain_id) - Number(b.chain_id))
.map(resolveChain)
.filter(isChain);
// const { chains, publicClient } = configureChains(
// networks?.length > 0 ? [...networks] : [mainnet],
// [publicProvider()]
// );
.filter(isChain)
const config: Config = getDefaultConfig({
appName: "RainbowKit demo",
projectId: "e89228fed40d4c6e9520912214dfd68b",
appName: 'Lux Bridge',
projectId: 'e89228fed40d4c6e9520912214dfd68b',
wallets: [
...wallets,
{
groupName: "Other",
groupName: 'Other',
wallets: [metaMaskWallet],
},
],
//@ts-expect-error "chains type"
chains: networks,
//@ts-expect-error "ignore chain type"
chains: chains,
ssr: true,
});
})
return (
<WagmiProvider config={config}>
@@ -206,10 +74,9 @@ const RainbowProvider = ({ children }: { children: React.ReactNode }) => {
<RainbowKitProvider //
avatar={CustomAvatar}
modalSize="compact"
// chains={chains}
appInfo={{
appName: "LuxBridge",
learnMoreUrl: "https://docs.bridge.lux.network/",
appName: 'LuxBridge',
learnMoreUrl: 'https://docs.bridge.lux.network/',
disclaimer: disclaimer,
}}
theme={darkTheme()}
@@ -218,7 +85,7 @@ const RainbowProvider = ({ children }: { children: React.ReactNode }) => {
</RainbowKitProvider>
</QueryClientProvider>
</WagmiProvider>
);
};
)
}
export default RainbowProvider;
export default RainbowProvider
-1
View File
@@ -34,7 +34,6 @@ const useSettings = (): BridgeAppSettings => {
const container = useContext<SettingsContainer | null>(SettingsContext)
// console.log("::app settings:", Object.keys(data))
if (container === undefined) {
throw new Error("useSettings must be used within a SettingsProvider")
}
+1 -1
View File
@@ -1,5 +1,5 @@
export default class AppSettings {
static BridgeApiUri?: string = process.env.NEXT_PUBLIC_LS_BRIDGE_API;
static BridgeApiUri?: string = process.env.NEXT_PUBLIC_BACKEND_API;
static ApiVersion: string = process.env.NEXT_PUBLIC_API_VERSION || 'mainnet';
static ExplorerURl: string = `https://explore.bridge.lux${process.env.NEXT_PUBLIC_API_VERSION === 'sandbox' ? '-test' : ''}.network`
}
+5 -5
View File
@@ -1,15 +1,15 @@
import { v4 as uuidv4 } from 'uuid'
import axios, { type AxiosInstance, type Method } from 'axios'
import { type BridgeSettings } from '../Models/BridgeSettings'
import { SwapStatus } from '../Models/SwapStatus'
import AppSettings from './AppSettings'
import BridgeAuthApiClient from './userAuthApiClient'
import { type BridgeSettings } from '@/Models/BridgeSettings'
import { type CryptoNetwork } from '@/Models/CryptoNetwork'
import { type Exchange } from '@/Models/Exchange'
import { SwapStatus } from '@/Models/SwapStatus'
import { InitializeInstance } from './axiosInterceptor'
import { AuthRefreshFailedError } from './Errors/AuthRefreshFailedError'
import { ApiResponse, EmptyApiResponse } from '../Models/ApiResponse'
import BridgeAuthApiClient from './userAuthApiClient'
import { type CryptoNetwork } from '../Models/CryptoNetwork'
import { type Exchange } from '../Models/Exchange'
export default class BridgeApiClient {
static apiBaseEndpoint?: string = AppSettings.BridgeApiUri
+9 -30
View File
@@ -1,53 +1,32 @@
// Importing JSON files for mainnet
import mainnetDiscovery from './mainnet/discovery.json'
import mainnetNetworks from './mainnet/networks.json'
import mainnetDepositContractAddress from './testnet/deposit.json'
import mainnetExchanges from './mainnet/exchanges.json'
// Importing JSON files for testnet
import testnetCurrencies from './testnet/currencies.json'
import testnetDiscovery from './testnet/discovery.json'
import testnetExchanges from './testnet/exchanges.json'
import testnetNetworks from './testnet/networks.json'
import testnetSources from './testnet/sources.json'
import testnetDestinations from './testnet/destinations.json'
import testnetDepositContractAddress from './testnet/deposit.json'
// testnets
import mainnetCurrencies from './mainnet/currencies.json'
import mainnetExchanges from './mainnet/exchanges.json'
import mainnetSources from './mainnet/sources.json'
import mainnetDestinations from './mainnet/destinations.json'
export const mainnetSettings = {
data: {
currencies: [],
discovery: mainnetDiscovery,
exchanges: [],
discovery: {},
exchanges: mainnetExchanges,
networks: [...mainnetNetworks, ...testnetNetworks],
},
sources: [],
destinations: [],
contractAddress: mainnetDepositContractAddress,
contractAddress: {},
error: null,
// data: {
// currencies: mainnetCurrencies,
// discovery: mainnetDiscovery,
// exchanges: mainnetExchanges,
// networks: mainnetNetworks,
// },
// sources: mainnetSources,
// destinations: mainnetDestinations,
// contractAddress: mainnetDepositContractAddress,
// error: null,
}
export const testnetSettings = {
data: {
currencies: testnetCurrencies,
discovery: testnetDiscovery,
currencies: [],
discovery: {},
exchanges: testnetExchanges,
networks: testnetNetworks,
},
sources: testnetSources,
destinations: testnetDestinations,
contractAddress: testnetDepositContractAddress,
sources: [],
destinations: [],
contractAddress: {},
error: null,
}
@@ -1,127 +0,0 @@
[
{
"asset": "BKT",
"precision": 6,
"usd_price": 0.00018693
},
{
"asset": "TON",
"precision": 7,
"usd_price": 2.16
},
{
"asset": "USDC",
"precision": 2,
"usd_price": 1.001
},
{
"asset": "IMX",
"precision": 6,
"usd_price": 1.8
},
{
"asset": "BTC",
"precision": 6,
"usd_price": 43523
},
{
"asset": "LUX",
"precision": 7,
"usd_price": 0.0021
},
{
"asset": "ETH",
"precision": 6,
"usd_price": 2191.53
},
{
"asset": "LRC",
"precision": 6,
"usd_price": 0.225478
},
{
"asset": "BNB",
"precision": 6,
"usd_price": 294.71
},
{
"asset": "HT",
"precision": 6,
"usd_price": 2.42
},
{
"asset": "OKT",
"precision": 6,
"usd_price": 17.69
},
{
"asset": "FUSE",
"precision": 6,
"usd_price": 0.073532
},
{
"asset": "MATIC",
"precision": 6,
"usd_price": 0.764774
},
{
"asset": "OP",
"precision": 6,
"usd_price": 3.01
},
{
"asset": "AVAX",
"precision": 6,
"usd_price": 31.97
},
{
"asset": "MNT",
"precision": 6,
"usd_price": 0.582907
},
{
"asset": "OSMO",
"precision": 6,
"usd_price": 1.71
},
{
"asset": "KCS",
"precision": 6,
"usd_price": 9.79
},
{
"asset": "SNX",
"precision": 6,
"usd_price": 3.16
},
{
"asset": "USDT",
"precision": 2,
"usd_price": 0.999346
},
{
"asset": "ASTR",
"precision": 6,
"usd_price": 0.117158
},
{
"asset": "SOL",
"precision": 6,
"usd_price": 87.93
},
{
"asset": "EVMOS",
"precision": 6,
"usd_price": 0.121364
},
{
"asset": "SYS",
"precision": 6,
"usd_price": 0.120236
},
{
"asset": "ZKS",
"precision": 6,
"usd_price": 0.072983
}
]
@@ -1,36 +0,0 @@
{
"data": [
{
"contract_name": "",
"contract_address": "0x9011E888251AB053B7bD1cdB598Db4f9DEd94714"
},
{
"contract_name": "",
"contract_address": "0xEAbCC110fAcBfebabC66Ad6f9E7B67288e720B59"
},
{
"contract_name": "",
"contract_address": "0x8d5081153aE1cfb41f5c932fe0b6Beb7E159cF84"
},
{
"contract_name": "",
"contract_address": "0xf8f12D0592e6d1bFe92ee16CaBCC4a6F26dAAe23"
},
{
"contract_name": "",
"contract_address": "0xFb66808f708e1d4D7D43a8c75596e84f94e06806"
},
{
"contract_name": "",
"contract_address": "0x313CF291c069C58D6bd61B0D672673462B8951bD"
},
{
"contract_name": "",
"contract_address": "0xf7f52257a6143cE6BbD12A98eF2B0a3d0C648079"
},
{
"contract_name": "STARKNET",
"contract_address": "0x012087325194323197379425C8f9d8c642ab7990ea0F58AEd184E607a300C303"
}
]
}
@@ -1,26 +0,0 @@
{
"evm": {
"address": "0x903670c142c670260cf96929Da156370d0dBE93a",
"memo": null
},
"TON": {
"address": "UQCdW7qm_Kh3zX6YdBPxK9_bHq1D7gowVkDEb2ekxb9GdR8P",
"memo": "BCE7D5F9B0A66291B221"
},
"btc": {
"address": "bc1qx6t60aknh95vjmnudf48mfjvwm47a607prqv4t",
"memo": null
},
"solana": {
"address": "52n85bTwSqkXuZxsz5sVEtzC7WQDMva228iUY2wZkLN1",
"memo": null
},
"xrp": {
"address": "r956hi9B5RAcmni3nxuYEmCFVypm97cwwa",
"memo": "4267978785"
},
"atom": {
"address": "cosmos1jsm6fe9pw3dh4l4uqhrtxqnfrjj4cjspsx8c7f",
"memo": "04626A736DEEEE52FF72"
}
}
@@ -1,81 +0,0 @@
{
"data": [
{
"network": "IMMUTABLEX_SEPOLIA",
"asset": "ETH"
},
{
"network": "ARBITRUM_SEPOLIA",
"asset": "ETH"
},
{
"network": "STARKNET_GOERLI",
"asset": "ETH"
},
{
"network": "POLYGON_MUMBAI",
"asset": "ETH"
},
{
"network": "LOOPRING_SEPOLIA",
"asset": "ETH"
},
{
"network": "ZKSYNCERA_GOERLI",
"asset": "ETH"
},
{
"network": "LINEA_GOERLI",
"asset": "ETH"
},
{
"network": "BASE_SEPOLIA",
"asset": "ETH"
},
{
"network": "ETHEREUM_SEPOLIA",
"asset": "ETH"
},
{
"network": "ARBITRUM_SEPOLIA",
"asset": "USDC"
},
{
"network": "STARKNET_GOERLI",
"asset": "USDC"
},
{
"network": "ETHEREUM_SEPOLIA",
"asset": "USDC"
},
{
"network": "OPTIMISM_SEPOLIA",
"asset": "USDC"
},
{
"network": "SOLANA_DEVNET",
"asset": "USDC"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "ETH"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "ARUSDC"
},
{
"network": "METIS_SEPOLIA",
"asset": "TMETIS"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "DAI2"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "DAI1"
}
],
"error": null
}
@@ -1,11 +0,0 @@
{
"identity_url": "https://identity-api.bridge.lux.network",
"resource_storage_url": "https://prodlslayerswapbridgesa.blob.core.windows.net/",
"o_auth_providers": [
{
"provider": "COINBASE",
"oauth_connect_url": "https://www.coinbase.com/oauth/authorize?client_id=b43d0fb2e023a66cf7be30ef983f9ee78efedd3567269fcd7c9bd9dd0bb7a776&redirect_uri=https%3A%2F%2Fbridge-api.bridge.lux.network%2Fapi%2Fcallback%2Fcoinbase&response_type=code&account=all&scope=wallet%3Auser%3Aemail%2Cwallet%3Aaddresses%3Aread%2Cwallet%3Aaddresses%3Acreate&state=",
"oauth_authorize_url": "https://www.coinbase.com/oauth/authorize?client_id=b43d0fb2e023a66cf7be30ef983f9ee78efedd3567269fcd7c9bd9dd0bb7a776&redirect_uri=https%3A%2F%2Fbridge-api.bridge.lux.network%2Fapi%2Fcallback%2Fcoinbase&response_type=code&account=all&scope=wallet%3Atransactions%3Aread%2Cwallet%3Auser%3Aread%2Cwallet%3Aaccounts%3Aread%2Cwallet%3Atransactions%3Asend%2Cwallet%3Auser%3Aemail&meta[send_limit_amount]=1&meta[send_limit_currency]=USD&meta[send_limit_period]=month&state="
}
]
}
File diff suppressed because it is too large Load Diff
@@ -1,73 +0,0 @@
{
"data": [
{
"network": "ETHEREUM_SEPOLIA",
"asset": "ETH"
},
{
"network": "IMMUTABLEX_SEPOLIA",
"asset": "ETH"
},
{
"network": "ARBITRUM_SEPOLIA",
"asset": "ETH"
},
{
"network": "STARKNET_GOERLI",
"asset": "ETH"
},
{
"network": "POLYGON_MUMBAI",
"asset": "ETH"
},
{
"network": "LOOPRING_SEPOLIA",
"asset": "ETH"
},
{
"network": "ZKSYNCERA_GOERLI",
"asset": "ETH"
},
{
"network": "ETHEREUM_SEPOLIA",
"asset": "USDC"
},
{
"network": "ARBITRUM_SEPOLIA",
"asset": "USDC"
},
{
"network": "STARKNET_GOERLI",
"asset": "USDC"
},
{
"network": "OPTIMISM_SEPOLIA",
"asset": "USDC"
},
{
"network": "SOLANA_DEVNET",
"asset": "USDC"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "ETH"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "ARUSDC"
},
{
"network": "METIS_SEPOLIA",
"asset": "TMETIS"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "DAI1"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "DAI2"
}
],
"error": null
}
@@ -1,127 +0,0 @@
[
{
"asset": "BKT",
"precision": 6,
"usd_price": 0.00018693
},
{
"asset": "IMX",
"precision": 6,
"usd_price": 1.83
},
{
"asset": "BTC",
"precision": 6,
"usd_price": 43617
},
{
"asset": "USDC",
"precision": 2,
"usd_price": 0.999836
},
{
"asset": "ETH",
"precision": 6,
"usd_price": 2196.62
},
{
"asset": "LUX",
"precision": 7,
"usd_price": 0.0021
},
{
"asset": "LRC",
"precision": 6,
"usd_price": 0.22762
},
{
"asset": "BNB",
"precision": 6,
"usd_price": 295.57
},
{
"asset": "OKT",
"precision": 6,
"usd_price": 17.67
},
{
"asset": "FUSE",
"precision": 6,
"usd_price": 0.074021
},
{
"asset": "MATIC",
"precision": 6,
"usd_price": 0.772845
},
{
"asset": "AVAX",
"precision": 6,
"usd_price": 32.15
},
{
"asset": "MNT",
"precision": 6,
"usd_price": 0.584164
},
{
"asset": "TON",
"precision": 7,
"usd_price": 2.17
},
{
"asset": "HT",
"precision": 6,
"usd_price": 2.42
},
{
"asset": "OSMO",
"precision": 6,
"usd_price": 1.71
},
{
"asset": "OP",
"precision": 6,
"usd_price": 3.04
},
{
"asset": "SNX",
"precision": 6,
"usd_price": 3.2
},
{
"asset": "USDT",
"precision": 2,
"usd_price": 1
},
{
"asset": "ASTR",
"precision": 6,
"usd_price": 0.120619
},
{
"asset": "SOL",
"precision": 6,
"usd_price": 89.04
},
{
"asset": "EVMOS",
"precision": 6,
"usd_price": 0.121623
},
{
"asset": "SYS",
"precision": 6,
"usd_price": 0.120383
},
{
"asset": "KCS",
"precision": 6,
"usd_price": 9.84
},
{
"asset": "ZKS",
"precision": 6,
"usd_price": 0.072962
}
]
@@ -1,36 +0,0 @@
{
"data": [
{
"contract_name": "",
"contract_address": "0x9011E888251AB053B7bD1cdB598Db4f9DEd94714"
},
{
"contract_name": "",
"contract_address": "0xEAbCC110fAcBfebabC66Ad6f9E7B67288e720B59"
},
{
"contract_name": "",
"contract_address": "0x8d5081153aE1cfb41f5c932fe0b6Beb7E159cF84"
},
{
"contract_name": "",
"contract_address": "0xf8f12D0592e6d1bFe92ee16CaBCC4a6F26dAAe23"
},
{
"contract_name": "",
"contract_address": "0xFb66808f708e1d4D7D43a8c75596e84f94e06806"
},
{
"contract_name": "",
"contract_address": "0x313CF291c069C58D6bd61B0D672673462B8951bD"
},
{
"contract_name": "",
"contract_address": "0xf7f52257a6143cE6BbD12A98eF2B0a3d0C648079"
},
{
"contract_name": "STARKNET",
"contract_address": "0x012087325194323197379425C8f9d8c642ab7990ea0F58AEd184E607a300C303"
}
]
}
@@ -1,18 +0,0 @@
{
"evm": {
"address": "0xD4952A4c2644469D59F9dE340E0e829e51836Dec",
"memo": null
},
"TON": {
"address": "0QDMXrj5n4ldLGoq9l0svifDORdTLnKsOEH6ClAEXX5qj1Sq",
"memo": "70A09E871BFAFCB0A216"
},
"btc": {
"address": "tb1qgps3lt0lz3mufdnmj3lhcnpfh48s2u53996xdv",
"memo": null
},
"solana": {
"address": "DsBiAAy92HtjXKFf78ZTQKCaMDuMGyUeh6v7pPSHrVbY",
"memo": null
}
}
@@ -1,81 +0,0 @@
{
"data": [
{
"network": "IMMUTABLEX_SEPOLIA",
"asset": "ETH"
},
{
"network": "ARBITRUM_SEPOLIA",
"asset": "ETH"
},
{
"network": "STARKNET_GOERLI",
"asset": "ETH"
},
{
"network": "POLYGON_MUMBAI",
"asset": "ETH"
},
{
"network": "LOOPRING_SEPOLIA",
"asset": "ETH"
},
{
"network": "ZKSYNCERA_GOERLI",
"asset": "ETH"
},
{
"network": "LINEA_GOERLI",
"asset": "ETH"
},
{
"network": "BASE_SEPOLIA",
"asset": "ETH"
},
{
"network": "ETHEREUM_SEPOLIA",
"asset": "ETH"
},
{
"network": "ARBITRUM_SEPOLIA",
"asset": "USDC"
},
{
"network": "STARKNET_GOERLI",
"asset": "USDC"
},
{
"network": "ETHEREUM_SEPOLIA",
"asset": "USDC"
},
{
"network": "OPTIMISM_SEPOLIA",
"asset": "USDC"
},
{
"network": "SOLANA_DEVNET",
"asset": "USDC"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "ETH"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "ARUSDC"
},
{
"network": "METIS_SEPOLIA",
"asset": "TMETIS"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "DAI2"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "DAI1"
}
],
"error": null
}
@@ -1,11 +0,0 @@
{
"identity_url": "https://identity-api.bridge.lux.network",
"resource_storage_url": "https://prodlslayerswapbridgesa.blob.core.windows.net/",
"o_auth_providers": [
{
"provider": "COINBASE",
"oauth_connect_url": "https://www.coinbase.com/oauth/authorize?client_id=b43d0fb2e023a66cf7be30ef983f9ee78efedd3567269fcd7c9bd9dd0bb7a776&redirect_uri=https%3A%2F%2Fbridge-api.bridge.lux.network%2Fapi%2Fcallback%2Fcoinbase&response_type=code&account=all&scope=wallet%3Auser%3Aemail%2Cwallet%3Aaddresses%3Aread%2Cwallet%3Aaddresses%3Acreate&state=",
"oauth_authorize_url": "https://www.coinbase.com/oauth/authorize?client_id=b43d0fb2e023a66cf7be30ef983f9ee78efedd3567269fcd7c9bd9dd0bb7a776&redirect_uri=https%3A%2F%2Fbridge-api.bridge.lux.network%2Fapi%2Fcallback%2Fcoinbase&response_type=code&account=all&scope=wallet%3Atransactions%3Aread%2Cwallet%3Auser%3Aread%2Cwallet%3Aaccounts%3Aread%2Cwallet%3Atransactions%3Asend%2Cwallet%3Auser%3Aemail&meta[send_limit_amount]=1&meta[send_limit_currency]=USD&meta[send_limit_period]=month&state="
}
]
}
@@ -1,11 +0,0 @@
{
"data": {
"manual_min_amount_in_usd": 5.003487,
"manual_min_amount": 0.001967,
"wallet_min_amount_in_usd": 5.003487,
"wallet_min_amount": 0.001967,
"max_amount_in_usd": 25.4281,
"max_amount": 0.01
},
"error": null
}
@@ -1,73 +0,0 @@
{
"data": [
{
"network": "ETHEREUM_SEPOLIA",
"asset": "ETH"
},
{
"network": "IMMUTABLEX_SEPOLIA",
"asset": "ETH"
},
{
"network": "ARBITRUM_SEPOLIA",
"asset": "ETH"
},
{
"network": "STARKNET_GOERLI",
"asset": "ETH"
},
{
"network": "POLYGON_MUMBAI",
"asset": "ETH"
},
{
"network": "LOOPRING_SEPOLIA",
"asset": "ETH"
},
{
"network": "ZKSYNCERA_GOERLI",
"asset": "ETH"
},
{
"network": "ETHEREUM_SEPOLIA",
"asset": "USDC"
},
{
"network": "ARBITRUM_SEPOLIA",
"asset": "USDC"
},
{
"network": "STARKNET_GOERLI",
"asset": "USDC"
},
{
"network": "OPTIMISM_SEPOLIA",
"asset": "USDC"
},
{
"network": "SOLANA_DEVNET",
"asset": "USDC"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "ETH"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "ARUSDC"
},
{
"network": "METIS_SEPOLIA",
"asset": "TMETIS"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "DAI1"
},
{
"network": "STARKNET_SEPOLIA",
"asset": "DAI2"
}
],
"error": null
}
+8 -4
View File
@@ -1,6 +1,6 @@
import type { BridgeSettings } from '@/Models/BridgeSettings'
import type { CryptoNetwork } from '@/Models/CryptoNetwork'
import type { Exchange } from '@/Models/Exchange'
import type { CryptoNetwork } from '@/Models/CryptoNetwork'
import BridgeApiClient from '@/lib/BridgeApiClient'
const getBridgeSettings = async (
@@ -31,10 +31,14 @@ const getBridgeSettings = async (
}
}
const apiClient = new BridgeApiClient()
const { data } = await apiClient.GetSettingsAsync()
// const apiClient = new BridgeApiClient()
// const { data } = await apiClient.GetSettingsAsync()
return data
// return data
return {
networks: [],
exchanges: [],
}
}
export default getBridgeSettings
+8
View File
@@ -0,0 +1,8 @@
import axios from 'axios'
const getSettings = async () => {
const settings = await axios.get(`${process.env.NEXT_PUBLIC_BACKEND_API}/setttings?version=${process.env.NEXT_PUBLIC_API_VERSION}`)
return settings
}
export default getSettings
+7 -6
View File
@@ -1,28 +1,29 @@
'use client'
import React, { ReactNode } from 'react'
import useSWR from 'swr';
import AppSettings from '@/lib/AppSettings';
import { ApiResponse } from '@/models/ApiResponse';
import { CryptoNetwork } from '@/models/CryptoNetwork';
import { BridgeAppSettings } from '@/models/BridgeAppSettings';
import React, { ReactNode } from 'react'
import useSWR from 'swr';
const SettingsContext = React.createContext<BridgeAppSettings | null>(null);
export const SettingsProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
const fetcher = (url: string) => fetch(url).then(r => r.json());
// const version = process.env.NEXT_PUBLIC_API_VERSION;
const version = 'sandbox'
const version = AppSettings.ApiVersion;
const { data: netWorkData } = useSWR<ApiResponse<CryptoNetwork[]>>(`${AppSettings.BridgeApiUri}/api/networks?version=${version}`, fetcher, { dedupingInterval: 60000 })
const { data: exchangeData } = useSWR<ApiResponse<CryptoNetwork[]>>(`${AppSettings.BridgeApiUri}/api/exchanges?version=${version}`, fetcher, { dedupingInterval: 60000 })
const { data: netWorkData } = useSWR<ApiResponse<CryptoNetwork[]>>(`${AppSettings.BridgeApiUri}/networks?version=${version}`, fetcher, { dedupingInterval: 60000 })
const { data: exchangeData } = useSWR<ApiResponse<CryptoNetwork[]>>(`${AppSettings.BridgeApiUri}/exchanges?version=${version}`, fetcher, { dedupingInterval: 60000 })
const settings = {
networks: netWorkData?.data,
exchanges: exchangeData?.data,
}
console.log("settings::::::", settings)
let appSettings = new BridgeAppSettings(settings);
return (
+1 -1
View File
@@ -1,4 +1,4 @@
export default class AppSettings {
static BridgeApiUri: string | undefined = process.env.NEXT_PUBLIC_BRIDGE_API;
static BridgeApiUri: string | undefined = process.env.NEXT_PUBLIC_BACKEND_API;
static ApiVersion: string = process.env.NEXT_PUBLIC_API_VERSION || 'mainnet';
}
+5
View File
@@ -25,6 +25,11 @@ spec:
env:
- name: PORT
value: "6000"
- name: COINBASE_API_KEY
valueFrom:
secretKeyRef:
name: bridge-server-secret
key: COINBASE_API_KEY
- name: POSTGRESQL_URL
valueFrom:
secretKeyRef:
+1 -1
View File
@@ -6,7 +6,7 @@ import axios from "axios";
export const getTokenPrice = async (token_id: string) => {
try {
const headers = {
"x-api-key": process.env.NEXT_PUBLIC_COINBASE_API_KEY,
"x-api-key": process.env.COINBASE_API_KEY,
accept: "application/json",
};
if (token_id === "LUX") {
+31
View File
@@ -0,0 +1,31 @@
import { Router, Request, Response } from "express"
import { getTokenPrice } from "@/lib/tokens"
const router: Router = Router()
// route: api/limits/from/fromCurrency/to/toCurrency?version=
// description:
// method: GET and it's public
router.get("/from/:fromCurrency/to/:toCurrency", async (req: Request, res: Response) => {
try {
// Access the route parameters
const { fromCurrency, toCurrency } = req.params
// Access the query parameter
const version = req.query.version
res.status(200).json({
data: {
manual_min_amount: 0.1,
manual_min_amount_in_usd: 0,
max_amount: 100,
max_amount_in_usd: 0,
wallet_min_amount: 0,
wallet_min_amount_in_usd: 0
}
})
} catch (error: any) {
res.status(500).json({ error: error })
}
})
export default router
+38
View File
@@ -0,0 +1,38 @@
import { Router, Request, Response } from "express"
import { getTokenPrice } from "@/lib/tokens"
const router: Router = Router()
// route: source_network=ETHEREUM_SEPOLIA&source_token=USDC&destination_network=ARBITRUM_SEPOLIA&destination_token=USDC&amount=1.245766&refuel=false&use_deposit_address=false
// description:
// method: GET and it's public
router.get("/", async (req: Request, res: Response) => {
try {
// Access the query parameters
const { source_network, source_token, destination_network, destination_token, amount, refuel, use_deposit_address } = req.query
const [sourcePrice, destinationPrice] = await Promise.all([getTokenPrice(String(source_token)), getTokenPrice(String(destination_token))])
res.status(200).json({
data: {
quote: {
receive_amount: (Number(amount) * sourcePrice) / destinationPrice,
min_receive_amount: 0.975,
blockchain_fee: 0.145766, //we need to estimate blockchain fee.
service_fee: 0.01, //our bridge service fee is 1%. or We should make no fee for our bridge currently.
avg_completion_time: "00:00:47.4595530", // it should be about 20 min for btc, and 3 ~ 4 mins for evm chains.
refuel_in_source: null,
slippage: 0.025,
total_fee: 0.245766,
total_fee_in_usd: 0.245766
},
refuel: null,
reward: {}
}
})
} catch (error: any) {
res.status(500).json({ error: error })
}
})
export default router
+44
View File
@@ -0,0 +1,44 @@
import { Router, Request, Response } from "express"
import { getTokenPrice } from "@/lib/tokens"
const router: Router = Router()
// route: /rate/source_network/source_asset/destination_network/destination_asset?amount=&version=
// description:
// method: GET and it's public
router.get("/:source_network/:source_asset/:destination_network/:destination_asset", async (req: Request, res: Response) => {
try {
// Access the route parameters
const { source_network, source_asset, destination_network, destination_asset } = req.params;
// Access the query parameters
const amount = req.query.amount;
const version = req.query.version;
const [sourcePrice, destinationPrice] = await Promise.all([
getTokenPrice(source_asset),
getTokenPrice(destination_asset)
]);
res.status(200).json({
data: {
wallet_fee_in_usd: 10,
wallet_fee: 0.1,
wallet_receive_amount: Number(amount),
manual_fee_in_usd: 0,
manual_fee: 0,
manual_receive_amount: Number(amount) * sourcePrice / destinationPrice,
avg_completion_time: {
total_minutes: 2,
total_seconds: 0,
total_hours: 0,
},
fee_usd_price: 10,
}
})
} catch (error: any) {
res.status(500).json({ error: error })
}
})
export default router
-1
View File
@@ -15,7 +15,6 @@ router.get("/", async (req: Request, res: Response) => {
const isMainnet = version ? (version === "mainnet") : true
const settings = isMainnet ? mainnetSettings : testnetSettings;
console.log("🚀 ~ settings:", settings)
res.status(200).json({ data: settings })
}
catch (error: any) {
+6
View File
@@ -6,6 +6,9 @@ import swaps from "@/routes/swaps"
import explorer from "@/routes/explorer"
import settings from "@/routes/settings"
import tokens from "@/routes/tokens"
import limits from "@/routes/limits"
import quotes from "@/routes/quotes"
import rate from "@/routes/rate"
dotenv.config()
@@ -20,6 +23,9 @@ app.use("/api/swaps", swaps)
app.use("/api/explorer", explorer)
app.use("/api/settings", settings)
app.use("/api/tokens", tokens)
app.use("/api/limits", limits)
app.use("/api/quotes", quotes)
app.use("/api/rate", rate)
app.get("/", async (req, res) => {
res.json(">>> Hello world. We are LUX!!!")
-2
View File
@@ -12,8 +12,6 @@ export const mainnetSettings = {
exchanges: mainnetExchanges,
networks: [...mainnetNetworks, ...testnetNetworks]
},
sources: [],
destinations: [],
error: null
}