mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-12-01 09:05:49 +00:00
add better error handling and double token amm functionality
This commit is contained in:
@@ -44,7 +44,7 @@
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td>
|
||||
<table>
|
||||
<table style="padding-bottom: 400px;">
|
||||
<tr valign="top">
|
||||
<td>
|
||||
<td>
|
||||
@@ -107,27 +107,84 @@
|
||||
Currency
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="standbyCurrencyField" size="40" value="USD"></input>
|
||||
<input type="text" id="standbyCurrencyField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p align="left">
|
||||
<textarea id="standbyResultField" cols="60" rows="20" style="resize: none;"></textarea>
|
||||
</p>
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td align="right">
|
||||
Asset 1 Currency
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset1CurrencyField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 1 Issuer
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset1IssuerField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 1 Amount
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset1AmountField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 2 Currency
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset2CurrencyField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 2 Issuer
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset2IssuerField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 2 Amount
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset2AmountField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p align="left">
|
||||
<textarea id="standbyResultField" cols="80" rows="20" ></textarea>
|
||||
</p>
|
||||
</td>
|
||||
</td>
|
||||
<td>
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td align="center" valign="top">
|
||||
<br><br><br><br>
|
||||
<td align="center" valign="top" style="padding-top: 165px;">
|
||||
<br>
|
||||
<button type="button" onClick="sendXRP()">Send XRP></button>
|
||||
<br/><br/>
|
||||
<button type="button" onClick="createTrustline()">Create TrustLine</button>
|
||||
<br/>
|
||||
<button type="button" onClick="sendCurrency()">Send Currency</button>
|
||||
<br/>
|
||||
<button type="button" onClick="getBalances()">Get Balances</button>
|
||||
<button type="button" onClick="getBalances()" style="margin-bottom: 160px;">Get Balances</button>
|
||||
<br/>
|
||||
<button type="button" onClick="checkAMM()">Check AMM</button>
|
||||
<br/>
|
||||
@@ -142,13 +199,13 @@
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<table>
|
||||
<table style="padding-bottom: 350px;">
|
||||
<tr>
|
||||
<td>
|
||||
<td>
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center" valign="top">
|
||||
<td align="center" valign="top" style="padding-bottom: 100px;">
|
||||
<button type="button" onClick="oPsendXRP()">< Send XRP</button>
|
||||
<br/><br/>
|
||||
<button type="button" onClick="oPcreateTrustline()">Create TrustLine</button>
|
||||
@@ -219,12 +276,14 @@
|
||||
Currency
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="operationalCurrencyField" size="40" value="USD"></input>
|
||||
<input type="text" id="operationalCurrencyField" size="40"></input>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p align="right">
|
||||
<textarea id="operationalResultField" cols="80" rows="20" ></textarea>
|
||||
<textarea id="operationalResultField" cols="60" rows="20" style="resize: none;"></textarea>
|
||||
<br><br>
|
||||
<textarea id="ammInfoField" cols="60" rows="20" style="resize: none;"></textarea>
|
||||
</p>
|
||||
</td>
|
||||
</td>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Add Assets to AMM Test Harness</title>
|
||||
<title>Add to AMM Test Harness</title>
|
||||
<link href='https://fonts.googleapis.com/css?family=Work Sans' rel='stylesheet'>
|
||||
<style>
|
||||
body{font-family: "Work Sans", sans-serif;padding: 20px;background: #fafafa;}
|
||||
@@ -26,7 +26,7 @@
|
||||
<!-- ************************************************************** -->
|
||||
|
||||
<body>
|
||||
<h1>Add Assets to AMM Test Harness</h1>
|
||||
<h1>Add to AMM Test Harness</h1>
|
||||
<form id="theForm">
|
||||
Choose your ledger instance:
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td>
|
||||
<table>
|
||||
<table style="padding-bottom: 400px;">
|
||||
<tr valign="top">
|
||||
<td>
|
||||
<td>
|
||||
@@ -108,7 +108,76 @@
|
||||
Currency
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="standbyCurrencyField" size="40" value="USD"></input>
|
||||
<input type="text" id="standbyCurrencyField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p align="left">
|
||||
<textarea id="standbyResultField" cols="60" rows="20" style="resize: none;"></textarea>
|
||||
</p>
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td align="right">
|
||||
Asset 1 Currency
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset1CurrencyField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 1 Issuer
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset1IssuerField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 1 Amount
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset1AmountField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 2 Currency
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset2CurrencyField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 2 Issuer
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset2IssuerField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Asset 2 Amount
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="asset2AmountField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Trading Fee
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="standbyFeeField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -120,25 +189,13 @@
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Trading Fee
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="standbyFeeField" size="40"></input>
|
||||
<br>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p align="left">
|
||||
<textarea id="standbyResultField" cols="80" rows="20" ></textarea>
|
||||
</p>
|
||||
</td>
|
||||
</td>
|
||||
<td>
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td align="center" valign="top" style="padding-top: 270px;">
|
||||
<td align="center" valign="top" style="padding-top: 240px;">
|
||||
<br>
|
||||
<button type="button" onClick="sendXRP()">Send XRP></button>
|
||||
<br/><br/>
|
||||
@@ -146,11 +203,11 @@
|
||||
<br/>
|
||||
<button type="button" onClick="sendCurrency()">Send Currency</button>
|
||||
<br/>
|
||||
<button type="button" onClick="getBalances()">Get Balances</button>
|
||||
<br/><br/>
|
||||
<button type="button" onClick="getBalances()" style="margin-bottom: 160px;">Get Balances</button>
|
||||
<br/>
|
||||
<button type="button" onClick="checkAMM()">Check AMM</button>
|
||||
<br/>
|
||||
<button type="button" onClick="createAMM()">Create AMM</button>
|
||||
<button type="button" onClick="createAMM()">Create AMM</button>
|
||||
<br/>
|
||||
<button type="button" onClick="addAssets()">Add to AMM</button>
|
||||
<br/>
|
||||
@@ -169,14 +226,13 @@
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<table>
|
||||
<table style="padding-bottom: 430px;">
|
||||
<tr>
|
||||
<td>
|
||||
<td>
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center" valign="top" style="padding-top: 15px;">
|
||||
<br/>
|
||||
<td align="center" valign="top" style="padding-bottom: 100px;">
|
||||
<button type="button" onClick="oPsendXRP()">< Send XRP</button>
|
||||
<br/><br/>
|
||||
<button type="button" onClick="oPcreateTrustline()">Create TrustLine</button>
|
||||
@@ -184,7 +240,6 @@
|
||||
<button type="button" onClick="oPsendCurrency()">Send Currency</button>
|
||||
<br/>
|
||||
<button type="button" onClick="getBalances()">Get Balances</button>
|
||||
<br>
|
||||
</td>
|
||||
<td valign="top" align="right">
|
||||
<button type="button" onClick="getAccount('operational')">Get New Operational Account</button>
|
||||
@@ -244,16 +299,18 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right" style="padding-bottom: 60px;">
|
||||
<td align="right">
|
||||
Currency
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="operationalCurrencyField" size="40" value="USD"></input>
|
||||
<input type="text" id="operationalCurrencyField" size="40"></input>
|
||||
</td>
|
||||
</tr>
|
||||
</table><br><br>
|
||||
</table>
|
||||
<p align="right">
|
||||
<textarea id="operationalResultField" cols="80" rows="20" ></textarea>
|
||||
<textarea id="operationalResultField" cols="60" rows="20" style="resize: none;"></textarea>
|
||||
<br><br>
|
||||
<textarea id="ammInfoField" cols="60" rows="20" style="resize: none;"></textarea>
|
||||
</p>
|
||||
</td>
|
||||
</td>
|
||||
|
||||
@@ -13,10 +13,16 @@ async function createAMM() {
|
||||
standbyResultField.value = results
|
||||
|
||||
const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value)
|
||||
const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value)
|
||||
const xrp_value = standbyBalanceField.value
|
||||
const currency_code = standbyCurrencyField.value
|
||||
const currency_value = standbyAmountField.value
|
||||
|
||||
const asset1_currency = asset1CurrencyField.value
|
||||
const asset1_issuer = asset1IssuerField.value
|
||||
const asset1_amount = asset1AmountField.value
|
||||
|
||||
const asset2_currency = asset2CurrencyField.value
|
||||
const asset2_issuer = asset2IssuerField.value
|
||||
const asset2_amount = asset2AmountField.value
|
||||
|
||||
let ammCreate = null
|
||||
|
||||
results += '\n\nCreating AMM ...'
|
||||
standbyResultField.value = results
|
||||
@@ -25,19 +31,84 @@ async function createAMM() {
|
||||
// (in drops) on the current network using server_state:
|
||||
const ss = await client.request({"command": "server_state"})
|
||||
const amm_fee_drops = ss.result.state.validated_ledger.reserve_inc.toString()
|
||||
|
||||
if (asset1_currency == 'XRP') {
|
||||
|
||||
ammCreate = {
|
||||
"TransactionType": "AMMCreate",
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": JSON.stringify(asset1_amount * 1000000), // convert XRP to drops
|
||||
"Amount2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer,
|
||||
"value": asset2_amount
|
||||
},
|
||||
"TradingFee": 500, // 500 = 0.5%
|
||||
"Fee": amm_fee_drops
|
||||
}
|
||||
|
||||
} else if (asset2_currency =='XRP') {
|
||||
|
||||
ammCreate = {
|
||||
"TransactionType": "AMMCreate",
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer,
|
||||
"value": asset1_amount
|
||||
},
|
||||
"Amount2": JSON.stringify(asset2_amount * 1000000), // convert XRP to drops
|
||||
"TradingFee": 500, // 500 = 0.5%
|
||||
"Fee": amm_fee_drops
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
ammCreate = {
|
||||
"TransactionType": "AMMCreate",
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer,
|
||||
"value": asset1_amount
|
||||
},
|
||||
"Amount2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer,
|
||||
"value": asset2_amount
|
||||
},
|
||||
"TradingFee": 500, // 500 = 0.5%
|
||||
"Fee": amm_fee_drops
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
const prepared_create = await client.autofill(ammCreate)
|
||||
results += `\n\nPrepared transaction:\n${JSON.stringify(prepared_create, null, 2)}`
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
|
||||
const ammcreate_result = await client.submitAndWait({
|
||||
"TransactionType": "AMMCreate",
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
"currency": currency_code,
|
||||
"issuer": operational_wallet.address,
|
||||
"value": currency_value
|
||||
},
|
||||
"Amount2": JSON.stringify(xrp_value * 1000000), // convert XRP to drops
|
||||
"TradingFee": 500, // 500 = 0.5%
|
||||
"Fee": amm_fee_drops,
|
||||
}, {autofill: true, wallet: standby_wallet, fail_hard: true}) // Use fail_hard so you don't waste the tx cost if you mess up
|
||||
const signed_create = standby_wallet.sign(prepared_create)
|
||||
results += `\n\nSending AMMCreate transaction ...`
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
|
||||
const amm_create = await client.submitAndWait(signed_create.tx_blob)
|
||||
|
||||
if (amm_create.result.meta.TransactionResult == "tesSUCCESS") {
|
||||
results += `\n\nTransaction succeeded.`
|
||||
} else {
|
||||
results += `\n\nError sending transaction: ${JSON.stringify(amm_create.result.meta.TransactionResult, null, 2)}`
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
results += `\n\n${error.message}`
|
||||
}
|
||||
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
|
||||
checkAMM()
|
||||
|
||||
@@ -50,46 +121,73 @@ async function createAMM() {
|
||||
async function checkAMM() {
|
||||
|
||||
let net = getNet()
|
||||
|
||||
const client = new xrpl.Client(net)
|
||||
results = `\n\nConnecting to ${getNet()} ...`
|
||||
standbyResultField.value = results
|
||||
|
||||
await client.connect()
|
||||
results += '\n\nConnected.'
|
||||
standbyResultField.value = results
|
||||
|
||||
// Gets the issuer and currency code
|
||||
const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value)
|
||||
const currency_code = standbyCurrencyField.value
|
||||
|
||||
results += '\n\nChecking AMM ...'
|
||||
standbyResultField.value = results
|
||||
const asset1_currency = asset1CurrencyField.value
|
||||
const asset1_issuer = asset1IssuerField.value
|
||||
|
||||
const asset2_currency = asset2CurrencyField.value
|
||||
const asset2_issuer = asset2IssuerField.value
|
||||
|
||||
let amm_info_request = null
|
||||
|
||||
// Get AMM info transaction
|
||||
const amm_info_request = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"asset2": {
|
||||
"currency": currency_code,
|
||||
"issuer": operational_wallet.address
|
||||
},
|
||||
"ledger_index": "validated"
|
||||
|
||||
if (asset1_currency == 'XRP') {
|
||||
|
||||
amm_info_request = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
},
|
||||
"ledger_index": "validated"
|
||||
}
|
||||
|
||||
} else if (asset2_currency =='XRP') {
|
||||
|
||||
amm_info_request = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"asset2": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"ledger_index": "validated"
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
amm_info_request = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
},
|
||||
"ledger_index": "validated"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
const amm_info_result = await client.request(amm_info_request)
|
||||
results += `\n\nAMM Info:\n${JSON.stringify(amm_info_result.result.amm, null, 2)}`
|
||||
} catch(err) {
|
||||
if (err.data.error === 'actNotFound') {
|
||||
results += `\n\nNo AMM exists for the pair ${currency_code} / XRP.`
|
||||
} else {
|
||||
results += `\n\n${err}`
|
||||
}
|
||||
ammInfo = `${JSON.stringify(amm_info_result.result.amm, null, 2)}`
|
||||
} catch(error) {
|
||||
ammInfo = `${error}`
|
||||
}
|
||||
|
||||
standbyResultField.value = results
|
||||
ammInfoField.value = ammInfo
|
||||
|
||||
client.disconnect()
|
||||
|
||||
|
||||
@@ -13,14 +13,19 @@ async function addAssets() {
|
||||
standbyResultField.value = results
|
||||
|
||||
const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value)
|
||||
const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value)
|
||||
const addXRP = standbyBalanceField.value
|
||||
const currency_code = standbyCurrencyField.value
|
||||
const addCurrency = standbyAmountField.value
|
||||
|
||||
const asset1_currency = asset1CurrencyField.value
|
||||
const asset1_issuer = asset1IssuerField.value
|
||||
const asset1_amount = asset1AmountField.value
|
||||
|
||||
const asset2_currency = asset2CurrencyField.value
|
||||
const asset2_issuer = asset2IssuerField.value
|
||||
const asset2_amount = asset2AmountField.value
|
||||
|
||||
// Check for all combinations of asset deposits.
|
||||
let ammdeposit = null
|
||||
|
||||
if (addXRP && addCurrency) {
|
||||
if (asset1_currency == "XRP" && asset2_currency && asset1_amount && asset2_amount ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
@@ -28,51 +33,160 @@ async function addAssets() {
|
||||
currency: "XRP"
|
||||
},
|
||||
"Asset2": {
|
||||
currency: currency_code,
|
||||
issuer: operational_wallet.address
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": xrpl.xrpToDrops(addXRP),
|
||||
"Amount": xrpl.xrpToDrops(asset1_amount),
|
||||
"Amount2": {
|
||||
currency: currency_code,
|
||||
issuer: operational_wallet.address,
|
||||
value: addCurrency
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer,
|
||||
value: asset2_amount
|
||||
},
|
||||
"Flags": 0x00100000
|
||||
}
|
||||
|
||||
} else if ( addXRP ) {
|
||||
} else if ( asset1_currency && asset2_currency == "XRP" && asset1_amount && asset2_amount ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
"Asset": {
|
||||
currency: "XRP"
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
currency: currency_code,
|
||||
issuer: operational_wallet.address
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": xrpl.xrpToDrops(addXRP),
|
||||
"Flags": 0x00080000
|
||||
}
|
||||
|
||||
} else if ( addCurrency ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
"Asset": {
|
||||
currency: "XRP"
|
||||
},
|
||||
"Asset2": {
|
||||
currency: currency_code,
|
||||
issuer: operational_wallet.address
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
currency: currency_code,
|
||||
issuer: operational_wallet.address,
|
||||
value: addCurrency
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer,
|
||||
value: asset1_amount
|
||||
},
|
||||
"Amount2": xrpl.xrpToDrops(asset2_amount),
|
||||
"Flags": 0x00100000
|
||||
}
|
||||
|
||||
} else if ( asset1_currency && asset2_currency && asset1_amount && asset2_amount ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
"Asset": {
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer,
|
||||
value: asset1_amount
|
||||
},
|
||||
"Amount2": {
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer,
|
||||
value: asset2_amount
|
||||
},
|
||||
"Flags": 0x00100000
|
||||
}
|
||||
|
||||
} else if ( asset1_currency == "XRP" && asset2_currency && asset1_amount ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
"Asset": {
|
||||
currency: "XRP"
|
||||
},
|
||||
"Asset2": {
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": xrpl.xrpToDrops(asset1_amount),
|
||||
"Flags": 0x00080000
|
||||
}
|
||||
|
||||
} else if ( asset1_currency && asset2_currency == "XRP" && asset1_amount ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
"Asset": {
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
currency: "XRP"
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer,
|
||||
value: asset1_amount
|
||||
},
|
||||
"Flags": 0x00080000
|
||||
}
|
||||
|
||||
} else if ( asset1_currency == "XRP" && asset2_currency && asset2_amount ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
"Asset": {
|
||||
currency: "XRP"
|
||||
},
|
||||
"Asset2": {
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer,
|
||||
value: asset2_amount
|
||||
},
|
||||
"Flags": 0x00080000
|
||||
}
|
||||
|
||||
} else if ( asset1_currency && asset2_currency && asset1_amount ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
"Asset": {
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer,
|
||||
value: asset1_amount
|
||||
},
|
||||
"Flags": 0x00080000
|
||||
}
|
||||
|
||||
} else if ( asset1_currency && asset2_currency && asset2_amount ) {
|
||||
|
||||
ammdeposit = {
|
||||
"TransactionType": "AMMDeposit",
|
||||
"Asset": {
|
||||
currency: asset1_currency,
|
||||
issuer: asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"Amount": {
|
||||
currency: asset2_currency,
|
||||
issuer: asset2_issuer,
|
||||
value: asset2_amount
|
||||
},
|
||||
"Flags": 0x00080000
|
||||
}
|
||||
@@ -82,8 +196,11 @@ async function addAssets() {
|
||||
results += `\n\nNo assets selected to add ...`
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
const prepared_deposit = await client.autofill(ammdeposit)
|
||||
results += `\n\nPrepared transaction:\n${JSON.stringify(prepared_deposit, null, 2)}`
|
||||
@@ -99,39 +216,18 @@ async function addAssets() {
|
||||
|
||||
if (lp_deposit.result.meta.TransactionResult == "tesSUCCESS") {
|
||||
results += `\n\nTransaction succeeded.`
|
||||
checkAMM()
|
||||
} else {
|
||||
results += `\n\nError sending transaction: ${lp_deposit}`
|
||||
results += `\n\nError sending transaction: ${JSON.stringify(lp_deposit.result.meta.TransactionResult, null, 2)}`
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
results += `\n\n${error.message}`
|
||||
}
|
||||
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
|
||||
// Update LP token balance.
|
||||
|
||||
standbyWalletBalances = (await client.getBalances(standby_wallet.address))
|
||||
|
||||
const amm_info_request = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"asset2": {
|
||||
"currency": currency_code,
|
||||
"issuer": operational_wallet.address
|
||||
},
|
||||
"ledger_index": "validated"
|
||||
}
|
||||
|
||||
const amm_info_result = await client.request(amm_info_request)
|
||||
|
||||
// Get the AMM account address that issues LP tokens to depositors
|
||||
ammAccount = amm_info_result.result.amm.account
|
||||
|
||||
const lpCurrency = standbyWalletBalances.find(item => item.issuer === ammAccount);
|
||||
|
||||
const lpValue = lpCurrency ? lpCurrency.value : 'Currency not found';
|
||||
standbyLPField.value = lpValue
|
||||
|
||||
client.disconnect()
|
||||
|
||||
}
|
||||
@@ -150,22 +246,64 @@ async function voteFees() {
|
||||
standbyResultField.value = results
|
||||
|
||||
const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value)
|
||||
const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value)
|
||||
const currency_code = standbyCurrencyField.value
|
||||
const voteFee = standbyFeeField.value
|
||||
|
||||
const ammvote = {
|
||||
"TransactionType": "AMMVote",
|
||||
"Asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"Asset2": {
|
||||
"currency": currency_code,
|
||||
"issuer": operational_wallet.address
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"TradingFee": Number(voteFee)
|
||||
const asset1_currency = asset1CurrencyField.value
|
||||
const asset1_issuer = asset1IssuerField.value
|
||||
|
||||
const asset2_currency = asset2CurrencyField.value
|
||||
const asset2_issuer = asset2IssuerField.value
|
||||
|
||||
let ammvote = null
|
||||
|
||||
if ( asset1_currency == "XRP" ) {
|
||||
|
||||
ammvote = {
|
||||
"TransactionType": "AMMVote",
|
||||
"Asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"Asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"TradingFee": Number(voteFee)
|
||||
}
|
||||
|
||||
} else if ( asset2_currency == "XRP" ) {
|
||||
|
||||
ammvote = {
|
||||
"TransactionType": "AMMVote",
|
||||
"Asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"TradingFee": Number(voteFee)
|
||||
}
|
||||
} else {
|
||||
|
||||
ammvote = {
|
||||
"TransactionType": "AMMVote",
|
||||
"Asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"TradingFee": Number(voteFee)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
const prepared_vote = await client.autofill(ammvote)
|
||||
results += `\n\nPrepared transaction:\n${JSON.stringify(prepared_vote, null, 2)}`
|
||||
@@ -180,10 +318,15 @@ async function voteFees() {
|
||||
const response_vote = await client.submitAndWait(signed_vote.tx_blob)
|
||||
if (response_vote.result.meta.TransactionResult == "tesSUCCESS") {
|
||||
results += `\n\nTransaction succeeded.`
|
||||
checkAMM()
|
||||
} else {
|
||||
results += `\n\nError sending transaction: ${response_vote}`
|
||||
results += `\n\nError sending transaction: ${JSON.stringify(response_vote.result.meta.TransactionResult, null, 2)}`
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
results += `\n\n${error.message}`
|
||||
}
|
||||
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
|
||||
@@ -203,40 +346,119 @@ async function calculateLP() {
|
||||
await client.connect()
|
||||
results += '\n\nConnected.'
|
||||
standbyResultField.value = results
|
||||
|
||||
const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value)
|
||||
const currency_code = standbyCurrencyField.value
|
||||
|
||||
const LPTokens = standbyLPField.value
|
||||
const standby_wallet = standbyAccountField.value
|
||||
|
||||
const asset1_currency = asset1CurrencyField.value
|
||||
const asset1_issuer = asset1IssuerField.value
|
||||
|
||||
const asset2_currency = asset2CurrencyField.value
|
||||
const asset2_issuer = asset2IssuerField.value
|
||||
|
||||
let amm_info = null
|
||||
|
||||
if ( asset1_currency == "XRP" ) {
|
||||
|
||||
const amm_info = (await client.request({
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"asset2": {
|
||||
"currency": currency_code,
|
||||
"issuer": operational_wallet.address
|
||||
amm_info = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
}
|
||||
}
|
||||
}))
|
||||
|
||||
const my_share = LPTokens / amm_info.result.amm.lp_token.value
|
||||
} else if ( asset2_currency == "XRP" ) {
|
||||
|
||||
amm_info = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"asset2": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
amm_info = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
const my_asset1 = (amm_info.result.amm.amount * my_share) / 1000000
|
||||
const my_asset2 = amm_info.result.amm.amount2.value * my_share
|
||||
// Get LP token balance.
|
||||
standbyWalletBalances = await client.getBalances(standby_wallet)
|
||||
|
||||
const amm_info_result = await client.request(amm_info)
|
||||
|
||||
// Get the AMM account address that issues LP tokens to depositors
|
||||
ammAccount = amm_info_result.result.amm.account
|
||||
|
||||
const lpCurrency = standbyWalletBalances.find(item => item.issuer === ammAccount);
|
||||
|
||||
const lpBalance = lpCurrency ? lpCurrency.value : 'Currency not found';
|
||||
|
||||
const my_share = lpBalance / amm_info_result.result.amm.lp_token.value
|
||||
|
||||
results += `\n\nMy ${LPTokens} LP tokens are worth:\n
|
||||
let my_asset1 = null
|
||||
let my_asset2 = null
|
||||
|
||||
if ( amm_info_result.result.amm.amount.value && amm_info_result.result.amm.amount2.value ) {
|
||||
|
||||
my_asset1 = amm_info_result.result.amm.amount.value * my_share
|
||||
my_asset2 = amm_info_result.result.amm.amount2.value * my_share
|
||||
|
||||
results += `\n\nI have a total of ${lpBalance} LP tokens that are worth:\n
|
||||
${amm_info_result.result.amm.amount.currency}: ${my_asset1}
|
||||
${amm_info_result.result.amm.amount2.currency}: ${my_asset2}`
|
||||
|
||||
} else if ( amm_info_result.result.amm.amount.value == undefined ) {
|
||||
|
||||
my_asset1 = (amm_info_result.result.amm.amount * my_share) / 1000000
|
||||
my_asset2 = amm_info_result.result.amm.amount2.value * my_share
|
||||
|
||||
results += `\n\nI have a total of ${lpBalance} LP tokens that are worth:\n
|
||||
XRP: ${my_asset1}
|
||||
${amm_info.result.amm.amount2.currency}: ${my_asset2}`
|
||||
${amm_info_result.result.amm.amount2.currency}: ${my_asset2}`
|
||||
|
||||
} else {
|
||||
|
||||
my_asset1 = amm_info_result.result.amm.amount.value * my_share
|
||||
my_asset2 = (amm_info_result.result.amm.amount2 * my_share) / 1000000
|
||||
|
||||
results += `\n\nI have a total of ${lpBalance} LP tokens that are worth:\n
|
||||
${amm_info_result.result.amm.amount.currency}: ${my_asset1}
|
||||
XRP: ${my_asset2}`
|
||||
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
results += `\n\n${error.message}`
|
||||
}
|
||||
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
|
||||
client.disconnect()
|
||||
|
||||
}
|
||||
|
||||
// Withdraw by redeeming LP tokens.
|
||||
// Redeem LP tokens.
|
||||
async function redeemLP() {
|
||||
|
||||
let net = getNet()
|
||||
@@ -250,45 +472,143 @@ async function redeemLP() {
|
||||
standbyResultField.value = results
|
||||
|
||||
const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value)
|
||||
const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value)
|
||||
const currency_code = standbyCurrencyField.value
|
||||
const LPTokens = standbyLPField.value
|
||||
|
||||
const asset1_currency = asset1CurrencyField.value
|
||||
const asset1_issuer = asset1IssuerField.value
|
||||
|
||||
const asset2_currency = asset2CurrencyField.value
|
||||
const asset2_issuer = asset2IssuerField.value
|
||||
|
||||
// Structure "amm_info" command based on asset combo.
|
||||
let amm_info = null
|
||||
|
||||
if ( asset1_currency == "XRP" ) {
|
||||
|
||||
amm_info = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
}
|
||||
}
|
||||
|
||||
} else if ( asset2_currency == "XRP" ) {
|
||||
|
||||
amm_info = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"asset2": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
amm_info = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Get LP token info.
|
||||
const amm_info_request = {
|
||||
"command": "amm_info",
|
||||
"asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"asset2": {
|
||||
"currency": currency_code,
|
||||
"issuer": operational_wallet.address
|
||||
},
|
||||
"ledger_index": "validated"
|
||||
|
||||
let ammIssuer = null
|
||||
let ammCurrency = null
|
||||
const LPTokens = standbyLPField.value
|
||||
|
||||
try {
|
||||
const amm_info_result = await client.request(amm_info)
|
||||
ammIssuer = amm_info_result.result.amm.lp_token.issuer
|
||||
ammCurrency = amm_info_result.result.amm.lp_token.currency
|
||||
} catch (error) {
|
||||
results += `\n\n${error.message}`
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
return
|
||||
}
|
||||
|
||||
const amm_info_result = await client.request(amm_info_request)
|
||||
const ammIssuer = amm_info_result.result.amm.lp_token.issuer
|
||||
const ammCurrency = amm_info_result.result.amm.lp_token.currency
|
||||
// Structure ammwithdraw transaction based on asset combo.
|
||||
let ammwithdraw = null
|
||||
|
||||
if ( asset1_currency == "XRP" ) {
|
||||
|
||||
ammwithdraw = {
|
||||
"TransactionType": "AMMWithdraw",
|
||||
"Asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"Asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"LPTokenIn": {
|
||||
currency: ammCurrency,
|
||||
issuer: ammIssuer,
|
||||
value: LPTokens
|
||||
},
|
||||
"Flags": 0x00010000
|
||||
}
|
||||
|
||||
} else if ( asset2_currency == "XRP" ) {
|
||||
|
||||
ammwithdraw = {
|
||||
"TransactionType": "AMMWithdraw",
|
||||
"Asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"LPTokenIn": {
|
||||
currency: ammCurrency,
|
||||
issuer: ammIssuer,
|
||||
value: LPTokens
|
||||
},
|
||||
"Flags": 0x00010000
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
ammwithdraw = {
|
||||
"TransactionType": "AMMWithdraw",
|
||||
"Asset": {
|
||||
"currency": asset1_currency,
|
||||
"issuer": asset1_issuer
|
||||
},
|
||||
"Asset2": {
|
||||
"currency": asset2_currency,
|
||||
"issuer": asset2_issuer
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"LPTokenIn": {
|
||||
currency: ammCurrency,
|
||||
issuer: ammIssuer,
|
||||
value: LPTokens
|
||||
},
|
||||
"Flags": 0x00010000
|
||||
}
|
||||
|
||||
const ammwithdraw = {
|
||||
"TransactionType": "AMMWithdraw",
|
||||
"Asset": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"Asset2": {
|
||||
"currency": currency_code,
|
||||
"issuer": operational_wallet.address
|
||||
},
|
||||
"Account": standby_wallet.address,
|
||||
"LPTokenIn": {
|
||||
currency: ammCurrency,
|
||||
issuer: ammIssuer,
|
||||
value: LPTokens
|
||||
},
|
||||
"Flags": 0x00010000
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
const prepared_withdraw = await client.autofill(ammwithdraw)
|
||||
results += `\n\nPrepared transaction:\n${JSON.stringify(prepared_withdraw, null, 2)}`
|
||||
standbyResultField.value = results
|
||||
@@ -302,30 +622,20 @@ async function redeemLP() {
|
||||
const response_withdraw = await client.submitAndWait(signed_withdraw.tx_blob)
|
||||
|
||||
if (response_withdraw.result.meta.TransactionResult == "tesSUCCESS") {
|
||||
results += `\n\nTransaction succeeded. Updating balances ...`
|
||||
results += `\n\nTransaction succeeded.`
|
||||
checkAMM()
|
||||
getBalances()
|
||||
} else {
|
||||
results += `\n\nError sending transaction: ${response_withdraw}`
|
||||
results += `\n\nError sending transaction: ${JSON.stringify(response_withdraw.result.meta.TransactionResult, null, 2)}`
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
results += `\n\n${error.message}`
|
||||
}
|
||||
|
||||
standbyResultField.value = results
|
||||
standbyResultField.scrollTop = standbyResultField.scrollHeight
|
||||
|
||||
// Update standby wallet XRP, token, and LP balances.
|
||||
standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address))
|
||||
walletBalances = (await client.getBalances(standby_wallet.address))
|
||||
|
||||
const currencyAmount = walletBalances.find(item => item.currency === currency_code);
|
||||
|
||||
const currencyValue = currencyAmount ? currencyAmount.value : 'Currency not found';
|
||||
standbyAmountField.value = currencyValue
|
||||
|
||||
ammAccount = amm_info_result.result.amm.account
|
||||
|
||||
const lpCurrency = walletBalances.find(item => item.issuer === ammAccount);
|
||||
|
||||
const lpValue = lpCurrency ? lpCurrency.value : 'Currency not found';
|
||||
standbyLPField.value = lpValue
|
||||
|
||||
client.disconnect()
|
||||
|
||||
}
|
||||
@@ -126,8 +126,7 @@ async function sendCurrency() {
|
||||
|
||||
const pay_prepared = await client.autofill(send_token_tx)
|
||||
const pay_signed = standby_wallet.sign(pay_prepared)
|
||||
results += 'Sending ${issue_quantity} ${currency_code} to ' +
|
||||
standbyDestinationField.value + '...'
|
||||
results += `\n\nSending ${issue_quantity} ${currency_code} to ${standbyDestinationField.value} ...`
|
||||
standbyResultField.value = results
|
||||
const pay_result = await client.submitAndWait(pay_signed.tx_blob)
|
||||
if (pay_result.result.meta.TransactionResult == "tesSUCCESS") {
|
||||
@@ -260,8 +259,7 @@ async function oPsendCurrency() {
|
||||
|
||||
const pay_prepared = await client.autofill(send_token_tx)
|
||||
const pay_signed = operational_wallet.sign(pay_prepared)
|
||||
results += 'Sending ${issue_quantity} ${currency_code} to ' +
|
||||
operationalDestinationField.value + '...'
|
||||
results += `\n\nSending ${issue_quantity} ${currency_code} to ${operationalDestinationField.value} ...`
|
||||
operationalResultField.value = results
|
||||
const pay_result = await client.submitAndWait(pay_signed.tx_blob)
|
||||
if (pay_result.result.meta.TransactionResult == "tesSUCCESS") {
|
||||
|
||||
Reference in New Issue
Block a user