diff --git a/package.json b/package.json index 59641d5..9a2ca7d 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/components/Swap.tsx b/src/components/Swap.tsx index c9ddd11..2cba7b6 100644 --- a/src/components/Swap.tsx +++ b/src/components/Swap.tsx @@ -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 }[] = []; 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);