mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-06 04:45:49 +00:00
339 lines
11 KiB
JavaScript
339 lines
11 KiB
JavaScript
|
|
// *********************************************************
|
|
// *************** Create Sell Offer ***********************
|
|
// *********************************************************
|
|
|
|
async function createSellOffer() {
|
|
const wallet = xrpl.Wallet.fromSeed(accountSeedField.value);
|
|
let results = '\nCreating sell offer...';
|
|
resultField.value = results;
|
|
|
|
try {
|
|
const client = new xrpl.Client(getNet());
|
|
await client.connect();
|
|
try {
|
|
const destination = destinationField.value || undefined;
|
|
const expiration = expirationField.value ? configureExpiration() : undefined;
|
|
|
|
const transactionJson = {
|
|
TransactionType: "NFTokenCreateOffer",
|
|
Account: wallet.classicAddress,
|
|
NFTokenID: nftIdField.value,
|
|
Flags: 1,
|
|
};
|
|
|
|
const amount = configureAmount();
|
|
if (amount) { // Only add Amount if it's defined
|
|
transactionJson.Amount = amount;
|
|
} else {
|
|
console.warn("Amount is undefined. Sell offer might be invalid.");
|
|
results += "\nWarning: Amount is undefined. Sell offer might be invalid, unless you plan to give away the NFT.";
|
|
resultField.value = results;
|
|
}
|
|
|
|
if (expiration) {
|
|
transactionJson.Expiration = expiration;
|
|
}
|
|
if (destination) {
|
|
transactionJson.Destination = destination;
|
|
}
|
|
|
|
const tx = await client.submitAndWait(transactionJson, { wallet });
|
|
results += `\nSell offer created successfully!\nTransaction Hash: ${tx.result.hash}\nEngine Result: ${tx.result.engine_result}`;
|
|
resultField.value = results;
|
|
|
|
} finally {
|
|
client.disconnect();
|
|
}
|
|
} catch (error) {
|
|
console.error("Error creating sell offer:", error);
|
|
results = `\nError: ${error.message || error}`;
|
|
resultField.value = results;
|
|
}
|
|
}// End of createSellOffer()
|
|
|
|
// *******************************************************
|
|
// ***************** Create Buy Offer ********************
|
|
// *******************************************************
|
|
|
|
async function createBuyOffer() {
|
|
const wallet = xrpl.Wallet.fromSeed(accountSeedField.value);
|
|
let net = getNet();
|
|
const client = new xrpl.Client(net);
|
|
await client.connect();
|
|
let results = '\n=== Connected. Creating buy offer. ===';
|
|
resultField.value = results;
|
|
|
|
try {
|
|
// Use the external configureAmount() function
|
|
let amount = configureAmount();
|
|
// Use the external configureExpiration() function
|
|
let expiration = configureExpiration(); // This will return a number or an empty string from the original logic
|
|
|
|
let transactionJson = {
|
|
"TransactionType": "NFTokenCreateOffer",
|
|
"Account": wallet.classicAddress,
|
|
"Owner": nftOwnerField.value,
|
|
"NFTokenID": nftIdField.value,
|
|
"Flags": 0, // Ensure no tfSellNFToken flag for a buy offer
|
|
};
|
|
|
|
// Only add Amount if it's defined (not undefined or an empty string)
|
|
if (amount !== undefined && amount !== '') {
|
|
transactionJson.Amount = amount;
|
|
} else {
|
|
results += "\nError: Amount field is required for a buy offer.";
|
|
resultField.value = results;
|
|
client.disconnect();
|
|
return;
|
|
}
|
|
|
|
if (destinationField.value !== '') {
|
|
transactionJson.Destination = destinationField.value;
|
|
}
|
|
|
|
// Only add Expiration if it's not an empty string
|
|
if (expiration > 0) {
|
|
transactionJson.Expiration = expiration;
|
|
}
|
|
|
|
const tx = await client.submitAndWait(transactionJson, { wallet: wallet });
|
|
|
|
results += "\n\n=== Sell Offers ===\n";
|
|
let nftSellOffers;
|
|
try {
|
|
nftSellOffers = await client.request({
|
|
method: "nft_sell_offers",
|
|
nft_id: nftIdField.value
|
|
});
|
|
} catch (err) {
|
|
nftSellOffers = "=== No sell offers. ===";
|
|
}
|
|
results += JSON.stringify(nftSellOffers, null, 2);
|
|
results += "\n\n=== Buy Offers ===\n";
|
|
let nftBuyOffers;
|
|
try {
|
|
nftBuyOffers = await client.request({
|
|
method: "nft_buy_offers",
|
|
nft_id: nftIdField.value
|
|
});
|
|
results += JSON.stringify(nftBuyOffers, null, 2);
|
|
} catch (err) {
|
|
results += "=== No buy offers. ===";
|
|
}
|
|
|
|
// Check transaction results -------------------------------------------------
|
|
results += "\n\n=== Transaction result:\n" +
|
|
JSON.stringify(tx.result.meta.TransactionResult, null, 2);
|
|
results += "\n\n=== Balance changes:\n" +
|
|
JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2);
|
|
resultField.value = results;
|
|
|
|
} catch (error) {
|
|
console.error('Error creating buy offer:', error);
|
|
results += "\n\n=== Error: " + error;
|
|
resultField.value = results;
|
|
} finally {
|
|
client.disconnect();
|
|
}
|
|
}// End of createBuyOffer()
|
|
|
|
// *******************************************************
|
|
// ******************** Cancel Offer *********************
|
|
// *******************************************************
|
|
|
|
async function cancelOffer() {
|
|
const wallet = xrpl.Wallet.fromSeed(accountSeedField.value)
|
|
let net = getNet()
|
|
const client = new xrpl.Client(net)
|
|
await client.connect()
|
|
let results = "\n=== Connected. Cancelling offer. ==="
|
|
resultField.value = results
|
|
|
|
const tokenOfferIDs = [nftOfferIdField.value]
|
|
|
|
// Prepare transaction -------------------------------------------------------
|
|
const transactionJson = {
|
|
"TransactionType": "NFTokenCancelOffer",
|
|
"Account": wallet.classicAddress,
|
|
"NFTokenOffers": tokenOfferIDs
|
|
}
|
|
// Submit transaction --------------------------------------------------------
|
|
const tx = await client.submitAndWait(transactionJson, { wallet })
|
|
|
|
results = "\n\n=== Sell Offers===\n"
|
|
let nftSellOffers
|
|
try {
|
|
nftSellOffers = await client.request({
|
|
method: "nft_sell_offers",
|
|
nft_id: nftIdField.value
|
|
})
|
|
} catch (err) {
|
|
nftSellOffers = '=== No sell offers. ===\n'
|
|
}
|
|
results += JSON.stringify(nftSellOffers, null, 2)
|
|
results += "\n\n=== Buy Offers ===\n"
|
|
let nftBuyOffers
|
|
try {
|
|
nftBuyOffers = await client.request({
|
|
method: "nft_buy_offers",
|
|
nft_id: nftIdField.value
|
|
})
|
|
|
|
} catch (err) {
|
|
nftBuyOffers = '=== No buy offers. ==='
|
|
}
|
|
results += JSON.stringify(nftBuyOffers, null, 2)
|
|
resultField.value += results
|
|
|
|
// Check transaction results -------------------------------------------------
|
|
|
|
results = "\n=== Transaction result:\n" +
|
|
JSON.stringify(tx.result.meta.TransactionResult, null, 2)
|
|
results += "\n\n=== Balance changes:\n" +
|
|
JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)
|
|
resultField.value += results
|
|
|
|
client.disconnect() // End of cancelOffer()
|
|
}
|
|
|
|
// *******************************************************
|
|
// ******************** Get Offers ***********************
|
|
// *******************************************************
|
|
|
|
async function getOffers() {
|
|
const wallet = xrpl.Wallet.fromSeed(accountSeedField.value)
|
|
let net = getNet()
|
|
const client = new xrpl.Client(net)
|
|
await client.connect()
|
|
|
|
let results = '\nConnected. Getting offers...'
|
|
resultField.value = results
|
|
|
|
// --- Sell Offers ---
|
|
results += '\n\n=== Sell Offers ===\n'
|
|
let nftSellOffers
|
|
try {
|
|
nftSellOffers = await client.request({
|
|
method: "nft_sell_offers",
|
|
nft_id: nftIdField.value
|
|
})
|
|
} catch (err) {
|
|
nftSellOffers = 'No sell offers found for this NFT ID.'
|
|
}
|
|
results += JSON.stringify(nftSellOffers, null, 2)
|
|
resultField.value = results
|
|
|
|
// --- Buy Offers ---
|
|
results = '\n\n=== Buy Offers ===\n'
|
|
let nftBuyOffers
|
|
try {
|
|
nftBuyOffers = await client.request({
|
|
method: "nft_buy_offers",
|
|
nft_id: nftIdField.value
|
|
})
|
|
} catch (err) {
|
|
// Log the actual error for debugging
|
|
nftBuyOffers = 'No buy offers found for this NFT ID.' // More descriptive
|
|
}
|
|
results += JSON.stringify(nftBuyOffers, null, 2) // Append the JSON string
|
|
resultField.value += results // Update the display with buy offers
|
|
|
|
client.disconnect()
|
|
}// End of getOffers()
|
|
|
|
// *******************************************************
|
|
// ****************** Accept Sell Offer ******************
|
|
// *******************************************************
|
|
|
|
async function acceptSellOffer() {
|
|
const wallet = xrpl.Wallet.fromSeed(accountSeedField.value)
|
|
let net = getNet()
|
|
const client = new xrpl.Client(net)
|
|
try {
|
|
await client.connect()
|
|
let results = '\n=== Connected. Accepting sell offer. ===\n\n'
|
|
resultField.value = results
|
|
|
|
// Prepare transaction -------------------------------------------------------
|
|
const transactionJson = {
|
|
"TransactionType": "NFTokenAcceptOffer",
|
|
"Account": wallet.classicAddress,
|
|
"NFTokenSellOffer": nftOfferIdField.value,
|
|
}
|
|
// Submit transaction --------------------------------------------------------
|
|
const tx = await client.submitAndWait(transactionJson, { wallet: wallet })
|
|
const nfts = await client.request({
|
|
method: "account_nfts",
|
|
account: wallet.classicAddress
|
|
})
|
|
|
|
// Check transaction results -------------------------------------------------
|
|
|
|
xrpBalanceField.value = (await client.getXrpBalance(wallet.address))
|
|
|
|
|
|
results += '=== Transaction result:\n'
|
|
results += JSON.stringify(tx.result.meta.TransactionResult, null, 2)
|
|
results += '\n=== Balance changes:'
|
|
results += JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)
|
|
results += JSON.stringify(nfts, null, 2)
|
|
resultField.value += results
|
|
} catch (error) {
|
|
console.error('Error accepting sell offer:', error)
|
|
resultField.value = `Error: ${error.message || error}`
|
|
} finally {
|
|
client.disconnect()
|
|
}
|
|
}// End of acceptSellOffer()
|
|
|
|
// *******************************************************
|
|
// ******************* Accept Buy Offer ******************
|
|
// *******************************************************
|
|
|
|
async function acceptBuyOffer() {
|
|
const wallet = xrpl.Wallet.fromSeed(accountSeedField.value);
|
|
let net = getNet();
|
|
const client = new xrpl.Client(net);
|
|
let results = '\n=== Connected. Accepting buy offer. ==='; // Declare results locally
|
|
|
|
try {
|
|
await client.connect();
|
|
resultField.value = results; // Update UI after connection
|
|
|
|
// Prepare transaction -------------------------------------------------------
|
|
const transactionJson = {
|
|
"TransactionType": "NFTokenAcceptOffer",
|
|
"Account": wallet.classicAddress,
|
|
"NFTokenBuyOffer": nftOfferIdField.value
|
|
};
|
|
|
|
// Submit transaction --------------------------------------------------------
|
|
const tx = await client.submitAndWait(transactionJson, { wallet: wallet });
|
|
|
|
const nfts = await client.request({
|
|
method: "account_nfts",
|
|
account: wallet.classicAddress
|
|
});
|
|
|
|
results += JSON.stringify(nfts, null, 2);
|
|
resultField.value = results;
|
|
|
|
// Check transaction results -------------------------------------------------
|
|
results += "\n\nTransaction result:\n" +
|
|
JSON.stringify(tx.result.meta.TransactionResult, null, 2);
|
|
results += "\nBalance changes:\n" +
|
|
JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2);
|
|
xrpBalanceField.value = (await client.getXrpBalance(wallet.address));
|
|
resultField.value = results;
|
|
|
|
} catch (error) {
|
|
console.error('Error in acceptBuyOffer:', error); // Log the full error
|
|
results = `\n=== Error accepting buy offer: ${error.message || 'Unknown error'} ===`;
|
|
resultField.value = results;
|
|
} finally {
|
|
if (client && client.isConnected()) {
|
|
client.disconnect();
|
|
}
|
|
}
|
|
} // End of acceptBuyOffer()
|