// ********************************************************* // *************** 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()