Integrate Jupiter into your React App
Use the React-Hook if you'd like to embed Jupiter into your own React UI.
Pre-requisites
Setup your Wallet Adapter for your frontend application.
Installation
Open your terminal, navigate to your project directory, and run the command below.
npm i @jup-ag/core @jup-ag/react-hook jsbi
Meanwhile, our published package can be found here NPM.
Usage
import { TOKEN_LIST_URL } from "@jup-ag/core";
import { JupiterProvider, useJupiter } from "@jup-ag/react-hook";
Create a React component
React
import React, { useEffect, useState } from "react";
const JupiterApp = () => {
return (
<>
<div style={{ fontWeight: '600', fontSize: 16, marginTop: 24 }}>
Hook example
</div>
<div>Number of tokens:</Text>
<div>Number of input tokens</Text>
<div>Possible number of routes:</Text>
<div>
Best quote:
</div>
</>
)
}
export default JupiterApp;
React Native
import React, { useEffect, useState } from "react";
import { Text } from "react-native";
const JupiterApp = () => {
return (
<>
<Text style={{ fontWeight: '600', fontSize: 16, marginTop: 24 }}>
Hook example
</Text>
<Text>Number of tokens:</Text>
<Text>Number of input tokens</Text>
<Text>Possible number of routes:</Text>
<Text>
Best quote:
</Text>
</>
)
}
export default JupiterApp;
Fetch the list of tokens
- Declare the interface.
export interface Token {
chainId: number; // 101,
address: string; // 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
symbol: string; // 'USDC',
name: string; // 'Wrapped USDC',
decimals: number; // 6,
logoURI: string; // 'https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BXXkv6z8ykpG1yuvUDPgh732wzVHB69RnB9YgSYh3itW/logo.png',
tags: string[]; // [ 'stablecoin' ]
}
- Fetch token list from Jupiter API.
import { TOKEN_LIST_URL } from "@jup-ag/core";
const JupiterApp = () => {
const [tokens, setTokens] = useState<Token[]>([])
useEffect(() => {
// Fetch token list from Jupiter API
fetch(TOKEN_LIST_URL[ENV])
.then(response => response.json())
.then(result => setTokens(result))
}, [])
// ...
}
export default JupiterApp;
- Then, it's time to look for which token you would like to swap, from the
tokens
array. In this case, we will swap from USDC to USDT.
import { TOKEN_LIST_URL } from "@jup-ag/core";
const JupiterApp = () => {
const [tokens, setTokens] = useState<Token[]>([])
console.log(tokens) // Look for tokens
const [inputMint] = useState<PublicKey>(new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"))
const [outputMint] = useState<PublicKey>(new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"))
// ...
}
Attach useJupiter hooks
import { TOKEN_LIST_URL } from "@jup-ag/core";
const JupiterApp = () => {
const [tokens, setTokens] = useState<Token[]>([])
const [inputMint] = useState<PublicKey>(new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"))
const [outputMint] = useState<PublicKey>(new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"))
useEffect(() => {
// Fetch token list from Jupiter API
fetch(TOKEN_LIST_URL[ENV])
.then(response => response.json())
.then(result => setTokens(result))
}, [])
// Attach Jupiter hook
const jupiter = useJupiter({
amount: JSBI.BigInt(1 * (10 ** 6)), // raw input amount of tokens
inputMint,
outputMint,
slippage: 1, // 1% slippage
debounceTime: 250, // debounce ms time before refresh
})
// ...
}
export default JupiterApp;
Every token have their own decimals place, in our example, both USDC and USDT pairs have their decimals place at 6. Assuming in the UI, user entered a value of 1 USDC, we can derive the amount to pass into Jupiter to be 1 multiplied by (10 exponent of 6)
const inputAmount = 1; // UI input
const inputTokenInfo = tokens.find(item => item.address === "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v") // Token info
const amount = JSBI.BigInt(inputAmount * (10 ** inputTokenInfo.decimals)) // Amount to send to Jupiter
Display the result
Tab
Performing a swap
Once you have acquired all the meaningful information from the Jupiter instance, it is time we perform a swap with the exchange() function.
You would need a wallet
and connection
instance to perform a swap, the easiest way to interface with your wallet (Phantom, Sollet, Solflare...) would be the use of @solana/wallet-adapter-react library, visit the documentation for more info.
Tab
SignerWalletAdapter from '@solana/wallet-adapter-base/lib/signer.d.ts'
Alternatively,
interface CustomWallet {
publicKey: PublicKey
sendTransaction(transaction: Transaction, connection: Connection, options?: SendTransactionOptions): Promise<TransactionSignature>;
signTransaction(transaction: Transaction): Promise<Transaction>;
signAllTransactions(transaction: Transaction[]): Promise<Transaction[]>;
}
Example
If you need more help, pay a visit to Example (React, Next.js) or, just fork and start there.
More issues? Head to FAQs and Troubleshooting section.