lp_ui: remove liquidity function
Change-Id: Ia2f4ed7f1501bbd3a70ed10fe61a10adfb2d521b
This commit is contained in:
parent
d8ad37d357
commit
54f7d46f66
|
@ -1,11 +1,15 @@
|
||||||
import { clusterApiUrl } from "@solana/web3.js";
|
import { clusterApiUrl } from "@solana/web3.js";
|
||||||
|
|
||||||
export const MIGRATION_PROGRAM_ADDRESS =
|
export const MIGRATION_PROGRAM_ADDRESS =
|
||||||
process.env.REACT_APP_CLUSTER === "testnet"
|
process.env.REACT_APP_CLUSTER === "mainnet"
|
||||||
|
? ""
|
||||||
|
: process.env.REACT_APP_CLUSTER === "testnet"
|
||||||
? ""
|
? ""
|
||||||
: "Ex9bCdVMSfx7EzB3pgSi2R4UHwJAXvTw18rBQm5YQ8gK";
|
: "Ex9bCdVMSfx7EzB3pgSi2R4UHwJAXvTw18rBQm5YQ8gK";
|
||||||
|
|
||||||
export const SOLANA_URL =
|
export const SOLANA_URL =
|
||||||
process.env.REACT_APP_CLUSTER === "testnet"
|
process.env.REACT_APP_CLUSTER === "mainnet"
|
||||||
|
? clusterApiUrl("mainnet-beta")
|
||||||
|
: process.env.REACT_APP_CLUSTER === "testnet"
|
||||||
? clusterApiUrl("testnet")
|
? clusterApiUrl("testnet")
|
||||||
: "http://localhost:8899";
|
: "http://localhost:8899";
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import addLiquidityTx from "@certusone/wormhole-sdk/lib/migration/addLiquidity";
|
import addLiquidityTx from "@certusone/wormhole-sdk/lib/migration/addLiquidity";
|
||||||
import getAuthorityAddress from "@certusone/wormhole-sdk/lib/migration/authorityAddress";
|
import getAuthorityAddress from "@certusone/wormhole-sdk/lib/migration/authorityAddress";
|
||||||
import claimSharesTx from "@certusone/wormhole-sdk/lib/migration/claimShares";
|
import claimSharesTx from "@certusone/wormhole-sdk/lib/migration/claimShares";
|
||||||
|
import removeLiquidityTx from "@certusone/wormhole-sdk/lib/migration/removeLiquidity";
|
||||||
import createPoolAccount from "@certusone/wormhole-sdk/lib/migration/createPool";
|
import createPoolAccount from "@certusone/wormhole-sdk/lib/migration/createPool";
|
||||||
import getFromCustodyAddress from "@certusone/wormhole-sdk/lib/migration/fromCustodyAddress";
|
import getFromCustodyAddress from "@certusone/wormhole-sdk/lib/migration/fromCustodyAddress";
|
||||||
import migrateTokensTx from "@certusone/wormhole-sdk/lib/migration/migrateTokens";
|
import migrateTokensTx from "@certusone/wormhole-sdk/lib/migration/migrateTokens";
|
||||||
|
@ -166,10 +167,13 @@ function Main() {
|
||||||
const [toggleAllData, setToggleAllData] = useState(false);
|
const [toggleAllData, setToggleAllData] = useState(false);
|
||||||
|
|
||||||
const [liquidityAmount, setLiquidityAmount] = useState("");
|
const [liquidityAmount, setLiquidityAmount] = useState("");
|
||||||
|
const [removeLiquidityAmount, setRemoveLiquidityAmount] = useState("");
|
||||||
const [migrationAmount, setMigrationAmount] = useState("");
|
const [migrationAmount, setMigrationAmount] = useState("");
|
||||||
const [redeemAmount, setRedeemAmount] = useState("");
|
const [redeemAmount, setRedeemAmount] = useState("");
|
||||||
|
|
||||||
const [liquidityIsProcessing, setLiquidityIsProcessing] = useState(false);
|
const [liquidityIsProcessing, setLiquidityIsProcessing] = useState(false);
|
||||||
|
const [removeLiquidityIsProcessing, setRemoveLiquidityIsProcessing] =
|
||||||
|
useState(false);
|
||||||
const [migrationIsProcessing, setMigrationIsProcessing] = useState(false);
|
const [migrationIsProcessing, setMigrationIsProcessing] = useState(false);
|
||||||
const [redeemIsProcessing, setRedeemIsProcessing] = useState(false);
|
const [redeemIsProcessing, setRedeemIsProcessing] = useState(false);
|
||||||
const [createPoolIsProcessing, setCreatePoolIsProcessing] = useState(false);
|
const [createPoolIsProcessing, setCreatePoolIsProcessing] = useState(false);
|
||||||
|
@ -445,6 +449,56 @@ function Main() {
|
||||||
toCustodyAddress,
|
toCustodyAddress,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const removeLiquidity = useCallback(async () => {
|
||||||
|
try {
|
||||||
|
const instruction = await removeLiquidityTx(
|
||||||
|
connection,
|
||||||
|
wallet?.publicKey?.toString() || "",
|
||||||
|
MIGRATION_PROGRAM_ADDRESS,
|
||||||
|
fromMint,
|
||||||
|
toMint,
|
||||||
|
toTokenAccount || "",
|
||||||
|
shareTokenAccount || "",
|
||||||
|
parseUnits(removeLiquidityAmount, shareMintDecimals).toBigInt()
|
||||||
|
);
|
||||||
|
setRemoveLiquidityIsProcessing(true);
|
||||||
|
signSendAndConfirm(wallet, connection, instruction).then(
|
||||||
|
(transaction: any) => {
|
||||||
|
log("Successfully removed liquidity to the pool.");
|
||||||
|
getBalance(
|
||||||
|
connection,
|
||||||
|
fromCustodyAddress,
|
||||||
|
setFromCustodyBalance,
|
||||||
|
log
|
||||||
|
);
|
||||||
|
getBalance(connection, toCustodyAddress, setToCustodyBalance, log);
|
||||||
|
setRemoveLiquidityIsProcessing(false);
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
log("Could not complete the removeLiquidity transaction");
|
||||||
|
console.error(error);
|
||||||
|
setRemoveLiquidityIsProcessing(false);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
log("Could not complete the removeLiquidity transaction");
|
||||||
|
console.error(e);
|
||||||
|
setRemoveLiquidityIsProcessing(false);
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
connection,
|
||||||
|
fromMint,
|
||||||
|
removeLiquidityAmount,
|
||||||
|
shareTokenAccount,
|
||||||
|
toMint,
|
||||||
|
toTokenAccount,
|
||||||
|
wallet,
|
||||||
|
log,
|
||||||
|
shareMintDecimals,
|
||||||
|
fromCustodyAddress,
|
||||||
|
toCustodyAddress,
|
||||||
|
]);
|
||||||
|
|
||||||
const migrateTokens = useCallback(async () => {
|
const migrateTokens = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
const instruction = await migrateTokensTx(
|
const instruction = await migrateTokensTx(
|
||||||
|
@ -610,6 +664,30 @@ function Main() {
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const removeLiquidityUI = (
|
||||||
|
<>
|
||||||
|
<Typography variant="h4">Remove Liquidity</Typography>
|
||||||
|
<Typography variant="body1">
|
||||||
|
This will remove 'Share' tokens from your wallet, and give you an equal
|
||||||
|
number of 'To' tokens.
|
||||||
|
</Typography>
|
||||||
|
<TextField
|
||||||
|
value={removeLiquidityAmount}
|
||||||
|
type="number"
|
||||||
|
onChange={(event) => setRemoveLiquidityAmount(event.target.value)}
|
||||||
|
label={"Amount to remove"}
|
||||||
|
></TextField>
|
||||||
|
<Button
|
||||||
|
variant="contained"
|
||||||
|
onClick={removeLiquidity}
|
||||||
|
disabled={removeLiquidityIsProcessing}
|
||||||
|
>
|
||||||
|
Remove Liquidity
|
||||||
|
</Button>
|
||||||
|
{removeLiquidityIsProcessing ? <CircularProgress /> : null}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
|
||||||
const migrateTokensUI = (
|
const migrateTokensUI = (
|
||||||
<>
|
<>
|
||||||
<Typography variant="h4">Migrate Tokens</Typography>
|
<Typography variant="h4">Migrate Tokens</Typography>
|
||||||
|
@ -736,6 +814,8 @@ function Main() {
|
||||||
<Divider className={classes.divider} />
|
<Divider className={classes.divider} />
|
||||||
{addLiquidityUI}
|
{addLiquidityUI}
|
||||||
<Divider className={classes.divider} />
|
<Divider className={classes.divider} />
|
||||||
|
{removeLiquidityUI}
|
||||||
|
<Divider className={classes.divider} />
|
||||||
{redeemSharesUI}
|
{redeemSharesUI}
|
||||||
<Divider className={classes.divider} />
|
<Divider className={classes.divider} />
|
||||||
{migrateTokensUI}
|
{migrateTokensUI}
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
import { Token, TOKEN_PROGRAM_ID } from "@solana/spl-token";
|
||||||
|
import { Connection, PublicKey, Transaction } from "@solana/web3.js";
|
||||||
|
import { ixFromRust } from "../solana";
|
||||||
|
|
||||||
|
export default async function removeLiquidity(
|
||||||
|
connection: Connection,
|
||||||
|
payerAddress: string,
|
||||||
|
program_id: string,
|
||||||
|
from_mint: string,
|
||||||
|
to_mint: string,
|
||||||
|
liquidity_token_account: string,
|
||||||
|
lp_share_token_account: string,
|
||||||
|
amount: BigInt
|
||||||
|
) {
|
||||||
|
const { authority_address, remove_liquidity } = await import(
|
||||||
|
"../solana/migration/wormhole_migration"
|
||||||
|
);
|
||||||
|
const approvalIx = Token.createApproveInstruction(
|
||||||
|
TOKEN_PROGRAM_ID,
|
||||||
|
new PublicKey(lp_share_token_account),
|
||||||
|
new PublicKey(authority_address(program_id)),
|
||||||
|
new PublicKey(payerAddress),
|
||||||
|
[],
|
||||||
|
Number(amount)
|
||||||
|
);
|
||||||
|
const ix = ixFromRust(
|
||||||
|
remove_liquidity(
|
||||||
|
program_id,
|
||||||
|
from_mint,
|
||||||
|
to_mint,
|
||||||
|
liquidity_token_account,
|
||||||
|
lp_share_token_account,
|
||||||
|
amount
|
||||||
|
)
|
||||||
|
);
|
||||||
|
const transaction = new Transaction().add(approvalIx, ix);
|
||||||
|
const { blockhash } = await connection.getRecentBlockhash();
|
||||||
|
transaction.recentBlockhash = blockhash;
|
||||||
|
transaction.feePayer = new PublicKey(payerAddress);
|
||||||
|
return transaction;
|
||||||
|
}
|
Loading…
Reference in New Issue