Wrap/unwrap sol in the same tx

This commit is contained in:
armaniferrante 2021-06-28 16:25:52 -07:00
parent 958f809be5
commit fd035017a5
No known key found for this signature in database
GPG Key ID: 58BEF301E91F7828
2 changed files with 68 additions and 70 deletions

View File

@ -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",

View File

@ -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);