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";
|
||||
|
||||
export const MIGRATION_PROGRAM_ADDRESS =
|
||||
process.env.REACT_APP_CLUSTER === "testnet"
|
||||
process.env.REACT_APP_CLUSTER === "mainnet"
|
||||
? ""
|
||||
: process.env.REACT_APP_CLUSTER === "testnet"
|
||||
? ""
|
||||
: "Ex9bCdVMSfx7EzB3pgSi2R4UHwJAXvTw18rBQm5YQ8gK";
|
||||
|
||||
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")
|
||||
: "http://localhost:8899";
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import addLiquidityTx from "@certusone/wormhole-sdk/lib/migration/addLiquidity";
|
||||
import getAuthorityAddress from "@certusone/wormhole-sdk/lib/migration/authorityAddress";
|
||||
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 getFromCustodyAddress from "@certusone/wormhole-sdk/lib/migration/fromCustodyAddress";
|
||||
import migrateTokensTx from "@certusone/wormhole-sdk/lib/migration/migrateTokens";
|
||||
|
@ -166,10 +167,13 @@ function Main() {
|
|||
const [toggleAllData, setToggleAllData] = useState(false);
|
||||
|
||||
const [liquidityAmount, setLiquidityAmount] = useState("");
|
||||
const [removeLiquidityAmount, setRemoveLiquidityAmount] = useState("");
|
||||
const [migrationAmount, setMigrationAmount] = useState("");
|
||||
const [redeemAmount, setRedeemAmount] = useState("");
|
||||
|
||||
const [liquidityIsProcessing, setLiquidityIsProcessing] = useState(false);
|
||||
const [removeLiquidityIsProcessing, setRemoveLiquidityIsProcessing] =
|
||||
useState(false);
|
||||
const [migrationIsProcessing, setMigrationIsProcessing] = useState(false);
|
||||
const [redeemIsProcessing, setRedeemIsProcessing] = useState(false);
|
||||
const [createPoolIsProcessing, setCreatePoolIsProcessing] = useState(false);
|
||||
|
@ -445,6 +449,56 @@ function Main() {
|
|||
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 () => {
|
||||
try {
|
||||
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 = (
|
||||
<>
|
||||
<Typography variant="h4">Migrate Tokens</Typography>
|
||||
|
@ -736,6 +814,8 @@ function Main() {
|
|||
<Divider className={classes.divider} />
|
||||
{addLiquidityUI}
|
||||
<Divider className={classes.divider} />
|
||||
{removeLiquidityUI}
|
||||
<Divider className={classes.divider} />
|
||||
{redeemSharesUI}
|
||||
<Divider className={classes.divider} />
|
||||
{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