上开发付款网关,并且需要使用node.js进行编程swap代币。目前,我正在使用jupiterapi.进行测试。
所有功能都可以生成交易签名。但是,在此之后,交换未执行-tokens保持不变。我看不到任何错误,但交易没有通过。
const {
Connection,
Keypair,
PublicKey,
clusterApiUrl,
LAMPORTS_PER_SOL,
VersionedTransaction,
} = require("@solana/web3.js");
const {
getAssociatedTokenAddressSync,
TOKEN_PROGRAM_ID,
ASSOCIATED_TOKEN_PROGRAM_ID,
} = require("@solana/spl-token");
const fetch = require("node-fetch"); // Ensure you have node-fetch installed
const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
const swapTokens = async (req, res) => {
try {
// **STEP 1: Get Best Quote**
const inputMint = "So11111111111111111111111111111111111111112"; // SOL
const outputMint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; // USDC
const userPublicKey = new PublicKey("YOUR_WALLET_PUBLIC_KEY"); // Replace with actual user public key
const amount = 0.000010; // Amount in SOL
const solAmount = Math.floor(amount * 1e9); // Convert SOL to lamports
const quoteResponse = await (
await fetch(
`https://api.jup.ag/swap/v1/quote?inputMint=${inputMint}&outputMint=${outputMint}&amount=${solAmount}&slippageBps=50&restrictIntermediateTokens=true&swapMode=ExactIn`
)
).json();
console.log("Quote Response:", JSON.stringify(quoteResponse, null, 2));
// **STEP 2: Execute Swap**
const swapResponse = await (
await fetch("https://api.jup.ag/swap/v1/swap", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
quoteResponse,
userPublicKey: userPublicKey.toBase58(),
}),
})
).json();
console.log("Swap Response:", swapResponse);
// **STEP 3: Sign and Send Transaction**
const transactionBase64 = swapResponse.swapTransaction;
const transaction = VersionedTransaction.deserialize(Buffer.from(transactionBase64, "base64"));
console.log("Deserialized Transaction:", transaction);
const mainWallet = Keypair.fromSecretKey(Uint8Array.from(YOUR_SECRET_KEY)); // Replace with your private key
transaction.sign([mainWallet]);
const transactionBinary = transaction.serialize();
console.log("Serialized Transaction:", transactionBinary);
const signature = await connection.sendRawTransaction(transactionBinary, {
maxRetries: 2,
skipPreflight: true,
});
console.log("Transaction Signature:", signature);
const confirmation = await connection.confirmTransaction({ signature }, "finalized");
console.log("Transaction Confirmation:", confirmation);
if (confirmation.value.err) {
console.log(`Transaction failed: ${JSON.stringify(confirmation.value.err)}\nhttps://solscan.io/tx/${signature}/`);
} else {
console.log(`Transaction successful: https://solscan.io/tx/${signature}/`);
}
res.status(200).json({ message: "Swap executed successfully", signature });
} catch (error) {
console.error("Swap Error:", error);
res.status(500).json({ message: "Swap failed: " + error.message });
}
};
pass quotesponse.引用而不是完整的引号,并启用前飞行以确保交易正确执行
const swapTokens = async (req, res) => {
try {
const inputMint = "So11111111111111111111111111111111111111112"; // SOL
const outputMint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; // USDC
const userPublicKey = new PublicKey("YOUR_WALLET_PUBLIC_KEY"); // Replace
const amount = 0.000010;
const solAmount = Math.floor(amount * 1e9);
const quoteResponse = await (
await fetch(
`https://api.jup.ag/swap/v1/quote?inputMint=${inputMint}&outputMint=${outputMint}&amount=${solAmount}&slippageBps=50`
)
).json();
console.log("Quote Response:", quoteResponse);
// **Extract only `quoteResponse.quote`**
const swapResponse = await (
await fetch("https://api.jup.ag/swap/v1/swap", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
quoteResponse: quoteResponse.quote, // ✅ Only pass `quote`
userPublicKey: userPublicKey.toBase58(),
}),
})
).json();
console.log("Swap Response:", swapResponse);
// Deserialize transaction
const transactionBase64 = swapResponse.swapTransaction;
const transaction = VersionedTransaction.deserialize(Buffer.from(transactionBase64, "base64"));
console.log("Deserialized Transaction:", transaction);
// Sign with the main wallet
const mainWallet = Keypair.fromSecretKey(Uint8Array.from(YOUR_SECRET_KEY)); // Replace
transaction.sign([mainWallet]);
// Convert to binary
const transactionBinary = Buffer.from(transaction.serialize());
// Send transaction
const signature = await connection.sendRawTransaction(transactionBinary, {
maxRetries: 2,
skipPreflight: false, // Ensure preflight checks
});
console.log("Transaction Signature:", signature);
// Confirm transaction
const confirmation = await connection.confirmTransaction(signature, "confirmed");
if (confirmation.value.err) {
console.log(`Transaction failed: https://solscan.io/tx/${signature}`);
} else {
console.log(`Transaction successful: https://solscan.io/tx/${signature}`);
}
res.status(200).json({ message: "Swap executed successfully", signature });
} catch (error) {
console.error("Swap Error:", error);
res.status(500).json({ message: "Swap failed: " + error.message });
}
};