Wrap/unwrap sol in the same tx
This commit is contained in:
parent
958f809be5
commit
fd035017a5
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@project-serum/swap-ui",
|
||||
"version": "0.1.10",
|
||||
"version": "0.1.11",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"homepage": "https://github.com/project-serum/swap-ui",
|
||||
|
|
|
@ -360,85 +360,83 @@ export function SwapButton() {
|
|||
throw new Error("Quote mint not found");
|
||||
}
|
||||
|
||||
// All transactions to send for the swap.
|
||||
let txs: { tx: Transaction; signers: Array<Signer | undefined> }[] = [];
|
||||
const amount = new BN(fromAmount * 10 ** fromMintInfo.decimals);
|
||||
|
||||
const isSol = fromMint.equals(SOL_MINT) || toMint.equals(SOL_MINT);
|
||||
const wrappedSolAccount = isSol ? Keypair.generate() : undefined;
|
||||
|
||||
// Wrap the SOL into wrapped SOL.
|
||||
if (isSol) {
|
||||
txs.push(
|
||||
await wrapSol(
|
||||
swapClient.program.provider,
|
||||
wrappedSolAccount as Keypair,
|
||||
fromMint,
|
||||
amount
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Build the swap.
|
||||
txs.push(
|
||||
...(await (async () => {
|
||||
if (!fromMarket) {
|
||||
throw new Error("Market undefined");
|
||||
}
|
||||
let txs = await (async () => {
|
||||
if (!fromMarket) {
|
||||
throw new Error("Market undefined");
|
||||
}
|
||||
|
||||
const minExchangeRate = {
|
||||
rate: new BN((10 ** toMintInfo.decimals * FEE_MULTIPLIER) / fair)
|
||||
.muln(100 - slippage)
|
||||
.divn(100),
|
||||
fromDecimals: fromMintInfo.decimals,
|
||||
quoteDecimals: quoteMintInfo.decimals,
|
||||
strict: isStrict,
|
||||
};
|
||||
const fromOpenOrders = fromMarket
|
||||
? openOrders.get(fromMarket?.address.toString())
|
||||
: undefined;
|
||||
const toOpenOrders = toMarket
|
||||
? openOrders.get(toMarket?.address.toString())
|
||||
: undefined;
|
||||
const fromWalletAddr = fromMint.equals(SOL_MINT)
|
||||
? wrappedSolAccount!.publicKey
|
||||
: fromWallet
|
||||
? fromWallet.publicKey
|
||||
: undefined;
|
||||
const toWalletAddr = toMint.equals(SOL_MINT)
|
||||
? wrappedSolAccount!.publicKey
|
||||
: toWallet
|
||||
? toWallet.publicKey
|
||||
: undefined;
|
||||
const minExchangeRate = {
|
||||
rate: new BN((10 ** toMintInfo.decimals * FEE_MULTIPLIER) / fair)
|
||||
.muln(100 - slippage)
|
||||
.divn(100),
|
||||
fromDecimals: fromMintInfo.decimals,
|
||||
quoteDecimals: quoteMintInfo.decimals,
|
||||
strict: isStrict,
|
||||
};
|
||||
const fromOpenOrders = fromMarket
|
||||
? openOrders.get(fromMarket?.address.toString())
|
||||
: undefined;
|
||||
const toOpenOrders = toMarket
|
||||
? openOrders.get(toMarket?.address.toString())
|
||||
: undefined;
|
||||
const fromWalletAddr = fromMint.equals(SOL_MINT)
|
||||
? wrappedSolAccount!.publicKey
|
||||
: fromWallet
|
||||
? fromWallet.publicKey
|
||||
: undefined;
|
||||
const toWalletAddr = toMint.equals(SOL_MINT)
|
||||
? wrappedSolAccount!.publicKey
|
||||
: toWallet
|
||||
? toWallet.publicKey
|
||||
: undefined;
|
||||
|
||||
return await swapClient.swapTxs({
|
||||
fromMint,
|
||||
toMint,
|
||||
quoteMint,
|
||||
amount,
|
||||
minExchangeRate,
|
||||
referral,
|
||||
fromMarket,
|
||||
toMarket,
|
||||
// Automatically created if undefined.
|
||||
fromOpenOrders: fromOpenOrders
|
||||
? fromOpenOrders[0].address
|
||||
: undefined,
|
||||
toOpenOrders: toOpenOrders ? toOpenOrders[0].address : undefined,
|
||||
fromWallet: fromWalletAddr,
|
||||
toWallet: toWalletAddr,
|
||||
quoteWallet: quoteWallet ? quoteWallet.publicKey : undefined,
|
||||
// Auto close newly created open orders accounts.
|
||||
close: isClosingNewAccounts,
|
||||
});
|
||||
})())
|
||||
);
|
||||
return await swapClient.swapTxs({
|
||||
fromMint,
|
||||
toMint,
|
||||
quoteMint,
|
||||
amount,
|
||||
minExchangeRate,
|
||||
referral,
|
||||
fromMarket,
|
||||
toMarket,
|
||||
// Automatically created if undefined.
|
||||
fromOpenOrders: fromOpenOrders ? fromOpenOrders[0].address : undefined,
|
||||
toOpenOrders: toOpenOrders ? toOpenOrders[0].address : undefined,
|
||||
fromWallet: fromWalletAddr,
|
||||
toWallet: toWalletAddr,
|
||||
quoteWallet: quoteWallet ? quoteWallet.publicKey : undefined,
|
||||
// Auto close newly created open orders accounts.
|
||||
close: isClosingNewAccounts,
|
||||
});
|
||||
})();
|
||||
|
||||
// Unwrap the SOL.
|
||||
// If swapping SOL, then insert a wrap/unwrap instruction.
|
||||
if (isSol) {
|
||||
txs.push(
|
||||
unwrapSol(swapClient.program.provider, wrappedSolAccount as Keypair)
|
||||
if (txs.length > 1) {
|
||||
throw new Error("SOL must be swapped in a single transaction");
|
||||
}
|
||||
const { tx: wrapTx, signers: wrapSigners } = await wrapSol(
|
||||
swapClient.program.provider,
|
||||
wrappedSolAccount as Keypair,
|
||||
fromMint,
|
||||
amount
|
||||
);
|
||||
const { tx: unwrapTx, signers: unwrapSigners } = unwrapSol(
|
||||
swapClient.program.provider,
|
||||
wrappedSolAccount as Keypair
|
||||
);
|
||||
const tx = new Transaction();
|
||||
tx.add(wrapTx);
|
||||
tx.add(txs[0].tx);
|
||||
tx.add(unwrapTx);
|
||||
txs[0].tx = tx;
|
||||
txs[0].signers.push(...wrapSigners);
|
||||
txs[0].signers.push(...unwrapSigners);
|
||||
}
|
||||
|
||||
await swapClient.program.provider.sendAll(txs);
|
||||
|
|
Loading…
Reference in New Issue