diff --git a/_code-samples/modular-tutorials/account-support.js b/_code-samples/modular-tutorials/account-support.js new file mode 100644 index 00000000000..8e237c04def --- /dev/null +++ b/_code-samples/modular-tutorials/account-support.js @@ -0,0 +1,208 @@ +// ****************************************************** +// ************* Get the Preferred Network ************** +// ****************************************************** + +function getNet() { + let net + if (document.getElementById("tn").checked) net = "wss://s.altnet.rippletest.net:51233/" + if (document.getElementById("dn").checked) net = "wss://s.devnet.rippletest.net:51233/" + return net +} // End of getNet() + +// ******************************************************* +// ************* Get Account ***************************** +// ******************************************************* + +async function getAccount() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + resultField.value = `===Getting Account===\n\nConnected to ${net}.` + try { + let faucetHost = null + const my_wallet = (await client.fundWallet(null, { faucetHost})).wallet + const newAccount = [my_wallet.address, my_wallet.seed] + return (newAccount) + } + catch (error) { + console.error('===Error getting account:', error); + results += `\nError: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await client.disconnect(); + } +} // End of getAccount() + +async function getNewAccount1() { + account1address.value = "=== Getting new account. ===\n\n" + account1seed.value = "" + const accountInfo= await getAccount() + account1address.value = accountInfo[0] + account1seed.value = accountInfo[1] +} + +async function getNewAccount2() { + account2address.value = "=== Getting new account. ===\n\n" + account2seed.value = "" + const accountInfo= await getAccount() + account2address.value = accountInfo[0] + account2seed.value = accountInfo[1] +} + +// ***************************************************** +// ********** Get Account from Seed ******************** +// ***************************************************** + +async function getAccountFromSeed(my_seed) { + const net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = '===Finding wallet.===\n\n' + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(my_seed) + const address = wallet.address + results += "===Wallet found.===\n\n" + results += "Account address: " + address + "\n\n" + resultField.value = results + return (address) + } + catch (error) { + console.error('===Error getting account from seed:', error); + results += `\nError: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await client.disconnect(); + } +} // End of getAccountFromSeed() + +// ***************************************************** +// ********** Get Account from Seed1 ******************* +// ***************************************************** + +async function getAccountFromSeed1() { + account1address.value = await getAccountFromSeed(account1seed.value) +} + +// ***************************************************** +// ********** Get Account from Seed2 ******************* +// ***************************************************** + +async function getAccountFromSeed2() { + account2address.value = await getAccountFromSeed(account2seed.value) +} + +// ***************************************************** +// ************ Gather Account Info ******************** +// ***************************************************** + +function gatherAccountInfo() { + let accountData = account1name.value + "\n" + account1address.value + "\n" + account1seed.value + "\n" + accountData += account2name.value + "\n" + account2address.value + "\n" + account2seed.value + resultField.value = accountData +} + +// ***************************************************** +// ********** Distribute Account Info ****************** +// ***************************************************** + +function distributeAccountInfo() { + let accountInfo = resultField.value.split("\n") + account1name.value = accountInfo[0] + account1address.value = accountInfo[1] + account1seed.value = accountInfo[2] + account2name.value = accountInfo[3] + account2address.value = accountInfo[4] + account2seed.value = accountInfo[5] +} + +// ***************************************************** +// ************ Populate Active Form 1 ***************** +// ***************************************************** + +function populate1() { + accountNameField.value = account1name.value + accountAddressField.value = account1address.value + accountSeedField.value = account1seed.value + getXrpBalance() +} + +// ***************************************************** +// ************ Populate Active Form 2 ***************** +// ***************************************************** + +function populate2() { + accountNameField.value = account2name.value + accountAddressField.value = account2address.value + accountSeedField.value = account2seed.value + getXrpBalance() +} + +// ******************************************************* +// **************** Get XRP Balance ********************* +// ******************************************************* + +async function getXrpBalance() { + const net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `\n===Getting XRP balance...===\n\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const balance = await client.getXrpBalance(wallet.address) + results += accountNameField.value + " current XRP balance: " + balance + "\n\n" + xrpBalanceField.value = await client.getXrpBalance(accountAddressField.value) + resultField.value = results + } + catch (error) { + console.error('Error getting XRP balance:', error); + results += `\nError: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await client.disconnect(); + } +} // End of getXrpBalance() + +// ******************************************************* +// ************** Get Token Balance ********************* +// ******************************************************* + +async function getTokenBalance() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}.===\n===Getting account token balance...===\n\n` + resultField.value += results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const balance = await client.request({ + command: "gateway_balances", + account: wallet.address, + ledger_index: "validated", + }) + results = accountNameField.value + "\'s token balance(s): " + JSON.stringify(balance.result, null, 2) + "\n" + resultField.value += results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } + catch (error) { + console.error('Error getting token balance:', error); + results = `\nError: ${error.message}\n` + resultField.value += results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await client.disconnect(); + } +} // End of getTokenBalance() + diff --git a/_code-samples/modular-tutorials/base-module.html b/_code-samples/modular-tutorials/base-module.html new file mode 100644 index 00000000000..e866f11cac5 --- /dev/null +++ b/_code-samples/modular-tutorials/base-module.html @@ -0,0 +1,201 @@ + + + XRPL Base Module + + + + + + + + + + + + +

XRPL Base Module

+
+ + Choose your ledger instance: + +    + + +    + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + +
+
+ + + + + + + +
+ + + + + +
+
+ +
+ + Destination + + + +
+
+ +
+

+ +

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/_code-samples/modular-tutorials/create-conditional-escrow.html b/_code-samples/modular-tutorials/create-conditional-escrow.html new file mode 100644 index 00000000000..effce073b10 --- /dev/null +++ b/_code-samples/modular-tutorials/create-conditional-escrow.html @@ -0,0 +1,280 @@ + + + Create a Conditional Escrow + + + + + + + + + + + + + + +

Create a Conditional Escrow

+
+ + Choose your ledger instance: + +    + + +    + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + +
+
+ + + + + +
+ + + + + +
+ + Destination + + + +
+
+ +
+ + Escrow Condition + + + +
+
+ +
+ + Escrow Fulfillment + + + +
+
+ +
+ + Escrow Cancel Time + + + +
+
+ +
+ + Escrow Sequence Number + + + +
+
+ +
+ + Escrow Owner + + + +
+
+ + Transaction + + + +
+
+
+

+ +

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/_code-samples/modular-tutorials/create-conditional-escrow.js b/_code-samples/modular-tutorials/create-conditional-escrow.js new file mode 100644 index 00000000000..99805b59862 --- /dev/null +++ b/_code-samples/modular-tutorials/create-conditional-escrow.js @@ -0,0 +1,86 @@ +// ******************************************************* +// ************* Create Conditional Escrow *************** +// ******************************************************* + +async function createConditionalEscrow() { + + //------------------------------------------------------Connect to the Ledger + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const sendAmount = amountField.value + let results = `===Connected to ${net}===\n===Creating conditional escrow.===\n\n` + resultField.value = results + let escrow_cancel_date = new Date() + escrow_cancel_date = addSeconds(parseInt(escrowCancelDateField.value)) + + // ------------------------------------------------------- Prepare transaction + try { + const escrowTx = await client.autofill({ + "TransactionType": "EscrowCreate", + "Account": wallet.address, + "Amount": xrpl.xrpToDrops(sendAmount), + "Destination": destinationField.value, + "CancelAfter": escrow_cancel_date, + "Condition": escrowConditionField.value + }) + + // ------------------------------------------------ Sign prepared instructions + const signed = wallet.sign(escrowTx) + + // -------------------------------------------------------- Submit signed blob + const tx = await client.submitAndWait(signed.tx_blob) + results = "\n=== *** Sequence Number (Save!): " + tx.result.tx_json.Sequence + results += "\n\n===Balance changes===\n" + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + resultField.value += results + } + catch (error) { + results += "\n===Error: " + error.message + resultField.value = results + } + finally { + // -------------------------------------------------------- Disconnect + client.disconnect() + } +} // End of createTimeEscrow() + +// ******************************************************* +// ************** Finish Conditional Escrow ************** +// ******************************************************* + +async function finishConditionalEscrow() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}===\n===Fulfilling conditional escrow.===\n` + resultField.value = results + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + try { + // ------------------------------------------------------- Prepare transaction + const prepared = await client.autofill({ + "TransactionType": "EscrowFinish", + "Account": accountAddressField.value, + "Owner": escrowOwnerField.value, + "OfferSequence": parseInt(escrowSequenceNumberField.value), + "Condition": escrowConditionField.value, + "Fulfillment": escrowFulfillmentField.value + }) + const signed = wallet.sign(prepared) + const tx = await client.submitAndWait(signed.tx_blob) + results += "\n===Balance changes===" + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value = results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } + catch (error) { + results += "\n===Error: " + error.message + ".===\n" + resultField.value = results + } + finally { + // -------------------------------------------------------- Disconnect + client.disconnect() + } +} // End of finisConditionalEscrow() \ No newline at end of file diff --git a/_code-samples/modular-tutorials/create-offer.html b/_code-samples/modular-tutorials/create-offer.html new file mode 100644 index 00000000000..cb505efc5be --- /dev/null +++ b/_code-samples/modular-tutorials/create-offer.html @@ -0,0 +1,249 @@ + + + Create Offers + + + + + + + + + + + + + + +

Create Offers

+
+ + Choose your ledger instance: + +    + + +    + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Taker Pays

+
+

Taker Gets

+
+ + Currency Code + + + + + + + +
+ + Issuer + + +    + +    + + +
+ + Amount + + + + + + + +
+ + Offer Sequence + + + + + +
+

+ +

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/_code-samples/modular-tutorials/create-offer.js b/_code-samples/modular-tutorials/create-offer.js new file mode 100644 index 00000000000..02d78121a60 --- /dev/null +++ b/_code-samples/modular-tutorials/create-offer.js @@ -0,0 +1,121 @@ +/*********************************** + *********** Create Offer ********** + **********************************/ + +async function createOffer() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}, getting wallet....===\n` + resultField.value = results + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + try { + if (getCurrencyField.value == 'XRP') { + takerGets = xrpl.xrpToDrops(getAmountField.value) + } + else { + takerGetsString = '{"currency": "' + getCurrencyField.value + '",\n' + + '"issuer": "' + getIssuerField.value + '",\n' + + '"value": "' + getAmountField.value + '"}' + takerGets = JSON.parse(takerGetsString) + } + + if (payCurrencyField.value == 'XRP') { + takerPays = xrpl.xrpToDrops(payAmountField.value) + } else { + takerPaysString = '{"currency": "' + payCurrencyField.value + '",\n' + + '"issuer": "' + payIssuerField.value + '",\n' + + '"value": "' + payAmountField.value + '"}' + takerPays = JSON.parse(takerPaysString) + } + const prepared = await client.autofill({ + "TransactionType": "OfferCreate", + "Account": wallet.address, + "TakerGets": takerGets, + "TakerPays": takerPays + }) + const signed = wallet.sign(prepared) + const tx = await client.submitAndWait(signed.tx_blob) + results = '\n\n===Offer created===\n\n' + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value += results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } catch (err) { + console.error('Error creating offer:', err); + results = `\nError: ${err.message}\n` + resultField.value += results + throw err; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + client.disconnect() + } +} // End of createOffer() + +/*********************************** + ************ Get Offers *********** + **********************************/ + +async function getOffers() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ' + ${net}, getting offers....===\n` + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + resultField.value = results + results += '\n\n=== Offers ===\n' + let offers + try { + offers = await client.request({ + method: "account_offers", + account: wallet.address, + ledger_index: "validated" + }) + results = JSON.stringify(offers, null, 2) + resultField.value += results + } catch (err) { + console.error('Error getting offers:', err); + results = `\nError: ${err.message}\n` + resultField.value += results + throw err; // Re-throw the error to be handled by the caller + } + finally { + client.disconnect() + } +}// End of getOffers() + +/*********************************** +*********** Cancel Offer ********** +**********************************/ +async function cancelOffer() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}, canceling offer.===\n` + resultField.value = results + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + try { + // OfferSequence is the _seq_ value from getOffers. + const prepared = await client.autofill({ + "TransactionType": "OfferCancel", + "Account": wallet.address, + "OfferSequence": parseInt(offerSequenceField.value) + }) + const signed = wallet.sign(prepared) + const tx = await client.submitAndWait(signed.tx_blob) + results += "\nOffer canceled. Balance changes: \n" + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value = results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } + catch (err) { + console.error('Error canceling offer:', err); + results = `\nError: ${err.message}\n` + resultField.value += results + throw err; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + client.disconnect() + } +}// End of cancelOffer() diff --git a/_code-samples/modular-tutorials/create-time-escrow.html b/_code-samples/modular-tutorials/create-time-escrow.html new file mode 100644 index 00000000000..b2d012dff38 --- /dev/null +++ b/_code-samples/modular-tutorials/create-time-escrow.html @@ -0,0 +1,269 @@ + + + Create a Time-based Escrow + + + + + + + + + + + + + +

Create a Time-based Escrow

+
+ + Choose your ledger instance: + +    + + +    + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + +
+
+ + + + + +
+ + + + + +
+ + Destination + + + +
+
+ +
+ + Escrow Finish Time + + + +
+
+ +
+ + Escrow Cancel Time + + + +
+
+ + +
+ + Escrow Sequence Number + + + +
+
+ +
+ + Escrow Owner + + + +
+
+ +
+ + Transaction + + + +
+
+
+

+ +

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/_code-samples/modular-tutorials/create-time-escrow.js b/_code-samples/modular-tutorials/create-time-escrow.js new file mode 100644 index 00000000000..2fda69f14a2 --- /dev/null +++ b/_code-samples/modular-tutorials/create-time-escrow.js @@ -0,0 +1,177 @@ +// ******************************************************* +// ************* Add Seconds to Current Date ************* +// ******************************************************* + +function addSeconds(numOfSeconds, date = new Date()) { + date.setSeconds(date.getSeconds() + numOfSeconds); + date = Math.floor(date / 1000) + date = date - 946684800 + + return date; +} + +// ******************************************************* +// ************* Create Time-based Escrow **************** +// ******************************************************* + +async function createTimeBasedEscrow() { + //-------------------------------------------- Prepare Finish and Cancel Dates + let escrow_finish_date = new Date() + let escrow_cancel_date = new Date() + escrow_finish_date = addSeconds(parseInt(escrowFinishTimeField.value)) + escrow_cancel_date = addSeconds(parseInt(escrowCancelTimeField.value)) + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}.===\n\n===Creating time-based escrow.===\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const sendAmount = amountField.value + const escrowTx = await client.autofill({ + "TransactionType": "EscrowCreate", + "Account": wallet.address, + "Amount": xrpl.xrpToDrops(sendAmount), + "Destination": destinationField.value, + "FinishAfter": escrow_finish_date, + "CancelAfter": escrow_cancel_date + }) + const signed = wallet.sign(escrowTx) + const tx = await client.submitAndWait(signed.tx_blob) + results += "\n===Success! === *** Save this sequence number: " + tx.result.tx_json.Sequence + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + resultField.value = results + } + catch (error) { + results += "\n===Error: " + error.message + resultField.value = results + } + finally { + client.disconnect() + } +} // End of createTimeEscrow() + +// ******************************************************* +// ***************** Finish Time- Based Escrow *********** +// ******************************************************* + +async function finishTimeBasedEscrow() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}. Finishing escrow.===\n` + resultField.value = results + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + try { + const prepared = await client.autofill({ + "TransactionType": "EscrowFinish", + "Account": accountAddressField.value, + "Owner": escrowOwnerField.value, + "OfferSequence": parseInt(escrowSequenceNumberField.value) + }) + const signed = wallet.sign(prepared) + const tx = await client.submitAndWait(signed.tx_blob) + results += "\n===Balance changes===" + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value = results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } + catch (error) { + results += "\n===Error: " + error.message + "===" + resultField.value = results + } + finally { + client.disconnect() + } +} // End of finishTimeBasedEscrow() + +// ******************************************************* +// ******************* Get Escrows *********************** +// ******************************************************* + +async function getEscrows() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `\n===Connected to ${net}.\nGetting account escrows.===\n` + resultField.value = results + try { + const escrow_objects = await client.request({ + "id": 5, + "command": "account_objects", + "account": accountAddressField.value, + "ledger_index": "validated", + "type": "escrow" + }) + results += JSON.stringify(escrow_objects.result, null, 2) + resultField.value = results + } + catch (error) { + results += "\nError: " + error.message + resultField.value = results + } + finally { + client.disconnect() + } +} + +// ******************************************************* +// ************** Get Transaction Info ******************* +// ******************************************************* + +async function getTransaction() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `\n===Connected to ${net}.===\n===Getting transaction information.===\n` + resultField.value = results + try { + const tx_info = await client.request({ + "id": 1, + "command": "tx", + "transaction": transactionField.value, + }) + results += JSON.stringify(tx_info.result, null, 2) + resultField.value = results + } + catch (error) { + results += "\nError: " + error.message + resultField.value = results + } + finally { + client.disconnect() + } +} // End of getTransaction() + +// ******************************************************* +// ****************** Cancel Escrow ********************** +// ******************************************************* + +async function cancelEscrow() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `\n===Connected to ${net}. Cancelling escrow.===` + resultField.value = results + try { + const prepared = await client.autofill({ + "TransactionType": "EscrowCancel", + "Account": accountAddressField.value, + "Owner": escrowOwnerField.value, + "OfferSequence": parseInt(escrowSequenceNumberField.value) + }) + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const signed = wallet.sign(prepared) + const tx = await client.submitAndWait(signed.tx_blob) + results += "\n===Balance changes: " + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value = results + } + catch (error) { + results += "\n===Error: " + error.message + resultField.value = results + } + finally { + client.disconnect() + } +} \ No newline at end of file diff --git a/_code-samples/modular-tutorials/five-bells.cjs b/_code-samples/modular-tutorials/five-bells.cjs new file mode 100644 index 00000000000..b1c5482b64a --- /dev/null +++ b/_code-samples/modular-tutorials/five-bells.cjs @@ -0,0 +1,24 @@ +const cc = require('five-bells-condition'); +const crypto = require('crypto'); + +// 1. Generate a random 32-byte seed +const preimageData = crypto.randomBytes(32); + +// 2. Create a PreimageSha256 fulfillment object +const fulfillment = new cc.PreimageSha256(); + +// 3. Set the preimage +fulfillment.setPreimage(preimageData); + +// 4. Generate the condition (binary) +const conditionBinary = fulfillment.getConditionBinary(); + +// 5. Generate the fulfillment (binary) +const fulfillmentBinary = fulfillment.serializeBinary(); + +// Convert to hex for easier use +const conditionHex = conditionBinary.toString('hex').toUpperCase(); +const fulfillmentHex = fulfillmentBinary.toString('hex').toUpperCase(); + +console.log('Condition (hex):', conditionHex); +console.log('Fulfillment (hex):', fulfillmentHex); \ No newline at end of file diff --git a/_code-samples/modular-tutorials/modular-tutorials.css b/_code-samples/modular-tutorials/modular-tutorials.css new file mode 100644 index 00000000000..1bc42daacce --- /dev/null +++ b/_code-samples/modular-tutorials/modular-tutorials.css @@ -0,0 +1,150 @@ +body { + font-family: "Inter", sans-serif; + padding: 20px; + background: #abe2ff; +} + +h1 { + font-weight: bold; +} + +td { + padding-left: 25px; + vertical-align: top; +} + +input, +button { + padding: 6px; + margin-bottom: 8px; + border: none +} + +input:read-only { + background-color:rgb(11, 96, 132); + color:white; + border: 0; +} + +button { + font-weight: bold; + font-family: "Work Sans", sans-serif; + background-color: #006aff; + -webkit-text-fill-color: white; +} + +button:hover { + background-color: #0555c5; + cursor: pointer; +} + +td { + vertical-align: middle; +} + +/* The switch - the box around the slider */ +.switch { + position: relative; + display: inline-block; + width: 30px; + height: 16px; +} + +/* Hide default HTML checkbox */ +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +/* The slider */ +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 13px; + width: 13px; + left: 4px; + bottom: 2px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked+.slider { + background-color: #2196F3; +} + +input:focus+.slider { + box-shadow: 0 0 1px #2196F3; +} + +input:checked+.slider:before { + -webkit-transform: translateX(13px); + -ms-transform: translateX(13px); + transform: translateX(13px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 17px; +} + +.slider.round:before { + border-radius: 50%; +} +.tooltip { + position: relative; + border-bottom: 1px dotted black; +} + +.tooltip:before { + content: attr(tooltip-data); + position: absolute; + width: 250px; + background-color: #006aff; + color: #fff; + text-align: center; + padding: 15px; + line-height: 1.1; + border-radius: 5px; + z-index: 1; + opacity: 0; + transition: opacity .5s; + bottom: 125%; + left: 50%; + margin-left: -60px; + font-size: 0.70em; + visibility: hidden; +} + +.tooltip:after { + content: ""; + position: absolute; + bottom: 75%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + opacity: 0; + transition: opacity .5s; + border-color: #000 transparent transparent transparent; + visibility: hidden; +} + +.tooltip:hover:before, +.tooltip:hover:after { + opacity: 1; + visibility: visible; +} \ No newline at end of file diff --git a/_code-samples/modular-tutorials/payment-modular-tutorials.zip b/_code-samples/modular-tutorials/payment-modular-tutorials.zip new file mode 100644 index 00000000000..c111ae9f206 Binary files /dev/null and b/_code-samples/modular-tutorials/payment-modular-tutorials.zip differ diff --git a/_code-samples/modular-tutorials/send-checks.html b/_code-samples/modular-tutorials/send-checks.html new file mode 100644 index 00000000000..7c7bbc04f1f --- /dev/null +++ b/_code-samples/modular-tutorials/send-checks.html @@ -0,0 +1,247 @@ + + + Send Checks + + + + + + + + + + + + + + + +

Send Checks

+
+ + Choose your ledger instance: + +    + + +    + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + +
+
+ + + + + +
+ + Currency Code + + + +
+
+ +
+ + Issuer + + + +
+
+ +
+ + + + + +
+
+ +
+ + Destination + + + +
+
+ +
+ + Check ID + + + +
+
+ +
+

+ +

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/_code-samples/modular-tutorials/send-checks.js b/_code-samples/modular-tutorials/send-checks.js new file mode 100644 index 00000000000..64c24462703 --- /dev/null +++ b/_code-samples/modular-tutorials/send-checks.js @@ -0,0 +1,152 @@ +// ******************************************************* +// ***************** Send Check ************************** +// ******************************************************* +async function sendCheck() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + results = `\n===Connected to ${net}.===\n===Sending check.===\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + let check_amount = amountField.value + if (currencyField.value != "XRP") { + check_amount = { + "currency": currencyField.value, + "value": amountField.value, + "issuer": wallet.address + } + } + const send_check_tx = { + "TransactionType": "CheckCreate", + "Account": wallet.address, + "SendMax": check_amount, + "Destination": destinationField.value + } + const check_prepared = await client.autofill(send_check_tx) + const check_signed = wallet.sign(check_prepared) + results = '\n===Sending ' + amountField.value + ' ' + currencyField. + value + ' to ' + destinationField.value + '.===\n' + resultField.value += results + const check_result = await client.submitAndWait(check_signed.tx_blob) + if (check_result.result.meta.TransactionResult == "tesSUCCESS") { + results += '===Transaction succeeded===\n\n' + resultField.value += JSON.stringify(check_result.result, null, 2) + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } + } + catch (error) { + results = `Error sending transaction: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } +} // end of sendCheck() + +// ******************************************************* +// ********************* Get Checks ********************** +// ******************************************************* + +async function getChecks() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `\n===Connected to ${net}.===\n===Getting account checks.===\n\n` + resultField.value = results + try { + const check_objects = await client.request({ + "id": 5, + "command": "account_objects", + "account": accountAddressField.value, + "ledger_index": "validated", + "type": "check" + }) + resultField.value += JSON.stringify(check_objects.result, null, 2) + } catch (error) { + results = `Error getting checks: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } +} // End of getChecks() + +// ******************************************************* +// ******************** Cash Check ********************** +// ******************************************************* + +async function cashCheck() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + results = `\n===Connected to ${net}.===\n===Cashing check.===\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + let check_amount = amountField.value + if (currencyField.value != "XRP") { + check_amount = { + "value": amountField.value, + "currency": currencyField.value, + "issuer": issuerField.value + } + } + const cash_check_tx = { + "TransactionType": "CheckCash", + "Account": wallet.address, + "Amount": check_amount, + "CheckID": checkIdField.value + } + const cash_prepared = await client.autofill(cash_check_tx) + const cash_signed = wallet.sign(cash_prepared) + results = ' Receiving ' + amountField.value + ' ' + currencyField.value + '.\n' + resultField.value += results + const check_result = await client.submitAndWait(cash_signed.tx_blob) + if (check_result.result.meta.TransactionResult == "tesSUCCESS") { + results = '===Transaction succeeded===\n' + JSON.stringify(check_result.result, null, 2) + resultField.value += results + } + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } catch (error) { + results = `Error sending transaction: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } +} // end of cashCheck() + +// ******************************************************* +// **************** Cancel Check ************************* +// ******************************************************* + +async function cancelCheck() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + results = `\n===Connected to ${net}.===\n===Cancelling check.===\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const cancel_check_tx = { + "TransactionType": "CheckCancel", + "Account": wallet.address, + "CheckID": checkIdField.value + } + const cancel_prepared = await client.autofill(cancel_check_tx) + const cancel_signed = wallet.sign(cancel_prepared) + const check_result = await client.submitAndWait(cancel_signed.tx_blob) + if (check_result.result.meta.TransactionResult == "tesSUCCESS") { + results += `===Transaction succeeded===\n${check_result.result.meta.TransactionResult}` + resultField.value = results + } + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } catch (error) { + results = `Error sending transaction: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } +} // end of cancelCheck() diff --git a/_code-samples/modular-tutorials/send-currency.html b/_code-samples/modular-tutorials/send-currency.html new file mode 100644 index 00000000000..6ff900a599a --- /dev/null +++ b/_code-samples/modular-tutorials/send-currency.html @@ -0,0 +1,229 @@ + + + Send Currency + + + + + + + + + + + + + + +

Send Currency

+
+ + Choose your ledger instance: + +    + + +    + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + +
+
+ + + + + +
+ + Currency Code + + + +
+
+ +
+ + Issuer + + + +
+
+ +
+ + + + + +
+
+ +
+ + Destination + + + +
+
+

+ +

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/_code-samples/modular-tutorials/send-currency.js b/_code-samples/modular-tutorials/send-currency.js new file mode 100644 index 00000000000..aba9fbab80f --- /dev/null +++ b/_code-samples/modular-tutorials/send-currency.js @@ -0,0 +1,96 @@ +// ******************************************************* +// ***************** Create TrustLine ******************** +// ******************************************************* + +async function createTrustLine() { + const net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = "\nConnected. Creating trust line.\n" + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const trustSet_tx = { + "TransactionType": "TrustSet", + "Account": accountAddressField.value, + "LimitAmount": { + "currency": currencyField.value, + "issuer": issuerField.value, + "value": amountField.value + } + } + const ts_prepared = await client.autofill(trustSet_tx) + const ts_signed = wallet.sign(ts_prepared) + resultField.value = results + const ts_result = await client.submitAndWait(ts_signed.tx_blob) + if (ts_result.result.meta.TransactionResult == "tesSUCCESS") { + results += '\n===Trustline established between account\n' + + accountAddressField.value + "\nand account\n" + issuerField.value + '.' + resultField.value = results + } else { + results += `\n===Transaction failed: ${ts_result.result.meta.TransactionResult}` + resultField.value = results + } + } + catch (error) { + console.error('Error creating trust line:', error); + results += `\n===Error: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await client.disconnect(); + } +} //End of createTrustline() + +// ******************************************************* +// *************** Send Issued Currency ****************** +// ******************************************************* + +async function sendCurrency() { + let net = getNet() + const client = new xrpl.Client(net) + results = 'Connecting to ' + getNet() + '....' + resultField.value = results + await client.connect() + results += '\nConnected.' + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const send_currency_tx = { + "TransactionType": "Payment", + "Account": wallet.address, + "Amount": { + "currency": currencyField.value, + "value": amountField.value, + "issuer": issuerField.value + }, + "Destination": destinationField.value + } + const pay_prepared = await client.autofill(send_currency_tx) + const pay_signed = wallet.sign(pay_prepared) + results += `\n\n===Sending ${amountField.value} ${currencyField.value} to ${destinationField.value} ...` + resultField.value = results + const pay_result = await client.submitAndWait(pay_signed.tx_blob) + if (pay_result.result.meta.TransactionResult == "tesSUCCESS") { + results += '\n===Transaction succeeded.' + resultField.value = results + getTokenBalance() + } else { + results += `\n===Transaction failed: ${pay_result.result.meta.TransactionResult}\n` + resultField.value = results + } + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) +} + catch (error) { + console.error('Error sending transaction:', error); + results += `\nError: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await client.disconnect(); + } +} // end of sendCurrency() diff --git a/_code-samples/modular-tutorials/send-mpt.html b/_code-samples/modular-tutorials/send-mpt.html new file mode 100644 index 00000000000..0f3cbbe93f0 --- /dev/null +++ b/_code-samples/modular-tutorials/send-mpt.html @@ -0,0 +1,218 @@ + + + Send MPT + + + + + + + + + + + + + +

Send MPT

+
+ + Choose your ledger instance: + +    + + +    + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + +
+
+ + + + + +
+ + MPT Issuance ID + + + +
+
+ +
+ + + + + +
+
+ +
+ + Destination + + + +
+
+ +
+

+ +

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/_code-samples/modular-tutorials/send-mpt.js b/_code-samples/modular-tutorials/send-mpt.js new file mode 100644 index 00000000000..c41c7d06965 --- /dev/null +++ b/_code-samples/modular-tutorials/send-mpt.js @@ -0,0 +1,113 @@ +// ******************************************************* +// ********************* Send MPT ************************ +// ******************************************************* + +async function sendMPT() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}. Sending MPT.===\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const mpt_issuance_id = mptIdField.value + const mpt_quantity = amountField.value + const send_mpt_tx = { + "TransactionType": "Payment", + "Account": wallet.address, + "Amount": { + "mpt_issuance_id": mpt_issuance_id, + "value": mpt_quantity, + }, + "Destination": destinationField.value, + } + const pay_prepared = await client.autofill(send_mpt_tx) + const pay_signed = wallet.sign(pay_prepared) + results = `\n===Sending ${mpt_quantity} ${mpt_issuance_id} to ${destinationField.value} ...` + resultField.value += results + const pay_result = await client.submitAndWait(pay_signed.tx_blob) + results = '\n\n===Transaction succeeded.\n' + results += JSON.stringify(pay_result.result, null, 2) + resultField.value += results + } catch (error) { + results = `Error sending MPT: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } +} // end of sendMPT() + +// ******************************************************* +// ******************** Get MPTs ************************* +// ******************************************************* + +async function getMPTs() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = '' + resultField.value = `===Connected to ${net}. Getting MPTs.===` + + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const mpts = await client.request({ + command: "account_objects", + account: wallet.address, + ledger_index: "validated", + type: "mptoken" + }) + let JSONString = JSON.stringify(mpts.result, null, 2) + let JSONParse = JSON.parse(JSONString) + let numberOfMPTs = JSONParse.account_objects.length + let x = 0 + while (x < numberOfMPTs){ + results += "\n\n===MPT Issuance ID: " + JSONParse.account_objects[x].MPTokenIssuanceID + + "\n===MPT Amount: " + JSONParse.account_objects[x].MPTAmount + x++ + } + results += "\n\n" + JSONString + resultField.value += results + } catch (error) { + results = `===Error getting MPTs: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } +} // End of getMPTs() + +// ********************************************************************** +// ****** MPTAuthorize Transaction *************************************** +// ********************************************************************** + +async function authorizeMPT() { + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}. Authorizing MPT.===\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const mpt_issuance_id = mptIdField.value + const auth_mpt_tx = { + "TransactionType": "MPTokenAuthorize", + "Account": wallet.address, + "MPTokenIssuanceID": mpt_issuance_id, + } + const auth_prepared = await client.autofill(auth_mpt_tx) + const auth_signed = wallet.sign(auth_prepared) + results += `\n\n===Sending authorization.===\n` + resultField.value = results + const auth_result = await client.submitAndWait(auth_signed.tx_blob) + results = '\n===Transaction succeeded===\n\n' + resultField.value += results + results += `\n\n` + JSON.stringify(auth_result.result, null, 2) + } catch (error) { + results = `===Error authorizing MPT: ${error}` + resultField.value = results + } finally { + resultField.value = results + } + client.disconnect() +} // end of MPTAuthorize() \ No newline at end of file diff --git a/_code-samples/modular-tutorials/send-xrp.js b/_code-samples/modular-tutorials/send-xrp.js new file mode 100644 index 00000000000..b5f054394e0 --- /dev/null +++ b/_code-samples/modular-tutorials/send-xrp.js @@ -0,0 +1,37 @@ +// ******************************************************* +// ******************** Send XRP ************************* +// ******************************************************* +async function sendXRP() { + const net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}.===\n\nSending XRP.\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const sendAmount = amountField.value + // -------------------------------------------------------- Prepare transaction + const prepared_tx = await client.autofill({ + "TransactionType": "Payment", + "Account": wallet.address, + "Amount": xrpl.xrpToDrops(sendAmount), + "Destination": destinationField.value + }) + // ------------------------------------------------- Sign prepared instructions + const signed = wallet.sign(prepared_tx) + // -------------------------------------------------------- Submit signed blob + const tx = await client.submitAndWait(signed.tx_blob) + results += JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value = results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } catch (error) { + console.error('Error sending transaction:', error); + results += `\nError: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await xrplClient.disconnect(); + } +} // End of sendXRP() \ No newline at end of file diff --git a/_code-samples/quickstart/js/ripplex3-mint-nfts.js b/_code-samples/quickstart/js/ripplex3-mint-nfts.js index 14ec69e35c8..0d5ae107c8d 100644 --- a/_code-samples/quickstart/js/ripplex3-mint-nfts.js +++ b/_code-samples/quickstart/js/ripplex3-mint-nfts.js @@ -27,8 +27,8 @@ async function mintToken() { // ----------------------------------------------------- Submit signed blob const tx = await client.submitAndWait(transactionJson, { wallet: standby_wallet} ) const nfts = await client.request({ - method: "account_nfts", - account: standby_wallet.classicAddress + "method": "account_nfts", + "account": standby_wallet.classicAddress }) // ------------------------------------------------------- Report results diff --git a/docs/img/conditional-escrow1.png b/docs/img/conditional-escrow1.png deleted file mode 100644 index 364ea085bf7..00000000000 Binary files a/docs/img/conditional-escrow1.png and /dev/null differ diff --git a/docs/img/conditional-escrow3.png b/docs/img/conditional-escrow3.png deleted file mode 100644 index 429d86f93ab..00000000000 Binary files a/docs/img/conditional-escrow3.png and /dev/null differ diff --git a/docs/img/conditional-escrow4.png b/docs/img/conditional-escrow4.png deleted file mode 100644 index 338a49cd9e8..00000000000 Binary files a/docs/img/conditional-escrow4.png and /dev/null differ diff --git a/docs/img/conditional-escrow5.png b/docs/img/conditional-escrow5.png deleted file mode 100644 index 6e268a79b44..00000000000 Binary files a/docs/img/conditional-escrow5.png and /dev/null differ diff --git a/docs/img/module-create-offer-cancel-offer.png b/docs/img/module-create-offer-cancel-offer.png deleted file mode 100644 index 8c6b77f95e2..00000000000 Binary files a/docs/img/module-create-offer-cancel-offer.png and /dev/null differ diff --git a/docs/img/module-create-offer-cancelled-offer.png b/docs/img/module-create-offer-cancelled-offer.png deleted file mode 100644 index 51cd9957b9d..00000000000 Binary files a/docs/img/module-create-offer-cancelled-offer.png and /dev/null differ diff --git a/docs/img/module-create-offer-get-accounts.png b/docs/img/module-create-offer-get-accounts.png deleted file mode 100644 index 5e354820acc..00000000000 Binary files a/docs/img/module-create-offer-get-accounts.png and /dev/null differ diff --git a/docs/img/module-create-offer-get-balances.png b/docs/img/module-create-offer-get-balances.png deleted file mode 100644 index 0799d105e56..00000000000 Binary files a/docs/img/module-create-offer-get-balances.png and /dev/null differ diff --git a/docs/img/module-create-offer-get-offers.png b/docs/img/module-create-offer-get-offers.png deleted file mode 100644 index 819fbf89ab9..00000000000 Binary files a/docs/img/module-create-offer-get-offers.png and /dev/null differ diff --git a/docs/img/module-create-offer-xrp-for-usd.png b/docs/img/module-create-offer-xrp-for-usd.png deleted file mode 100644 index bf21a14e1b3..00000000000 Binary files a/docs/img/module-create-offer-xrp-for-usd.png and /dev/null differ diff --git a/docs/img/module-create-offer-xrp-for-usd2.png b/docs/img/module-create-offer-xrp-for-usd2.png deleted file mode 100644 index 49af8663937..00000000000 Binary files a/docs/img/module-create-offer-xrp-for-usd2.png and /dev/null differ diff --git a/docs/img/module-create-offer.png b/docs/img/module-create-offer.png deleted file mode 100644 index 66ebbdf1eb6..00000000000 Binary files a/docs/img/module-create-offer.png and /dev/null differ diff --git a/docs/img/mt-conditional-escrow-1-empty-form.png b/docs/img/mt-conditional-escrow-1-empty-form.png new file mode 100644 index 00000000000..925d4294bb4 Binary files /dev/null and b/docs/img/mt-conditional-escrow-1-empty-form.png differ diff --git a/docs/img/conditional-escrow2.png b/docs/img/mt-conditional-escrow-2-getConditionAndFulfillment.png similarity index 100% rename from docs/img/conditional-escrow2.png rename to docs/img/mt-conditional-escrow-2-getConditionAndFulfillment.png diff --git a/docs/img/mt-conditional-escrow-3-form-with-accounts.png b/docs/img/mt-conditional-escrow-3-form-with-accounts.png new file mode 100644 index 00000000000..3eeb22595db Binary files /dev/null and b/docs/img/mt-conditional-escrow-3-form-with-accounts.png differ diff --git a/docs/img/mt-conditional-escrow-4-escrow-create.png b/docs/img/mt-conditional-escrow-4-escrow-create.png new file mode 100644 index 00000000000..61317bb4631 Binary files /dev/null and b/docs/img/mt-conditional-escrow-4-escrow-create.png differ diff --git a/docs/img/mt-conditional-escrow-5-escrow-fulfill.png b/docs/img/mt-conditional-escrow-5-escrow-fulfill.png new file mode 100644 index 00000000000..fd518b9aed1 Binary files /dev/null and b/docs/img/mt-conditional-escrow-5-escrow-fulfill.png differ diff --git a/docs/img/mt-conditional-escrow-6-get-escrows.png b/docs/img/mt-conditional-escrow-6-get-escrows.png new file mode 100644 index 00000000000..e8f0d23e05d Binary files /dev/null and b/docs/img/mt-conditional-escrow-6-get-escrows.png differ diff --git a/docs/img/mt-conditional-escrow-7-sequence-value.png b/docs/img/mt-conditional-escrow-7-sequence-value.png new file mode 100644 index 00000000000..3b95449b36e Binary files /dev/null and b/docs/img/mt-conditional-escrow-7-sequence-value.png differ diff --git a/docs/img/mt-create-offers-1-empty-form-info.png b/docs/img/mt-create-offers-1-empty-form-info.png new file mode 100644 index 00000000000..b0aeab85e0e Binary files /dev/null and b/docs/img/mt-create-offers-1-empty-form-info.png differ diff --git a/docs/img/mt-create-offers-2-form-with-account-info.png b/docs/img/mt-create-offers-2-form-with-account-info.png new file mode 100644 index 00000000000..48f66d50ce2 Binary files /dev/null and b/docs/img/mt-create-offers-2-form-with-account-info.png differ diff --git a/docs/img/mt-create-offers-3-xrp-for-usd-offer.png b/docs/img/mt-create-offers-3-xrp-for-usd-offer.png new file mode 100644 index 00000000000..8e6d8b6804c Binary files /dev/null and b/docs/img/mt-create-offers-3-xrp-for-usd-offer.png differ diff --git a/docs/img/mt-create-offers-4-matching-offer.png b/docs/img/mt-create-offers-4-matching-offer.png new file mode 100644 index 00000000000..8a7785ae62c Binary files /dev/null and b/docs/img/mt-create-offers-4-matching-offer.png differ diff --git a/docs/img/mt-create-offers-5-sequence-number.png b/docs/img/mt-create-offers-5-sequence-number.png new file mode 100644 index 00000000000..624bcdc4a15 Binary files /dev/null and b/docs/img/mt-create-offers-5-sequence-number.png differ diff --git a/docs/img/mt-create-offers-6-no-offers.png b/docs/img/mt-create-offers-6-no-offers.png new file mode 100644 index 00000000000..1235dfef557 Binary files /dev/null and b/docs/img/mt-create-offers-6-no-offers.png differ diff --git a/docs/img/mt-send-checks-1-empty-form.png b/docs/img/mt-send-checks-1-empty-form.png new file mode 100644 index 00000000000..9fb2043588c Binary files /dev/null and b/docs/img/mt-send-checks-1-empty-form.png differ diff --git a/docs/img/mt-send-checks-2-form-with-accounts.png b/docs/img/mt-send-checks-2-form-with-accounts.png new file mode 100644 index 00000000000..81a708165c6 Binary files /dev/null and b/docs/img/mt-send-checks-2-form-with-accounts.png differ diff --git a/docs/img/mt-send-checks-3-send-xrp.png b/docs/img/mt-send-checks-3-send-xrp.png new file mode 100644 index 00000000000..14a1f7c2620 Binary files /dev/null and b/docs/img/mt-send-checks-3-send-xrp.png differ diff --git a/docs/img/mt-send-checks-4-send-currency.png b/docs/img/mt-send-checks-4-send-currency.png new file mode 100644 index 00000000000..c0c61914d58 Binary files /dev/null and b/docs/img/mt-send-checks-4-send-currency.png differ diff --git a/docs/img/mt-send-checks-5-get-checks.png b/docs/img/mt-send-checks-5-get-checks.png new file mode 100644 index 00000000000..a587cb5be66 Binary files /dev/null and b/docs/img/mt-send-checks-5-get-checks.png differ diff --git a/docs/img/mt-send-checks-6-cash-check.png b/docs/img/mt-send-checks-6-cash-check.png new file mode 100644 index 00000000000..ff5af4b4167 Binary files /dev/null and b/docs/img/mt-send-checks-6-cash-check.png differ diff --git a/docs/img/mt-send-checks-7-get-balance.png b/docs/img/mt-send-checks-7-get-balance.png new file mode 100644 index 00000000000..06541c9a3d3 Binary files /dev/null and b/docs/img/mt-send-checks-7-get-balance.png differ diff --git a/docs/img/mt-send-checks-8-cancel-check.png b/docs/img/mt-send-checks-8-cancel-check.png new file mode 100644 index 00000000000..40f73230d93 Binary files /dev/null and b/docs/img/mt-send-checks-8-cancel-check.png differ diff --git a/docs/img/mt-send-currency-1-empty-form-info.png b/docs/img/mt-send-currency-1-empty-form-info.png new file mode 100644 index 00000000000..745906dc34d Binary files /dev/null and b/docs/img/mt-send-currency-1-empty-form-info.png differ diff --git a/docs/img/mt-send-currency-2-distribute-accounts.png b/docs/img/mt-send-currency-2-distribute-accounts.png new file mode 100644 index 00000000000..a5de8f3dd3c Binary files /dev/null and b/docs/img/mt-send-currency-2-distribute-accounts.png differ diff --git a/docs/img/mt-send-currency-3-create-trustline.png b/docs/img/mt-send-currency-3-create-trustline.png new file mode 100644 index 00000000000..b82411ad3b9 Binary files /dev/null and b/docs/img/mt-send-currency-3-create-trustline.png differ diff --git a/docs/img/mt-send-currency-4-send-currency.png b/docs/img/mt-send-currency-4-send-currency.png new file mode 100644 index 00000000000..ff4190f9a53 Binary files /dev/null and b/docs/img/mt-send-currency-4-send-currency.png differ diff --git a/docs/img/mt-send-currency-5-issuer-token-balance.png b/docs/img/mt-send-currency-5-issuer-token-balance.png new file mode 100644 index 00000000000..efd31358d12 Binary files /dev/null and b/docs/img/mt-send-currency-5-issuer-token-balance.png differ diff --git a/docs/img/mt-send-currency-6-holder-token-balance.png b/docs/img/mt-send-currency-6-holder-token-balance.png new file mode 100644 index 00000000000..f7bca2cb91b Binary files /dev/null and b/docs/img/mt-send-currency-6-holder-token-balance.png differ diff --git a/docs/img/tut-send-mpt-0-empty-form.png b/docs/img/mt-send-mpt-0-empty-form.png similarity index 100% rename from docs/img/tut-send-mpt-0-empty-form.png rename to docs/img/mt-send-mpt-0-empty-form.png diff --git a/docs/img/tut-send-mpt-1-gathered-info.png b/docs/img/mt-send-mpt-1-gathered-info.png similarity index 100% rename from docs/img/tut-send-mpt-1-gathered-info.png rename to docs/img/mt-send-mpt-1-gathered-info.png diff --git a/docs/img/tut-send-mpt-2-account-2.png b/docs/img/mt-send-mpt-2-account-2.png similarity index 100% rename from docs/img/tut-send-mpt-2-account-2.png rename to docs/img/mt-send-mpt-2-account-2.png diff --git a/docs/img/tut-send-mpt-2-authorize-mpt.png b/docs/img/mt-send-mpt-2-authorize-mpt.png similarity index 100% rename from docs/img/tut-send-mpt-2-authorize-mpt.png rename to docs/img/mt-send-mpt-2-authorize-mpt.png diff --git a/docs/img/tut-send-mpt-3-send-mpt.png b/docs/img/mt-send-mpt-3-send-mpt.png similarity index 100% rename from docs/img/tut-send-mpt-3-send-mpt.png rename to docs/img/mt-send-mpt-3-send-mpt.png diff --git a/docs/img/tut-send-mpt-4-get-mpts.png b/docs/img/mt-send-mpt-4-get-mpts.png similarity index 100% rename from docs/img/tut-send-mpt-4-get-mpts.png rename to docs/img/mt-send-mpt-4-get-mpts.png diff --git a/docs/img/mt-send-xrp-1-xrpl-base-module.png b/docs/img/mt-send-xrp-1-xrpl-base-module.png new file mode 100644 index 00000000000..1b795370ec8 Binary files /dev/null and b/docs/img/mt-send-xrp-1-xrpl-base-module.png differ diff --git a/docs/img/mt-send-xrp-2-named-accounts.png b/docs/img/mt-send-xrp-2-named-accounts.png new file mode 100644 index 00000000000..e729fcebaac Binary files /dev/null and b/docs/img/mt-send-xrp-2-named-accounts.png differ diff --git a/docs/img/mt-send-xrp-3-transferred-xrp.png b/docs/img/mt-send-xrp-3-transferred-xrp.png new file mode 100644 index 00000000000..0adf64dd03c Binary files /dev/null and b/docs/img/mt-send-xrp-3-transferred-xrp.png differ diff --git a/docs/img/mt-send-xrp-4-account2-send-xrp.png b/docs/img/mt-send-xrp-4-account2-send-xrp.png new file mode 100644 index 00000000000..8ed9efc9a96 Binary files /dev/null and b/docs/img/mt-send-xrp-4-account2-send-xrp.png differ diff --git a/docs/img/mt-send-xrp-5-gather-account-info.png b/docs/img/mt-send-xrp-5-gather-account-info.png new file mode 100644 index 00000000000..685af4282fd Binary files /dev/null and b/docs/img/mt-send-xrp-5-gather-account-info.png differ diff --git a/docs/img/mt-time-escrow-1-empty-form.png b/docs/img/mt-time-escrow-1-empty-form.png new file mode 100644 index 00000000000..3d84544e152 Binary files /dev/null and b/docs/img/mt-time-escrow-1-empty-form.png differ diff --git a/docs/img/mt-time-escrow-2-form-with-accounts.png b/docs/img/mt-time-escrow-2-form-with-accounts.png new file mode 100644 index 00000000000..880d1df5257 Binary files /dev/null and b/docs/img/mt-time-escrow-2-form-with-accounts.png differ diff --git a/docs/img/mt-time-escrow-3-create-escrow.png b/docs/img/mt-time-escrow-3-create-escrow.png new file mode 100644 index 00000000000..6cc01698fd7 Binary files /dev/null and b/docs/img/mt-time-escrow-3-create-escrow.png differ diff --git a/docs/img/mt-time-escrow-4-fulfill-escrow.png b/docs/img/mt-time-escrow-4-fulfill-escrow.png new file mode 100644 index 00000000000..91a8cb0c14a Binary files /dev/null and b/docs/img/mt-time-escrow-4-fulfill-escrow.png differ diff --git a/docs/img/mt-time-escrow-5-get-escrows.png b/docs/img/mt-time-escrow-5-get-escrows.png new file mode 100644 index 00000000000..2fa161fb7f0 Binary files /dev/null and b/docs/img/mt-time-escrow-5-get-escrows.png differ diff --git a/docs/img/mt-time-escrow-6-cancel-escrow.png b/docs/img/mt-time-escrow-6-cancel-escrow.png new file mode 100644 index 00000000000..2ce04b0597c Binary files /dev/null and b/docs/img/mt-time-escrow-6-cancel-escrow.png differ diff --git a/docs/img/quickstart-checks1.png b/docs/img/quickstart-checks1.png deleted file mode 100644 index 908b0937a65..00000000000 Binary files a/docs/img/quickstart-checks1.png and /dev/null differ diff --git a/docs/img/quickstart-checks2.png b/docs/img/quickstart-checks2.png deleted file mode 100644 index 2274bf62436..00000000000 Binary files a/docs/img/quickstart-checks2.png and /dev/null differ diff --git a/docs/img/quickstart-checks3.png b/docs/img/quickstart-checks3.png deleted file mode 100644 index d9391107cf3..00000000000 Binary files a/docs/img/quickstart-checks3.png and /dev/null differ diff --git a/docs/img/quickstart-checks4.png b/docs/img/quickstart-checks4.png deleted file mode 100644 index f55b3f6b12c..00000000000 Binary files a/docs/img/quickstart-checks4.png and /dev/null differ diff --git a/docs/img/quickstart-checks5.png b/docs/img/quickstart-checks5.png deleted file mode 100644 index b05eec9f285..00000000000 Binary files a/docs/img/quickstart-checks5.png and /dev/null differ diff --git a/docs/img/quickstart-checks6.png b/docs/img/quickstart-checks6.png deleted file mode 100644 index 58fc506f6d3..00000000000 Binary files a/docs/img/quickstart-checks6.png and /dev/null differ diff --git a/docs/img/quickstart-checks7.png b/docs/img/quickstart-checks7.png deleted file mode 100644 index c6f64c8b9ff..00000000000 Binary files a/docs/img/quickstart-checks7.png and /dev/null differ diff --git a/docs/img/quickstart-checks8.png b/docs/img/quickstart-checks8.png deleted file mode 100644 index 943f2b7010e..00000000000 Binary files a/docs/img/quickstart-checks8.png and /dev/null differ diff --git a/docs/img/quickstart-escrow1.png b/docs/img/quickstart-escrow1.png deleted file mode 100644 index 067534b3a15..00000000000 Binary files a/docs/img/quickstart-escrow1.png and /dev/null differ diff --git a/docs/img/quickstart-escrow2.png b/docs/img/quickstart-escrow2.png deleted file mode 100644 index 8b069c248d3..00000000000 Binary files a/docs/img/quickstart-escrow2.png and /dev/null differ diff --git a/docs/img/quickstart-escrow3.png b/docs/img/quickstart-escrow3.png deleted file mode 100644 index 54a5318a8df..00000000000 Binary files a/docs/img/quickstart-escrow3.png and /dev/null differ diff --git a/docs/img/quickstart-escrow4.png b/docs/img/quickstart-escrow4.png deleted file mode 100644 index cc0c2e6fd29..00000000000 Binary files a/docs/img/quickstart-escrow4.png and /dev/null differ diff --git a/docs/img/quickstart-escrow5.png b/docs/img/quickstart-escrow5.png deleted file mode 100644 index a768cd8d0ed..00000000000 Binary files a/docs/img/quickstart-escrow5.png and /dev/null differ diff --git a/docs/img/quickstart-escrow6.png b/docs/img/quickstart-escrow6.png deleted file mode 100644 index 9ccfcfd8c42..00000000000 Binary files a/docs/img/quickstart-escrow6.png and /dev/null differ diff --git a/docs/img/quickstart-escrow7.png b/docs/img/quickstart-escrow7.png deleted file mode 100644 index 79b9d6fd09c..00000000000 Binary files a/docs/img/quickstart-escrow7.png and /dev/null differ diff --git a/docs/img/quickstart-escrow8.png b/docs/img/quickstart-escrow8.png deleted file mode 100644 index 650c9d96b7f..00000000000 Binary files a/docs/img/quickstart-escrow8.png and /dev/null differ diff --git a/docs/img/quickstart-escrow9.png b/docs/img/quickstart-escrow9.png deleted file mode 100644 index 69746a19230..00000000000 Binary files a/docs/img/quickstart-escrow9.png and /dev/null differ diff --git a/docs/img/quickstart2.png b/docs/img/quickstart2.png deleted file mode 100644 index ccc9170d6c7..00000000000 Binary files a/docs/img/quickstart2.png and /dev/null differ diff --git a/docs/img/quickstart3.png b/docs/img/quickstart3.png deleted file mode 100644 index 84be6261ef6..00000000000 Binary files a/docs/img/quickstart3.png and /dev/null differ diff --git a/docs/img/quickstart4.png b/docs/img/quickstart4.png deleted file mode 100644 index ceef3a7fb45..00000000000 Binary files a/docs/img/quickstart4.png and /dev/null differ diff --git a/docs/img/quickstart5.png b/docs/img/quickstart5.png deleted file mode 100644 index b9fe040b7fc..00000000000 Binary files a/docs/img/quickstart5.png and /dev/null differ diff --git a/docs/img/quickstart6.png b/docs/img/quickstart6.png deleted file mode 100644 index 2a87fc10f0d..00000000000 Binary files a/docs/img/quickstart6.png and /dev/null differ diff --git a/docs/img/quickstart7.png b/docs/img/quickstart7.png deleted file mode 100644 index 36e3d103b60..00000000000 Binary files a/docs/img/quickstart7.png and /dev/null differ diff --git a/docs/img/uc-mpt1-t-bill-account-configuration.png b/docs/img/uc-mpt1-t-bill-account-configuration.png index eae66e8e3f8..7d16d036edd 100644 Binary files a/docs/img/uc-mpt1-t-bill-account-configuration.png and b/docs/img/uc-mpt1-t-bill-account-configuration.png differ diff --git a/docs/tutorials/javascript/index.md b/docs/tutorials/javascript/index.md index d2b871fef24..8972852dbc7 100644 --- a/docs/tutorials/javascript/index.md +++ b/docs/tutorials/javascript/index.md @@ -27,7 +27,7 @@ To get started: `npm install xrpl` -- Clone or download the [Sample modules](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/). +Download and expand the [Payment Modular Tutorial Samples](/_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. ## Tutorial Modules diff --git a/docs/tutorials/javascript/send-payments/create-accounts-send-xrp.md b/docs/tutorials/javascript/send-payments/create-accounts-send-xrp.md index 45d017cdaaa..9c5ff887a8b 100644 --- a/docs/tutorials/javascript/send-payments/create-accounts-send-xrp.md +++ b/docs/tutorials/javascript/send-payments/create-accounts-send-xrp.md @@ -1,11 +1,8 @@ --- -html: create-accounts-send-xrp-using-javascript.html -parent: send-payments-using-javascript.html seo: description: Create two accounts and transfer XRP between them. labels: - Accounts - - Quickstart - Transaction Sending - XRP --- @@ -19,7 +16,7 @@ This example shows how to: When you create an account, you receive a public/private key pair offline. Your account does not appear on the ledger until it is funded with XRP. This example shows how to create accounts for Testnet, but not how to create an account that you can use on Mainnet. -[![Token Test Harness](/docs/img/quickstart2.png)](/docs/img/quickstart2.png) +[![XRPL Base Module](/docs/img/mt-send-xrp-1-xrpl-base-module.png)](/docs/img/mt-send-xrp-1-xrpl-base-module.png) ## Prerequisites @@ -29,613 +26,549 @@ To get started, create a new folder on your local disk and install the JavaScrip npm install xrpl ``` -Download and expand the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/) archive. +Download and expand the [Payment Modular Tutorial Samples](/_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. -{% admonition type="info" name="Note" %}Without the Quickstart Samples, you will not be able to try the examples that follow. {% /admonition %} +{% admonition type="info" name="Note" %}Without the Payment Modular Tutorials Samples, you will not be able to try the examples that follow. {% /admonition %} ## Usage -
- -
- To get test accounts: 1. Open `1.get-accounts-send-xrp.html` in a browser 2. Choose **Testnet** or **Devnet**. -3. Click **Get New Standby Account**. -4. Click **Get New Operational Account.** -5. Copy and paste the **Seeds** field in a persistent location, such as a Notepad, so that you can reuse the accounts after reloading the form. +3. Click **Get New Account 1**. +4. Click **Get New Account 2.** +5. Optionally fill in **Account 1 Name** and **Account 2 Name**. -[![Standby and Operational Accounts](/docs/img/quickstart3.png)](/docs/img/quickstart3.png) +The name fields are there for you to create an arbitrary label to make the account easier to recognize when switching back and forth than the 34 character account address. For example, I might name the accounts after my friends _Alfredo_ and _Binti_. The name is a local value that is never sent to the XRPL server. -You can transfer XRP between your new accounts. Each account has its own fields and buttons. +[![Accounts 1 and 2](/docs/img/mt-send-xrp-2-named-accounts.png)](/docs/img/mt-send-xrp-2-named-accounts.png) -
- -
+To transfer XRP from Account 1 to Account 2: -To transfer XRP from the Standby account to the Operational account: +1. Click the **Account 1** radio button. The information about Account 1 populates the uneditable fields of the form. +2. Enter the **Amount** of XRP to send. +2. Copy and paste the **Account 2 Address** value to the **Destination** field. +3. Click **Send XRP** to transfer XRP from Account 1 to Account 2. -1. On the Standby (left) side of the form, enter the **Amount** of XRP to send. -2. Copy and paste the **Operational Account** field to the Standby **Destination** field. -3. Click **Send XRP>** to transfer XRP from the standby account to the operational account +The **Results** field shows the change in balance in each of the accounts. Note that sending the XRP cost an additional .000001 XRP as the transfer fee. The transfer fee is small enough to be no burden for legitimate users, but is there to stop spammers from making DDS attacks against the XRP Ledger (sending millions of false transactions will quickly add up to real money). -To transfer XRP from the Operational account to the Standby account: +[![Transferred XRP](/docs/img/mt-send-xrp-3-transferred-xrp.png)](/docs/img/mt-send-xrp-3-transferred-xrp.png) -1. On the Operational (right) side of the form, enter the **Amount** of XRP to send. -2. Copy and paste the **Standby Account** field to the Operational **Destination** field. -3. Click **<Send XRP** to transfer XRP from the Operational account to the Standby account. +Click **Account 2** to see its XRP balance. -[![Transferred XRP](/docs/img/quickstart4.png)](/docs/img/quickstart4.png) +To transfer XRP from Account 2 back to Account 1: -# Code Walkthrough +1. Click the **Account 2** radio button. +2. Enter the **Amount** of XRP to send. +3. Copy and paste the **Account 1 Address** value to the **Destination** field. +4. Click **Send XRP** to transfer XRP from Account 1 to Account 2. +5. Click the **Account 1** radio button to see its new XRP balance. -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/)in the source repository for this website. -## ripplex-1-send-xrp.js +[![Transferred XRP from Account 2 to Account 1](/docs/img/mt-send-xrp-4-account2-send-xrp.png)](/docs/img/mt-send-xrp-4-account2-send-xrp.png) -This example can be used with any XRP Ledger network, _Testnet_, or _Devnet_. You can update the code to choose different or additional XRP Ledger networks. +## Gather and Distribute Account Information -### getNet() - +For most exercises, it's fine if you want to create a new account. If want to use the same account in another exercise, you can gather the information from both accounts to the **Result** field to paste into the next form. -```javascript -// ****************************************************** -// ************* Get the Preferred Network ************** -// ****************************************************** +1. Click **Gather Account Info**. +2. Copy the name, address, and seed values from the **Result** field. - function getNet() { -``` +[![Copy gathered info from the Result field.](/docs/img/mt-send-xrp-5-gather-account-info.png)](/docs/img/mt-send-xrp-5-gather-account-info.png) -This function uses brute force `if` statements to discover the selected network instance and return the URI. +3. Go to the next modular tutorial form. +4. Paste the values in the **Result** field. +5. Click **Distribute Account Info** to populate all of the Account 1 and Account 2 fields. -```javascript - let net - if (document.getElementById("tn").checked) net = "wss://s.altnet.rippletest.net:51233" - if (document.getElementById("dn").checked) net = "wss://s.devnet.rippletest.net:51233" - return net -} // End of getNet() -``` +## Getting the XRP Balance -### getAccount(type) - +The **XRP Balance** field is automatically updated when you choose **Account 1** or **Account 2**. If you send XRP to an account from another application and you want to see the result, you can click **Get XRP Balance** at any time to see the currently available XRP. -```javascript -// ******************************************************* -// ************* Get Account ***************************** -// ******************************************************* +## Getting the Token Balance -async function getAccount(type) { -``` +You can see the balance of all issued currencies, MPTs, and other tokens by clicking **Get Token Balance**. You can issue and send tokens in many of the modular tutorials that build off the XRPL Base Module. -Get the selected ledger. +# Code Walkthrough -```javascript - let net = getNet() -``` +You can download the [Payment Modular Tutorials](/_code-samples/modular-tutorials/payment-modular-tutorials.zip) from the source repository for this website. -Instantiate a client. +## account-support.js -```javascript - const client = new xrpl.Client(net) -``` +This file contains the functions all of the modular examples use to create, use, and reuse accounts. -Use the _results_ variable to capture progress information. +### getNet() -```javascript - results = 'Connecting to ' + net + '....' -``` -Use the default faucet using a _null_ value. +This function can be used with _Testnet_, or _Devnet_. It allows you to select between them with a radio button to set the _net_ variable with the server URL. ```javascript - let faucetHost = null +function getNet() { + let net + if (document.getElementById("tn").checked) net = "wss://s.altnet.rippletest.net:51233/" + if (document.getElementById("dn").checked) net = "wss://s.devnet.rippletest.net:51233/" + return net +} // End of getNet() ``` +### getAccount() -Report progress in the appropriate results field. +The `getAccount()` function uses the faucet host to fund a new account wallet ```javascript - if (type == 'standby') { - standbyResultField.value = results - } else { - operationalResultField.value = results - } +async function getAccount() { ``` -Connect to the server. +Get the selected network, create a new client, and connect to the XRPL serever. ```javascript + let net = getNet() + const client = new xrpl.Client(net) await client.connect() - - results += '\nConnected, funding wallet.' - if (type == 'standby') { - standbyResultField.value = results - } else { - operationalResultField.value = results - } - -``` - -Create and fund a test account. - -```javascript - const my_wallet = (await client.fundWallet(null, { faucetHost })).wallet - - results += '\nGot a wallet.' - if (type == 'standby') { - standbyResultField.value = results - } else { - operationalResultField.value = results - } + resultField.value = `===Getting Account===\n\nConnected to ${net}.` ``` -Get the current XRP balance for the account. +Request a new wallet funded with play-money XRP for experimentation. ```javascript - const my_balance = (await client.getXrpBalance(my_wallet.address)) -``` - -If this is a standby account, populate the standby account fields. - -```javascript - if (type == 'standby') { - standbyAccountField.value = my_wallet.address - standbyPubKeyField.value = my_wallet.publicKey - standbyPrivKeyField.value = my_wallet.privateKey - standbyBalanceField.value = (await client.getXrpBalance(my_wallet.address)) - standbySeedField.value = my_wallet.seed - results += '\nStandby account created.' - standbyResultField.value = results -``` - -Otherwise, populate the operational account fields. - -```javascript - } else { - operationalAccountField.value = my_wallet.address - operationalPubKeyField.value = my_wallet.publicKey - operationalPrivKeyField.value = my_wallet.privateKey - operationalSeedField.value = my_wallet.seed - operationalBalanceField.value = (await client.getXrpBalance(my_wallet.address)) - results += '\nOperational account created.' - operationalResultField.value = results + try { + let faucetHost = null + const my_wallet = (await client.fundWallet(null, { faucetHost})).wallet + const newAccount = [my_wallet.address, my_wallet.seed] + return (newAccount) } ``` -Insert the seed values for both accounts as they are created to the **Seeds** field as a convenience. You can copy the values and store them offline. When you reload this form or another in this tutorial, copy and paste them into the **Seeds** field to retrieve the accounts with the `getAccountsFromSeeds()` function. +Catch and report any errors. ```javascript - seeds.value = standbySeedField.value + '\n' + operationalSeedField.value + catch (error) { + console.error('Error getting account:', error); + results = `\n===Error: ${error.message}===\n` + resultField.value += results + throw error; // Re-throw the error to be handled by the caller + } ``` -Disconnect from the XRP ledger. +Disconnect from the XRPL server and return the address and seed information. ```javascript client.disconnect() + return (newAccount) } // End of getAccount() ``` -### Get Accounts from Seeds +### getNewAccount1() and getNewAccount2() + +These are wrapper functions that call the getAccount() function, then populate the account address and account seed fields for Account1 or Account2, respectively. ```javascript -// ******************************************************* -// ********** Get Accounts from Seeds ******************** -// ******************************************************* +async function getNewAccount1() { + account1address.value = "=== Getting new account. ===\n\n" + account1seed.value = "" + const accountInfo= await getAccount() + account1address.value = accountInfo[0] + account1seed.value = accountInfo[1] +} + -async function getAccountsFromSeeds() { +async function getNewAccount2() { + account2address.value = "=== Getting new account. ===\n\n" + account2seed.value = "" + const accountInfo= await getAccount() + account2address.value = accountInfo[0] + account2seed.value = accountInfo[1] +} ``` -Connect to the selected network. +### getAccountFromSeed() + +This function uses an existing seed value to access the client information from the XRP Ledger, then return the account address. ```javascript - let net = getNet() +async function getAccountFromSeed(my_seed) { + const net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results await client.connect() - results += '\nConnected, finding wallets.\n' - standbyResultField.value = results + let results = '===Finding wallet.===\n\n' + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(my_seed) + const address = wallet.address + results += "===Wallet found.===\n\n" + results += "Account address: " + address + "\n\n" + resultField.value = results + return (address) + } ``` - -Parse the **Seeds** field. +Catch and report any errors. ```javascript - var lines = seeds.value.split('\n') -``` + catch (error) { + console.error('===Error getting account from seed:', error); + results += `\nError: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller + } + ``` -Get the `standby_wallet` based on the seed in the first line. Get the `operational_wallet` based on the seed in the second line. + Disconnect from the XRP Ledger and return the . -```javascript - const standby_wallet = xrpl.Wallet.fromSeed(lines[0]) - const operational_wallet = xrpl.Wallet.fromSeed(lines[1]) + ```javascript + finally { + await client.disconnect(); + } +} // End of getAccountFromSeed() ``` +### getAccountFromSeed1 and getAccountFromSeed2 -Get the current XRP balances for the accounts. +These wrapper functions populate the Account1 Address or Account2 address from a seed value, respectively. ```javascript - const standby_balance = (await client.getXrpBalance(standby_wallet.address)) - const operational_balance = (await client.getXrpBalance(operational_wallet.address)) +async function getAccountFromSeed1() { + account1address.value = await getAccountFromSeed(account1seed.value) +} + +async function getAccountFromSeed2() { + account2address.value = await getAccountFromSeed(account2seed.value) +} ``` -Populate the fields for the standby and operational accounts. +### gatherAccountInfo() + +This local function copies the name, account, and seed values for Account1 and Account2 and displays the information in the **Result** field. You can then copy the information to reuse in another modular tutorial. ```javascript - standbyAccountField.value = standby_wallet.address - standbyPubKeyField.value = standby_wallet.publicKey - standbyPrivKeyField.value = standby_wallet.privateKey - standbySeedField.value = standby_wallet.seed - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - - operationalAccountField.value = operational_wallet.address - operationalPubKeyField.value = operational_wallet.publicKey - operationalPrivKeyField.value = operational_wallet.privateKey - operationalSeedField.value = operational_wallet.seed - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) +function gatherAccountInfo() { + let accountData = account1name.value + "\n" + account1address.value + "\n" + account1seed.value + "\n" + accountData += account2name.value + "\n" + account2address.value + "\n" + account2seed.value + resultField.value = accountData +} ``` -Disconnect from the XRP Ledger. +### distributeAccountInfo() + +This local function parses structured account information from the **Result** field and distributes it to the corresponding account fields. It is the counterpart to the gatherAccountInfo() utility. The purpose is to let you continue to use the same accounts in all of the modular examples. If you have information that doesn't perfectly conform, you can still use this utility to populate the fields with the information that does fit the format. ```javascript - client.disconnect() -} // End of getAccountsFromSeeds() +function distributeAccountInfo() { + let accountInfo = resultField.value.split("\n") + account1name.value = accountInfo[0] + account1address.value = accountInfo[1] + account1seed.value = accountInfo[2] + account2name.value = accountInfo[3] + account2address.value = accountInfo[4] + account2seed.value = accountInfo[5] +} ``` -### Send XRP +### populate1() and populate2 + +These local functions populate the active form fields with values for their correesponding accounts. ```javascript -// ******************************************************* -// ******************** Send XRP ************************* -// ******************************************************* +function populate1() { + accountNameField.value = account1name.value + accountAddressField.value = account1address.value + accountSeedField.value = account1seed.value + getXrpBalance() +} -async function sendXRP() { +function populate2() { + accountNameField.value = account2name.value + accountAddressField.value = account2address.value + accountSeedField.value = account2seed.value + getXrpBalance() +} ``` -Connect to your selected ledger. +### getXrpBalance() + +Connect to the XRP Ledger, send a `getXrpBalance()` request for the current acitve account, then display it in the **XRP Balance Field**. ```javascript - results = "Connecting to the selected ledger.\n" - standbyResultField.value = results - let net = getNet() - results = 'Connecting to ' + getNet() + '....' +async function getXrpBalance() { + const net = getNet() const client = new xrpl.Client(net) await client.connect() - - results += "\nConnected. Sending XRP.\n" - standbyResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const sendAmount = standbyAmountField.value - - results += "\nstandby_wallet.address: = " + standby_wallet.address - standbyResultField.value = results -``` - -Prepare the transaction. This is a Payment transaction from the standby address to the operational address. + let results = `\n===Getting XRP balance...===\n\n` + resultField.value = results + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const balance = await client.getXrpBalance(wallet.address) + results += accountNameField.value + " current XRP balance: " + balance + "\n\n" + xrpBalanceField.value = await client.getXrpBalance(accountAddressField.value) + resultField.value = results + } + ``` -The _Payment_ transaction expects the XRP to be expressed in drops, or 1/millionth of an XRP. You can use the `xrpToDrops()` method to convert the send amount for you (which beats having to type an extra 6 zeroes to send 1 XRP). + Catch any errors and disconnect from the XRP Ledger. -```javascript - const prepared = await client.autofill({ - "TransactionType": "Payment", - "Account": standby_wallet.address, - "Amount": xrpl.xrpToDrops(sendAmount), - "Destination": standbyDestinationField.value - }) + ```javascript + catch (error) { + console.error('Error getting XRP balance:', error); + results += `\nError: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await client.disconnect(); + } ``` +### getTokenBalance() -Sign the prepared transaction. +Get the balance of all tokens for the current active account. This is a function that is used frequently in other modular tutorials that deal with currencies other than XRP. -``` -const signed = standby_wallet.sign(prepared) +```javascript +async function getTokenBalance() { ``` -Submit the transaction and wait for the results. +Connect with the network. -``` -const tx = await client.submitAndWait(signed.tx_blob) +```javascript + let net = getNet() + const client = new xrpl.Client(net) + await client.connect() + let results = `===Connected to ${net}.===\n===Getting account token balance...===\n\n` + resultField.value += results ``` -Request the balance changes caused by the transaction and report the results. +Send a request to get the account balance, then wait for the results. +```javascript + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const balance = await client.request({ + command: "gateway_balances", + account: wallet.address, + ledger_index: "validated", + }) + results = accountNameField.value + "\'s token balance(s): " + JSON.stringify(balance.result, null, 2) + "\n" + resultField.value += results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } ``` - results += "\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - standbyResultField.value = results - - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - client.disconnect() -} // End of sendXRP() -``` - -### Reciprocal Transactions -For each of the transactions, there is an accompanying reciprocal transaction, with the prefix _oP,_ for the operational account. See the corresponding function for the standby account for code commentary. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript -// ********************************************************************** -// ****** Reciprocal Transactions *************************************** -// ********************************************************************** - -// ******************************************************* -// ********* Send XRP from Operational account *********** -// ******************************************************* - -async function oPsendXRP() { - - results = "Connecting to the selected ledger.\n" - operationalResultField.value = results - let net = getNet() - results = 'Connecting to ' + getNet() + '....' - const client = new xrpl.Client(net) - await client.connect() - - results += "\nConnected. Sending XRP.\n" - operationalResultField.value = results - - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const sendAmount = operationalAmountField.value - - results += "\noperational_wallet.address: = " + operational_wallet.address - operationalResultField.value = results - -// ---------------------------------------------------------- Prepare transaction - const prepared = await client.autofill({ - "TransactionType": "Payment", - "Account": operational_wallet.address, - "Amount": xrpl.xrpToDrops(operationalAmountField.value), - "Destination": operationalDestinationField.value - }) - -// ---------------------------------------------------- Sign prepared instructions - const signed = operational_wallet.sign(prepared) - -// ------------------------------------------------------------ Submit signed blob - const tx = await client.submitAndWait(signed.tx_blob) - - results += "\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - operationalResultField.value = results - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - - client.disconnect() -} // End of oPsendXRP() + + catch (error) { + console.error('Error getting token balance:', error); + results = `\nError: ${error.message}\n` + resultField.value += results + throw error; // Re-throw the error to be handled by the caller + } + finally { + // Disconnect from the client + await client.disconnect(); + } +} ``` -## 1.get-accounts-send-xrp.html +## base-module.html Create a standard HTML form to send transactions and requests, then display the results. ```html - - Token Test Harness + + XRPL Base Module - - - - - - + + + + + + - -

Token Test Harness

+ +

XRPL Base Module

- Choose your ledger instance: -    - - -    - - -

- -
- -

- - - - - -
- - + + Choose your ledger instance: + +    + + +    + + +

+
+ + + + + + + + + + + + + + - + + + + + + + + +
+ + + + + + + +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Standby Account - - -
-
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination - - -
-
-

- -

+
+ + + + + +
+ + + + + + + + + - - - - - - -
- -
-
+ + + + + + + + + + + +
-
+
- + + - -
+ + + + - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Operational Account - - -
-
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination - - -
-
-

- -

-
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + Destination + + + + +
+ + + + + + + +

+ +

+ + +
+ + + +
- + + ``` diff --git a/docs/tutorials/javascript/send-payments/create-conditional-escrows.md b/docs/tutorials/javascript/send-payments/create-conditional-escrows.md index 0d38cb71d32..310d3174c0a 100644 --- a/docs/tutorials/javascript/send-payments/create-conditional-escrows.md +++ b/docs/tutorials/javascript/send-payments/create-conditional-escrows.md @@ -1,13 +1,12 @@ --- -html: create-conditional-escrows-using-javascript.html -parent: send-payments-using-javascript.html seo: description: Create, finish, or cancel condition-based escrow transactions. labels: - Accounts - - Quickstart + - Modular Tutorials - Transaction Sending - XRP + - Escrow --- # Create Conditional Escrows Using JavaScript @@ -19,12 +18,12 @@ This example shows how to: 3. Cancel a conditional escrow transaction. -[![Conditional Escrow Tester Form](/docs/img/conditional-escrow1.png)](/docs/img/conditional-escrow1.png) +[![Conditional Escrow Tester Form](/docs/img/mt-conditional-escrow-1-empty-form.png)](/docs/img/mt-conditional-escrow-1-empty-form.png) ## Prerequisites -Download and expand the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/) archive. +Download and expand the [Modular Tutorials](../../../../_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. ## Usage @@ -34,632 +33,543 @@ You create a condition-based escrow using a fulfillment code associated with a Install `five-bells-condition`: -1. In a terminal window, navigate to your local `Quickstart` directory (for convenience). +1. In a terminal window, navigate to your chosen local directory. 2. Enter the command `npm install five-bells-condition`. To create a condition/fulfillment pair: -1. In a terminal window, navigate to your `Quickstart` directory. +1. In a terminal window, navigate to your chosen local directory. 2. Enter the command `node getConditionAndFulfillment.js`. 3. Copy and save the generated Condition and Fulfillment pair. -[![Condition and Fulfillment](/docs/img/conditional-escrow2.png)](/docs/img/conditional-escrow2.png) +[![Condition and Fulfillment](/docs/img/mt-conditional-escrow-2-getConditionAndFulfillment.png)](/docs/img/mt-conditional-escrow-2-getConditionAndFulfillment.png) To get test accounts: -1. Open `9.escrow-condition.html` in a browser -2. Choose **Testnet** or **Devnet**. -3. Get test accounts. - 1. If you have existing account seeds - 1. Paste account seeds in the **Seeds** field. - 2. Click **Get Accounts from Seeds**. - 2. If you do not have account seeds: - 1. Click **Get New Standby Account**. - 2. Click **Get New Operational Account**. +1. Open `create-conditional-escrow.html` in a browser +2. Get test accounts. + 1. If you copied the gathered information from another tutorial: + 1. Paste the gathered information to the **Result** field. + 2. Click **Distribute Account Info**. + 2. If you have an existing account seed: + 1. Paste the account seed to the **Account 1 Seed** or **Account 2 Seed** field. + 2. Click **Get Account 1 from Seed** or **Get Account 2 from Seed**. + 2. If you do not have existing accounts: + 1. Click **Get New Account 1**. + 2. Click **Get New Account 2**. -[![Escrow Tester with Account Information](/docs/img/conditional-escrow3.png)](/docs/img/conditional-escrow3.png) +[![Form with Accounts](/docs/img/mt-conditional-escrow-3-form-with-accounts.png)](/docs/img/mt-conditional-escrow-3-form-with-accounts.png) -### Create Conditional Escrow: +### Create Conditional Escrow -
- -
- -When you create a conditional escrow, you need to specify the amount you want to reserve and the `Condition` value you generated above. You can also set a cancel date and time, after which the escrow is no longer available. +When you create a conditional escrow, you need to specify the amount you want to reserve and the `Condition` value you generated above. You can also set a cancel date and time, after which the escrow is no longer available. For testing, the **Cancel** time is in seconds: in practice, you might set a **Cancel** time in days, weeks, months, or years. To create a conditional escrow: 1. Enter an **Amount** to transfer. -2. Copy the **Operational Account** value. -3. Paste it in the **Destination Account** field. +3. Enter the **Destination** field (for example, use Account 2 Address). 4. Enter the **Escrow Condition** value. -5. Enter the **Escrow Cancel (seconds)** value. +5. Enter the **Escrow Cancel (seconds)** value. 6. Click **Create Escrow**. -7. Copy and save the _Sequence Number_ of the escrow called out in the **Standby Result** field. +7. Copy and save the _Sequence Number_ of the escrow called out in the **Results** field. The escrow is created on the XRP Ledger instance, reserving your requested XRP amount plus the transaction cost. When you create an escrow, capture and save the _Sequence Number_ so that you can use it to finish the escrow transaction. -[![Created Escrow Transaction](/docs/img/conditional-escrow4.png)](/docs/img/conditional-escrow4.png) +[![Created Escrow Transaction](/docs/img/mt-conditional-escrow-4-escrow-create.png)](/docs/img/mt-conditional-escrow-4-escrow-create.png) ## Finish Conditional Escrow Any account can finish the conditional escrow any time before the _Escrow Cancel_ time. Following on the example above, you can use the _Sequence Number_ to finish the transaction once the Escrow Cancel time has passed. -To finish a time-based escrow: +To finish a conditional escrow: -1. Paste the sequence number in the Operational account **Escrow Sequence Number** field. -2. Enter the `Fulfillment` code for the `Condition`. -3. Click **Finish Conditional Escrow**. +1. Enter the **Escrow Condition** code for the escrow. +2. Enter the corresponding **Escrow Fulfillment** code. +3. Enter the **Escrow Owner** (the account address of the account that created the escrow). +4. Enter the sequence number in the **Escrow Sequence Number** field. +5. Click **Finish Escrow**. -The transaction completes and balances are updated for both the Standby and Operational accounts. +The transaction is completed and balances adjusted for both accounts. -[![Finished Escrow Transaction](/docs/img/conditional-escrow5.png)](/docs/img/conditional-escrow5.png) +[![Finished Escrow Transaction](/docs/img/mt-conditional-escrow-5-escrow-fulfill.png)](/docs/img/mt-conditional-escrow-5-escrow-fulfill.png) ## Get Escrows -Click **Get Escrows** for either the Standby account or the Operational account to see their current list of escrows. +Click **Get Escrows** to see the current list of escrows generated by or destined for the current account. ## Cancel Escrow -When the Escrow Cancel time passes, the escrow is no longer available to the recipient. The initiator of the escrow can reclaim the XRP, less the transaction fees. Any account can cancel an escrow once the cancel time has elapsed. Accounts that try to cancel the transaction prior to the **Escrow Cancel** time are charged the nominal transaction cost (12 drops), but the actual escrow cannot be cancelled until after the Escrow Cancel time. +When the Escrow Cancel time passes, the escrow is no longer available to the recipient. The initiator of the escrow can reclaim the XRP, less the transaction fees. Any account can cancel an escrow once the cancel time has elapsed. Accounts that try to cancel the transaction prior to the **Escrow Cancel** time are charged the nominal transaction cost (typically 12 drops), but the actual escrow cannot be cancelled until after the Escrow Cancel time. + +To cancel an expired escrow: + +1. Enter the sequence number in the **Escrow Sequence Number** field. +2. Click **Cancel Escrow**. ## Oh No! I Forgot to Save the Sequence Number! If you forget to save the sequence number, you can find it in the escrow transaction record. -1. Create a new escrow as described in [Create Escrow](#create-escrow), above. +1. If needed, create a new escrow as described in [Create Escrow](#create-escrow), above. 2. Click **Get Escrows** to get the escrow information. 3. Copy the _PreviousTxnID_ value from the results. - ![Transaction ID in Get Escrows results](/docs/img/quickstart-escrow7.png) -4. Paste the _PreviousTxnID_ in the **Transaction to Look Up** field. - ![Transaction to Look Up field](/docs/img/quickstart-escrow8.png) + [![Previous Transaction ID in Get Escrows results](/docs/img/mt-conditional-escrow-6-get-escrows.png)](/docs/img/mt-conditional-escrow-6-get-escrows.png) +4. Paste the _PreviousTxnID_ in the **Transaction** field. 5. Click **Get Transaction**. -6. Locate the _Sequence_ value in the results. - ![Sequence number in results](/docs/img/quickstart-escrow9.png) +6. Locate the _ModifiedNode.PreviousFields.Sequence_ value in the results. + [![Sequence number in results](/docs/img/mt-conditional-escrow-7-sequence-value.png)](/docs/img/mt-conditional-escrow-7-sequence-value.png) # Code Walkthrough -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/)in the source repository for this website. - -## getConditionAndFulfillment.js - -To generate a condition/fulfillment pair, use Node.js to run the `getConditionAndFulfillment.js` script. - -```javascript -function getConditionAndFulfillment() { -``` - -Instantiate the `five-bells-condition` and `crypto` libraries. - -```javascript - const cc = require('five-bells-condition') - const crypto = require('crypto') -``` - -Create a random 32-byte seed string. +Download the [Modular Tutorials](../../../../_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. -```javascript - const preimageData = crypto.randomBytes(32) -``` +## five-bells.cjs -Create a fulfillment object. +To generate a condition/fulfillment pair, use Node.js to run the `five-bells.js` script. ```javascript - const fulfillment = new cc.PreimageSha256() -``` +const cc = require('five-bells-condition') +const crypto = require('crypto') -Generate a fulfillment code. +// 1. Generate a random 32-byte seed +const preimageData = crypto.randomBytes(32) -```javascript - fulfillment.setPreimage(preimageData) -``` +// 2. Create a PreimageSha256 fulfillment object +const fulfillment = new cc.PreimageSha256() -Generate the condition value based on the fulfillment value. - -```javascript - const condition = fulfillment.getConditionBinary().toString('hex').toUpperCase() -``` +// 3. Set the preimage +fulfillment.setPreimage(preimageData) -Return the condition. +// 4. Generate the condition (binary) +const conditionBinary = fulfillment.getConditionBinary() -```javascript - console.log('Condition:', condition) -``` +// 5. Generate the fulfillment (binary) +const fulfillmentBinary = fulfillment.serializeBinary() -Convert the fulfillment code to a hexadecimal string. +// Convert to hex for easier use +const conditionHex = conditionBinary.toString('hex').toUpperCase() +const fulfillmentHex = fulfillmentBinary.toString('hex').toUpperCase() -```javascript - const fulfillment_hex = fulfillment.serializeBinary().toString('hex').toUpperCase() +console.log('Condition (hex):', conditionHex) +console.log('Fulfillment (hex):', fulfillmentHex) ``` -Return the fulfillment code. Keep it secret until you want to finish the escrow. +## create-conditional-escrow.js -```javascript - console.log('Fulfillment:', fulfillment_hex) -} -getConditionAndFulfillment() -``` -## ripplex9-escrow-condition.js +### createConditionalEscrow() - -### Create Conditional Escrow +Connect to the ledger and get the account wallet. ```javascript async function createConditionalEscrow() { -``` - -Connect to your preferred ledger. - -```javascript - results = "Connecting to the selected ledger.\n" - standbyResultField.value = results - let net = getNet() - results = "Connecting to " + net + "....\n" + let net = getNet() const client = new xrpl.Client(net) await client.connect() - - results += "Connected. Creating conditional escrow.\n" - standbyResultField.value = results -``` - -Instantiate the standby and operational wallets - -```javascript - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) -``` - -Capture the amount to send in the escrow. - -```javascript - const sendAmount = standbyAmountField.value -``` - -Update the results field. - -```javascript - results += "\nstandby_wallet.address: = " + standby_wallet.address - standbyResultField.value = results + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const sendAmount = amountField.value + let results = `===Connected to ${net}===\n===Creating conditional escrow.===\n\n` + resultField.value = results ``` -Create a date value and add your requested number of seconds. +Prepare the cancel date by adding the number of seconds in the **Escrow Cancel Date** field to the current date and time. In practice, the cancel date might be in days, weeks, months, or years. Using seconds allows you to test scenarios with expired escrows. ```javascript let escrow_cancel_date = new Date() - escrow_cancel_date = addSeconds(parseInt(standbyEscrowCancelDateField.value)) + escrow_cancel_date = addSeconds(parseInt(escrowCancelDateField.value)) ``` -Prepare the `EscrowCreate` transaction. +Prepare the transaction object. ```javascript const escrowTx = await client.autofill({ "TransactionType": "EscrowCreate", - "Account": standby_wallet.address, + "Account": wallet.address, "Amount": xrpl.xrpToDrops(sendAmount), - "Destination": standbyDestinationField.value, + "Destination": destinationField.value, "CancelAfter": escrow_cancel_date, - "Condition": standbyEscrowConditionField.value + "Condition": escrowConditionField.value }) ``` -Sign the transaction. +Sign the prepared transaction object. ```javascript - const signed = standby_wallet.sign(escrowTx) + const signed = wallet.sign(escrowTx) ``` -Submit the transaction and wait for the results. +Submit the signed object and wait for the results. ```javascript const tx = await client.submitAndWait(signed.tx_blob) ``` -Report the results and update balance fields. +Report the results, parsing the _Sequence Number_ for later use. ```javascript - results += "\nSequence Number (Save!): " + JSON.stringify(tx.result.Sequence) - results += "\n\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - standbyResultField.value = results + results = "\n=== *** Sequence Number (Save!): " + tx.result.tx_json.Sequence + results += "\n\n===Balance changes===\n" + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + resultField.value += results ``` -Disconnect from the XRPL +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript -client.disconnect() - -} // End of createTimeEscrow() + catch (error) { + results += "\n===Error: " + error.message + resultField.value = results + } + finally { + // -------------------------------------------------------- Disconnect + client.disconnect() + }// End of createTimeEscrow() ``` -### Finish Conditional Escrow +### finishConditionalEscrow() -Finish the escrow by submitting the condition and fulfillment codes. +Connect to the ledger and get the account wallet from the account seed. ```javascript async function finishConditionalEscrow() { -``` - -Connect to your preferred XRP Ledger instance. - -```javascript - results = "Connecting to the selected ledger.\n" - operationalResultField.value = results let net = getNet() - results += 'Connecting to ' + getNet() + '....' const client = new xrpl.Client(net) await client.connect() - results += "\nConnected. Finishing escrow.\n" - operationalResultField.value = results -``` - -Get the standby and operational account wallets. - -```javascript - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const sendAmount = operationalAmountField.value - - results += "\noperational_wallet.address: = " + operational_wallet.address - operationalResultField.value = results + let results = `===Connected to ${net}===\n===Fulfilling conditional escrow.===\n` + resultField.value = results + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) ``` -Prepare the transaction. +Prepare the transaction object. ```javascript const prepared = await client.autofill({ "TransactionType": "EscrowFinish", - "Account": operationalAccountField.value, - "Owner": standbyAccountField.value, - "OfferSequence": parseInt(operationalEscrowSequenceField.value), - "Condition": standbyEscrowConditionField.value, - "Fulfillment": operationalFulfillmentField.value + "Account": accountAddressField.value, + "Owner": escrowOwnerField.value, + "OfferSequence": parseInt(escrowSequenceNumberField.value), + "Condition": escrowConditionField.value, + "Fulfillment": escrowFulfillmentField.value }) ``` -Sign the transaction. +Sign the prepared transaction object. ```javascript - - const signed = operational_wallet.sign(prepared) + const signed = wallet.sign(prepared) ``` -Submit the transaction and wait for the results. +Submit the signed transaction and wait for the results. ```javascript const tx = await client.submitAndWait(signed.tx_blob) ``` -Report the results. +Report the results ```javascript - results += "\nBalance changes: " + + results = "\n===Balance changes===" + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - operationalResultField.value = results - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) + resultField.value += results ``` -Disconnect from the XRPL. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - client.disconnect() - -} // End of finishEscrow() + catch (error) { + results += "\n===Error: " + error.message + ".===\n" + resultField.value = results + } + finally { + // -------------------------------------------------------- Disconnect + client.disconnect() + } ``` - -## 9.escrow-condition.html +## create-conditional-escrow.html ```html - - Conditional Escrow Test Harness + + Create a Conditional Escrow - - - - - - - - + + + + + + + + - -

Conditional Escrow Test Harness

+ +

Create a Conditional Escrow

- Choose your ledger instance: -    - - -    - - -

- -
- -

- - - - - -
- - + + Choose your ledger instance: + +    + + +    + + +

+
+ + - + + + + + + + + + + + + + + + + + + + + +
+ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Standby Account - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination Account - - -
-
- Escrow Condition - - -
-
- Escrow Cancel (seconds) - - -
-
- Escrow Sequence Number - - -
-
- - -
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
-

- -

+
+ - - - - - - - -
- -

- -
- -
- -
- -
-
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
-
+
- + + + + + - -
+ + + + + + + +
+ + + + - - - - - - - - -
- -

- -
- -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Operational Account - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Fulfillment Code - - -
-
- Escrow Sequence Number - - -
-
- Transaction to Look Up - - -
-
- - - - -
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
-

- -

-
-
-
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + Destination + + + + +
+ + + + + + + + + Escrow Condition + + + + +
+ + + + + + + + + Escrow Fulfillment + + + + +
+ + + + + + + + + Escrow Cancel Time + + + + +
+ + + + + + + + + Escrow Sequence Number + + + + +
+ + + + + + + + + Escrow Owner + + + + +
+ + + + + + Transaction + + + + +
+ + + + + + +

+ +

+ + +
+ + + +
- + + ``` diff --git a/docs/tutorials/javascript/send-payments/create-offers.md b/docs/tutorials/javascript/send-payments/create-offers.md index 665b00707f2..9c9073fd2f0 100644 --- a/docs/tutorials/javascript/send-payments/create-offers.md +++ b/docs/tutorials/javascript/send-payments/create-offers.md @@ -17,61 +17,64 @@ This example shows how to: 4. Cancel an unsettled offer. -[![Offer Create Token Test Harness](/docs/img/module-create-offer.png)](/docs/img/module-create-offer.png) +[![Offer Create Token Test Harness](/docs/img/mt-create-offers-1-empty-form-info.png)](/docs/img/mt-create-offers-1-empty-form-info.png) -Download and expand the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/) archive. +Download and expand the [Modular Tutorials](../../../../_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. -**Note:** Without the Quickstart Samples, you will not be able to try the examples that follow. +**Note:** Without the Modular Tutorial Samples, you will not be able to try the examples that follow. ## Usage - + To get test accounts: -1. Open `3a.CreateOffer.html` in a browser -2. Choose **Testnet** or **Devnet**. -3. Enter an **Account Name** for the left column. For example, _Standby_. -4. Click **Get New Account** on the left. -5. Enter an **Account Name** for the right column. For example, _Operational_. -5. Click **Get New Account** on the right. -6. Copy and paste the **Seeds** field in a persistent location, such as a Notepad, so that you can reuse the accounts after reloading the form. +1. Open `create-offers.html` in a browser. +2. Get test accounts. + 1. If you copied the gathered information from another tutorial: + 1. Paste the gathered information to the **Result** field. + 2. Click **Distribute Account Info**. + 2. If you have an existing account seed: + 1. Paste the account seed to the **Account 1 Seed** or **Account 2 Seed** field. + 2. Click **Get Account 1 from Seed** or **Get Account 2 from Seed**. + 2. If you do not have existing accounts: + 1. Click **Get New Account 1**. + 2. Click **Get New Account 2**. -[![Created Standby and Operational Accounts](/docs/img/module-create-offer-get-accounts.png)](/docs/img/module-create-offer-get-accounts.png) +[![Created Accounts](/docs/img/mt-create-offers-2-form-with-account-info.png)](/docs/img/mt-create-offers-2-form-with-account-info.png) You can create and match offers from either account. ## Create Offer -To create an offer to exchange XRP for an issued currency on the Standby (left) side: +To create an offer to exchange XRP for an issued currency: -1. Enter _XRP_ as the Taker Pays **Currency**. -2. Enter the Taker Pays **Value** in drops. For example, _50000000_. +1. Click **Account 1** or **Account 2**. +2. Enter _XRP_ as the Taker Pays **Currency Code**. +2. Enter the Taker Pays **Amount** in drops. For example, _50000000_. 3. Enter the Taker Gets **Currency**. For example, _USD_. -4. Copy the left account (_Standby_) value to the Taker Gets **Issuer** field. -5. Enter the Taker Gets **Value**. For example, _50_. +4. Copy the current **Account Address** and paste it in the Taker Gets **Issuer** field. +5. Enter the Taker Gets **Amount**. For example, _50_. 6. Click **Create Offer**. -[![Created an offer for XRP and USD](/docs/img/module-create-offer-xrp-for-usd.png)](/docs/img/module-create-offer-xrp-for-usd.png) +[![Created an offer for XRP and USD](/docs/img/mt-create-offers-3-xrp-for-usd-offer.png)](/docs/img/mt-create-offers-3-xrp-for-usd-offer.png) -To create a complementary offer on the Operational (right) side: +## Get Offers -1. Enter the Taker Pays **Currency**. For example, _USD_. -2. Copy the left (Standby) side **Account** string into the **Issuer** field. -3. Enter the Taker Pays **Value**. For example, _50_. -4. Enter _XRP_ as the Taker Gets **Currency**. -5. Enter the Taker Gets **Value** in drops. For example, _50000000_. -6. Click **Create Offer**. +Click **Get Offers** to get a list of offers issued by the corresponding account. -[![Results of matching offers for XRP and USD](/docs/img/module-create-offer-xrp-for-usd2.png)](/docs/img/module-create-offer-xrp-for-usd2.png) +[![Created an offer for XRP and USD](/docs/img/mt-create-offers-3-xrp-for-usd-offer.png)](/docs/img/mt-create-offers-3-xrp-for-usd-offer.png) -## Get Offers +## Create a Matching Offer -Click **Get Offers** to get a list of offers issued by the corresponding account. +1. Choose an account other than the Issuer. For example, **Account 2**. +2. Enter _XRP_ as the Taker Gets **Currency Code**. +3. Enter the Taker Gets **Amount**. For example, _50000000_. +3. Enter the Taker Pays **Currency Code**, for example _USD_. +4. Enter the Taker Pays **Issuer**. For example, the **Account 1 Address**. +5. Enter the Taker Pays **Amount** For example, _50_. +6. Click **Create Offer**. -[![Get outstanding offers for the Standby (left) account](/docs/img/module-create-offer-get-offers.png)](/docs/img/module-create-offer-get-offers.png) + +[![Results of matching offers for XRP and USD](/docs/img/mt-create-offers-4-matching-offer.png)](/docs/img/mt-create-offers-4-matching-offer.png) ## Cancel Offer @@ -79,1012 +82,468 @@ To cancel an existing offer: 1. Enter the sequence number of the offer in the **Offer Sequence** field. To find the sequence number, you can click **Get Offers**, then look for the _Seq_ value for the offer you want to cancel. -[![Where to find the "seq" value in an offer record](/docs/img/module-create-offer-cancel-offer.png)](/docs/img/module-create-offer-cancel-offer.png) +[![Where to find the "seq" value in an offer record](/docs/img/mt-create-offers-5-sequence-number.png)](/docs/img/mt-create-offers-5-sequence-number.png) 2. Click **Cancel Offer**, then click **Get Offers** to show that the offer has been removed from the list of outstanding offers. -[![Get Offers result showing no offers](/docs/img/module-create-offer-cancelled-offer.png)](/docs/img/module-create-offer-cancelled-offer.png) +[![Get Offers result showing no offers](/docs/img/mt-create-offers-6-no-offers.png)](/docs/img/mt-create-offers-6-no-offers.png) # Code Walkthrough -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/){.github-code-download} in the source repository for this website. +You can download the [Payment Modular Tutorials](/_code-samples/modular-tutorials/payment-modular-tutorials.zip) from the source repository for this website. + +## create-offer.js -## ripplex3a-create-offers.js +The functions in create-offer.html leverage functions from the base module. The functions that follow are solely focused on creating and handling offers. ### Create Offer -Initialize variables for the _takerGets_ and _takerPays_ payload, and get the selected developer network instance. +Connect to the XRP Ledger and get the account wallet. -```js +```javascript async function createOffer() { - let takerGets = '' - let takerPays = '' let net = getNet() -``` - -Get a client instance and connect to the XRP Ledger. - -```js - let results = 'Connecting to ' + net + '....\n' const client = new xrpl.Client(net) await client.connect() + let results = `===Connected to ${net}, getting wallet....===\n` + resultField.value = results + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) ``` -Get the wallets for both accounts. - -```js - results += "Connected. Getting wallets.\n" - standbyResultField.value = results - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - results += standbyNameField.value + " account address: " + standby_wallet.address + "\n" - standbyResultField.value = results -``` - -If the currency for the "Taker Gets" side of the deal is XRP, you only need the value (amount) of XRP to request. If you are trading an issued currency, you need to capture the currency code, issuer account, and value. - -```js - if (standbyTakerGetsCurrencyField.value == 'XRP') { - takerGets = standbyTakerGetsValueField.value - } else { - takerGetsString = '{"currency": "' + standbyTakerGetsCurrencyField.value +'",\n' + - '"issuer": "' + standbyTakerGetsIssuerField.value + '",\n' + - '"value": "' + standbyTakerGetsValueField.value + '"}' - takerGets = JSON.parse(takerGetsString) - } -``` - -Similarly on the "Take Pays" side, you only need the value when trading XRP. - -```js - if (standbyTakerPaysCurrencyField.value == 'XRP') { - takerPays = standbyTakerPaysValueField.value - } else { - takerPaysString = '{"currency": "' + standbyTakerPaysCurrencyField.value + '",\n' + - '"issuer": "' + standbyTakerPaysIssuerField.value + '",\n' + - '"value": "' + standbyTakerPaysValueField.value + '"}' - takerPays = JSON.parse(takerPaysString) - } -``` - -Prepare the transaction. - -```js - const prepared = await client.autofill({ - "TransactionType": "OfferCreate", - "Account": standby_wallet.address, - "TakerGets": takerGets, - "TakerPays": takerPays - }) - ``` - - Sign the prepared instructions. - - ```js - const signed = standby_wallet.sign(prepared) - results += "\nSubmitting transaction...." -``` +Gather the information for what the taker pays, and what the taker gets in return. If the **Currency Code** is _XRP_, the amount is equal to the value in the **Amount** field. Otherwise, the `takerGets` parameter is constructed as an array containing the currency code, issuer address, and the value in the amount field. -Submit the signed transaction blob. - -```js -const tx = await client.submitAndWait(signed.tx_blob) -``` - -Report the results and update XRP balances. - -```js - results += tx.results + "\n" - results += "\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - standbyResultField.value = results - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) -``` - -Call the `getOffers` function to show the new offer. - -```js - getOffers() -``` - -Disconnect from the XRP Ledger. - -```js - client.disconnect() -} -``` - -### Get Offers - -Connect to the XRP Ledger and get the wallet for the Standby (left) side of the Token Test Harness. - -```js -async function getOffers() { - let net = getNet() - let results = 'Connecting to ' + net + '....\n' - const client = new xrpl.Client(net) - await client.connect() - results += "Connected.\n" - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - results += standbyNameField.value + " acccount: " + standby_wallet.address -``` - -Label the offers section of the results - -```js - results += '\n\n*** Offers ***\n' -``` - -Send the _account_offers_ request to the XRP Ledger. Capture the results. - -```js +```javascript try { - const offers = await client.request({ - method: "account_offers", - account: standby_wallet.address, - ledger_index: "validated" - }) - results += JSON.stringify(offers,null,2) - } catch (err) { - results += err - } -``` - -Report the results and disconnect from the XRP Ledger. - -```js - standbyResultField.value = results - client.disconnect() -} -``` - -### Cancel Offer - -Connect to the XRP Ledger and get the account wallets. - -```js - - async function cancelOffer() { - let results = "Connecting to the selected ledger.\n" - standbyResultField.value = results - let net = getNet() - results += 'Connecting to ' + net + '....\n' - const client = new xrpl.Client(net) - await client.connect() - - results += "Connected.\n" - standbyResultField.value = results - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - results += "standby_wallet.address: = " + standby_wallet.address - standbyResultField.value = results -``` - -Prepare the transaction. `The OfferSequence` is the `Seq` value in the response to the `account_offers` request. - -```js - const prepared = await client.autofill({ - "TransactionType": "OfferCancel", - "Account": standby_wallet.address, - "OfferSequence": parseInt(standbyOfferSequenceField.value) - }) -``` - -Sign the prepared transaction. -```js - const signed = standby_wallet.sign(prepared) -``` - -Submit the transaction and wait for the results. - -```js - const tx = await client.submitAndWait(signed.tx_blob) -``` - -Capture the balance changes and report the results. - -```js - results += "\nBalance changes: \n" + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - standbyResultField.value = results -``` - -Update the XRP balance. - -```js - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) -``` - -Disconnect from the XRP Ledger. - -```js - client.disconnect() - } -``` - -### Reciprocal functions for the Operational (right) account. -```js - /*********************************** - ********* OP Create Offer ********* - **********************************/ - - async function oPcreateOffer() { - let takerGets = '' - let takerPays = '' - - operationalResultField.value = '' - let net = getNet() - let results = 'Connecting to ' + net + '....\n' - const client = new xrpl.Client(net) - await client.connect() - - results += "Connected. Getting wallets.\n" - operationalResultField.value = results - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - results += operationalNameField.value + " account address: " + operational_wallet.address + "\n" - operationalResultField.value = results - - - if (operationalTakerGetsCurrencyField.value == 'XRP') { - takerGets = operationalTakerGetsValueField.value + if (getCurrencyField.value == 'XRP') { + takerGets = getAmountField.value } else { - takerGetsString = '{"currency": "' + operationalTakerGetsCurrencyField.value +'",\n' + - '"issuer": "' + operationalTakerGetsIssuerField.value + '",\n' + - '"value": "' + operationalTakerGetsValueField.value + '"}' - takerGets = JSON.parse(takerGetsString) + takerGetsString = '{"currency": "' + getCurrencyField.value +'",\n' + + '"issuer": "' + getIssuerField.value + '",\n' + + '"value": "' + getAmountField.value + '"}' + takerGets = JSON.parse(takerGetsString) } +``` + +The same logic is used to create the value for the `takerPays` parameter. - if (operationalTakerPaysCurrencyField.value == 'XRP') { - takerPays = operationalTakerPaysValueField.value +```javascript + if (payCurrencyField.value == 'XRP') { + takerPays = xrpl.xrpToDrops(payAmountField.value) } else { - takerPaysString = '{"currency": "' + operationalTakerPaysCurrencyField.value + '",\n' + - '"issuer": "' + operationalTakerPaysIssuerField.value + '",\n' + - '"value": "' + operationalTakerPaysValueField.value + '"}' + takerPaysString = '{"currency": "' + payCurrencyField.value + '",\n' + + '"issuer": "' + payIssuerField.value + '",\n' + + '"value": "' + payAmountField.value + '"}' takerPays = JSON.parse(takerPaysString) } - - // -------------------------------------------------------- Prepare transaction - const prepared = await client.autofill({ - "TransactionType": "OfferCreate", - "Account": operational_wallet.address, - "TakerGets": takerGets, - "TakerPays": takerPays - }) - // ------------------------------------------------- Sign prepared instructions - const signed = operational_wallet.sign(prepared) - results += "\nSubmitting transaction...." - // -------------------------------------------------------- Submit signed blob - const tx = await client.submitAndWait(signed.tx_blob) - - results += tx.results + "\n" - results += "\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - operationalResultField.value = results - - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - getOffers() - client.disconnect() - } // End of oPcreateOffer() - - /*********************************** - ********** OP Get Offers *********** - ***********************************/ - -async function oPgetOffers() { - let results = "Connecting to the selected ledger.\n" - operationalResultField.value = results - let net = getNet() - results = 'Connecting to ' + net + '....\n' - const client = new xrpl.Client(net) - await client.connect() - - results += "Connected.\n" - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - results += operationalNameField.value + " account: " + operational_wallet.address - operationalResultField.value = results + ``` - // -------------------------------------------------------- Prepare request +Define the `OfferCreate` transaction, using the `takerPays` and `takerGets` parameters defined above. - results += '\n\n*** Offers ***\n' - let offers - try { - const offers = await client.request({ - method: "account_offers", - account: operational_wallet.address, - ledger_index: "validated" - }) - results += JSON.stringify(offers,null,2) - } catch (err) { - results += err - } - results += JSON.stringify(offers,null,2) - operationalResultField.value = results - client.disconnect() -}// End of oPgetOffers() - -/************************************ - ********** Op Cancel Offer ********* - ***********************************/ - -async function oPcancelOffer() { - let net = getNet() - let results = 'Connecting to ' + net + '....\n' - const client = new xrpl.Client(net) - await client.connect() - - results += "Connected.\n" - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - results += "wallet.address: = " + operational_wallet.address - operationalResultField.value = results - - // -------------------------------------------------------- Prepare transaction - - /* OfferSequence is the Seq value when you getOffers. */ + ```javascript const prepared = await client.autofill({ - "TransactionType": "OfferCancel", - "Account": operational_wallet.address, - "OfferSequence": parseInt(operationalOfferSequenceField.value) -}) - -// ------------------------------------------------- Sign prepared instructions - const signed = operational_wallet.sign(prepared) - -// -------------------------------------------------------- Submit signed blob - const tx = await client.submitAndWait(signed.tx_blob) - - results += "\nBalance changes: \n" + tx.result + "\n" + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - operationalResultField.value = results - - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - client.disconnect() -} // End of oPcancelOffer() -``` - -## ripplex3b-name-field-support.js - -When creating more complex transactions, it can be difficult to remember which account number was performing which part of the deal. To ease the mental burden, there is a new _Name_ field to facilitate working with use cases that typically involve more than two accounts. The account name is appended to the seed values, which makes them reusable and portable to other forms with name field support. To migrate an account, paste the seed value into the seeds field, add a period, then type the account name as a string with no spaces. - -With the exception of the changes that enable use of the Name field, the functions in this JavaScript file are identical to the functions found in `ripplex1-send-xrp.js`. - - -```javascript -### getNet() - - function getNet() { -``` - -This function uses brute force `if` statements to discover the selected network instance and return the URI. - -```javascript - let net - if (document.getElementById("tn").checked) net = "wss://s.altnet.rippletest.net:51233" - if (document.getElementById("dn").checked) net = "wss://s.devnet.rippletest.net:51233" - return net -} // End of getNet() -``` - -### getAccount(type) - - -```javascript -// ******************************************************* -// ************* Get Account ***************************** -// ******************************************************* - -async function getAccount(type) { -``` - -Get the selected ledger. - -```javascript - let net = getNet() -``` - -Instantiate a client. - -```javascript - const client = new xrpl.Client(net) -``` - -Use the _results_ variable to capture progress information. - -```javascript - results = 'Connecting to ' + net + '....' -``` -Use the default faucet using a _null_ value. - -```javascript - let faucetHost = null -``` - -Report progress in the appropriate results field. - -```javascript - if (type == 'standby') { - standbyResultField.value = results - } else { - operationalResultField.value = results - } + "TransactionType": "OfferCreate", + "Account": wallet.address, + "TakerGets": takerGets, + "TakerPays": takerPays + }) ``` -Connect to the server. +Sign and send the prepared transaction, and wait for the results. ```javascript - await client.connect() - - results += '\nConnected, funding wallet.' - if (type == 'standby') { - standbyResultField.value = results - } else { - operationalResultField.value = results - } - + const signed = wallet.sign(prepared) + const tx = await client.submitAndWait(signed.tx_blob) ``` -Create and fund a test account. +Request the token balance changes after the transaction. ```javascript - const my_wallet = (await client.fundWallet(null, { faucetHost })).wallet - - results += '\nGot a wallet.' - if (type == 'standby') { - standbyResultField.value = results - } else { - operationalResultField.value = results - } + results = '\n\n===Offer created===\n\n' + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value += results ``` -Get the current XRP balance for the account. +Get the new XRP balance, reflecting the payments and transaction fees. ```javascript - const my_balance = (await client.getXrpBalance(my_wallet.address)) + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) ``` -If this is a standby account, populate the standby account fields. ```javascript - if (type == 'standby') { - standbyAccountField.value = my_wallet.address - standbyBalanceField.value = (await client.getXrpBalance(my_wallet.address)) - standbySeedField.value = my_wallet.seed - results += '\nAccount created named ' + standbyNameField.value + '.' - standbyResultField.value = results + getOffers() ``` -Otherwise, populate the operational account fields. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - } else { - operationalAccountField.value = my_wallet.address - operationalSeedField.value = my_wallet.seed - operationalBalanceField.value = (await client.getXrpBalance(my_wallet.address)) - results += '\nAccount created named ' + operationalNameField.value + '.' - operationalResultField.value = results + } catch (err) { + console.error('Error creating offer:', err); + results = `\nError: ${err.message}\n` + resultField.value += results + throw err; // Re-throw the error to be handled by the caller } + finally { + // Disconnect from the client + client.disconnect() + }) ``` -Insert the seed values and names for both accounts as they are created to the **Seeds** field as a convenience. You can copy the values and store them offline. When you reload this form or another in this tutorial, copy and paste them into the **Seeds** field to retrieve the accounts with the `getAccountsFromSeeds()` function. - -```javascript - seeds.value = standbySeedField.value + "." + standbyNameField.value + '\n' + - operationalSeedField.value + "." + operationalNameField.value -``` - -Disconnect from the XRP ledger. - -```javascript - client.disconnect() -} // End of getAccount() -``` - -### Get Accounts from Seeds +### getOffers -```javascript -// ******************************************************* -// ********** Get Accounts from Seeds ******************** -// ******************************************************* - -async function getAccountsFromSeeds() { -``` +This function requests a list of all offers posted by an account. -Connect to the selected network. +Connect to the XRP Ledger and get the Account wallet. ```javascript +async function getOffers() { let net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results await client.connect() - results += '\nConnected, finding wallets.\n' - standbyResultField.value = results -``` - -Parse the **Seeds** field. - -```javascript - var lines = seeds.value.split('\n') - var first_line_value = lines[0] - var first_line = first_line_value.split('.') - var first_seed = first_line[0] - var first_name = first_line[1] - - var second_line = lines[1].split('.') - var second_seed = second_line[0] - var second_name = second_line[1] + let results = `===Connected to ' + ${net}, getting offers....===\n` + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + resultField.value = results ``` -Get the `standby_wallet` based on the seed in the first line. Get the `operational_wallet` based on the seed in the second line. +Send a request for all `account_offers` for the specified account address and report the results. ```javascript - const standby_wallet = xrpl.Wallet.fromSeed(lines[0]) - const operational_wallet = xrpl.Wallet.fromSeed(lines[1]) + results += '\n\n*** Offers ***\n' + let offers + try { + offers = await client.request({ + method: "account_offers", + account: wallet.address, + ledger_index: "validated" + }) + results = JSON.stringify(offers, null, 2) + resultField.value += results ``` -Populate the fields for the standby and operational accounts. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - standbyAccountField.value = standby_wallet.address - standbyNameField.value = first_name - standbySeedField.value = first_seed - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - - operationalAccountField.value = operational_wallet.address - operationalNameField.value = second_name - operationalSeedField.value = second_seed - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) -``` - -Disconnect from the XRP Ledger. + } catch (err) { + console.error('Error getting offers:', err); + results = `\nError: ${err.message}\n` + resultField.value += results + throw err; // Re-throw the error to be handled by the caller + } + finally { + client.disconnect() + } -```javascript - client.disconnect() -} // End of getAccountsFromSeeds() ``` -### Send XRP - -```javascript -// ******************************************************* -// ******************** Send XRP ************************* -// ******************************************************* +### cancelOffer() -async function sendXRP() { -``` +You can cancel an offer before it is matched with another offer. -Connect to your selected ledger. +Connect to the XRP Ledger and get the account wallet. ```javascript - results = "Connecting to the selected ledger.\n" - standbyResultField.value = results +async function cancelOffer() { let net = getNet() - results = 'Connecting to ' + getNet() + '....' const client = new xrpl.Client(net) await client.connect() - - results += "\nConnected. Sending XRP.\n" - standbyResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const sendAmount = standbyAmountField.value - - results += "\nstandby_wallet.address: = " + standby_wallet.address - standbyResultField.value = results -``` - -Prepare the transaction. This is a Payment transaction from the standby address to the operational address. - -The _Payment_ transaction expects the XRP to be expressed in drops, or 1/millionth of an XRP. You can use the `xrpToDrops()` method to convert the send amount for you (which beats having to type an extra 6 zeroes to send 1 XRP). - -```javascript - const prepared = await client.autofill({ - "TransactionType": "Payment", - "Account": standby_wallet.address, - "Amount": xrpl.xrpToDrops(sendAmount), - "Destination": standbyDestinationField.value - }) + let results = `===Connected to ${net}, canceling offer.===\n` + resultField.value = results + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) ``` -Sign the prepared transaction. +Prepare the `OfferCancel` transaction, passing the account address of the account that created the offer and the `Sequence` of the offer. ```javascript -const signed = standby_wallet.sign(prepared) + try { + const prepared = await client.autofill({ + "TransactionType": "OfferCancel", + "Account": wallet.address, + "OfferSequence": parseInt(offerSequenceField.value) + }) ``` -Submit the transaction and wait for the results. +Sign and submit the transaction, then wait for the result. ```javascript -const tx = await client.submitAndWait(signed.tx_blob) + const signed = wallet.sign(prepared) + const tx = await client.submitAndWait(signed.tx_blob) ``` -Request the balance changes caused by the transaction and report the results. +Report the results. ```javascript - results += "\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - standbyResultField.value = results - - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - client.disconnect() -} // End of sendXRP() + results += "\nOffer canceled. Balance changes: \n" + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value = results ``` -### Reciprocal Transactions - -For each of the transactions, there is an accompanying reciprocal transaction, with the prefix _oP,_ for the operational account. See the corresponding function for the standby account for code commentary. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - -// ******************************************************* -// ********* Send XRP from Operational account *********** -// ******************************************************* - -async function oPsendXRP() { - - results = "Connecting to the selected ledger.\n" - operationalResultField.value = results - let net = getNet() - results = 'Connecting to ' + getNet() + '....' - const client = new xrpl.Client(net) - await client.connect() - - results += "\nConnected. Sending XRP.\n" - operationalResultField.value = results - - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const sendAmount = operationalAmountField.value - - results += "\noperational_wallet.address: = " + operational_wallet.address - operationalResultField.value = results - -// ---------------------------------------------------------- Prepare transaction - const prepared = await client.autofill({ - "TransactionType": "Payment", - "Account": operational_wallet.address, - "Amount": xrpl.xrpToDrops(sendAmount), - "Destination": operationalDestinationField.value - }) - -// ---------------------------------------------------- Sign prepared instructions - const signed = operational_wallet.sign(prepared) - -// ------------------------------------------------------------ Submit signed blob - const tx = await client.submitAndWait(signed.tx_blob) - - results += "\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - operationalResultField.value = results - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - - client.disconnect() - -} // End of oPsendXRP() + } + catch (err) { + console.error('Error canceling offer:', err); + results = `\nError: ${err.message}\n` + resultField.value += results + throw err; // Re-throw the error to be handled by the caller + } + finally { + client.disconnect() + } +}// End of cancelOffer() ``` -## 3a.CreateOffer.html - -This form includes the added account name fields, to allow you to swap in different accounts for a variety of use cases with a recognizable label for the seed and account values. +## create-offer.html ```html - - Token Test Harness + + Create Offers - - - - - + + + + + - - - - - -

Token Test Harness

+ + + + + + + +

Create Offers

- Choose your ledger instance: -    - - -    - - -

- -
- - - - - - - - - - - - - -
- - + + Choose your ledger instance: + +    + + +    + + +

+
+ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Account Name - - -
-
- Account - - -
-
- Seed - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination - - -
-
- - -
- Currency - - -
- Offer Sequence - - -
+
- - - - - -
- Taker Pays:
- Currency:
- Issuer:
- Value: -
- Taker Gets:
- Currency:
- Issuer:
- Value:
-
-

- -

+
-
- - - - -
- -
- -
- -
- -
- -

- -
- -
- +
+
-
- - - - -
- -
- -
- -
- -
- -

- -
- -
- +
+
-
- - - - + + - - - - - - + + + + + + + + + + + + + +
- Account Name +
+ + - -
+
+
- Account + + + + - -
+
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + - - + + - - + + - - + + - - + +
- Seed + + + - -
+ + +
- XRP Balance + + + - -
+ + +
- Amount + + + - -
+ +
- Destination + + + - -
+
+ + + + + + + - - + + + + + + - - + + + - -
+

Taker Pays

+
+

Taker Gets

+
- - - + + Currency Code + + +
+ + + +
- Currency + + Issuer + + +    + +    - +
- Offer Sequence + + Amount + - + + +
- - + + + + + + + + + - -
- Taker Pays:
- Currency:
- Issuer:
- Value: + +
+ + Offer Sequence + - Taker Gets:
- Currency:
- Issuer:
- Value:
+ +
+ +
+

+ +

+
+
+
-

- -

-
+ +
- + + ``` diff --git a/docs/tutorials/javascript/send-payments/create-time-based-escrows.md b/docs/tutorials/javascript/send-payments/create-time-based-escrows.md index ef7e7fb3720..1f0e9c132be 100644 --- a/docs/tutorials/javascript/send-payments/create-time-based-escrows.md +++ b/docs/tutorials/javascript/send-payments/create-time-based-escrows.md @@ -1,11 +1,8 @@ --- -html: create-time-based-escrows-using-javascript.html -parent: send-payments-using-javascript.html seo: description: Create, finish, or cancel time-based escrow transactions. labels: - Accounts - - Quickstart - Transaction Sending - XRP --- @@ -20,49 +17,48 @@ This example shows how to: 3. Cancel an escrow payment and return the XRP to the sending account. -[![Escrow Tester Form](/docs/img/quickstart-escrow1.png)](/docs/img/quickstart-escrow1.png) +[![Time-based Escrow Form](/docs/img/mt-time-escrow-1-empty-form.png)](/docs/img/mt-time-escrow-1-empty-form.png) ## Prerequisites -Download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/). +Download and expand the [Modular Tutorials](../../../../_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. ## Usage To get test accounts: -1. Open `8.escrow.html` in a browser -2. Choose **Testnet** or **Devnet**. -3. Get test accounts. - 1. If you have existing account seeds - 1. Paste account seeds in the **Seeds** field. - 2. Click **Get Accounts from Seeds**. - 2. If you do not have account seeds: - 1. Click **Get New Standby Account**. - 2. Click **Get New Operational Account**. +1. Open `create-time-based-escrows.html` in a browser +2. Get test accounts. + 1. If you copied the gathered information from another tutorial: + 1. Paste the gathered information to the **Result** field. + 2. Click **Distribute Account Info**. + 2. If you have an existing account seed: + 1. Paste the account seed to the **Account 1 Seed** or **Account 2 Seed** field. + 2. Click **Get Account 1 from Seed** or **Get Account 2 from Seed**. + 2. If you do not have existing accounts: + 1. Click **Get New Account 1**. + 2. Click **Get New Account 2**. -[![Escrow Tester with Account Information](/docs/img/quickstart-escrow2.png)](/docs/img/quickstart-escrow2.png) +[![Escrow Tester with Account Information](/docs/img/mt-time-escrow-2-form-with-accounts.png)](/docs/img/mt-time-escrow-2-form-with-accounts.png) ## Create Escrow -
- -
- You can create a time-based escrow with a minimum time to finish the escrow and a cancel time after which the funds in escrow are no longer available to the recipient. This is a test harness: while a practical scenario might express time in days or weeks, this form lets you set the finish and cancel times in seconds so that you can quickly run through a variety of scenarios. (There are 86,400 seconds in a day, if you want to play with longer term escrows.) To create a time-based escrow: -1. Enter an **Amount** to transfer. -2. Copy the **Operational Account** value. -3. Paste it in the **Destination Account** field. -4. Set the **Escrow Finish (seconds)** value. For example, enter _10_. -5. Set the **Escrow Cancel (seconds)** value. For example, enter _120_. -6. Click **Create Escrow**. +1. Enter an **Amount** to transfer. For example, _10_. +2. Enter the **Destination**. (For example, the Account 2 address.) +4. Set the **Escrow Finish Time** value, in seconds. For example, enter _10_. +5. Set the **Escrow Cancel Time** value, in seconds. For example, enter _120_. +6. Click **Create Time-based Escrow**. 7. Copy the _Sequence Number_ of the escrow called out in the **Standby Result** field. -The escrow is created on the XRP Ledger instance, reserving 100 XRP plus the transaction cost. When you create an escrow, capture and save the **Sequence Number** so that you can use it to finish the escrow transaction. +The escrow is created on the XRP Ledger instance, reserving 10 XRP plus the transaction cost. When you create an escrow, capture and save the **Sequence Number** so that you can use it to finish the escrow transaction. + +The escrow finish and cancel times are expressed in seconds here to let you experiment with scenarios where the escrows are outside the time constraints. In practice, escrow times might be expressed in days, weeks, months, or years. -[![Completed Escrow Transaction](/docs/img/quickstart-escrow3.png)](/docs/img/quickstart-escrow3.png) +[![Completed Escrow Transaction](/docs/img/mt-time-escrow-3-create-escrow.png)](/docs/img/mt-time-escrow-3-create-escrow.png) ## Finish Escrow @@ -71,11 +67,12 @@ The recipient of the XRP held in escrow can finish the transaction any time with To finish a time-based escrow: 1. Paste the sequence number in the Operational account **Escrow Sequence Number** field. -2. Click **Finish Escrow**. +2. Copy and paste the address that created the escrow in the **Escrow Owner** field. +2. Click **Finish Time-based Escrow**. The transaction completes and balances are updated for both the Standby and Operational accounts. -[![Completed Escrow Transaction](/docs/img/quickstart-escrow4.png)](/docs/img/quickstart-escrow4.png) +[![Completed Escrow Transaction](/docs/img/mt-time-escrow-4-fulfill-escrow.png)](/docs/img/mt-time-escrow-4-fulfill-escrow.png) ## Get Escrows @@ -83,9 +80,9 @@ Click **Get Escrows** for either the Standby account or the Operational account For the purposes of this tutorial, follow the steps in [Create Escrow](#create-escrow), above, to create a new escrow transaction, perhaps setting **Escrow Cancel (seconds)** field to _600_ seconds to give you extra time to explore. Remember to capture the _Sequence Number_ from the transaction results. -Click **Get Escrows** for both the Standby and the Operational account. The `account_info` request returns the same `account_object` for both accounts, demonstrating the link between the accounts created by the escrow transaction. +Click **Get Escrows**. -[![Get Escrows results](/docs/img/quickstart-escrow5.png)](/docs/img/quickstart-escrow5.png) +[![Get Escrows results](/docs/img/mt-time-escrow-5-get-escrows.png)](/docs/img/mt-time-escrow-5-get-escrows.png) ## Cancel Escrow @@ -96,30 +93,30 @@ You can wait the allotted time for the escrow you created in the previous step, To cancel an expired escrow: -1. Enter the sequence number in the Standby **Escrow Sequence Number** field. +1. Enter the sequence number in the **Escrow Sequence Number** field. +2. Enter the address of the account that created the escrow in the **Escrow Owner** field. 2. Click **Cancel Escrow**. -The funds are returned to the Standby account, less the initial transaction fee. +The funds are returned to the owner account, less the initial transaction fee. -[![Cancel Escrow results](/docs/img/quickstart-escrow6.png)](/docs/img/quickstart-escrow6.png) +[![Cancel Escrow results](/docs/img/mt-time-escrow-6-cancel-escrow.png)](/docs/img/mt-time-escrow-6-cancel-escrow.png) ## Oh No! I Forgot to Save the Sequence Number! If you forget to save the sequence number, you can find it in the escrow transaction record. -1. Create a new escrow as described in [Create Escrow](#create-escrow), above. +1. If needed, create a new escrow as described in [Create Escrow](#create-escrow), above. 2. Click **Get Escrows** to get the escrow information. 3. Copy the _PreviousTxnID_ value from the results. - ![Transaction ID in Get Escrows results](/docs/img/quickstart-escrow7.png) -4. Paste the _PreviousTxnID_ in the **Transaction to Look Up** field. - ![Transaction to Look Up field](/docs/img/quickstart-escrow8.png) + [![Previous Transaction ID in Get Escrows results](/docs/img/mt-conditional-escrow-6-get-escrows.png)](/docs/img/mt-conditional-escrow-6-get-escrows.png) +4. Paste the _PreviousTxnID_ in the **Transaction** field. 5. Click **Get Transaction**. -6. Locate the _Sequence_ value in the results. - ![Sequence number in results](/docs/img/quickstart-escrow9.png) +6. Locate the _ModifiedNode.PreviousFields.Sequence_ value in the results. + [![Sequence number in results](/docs/img/mt-conditional-escrow-7-sequence-value.png)](/docs/img/mt-conditional-escrow-7-sequence-value.png) # Code Walkthrough -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/)in the source repository for this website. +Download and expand the [Modular Tutorials](../../../../_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. ## ripple8-escrow.js @@ -162,7 +159,7 @@ Return the result. ### Create Time-based Escrow ```javascript -async function createTimeEscrow() { +async function createTimeBasedEscrow() { ``` Instantiate two new date objects, then set the dates to the current date plus the set number of seconds for the finish and cancel dates. @@ -170,200 +167,144 @@ Instantiate two new date objects, then set the dates to the current date plus th ```javascript let escrow_finish_date = new Date() let escrow_cancel_date = new Date() - escrow_finish_date = addSeconds(parseInt(standbyEscrowFinishDateField.value)) - escrow_cancel_date = addSeconds(parseInt(standbyEscrowCancelDateField.value)) + escrow_finish_date = addSeconds(parseInt(escrowFinishTimeField.value)) + escrow_cancel_date = addSeconds(parseInt(escrowCancelTimeField.value)) ``` -Connect to the ledger. +Connect to the ledger and get the account wallet. ```javascript - results = "Connecting to the selected ledger.\n" - standbyResultField.value = results let net = getNet() - results = "Connecting to " + net + "....\n" const client = new xrpl.Client(net) await client.connect() - results += "Connected. Creating time-based escrow.\n" - standbyResultField.value = results + let results = `===Connected to ${net}.===\n\n===Creating time-based escrow.===\n` + resultField.value = results ``` -Get the wallet information based on the account seed values. +Define the transaction object. ```javascript - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const sendAmount = standbyAmountField.value - results += "\nstandby_wallet.address: = " + standby_wallet.address - standbyResultField.value = results -``` - -Define the `EscrowCreate` transaction, automatically filling values in common fields. + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const sendAmount = amountField.value + const escrowTx = await client.autofill({ + "TransactionType": "EscrowCreate", + "Account": wallet.address, + "Amount": xrpl.xrpToDrops(sendAmount), + "Destination": destinationField.value, + "FinishAfter": escrow_finish_date, + "CancelAfter": escrow_cancel_date + }) -```javascript - const escrowTx = await client.autofill({ - "TransactionType": "EscrowCreate", - "Account": standby_wallet.address, - "Amount": xrpl.xrpToDrops(sendAmount), - "Destination": standbyDestinationField.value, - "FinishAfter": escrow_finish_date, - "CancelAfter": escrow_cancel_date - }) -``` + ``` -Sign the escrow transaction definition. + Sign the prepared transaction object. ```javascript - const signed = standby_wallet.sign(escrowTx) + const signed = wallet.sign(escrowTx) + } ``` -Submit the transaction. +Submit the signed transaction object and wait for the results. ```javascript - const tx = await client.submitAndWait(signed.tx_blob) + const tx = await client.submitAndWait(signed.tx_blob) ``` Report the results. ```javascript - results += "\nSequence Number (Save!): " + JSON.stringify(tx.result.Sequence) - results += "\n\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - standbyResultField.value = results + results += "\n===Success! === *** Save this sequence number: " + tx.result.tx_json.Sequence + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + resultField.value = results + } ``` -Disconnect from the XRP Ledger. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - client.disconnect() -} // End of createTimeEscrow() + catch (error) { + results += "\n===Error: " + error.message + resultField.value = results + } + finally { + client.disconnect() + } ``` + ### Finish Time-based Escrow ```javascript async function finishEscrow() { ``` -Connect to the XRP Ledger and get the account wallets. +Connect to the XRP Ledger. ```javascript - results = "Connecting to the selected ledger.\n" - operationalResultField.value = results let net = getNet() - results = 'Connecting to ' + getNet() + '....' const client = new xrpl.Client(net) await client.connect() - - results += "\nConnected. Finishing escrow.\n" - operationalResultField.value = results - - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const sendAmount = operationalAmountField.value - - results += "\noperational_wallet.address: = " + operational_wallet.address - operationalResultField.value = results + let results = `===Connected to ${net}. Finishing escrow.===\n` + resultField.value = results ``` Define the transaction. The _Owner_ is the account that created the escrow. The _OfferSequence_ is the sequence number of the escrow transaction. Automatically fill in the common fields for the transaction. ```javascript + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) const prepared = await client.autofill({ "TransactionType": "EscrowFinish", - "Account": operationalAccountField.value, - "Owner": standbyAccountField.value, - "OfferSequence": parseInt(operationalEscrowSequenceField.value) + "Account": accountAddressField.value, + "Owner": escrowOwnerField.value, + "OfferSequence": parseInt(escrowSequenceNumberField.value) }) ``` Sign the transaction definition. ```javascript - const signed = operational_wallet.sign(prepared) + const signed = wallet.sign(prepared) ``` Submit the signed transaction to the XRP ledger. ```javascript - const tx = await client.submitAndWait(signed.tx_blob) ``` Report the results. ```javascript - results += "\nBalance changes: " + + results += "\n===Balance changes===" + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - operationalResultField.value = results - - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) -``` - -Disconnect from the XRP Ledger. - -```javascript - client.disconnect() -} // End of finishEscrow() -``` - -### Get Standby Escrows - -Get the escrows associated with the Standby account. - -```javascript -async function getStandbyEscrows() { -``` - -Connect to the network. The information you are looking for is public information, so there is no need to instantiate your wallet. - -```javascript - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results - - await client.connect() - results += '\nConnected.' - standbyResultField.value = results - - results= "\nGetting standby account escrows...\n" -``` - -Create the `account_objects` request. Specify that you want objects of the type _escrow_. - -```javascript - const escrow_objects = await client.request({ - "id": 5, - "command": "account_objects", - "account": standbyAccountField.value, - "ledger_index": "validated", - "type": "escrow" - }) + resultField.value = results ``` -Report the results. +Update the **XRP Balance** field. ```javascript - results += JSON.stringify(escrow_objects.result, null, 2) - standbyResultField.value = results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) ``` -Disconnect from the XRP Ledger +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - client.disconnect() -} // End of getStandbyEscrows() + catch (error) { + results += "\n===Error: " + error.message + "===" + resultField.value = results + } + finally { + client.disconnect() + } ``` -### Get Operational Escrows +### Get Escrows -This function is the same as `getStandbyEscrows()`, but for the Operational account. +Get the escrows created by or destined to the current account. ```javascript -async function getOperationalEscrows() { +async function getEscrows() { ``` Connect to the network. The information you are looking for is public information, so there is no need to instantiate your wallet. @@ -371,40 +312,43 @@ Connect to the network. The information you are looking for is public informatio ```javascript let net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - operationalResultField.value = results - - await client.connect() - results += '\nConnected.' - operationalResultField.value = results - - results= "\nGetting operational account escrows...\n" + await client.connect() + let results = `\n===Connected to ${net}.\nGetting account escrows.===\n` + resultField.value = results ``` Create the `account_objects` request. Specify that you want objects of the type _escrow_. ```javascript - const escrow_objects = await client.request({ - "id": 5, - "command": "account_objects", - "account": operationalAccountField.value, - "ledger_index": "validated", - "type": "escrow" - }) + try { + const escrow_objects = await client.request({ + "id": 5, + "command": "account_objects", + "account": accountAddressField.value, + "ledger_index": "validated", + "type": "escrow" + }) ``` Report the results. ```javascript - results += JSON.stringify(escrow_objects.result, null, 2) - operationalResultField.value = results + results += JSON.stringify(escrow_objects.result, null, 2) + resultField.value = results + } ``` +Catch and report any errors, then disconnect from the XRP Ledger. -Disconnect from the XRP Ledger instance. ```javascript - client.disconnect() -} // End of getOperationalEscrows() + catch (error) { + results += "\nError: " + error.message + resultField.value = results + } + finally { + client.disconnect() + } +} ``` ### Get Transaction Info @@ -418,412 +362,378 @@ Connect to the XRP Ledger. ```javascript let net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - operationalResultField.value = results - - await client.connect() - results += '\nConnected.' - operationalResultField.value = results - - results= "\nGetting transaction information...\n" + await client.connect() + let results = `\n===Connected to ${net}.===\n===Getting transaction information.===\n` + resultField.value = results ``` Prepare and send the transaction information request. The only required parameter is the transaction ID. ```javascript - const tx_info = await client.request({ - "id": 1, - "command": "tx", - "transaction": operationalTransactionField.value, - }) + try { + const tx_info = await client.request({ + "id": 1, + "command": "tx", + "transaction": transactionField.value, + }) ``` Report the results. ```javascript - results += JSON.stringify(tx_info.result, null, 2) - operationalResultField.value = results + results += JSON.stringify(tx_info.result, null, 2) + resultField.value = results + } ``` -Disconnect from the XRP Ledger instance. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - client.disconnect() + catch (error) { + results += "\nError: " + error.message + resultField.value = results + } + finally { + client.disconnect() + } } // End of getTransaction() ``` ### Cancel Escrow -Cancel an escrow after it passes the expiration date. +Cancel an escrow after it passes the expiration date and time. ```javascript async function cancelEscrow() { ``` -Connect to the XRP Ledger instance. +Connect to the XRP Ledger instance and get the account wallet. ```javascript let net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results - - await client.connect() - results += '\nConnected.' - standbyResultField.value = results -``` - -Get the account wallets. - -```javascript - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) + await client.connect() + let results = `\n===Connected to ${net}. Cancelling escrow.===` + resultField.value = results ``` -Prepare the EscrowCancel transaction. +Prepare the EscrowCancel transaction, passing the escrow owner and offer sequence values. ```javascript - const prepared = await client.autofill({ - "TransactionType": "EscrowCancel", - "Account": standby_wallet.address, - "Owner": standbyAccountField.value, - "OfferSequence": parseInt(standbyEscrowSequenceNumberField.value) - }) + try { + const prepared = await client.autofill({ + "TransactionType": "EscrowCancel", + "Account": accountAddressField.value, + "Owner": escrowOwnerField.value, + "OfferSequence": parseInt(escrowSequenceNumberField.value) + }) ``` Sign the transaction. + ```javascript - const signed = standby_wallet.sign(prepared) + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const signed = wallet.sign(prepared) ``` Submit the transaction and wait for the response. ``` javascript - const tx = await client.submitAndWait(signed.tx_blob) + const tx = await client.submitAndWait(signed.tx_blob) ``` Report the results. ```javascript - results += "\nBalance changes: " + - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) - standbyResultField.value = results - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) + results += "\n===Balance changes: " + + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) + resultField.value = results +) ``` -Disconnect from the XRP Ledger instance. +Catch and report any errors, then disconnect from the XRP Ledger instance. ```javascript - client.disconnect() + } + catch (error) { + results += "\n===Error: " + error.message + resultField.value = results + } + finally { + client.disconnect() + } } ``` -## 8.escrow.html +## create-time-escrow.html ```html - - Time-based Escrow Test Harness + + Create a Time-based Escrow - - - - - - - + + + + + + + - -

Time-based Escrow Test Harness

+ +

Create a Time-based Escrow

- Choose your ledger instance: -    - - -    - - -

- -
- -

- - - - - -
- - + + Choose your ledger instance: + +    + + +    + + +

+
+ + + + + + + + + + + + + + - + + + + + + + + +
+ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Standby Account - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination Account - - -
-
- Escrow Finish (seconds) - - -
-
- Escrow Cancel (seconds) - - -
-
- Escrow Sequence Number - - -
-
- - -
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
-

- -

+
+ + + +
+ + + + + + + + + + +
+ + + + + + + + + - - - - - - - -
- -

- -
- -
- -
- -
-
+ + + + + + + + + + + +
-
+
- + + + + + + + + + - -
+ + + + + + + +
+ + + + + + + +
+ + + + - - - - - - - - -
- -

- -
- -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Operational Account - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination - - -
-
- Escrow Sequence Number - - -
-
- Transaction to Look Up - - -
-
- - - - -
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
-

- -

-
-
-
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + Destination + + + + +
+ + + + + + + + + Escrow Finish Time + + + + +
+ + + + + + + + + Escrow Cancel Time + + + + +
+ + + + + + + + + + Escrow Sequence Number + + + + +
+ + + + + + + + + Escrow Owner + + + + +
+ + + + + + + + + Transaction + + + + +
+ + + + + + +

+ +

+ + +
+ + + +
- + + ``` diff --git a/docs/tutorials/javascript/send-payments/create-trust-line-send-currency.md b/docs/tutorials/javascript/send-payments/create-trust-line-send-currency.md index adae0c244cb..9ebaa3f4746 100644 --- a/docs/tutorials/javascript/send-payments/create-trust-line-send-currency.md +++ b/docs/tutorials/javascript/send-payments/create-trust-line-send-currency.md @@ -1,12 +1,9 @@ --- -html: create-trustline-send-currency-using-javascript.html -parent: send-payments-using-javascript.html seo: description: Create Trust Lines and send currency. labels: - Cross-Currency - Payments - - Quickstart - Tokens --- @@ -14,797 +11,470 @@ labels: This example shows how to: -1. Configure accounts to allow transfer of funds to third party accounts. -2. Set a currency type for transactions. -3. Create a trust line between the standby account and the operational account. -4. Send issued currency between accounts. -5. Display account balances for all currencies. +1. Create a trust line between two accounts. +2. Send issued currency between accounts. +3. Display account balances for all currencies. -[![Test harness with currency transfer](/docs/img/quickstart5.png)](/docs/img/quickstart5.png) +[![Send Currency test harness](/docs/img/mt-send-currency-1-empty-form-info.png )](/docs/img/mt-send-currency-1-empty-form-info.png) -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/) archive to try each of the samples in your own browser. +You can download the [Payment Modular Tutorials](/_code-samples/modular-tutorials/payment-modular-tutorials.zip) from the source repository for this website. -{% admonition type="info" name="Note" %}Without the Quickstart Samples, you will not be able to try the examples that follow. {% /admonition %} +{% admonition type="info" name="Note" %}Without the Payment modular tutorials, you will not be able to try the examples that follow. {% /admonition %} ## Usage -Open the Token Test Harness and get accounts: +Open the Send Currency test harness and get accounts: -1. Open `2.create-trustline-send-currency.html` in a browser. +1. Open `send-currency.html` in a browser. 2. Get test accounts. - 1. If you have existing account seeds - 1. Paste account seeds in the **Seeds** field. - 2. Click **Get Accounts from Seeds**. - 2. If you do not have account seeds: - 1. Click **Get New Standby Account**. - 2. Click **Get New Operational Account**. + 1. If you copied the gathered information from another tutorial: + 1. Paste the gathered information to the **Result** field. + 2. Click **Distribute Account Info**. + 2. If you have an existing account seed: + 1. Paste the account seed to the **Account 1 Seed** or **Account 2 Seed** field. + 2. Click **Get Account 1 from Seed** or **Get Account 2 from Seed**. + 2. If you do not have existing accounts: + 1. Click **Get New Account 1**. + 2. Click **Get New Account 2**. + +[![Distribute Account Information](/docs/img/mt-send-currency-2-distribute-accounts.png)](/docs/img/mt-send-currency-2-distribute-accounts.png) + +If you want an account to be able to transfer issued currency to accounts other than the issuer, the issuer account must be configured to allow rippling. See _Issuer_ in the [Configuring Accounts](../../../concepts/accounts/configuring-accounts.md#issuer) topic. + +Accounts can always transfer currency tokens back to the original issuer. ## Create Trust Line -
- -
+In order to trade standard tokens, you must first establish a trust line from the receiving account to the issuing account. To create a trust line between accounts: -1. Enter a [currency code](https://www.iban.com/currency-codes) in the **Currency** field. -2. Enter the maximum transfer limit in the **Amount** field. -3. Enter the destination account value in the **Destination** field. -4. Click **Create Trustline**. +1. Click **Account 2** to populate the uneditable fields in the form. +2. Enter a [currency code](https://www.iban.com/currency-codes) in the **Currency Code** field. +3. Enter the maximum transfer limit in the **Amount** field. +4. Copy and paste the **Account 1 Address** value to the **Issuer** field. +5. Click **Create Trust Line**. -[![Trust line results](/docs/img/quickstart6.png)](/docs/img/quickstart6.png) +[![Trust line results](/docs/img/mt-send-currency-3-create-trustline.png)](/docs/img/mt-send-currency-3-create-trustline.png) ## Send an Issued Currency Token To transfer an issued currency token, once you have created a trust line: -1. Enter the **Amount**. -2. Enter the **Destination**. -3. Enter the **Currency** type. +1. Click **Account 1**. +3. Enter the **Currency Code**. +4. Copy and paste the **Account 1 Address** to the **Issuer** field. +4. Enter the **Amount** of issued currency to send. +2. Copy and paste the **Account 2 Address** to the **Destination** field. 4. Click **Send Currency**. -[![Currency transfer](/docs/img/quickstart7.png)](/docs/img/quickstart7.png) - -# Code Walkthrough - -You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/js/) archive to try each of the samples in your own browser. - -## ripplex2-send-currency.js - +[![Currency transfer](/docs/img/mt-send-currency-4-send-currency.png)](/docs/img/mt-send-currency-4-send-currency.png) -### Configure Account +## Get the Current Token Balance -When transferring fiat currency, the actual transfer of funds is not simultaneous, as it is with XRP. If currency is transferred to a third party for a different currency, there can be a devaluation of the currency that impacts the originating account. To avoid this situation, this up and down valuation of currency, known as _rippling_, is not allowed by default. Currency transferred from one account can only be transferred back to the same account. To enable currency transfer to third parties, you need to set the `rippleDefault` value to true. The Token Test Harness provides a checkbox to enable or disable rippling. - -```javascript -// ******************************************************* -// **************** Configure Account ******************** -// ******************************************************* - -async function configureAccount(type, defaultRippleSetting) { -``` - -Connect to the ledger - -```javascript - let net = getNet() - let resultField = 'standbyResultField' - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - await client.connect() - results += '\nConnected, finding wallet.' -``` +To see the balances for all issued tokens for an account. -Get the account wallets. +1. Click **Account 1** or **Account 2**. +2. Click **Get Token Balance**. -``` -if (type=='standby') { - my_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) -} else { - my_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - resultField = 'operationalResultField' -} -results += '\nRipple Default Setting: ' + defaultRippleSetting -resultField.value = results -``` +The balance for an issuing account is shown as an obligation. -Prepare the transaction. If the `rippleDefault` argument is true, set the `asfDefaultRipple` flag. If it is false, clear the `asfDefaultRipple` flag. +[![Currency transfer](/docs/img/mt-send-currency-5-issuer-token-balance.png)](/docs/img/mt-send-currency-5-issuer-token-balance.png) -```javascript - let settings_tx = {} - if (defaultRippleSetting) { - settings_tx = { - "TransactionType": "AccountSet", - "Account": my_wallet.address, - "SetFlag": xrpl.AccountSetAsfFlags.asfDefaultRipple - } - results += '\n Set Default Ripple flag.' - } else { - settings_tx = { - "TransactionType": "AccountSet", - "Account": my_wallet.address, - "ClearFlag": xrpl.AccountSetAsfFlags.asfDefaultRipple - } - results += '\n Clear Default Ripple flag.' - } - results += '\nSending account setting.' - resultField.value = results -``` +The balance for a holder account is shown as an asset. -Auto-fill the default values for the transaction. +[![Currency transfer](/docs/img/mt-send-currency-6-holder-token-balance.png)](/docs/img/mt-send-currency-6-holder-token-balance.png) -```javascript - const prepared = await client.autofill(settings_tx) -``` - -Sign the transaction. - -```javascript - const signed = my_wallet.sign(prepared) -``` - -Submit the transaction and wait for the result. +# Code Walkthrough -```javascript - const result = await client.submitAndWait(signed.tx_blob) -``` +You can download the [Payment Modular Tutorials](/_code-samples/modular-tutorials/payment-modular-tutorials.zip) from the source repository for this website. -Report the result. +## send-currency.js -```javascript - if (result.result.meta.TransactionResult == "tesSUCCESS") { - results += '\nAccount setting succeeded.' - document.getElementById(resultField).value = results - } else { - throw 'Error sending transaction: ${result}' - results += '\nAccount setting failed.' - resultField.value = results - } - client.disconnect() -} // End of configureAccount() -``` +There are two asynchronous functions in the send-currency.js file that build on the base module to add new behavior for sending issued currency between accounts. ### Create Trust Line A trust line enables two accounts to trade a defined currency up to a set limit. This gives the participants assurance that any exchanges are between known entities at agreed upon maximum amounts. +Connect to the XRPL server. + ```javascript -// ******************************************************* -// ***************** Create TrustLine ******************** -// ******************************************************* - -async function createTrustline() { - let net = getNet() +async function createTrustLine() { + const net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results - await client.connect() - results += '\nConnected.' - standbyResultField.value = results -``` - -Get the standby and operational wallets. - -```javascript - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) -``` - -Capture the currency code from the standby currency field. - -```javascript - const currency_code = standbyCurrencyField.value + let results = "\nConnected. Creating trust line.\n" + resultField.value = results ``` -Define the transaction, capturing the currency code and (limit) amount from the form fields. +Create a `TrustSet` transaction, passing the currency code, issuer account, and the total value the holder is willing to accept. ```javascript - const trustSet_tx = { - "TransactionType": "TrustSet", - "Account": standbyDestinationField.value, - "LimitAmount": { - "currency": standbyCurrencyField.value, - "issuer": standby_wallet.address, - "value": standbyAmountField.value + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const trustSet_tx = { + "TransactionType": "TrustSet", + "Account": accountAddressField.value, + "LimitAmount": { + "currency": currencyField.value, + "issuer": issuerField.value, + "value": amountField.value + } } - } ``` -Prepare the transaction by automatically filling the default parameters. - -```javascript - const ts_prepared = await client.autofill(trustSet_tx) -``` - - -Sign the transaction. - +Autofill the remaining default transaction parameters. ```javascript - const ts_signed = operational_wallet.sign(ts_prepared) - results += '\nCreating trust line from operational account to standby account...' - standbyResultField.value = results + const ts_prepared = await client.autofill(trustSet_tx) ``` - -Submit the transaction and wait for the results. - +Sign and send the transaction to the XRPL server, then wait for the results. ```javascript + const ts_signed = wallet.sign(ts_prepared) + resultField.value = results const ts_result = await client.submitAndWait(ts_signed.tx_blob) ``` - -Report the results. - +Report the results of the transaction. ```javascript - if (ts_result.result.meta.TransactionResult == "tesSUCCESS") { - results += '\nTrustline established between account \n' + - standbyDestinationField.value + ' \n and account\n' + standby_wallet.address + '.' - standbyResultField.value = results - } else { - results += '\nTrustLine failed. See JavaScript console for details.' - document.getElementById('standbyResultField').value = results - throw 'Error sending transaction: ${ts_result.result.meta.TransactionResult}' + if (ts_result.result.meta.TransactionResult == "tesSUCCESS") { + results += '\n===Trust line established between account \n' + + accountAddressField.value + ' \n and account\n' + issuerField.value + '.' + resultField.value = results + } else { + results += `\n===Transaction failed: ${ts_result.result.meta.TransactionResult}` + resultField.value = results + } } -} //End of createTrustline() - -``` - -### Send Issued Currency - -Once you have created a trust line from an account to your own, you can send issued currency tokens to that account, up to the established limit. - -```javascript -// ******************************************************* -// *************** Send Issued Currency ****************** -// ******************************************************* - -async function sendCurrency() { ``` -Connect to the ledger. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - document.getElementById('standbyResultField').value = results - - await client.connect() - - results += '\nConnected.' - standbyResultField.value = results -``` - -Get the account wallets. - -```javascript - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const currency_code = standbyCurrencyField.value - const issue_quantity = standbyAmountField.value - - const send_token_tx = { - "TransactionType": "Payment", - "Account": standby_wallet.address, - "Amount": { - "currency": standbyCurrencyField.value, - "value": standbyAmountField.value, - "issuer": standby_wallet.address - }, - "Destination": standbyDestinationField.value + catch (error) { + console.error('===Error creating trust line:', error); + results += `\n===Error: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller } -``` - - -Prepare the transaction by automatically filling default values. - - -```javascript - const pay_prepared = await client.autofill(send_token_tx) -``` - - -Sign the transaction. - - -```javascript - const pay_signed = standby_wallet.sign(pay_prepared) - results += 'Sending ${issue_quantity} ${currency_code} to ' + - standbyDestinationField.value + '...' - standbyResultField.value = results -``` - - -Submit the transaction and wait for the results. - - -```javascript - const pay_result = await client.submitAndWait(pay_signed.tx_blob) -``` - - -Report the results. - - -```javascript - if (pay_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded: https://testnet.xrpl.org/transactions/${pay_signed.hash}' - standbyResultField.value = results - } else { - results += 'Transaction failed: See JavaScript console for details.' - standbyResultField.value = results - throw 'Error sending transaction: ${pay_result.result.meta.TransactionResult}' + finally { + // Disconnect from the client + await client.disconnect(); } - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - getBalances() - client.disconnect() -} // end of sendCurrency() +} +//End of createTrustline() ``` +### sendCurrency() +This transaction actually sends a transaction that changes balances on both sides of the trust line. - -### Get Balances - - -```javascript -// ******************************************************* -// ****************** Get Balances *********************** -// ******************************************************* - -async function getBalances() { -``` - -Connect to the ledger. +Connect to the XRP Ledger and get the account wallet. ```javascript +async function sendCurrency() { let net = getNet() const client = new xrpl.Client(net) results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results - await client.connect() + resultField.value = results + await client.connect() results += '\nConnected.' - standbyResultField.value = results -``` - -Get the account wallets. - -```javascript - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - results = "\nGetting standby account balances...\n" -``` - -Define and send the request for the standby account, then wait for the results. - -```javascript - const standby_balances = await client.request({ - command: "gateway_balances", - account: standby_wallet.address, - ledger_index: "validated", - hotwallet: [operational_wallet.address] - }) -``` - -Report the results. - -```javascript - results += JSON.stringify(standby_balances.result, null, 2) - standbyResultField.value = results -``` - -Define and send the request for the operational account, then wait for the results. - -```javascript - results += "\nGetting operational account balances...\n" - const operational_balances = await client.request({ - command: "gateway_balances", - account: operational_wallet.address, - ledger_index: "validated" - }) + resultField.value = results ``` -Report the results. +Create a payment transaction to the destination account, specifying the amount using the currency, value, and issuer. ```javascript - results += JSON.stringify(operational_balances.result, null, 2) - operationalResultField.value = results -``` + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const send_currency_tx = { + "TransactionType": "Payment", + "Account": wallet.address, + "Amount": { + "currency": currencyField.value, + "value": amountField.value, + "issuer": issuerField.value + }, + "Destination": destinationField.value + } + ``` -Update the form with current XRP balances. +Autofill the remaining default transaction parameters. ```javascript - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - standbyResultField.value = results - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) + const pay_prepared = await client.autofill(send_currency_tx) ``` -Disconnect from the ledger. +Sign and send the prepared payment transaction to the XRP Ledger, then await and report the results. ```javascript - client.disconnect() -} // End of getBalances() + const pay_signed = wallet.sign(pay_prepared) + results += `\n\n===Sending ${amountField.value} ${currencyField.value} to ${destinationField.value} ...` + resultField.value = results + const pay_result = await client.submitAndWait(pay_signed.tx_blob) + if (pay_result.result.meta.TransactionResult == "tesSUCCESS") { + results += '\n===Transaction succeeded.' + resultField.value = results + } else { + results += `\n===Transaction failed: ${pay_result.result.meta.TransactionResult}` + resultField.value = results + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) + } + } ``` -### Reciprocal Transactions - -For each of the transactions, there is an accompanying reciprocal transaction, with the prefix _oP,_ for the operational account. See the corresponding function for the standby account for code commentary. The `getBalances()` request does not have a reciprocal transaction, because it reports balances for both accounts. +Update the XRP value field to reflect the transaction fee. ```javascript -// ******************************************************* -// ************ Create Operational TrustLine ************* -// ******************************************************* - -async function oPcreateTrustline() { - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - operationalResultField.value = results - - await client.connect() - results += '\nConnected.' - operationalResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const trustSet_tx = { - "TransactionType": "TrustSet", - "Account": operationalDestinationField.value, - "LimitAmount": { - "currency": operationalCurrencyField.value, - "issuer": operational_wallet.address, - "value": operationalAmountField.value - } - } - const ts_prepared = await client.autofill(trustSet_tx) - const ts_signed = standby_wallet.sign(ts_prepared) - results += '\nCreating trust line from operational account to ' + - operationalDestinationField.value + ' account...' - operationalResultField.value = results - const ts_result = await client.submitAndWait(ts_signed.tx_blob) - if (ts_result.result.meta.TransactionResult == "tesSUCCESS") { - results += '\nTrustline established between account \n' + operational_wallet.address + - ' \n and account\n' + operationalDestinationField.value + '.' - operationalResultField.value = results - } else { - results += '\nTrustLine failed. See JavaScript console for details.' - operationalResultField.value = results - throw 'Error sending transaction: ${ts_result.result.meta.TransactionResult}' - } -} //End of oPcreateTrustline - -// ******************************************************* -// ************* Operational Send Issued Currency ******** -// ******************************************************* - -async function oPsendCurrency() { - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - operationalResultField.value = results - - await client.connect() - results += '\nConnected.' - operationalResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const currency_code = operationalCurrencyField.value - const issue_quantity = operationalAmountField.value - - const send_token_tx = { - "TransactionType": "Payment", - "Account": operational_wallet.address, - "Amount": { - "currency": currency_code, - "value": issue_quantity, - "issuer": operational_wallet.address - }, - "Destination": operationalDestinationField.value + catch (error) { + console.error('Error sending transaction:', error); + results += `\nError: ${error.message}\n` + resultField.value = results + throw error; // Re-throw the error to be handled by the caller } - - 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 + '...' - operationalResultField.value = results - const pay_result = await client.submitAndWait(pay_signed.tx_blob) - if (pay_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded: https://testnet.xrpl.org/transactions/${pay_signed.hash}' - operationalResultField.value = results - } else { - results += 'Transaction failed: See JavaScript console for details.' - operationalResultField.value = results - throw 'Error sending transaction: ${pay_result.result.meta.TransactionResult}' + finally { + // Disconnect from the client + await client.disconnect(); } - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - getBalances() - client.disconnect() -} // end of oPsendCurrency() +} // end of sendCurrency() + ``` -## 2.create-trustline-send-currency.html +## send-currency.html Update the form to support the new functions. ```html - - Token Test Harness + + Send Currency - - - - + + + + + - - + + - -

Token Test Harness

+ +

Send Currency

- Choose your ledger instance: -    - - -    - - -

- -
- -

- - - - - -
- - + + Choose your ledger instance: + +    + + +    + + +

+
+ + + + + + + + + + + + + + + + + + + + - + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Standby Account - - -
-
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination - - -
-
- - -
- Currency - - -
-

- -

+ + +
+ + + + + - - - - - - -
- -

- -
- -
- -
-
-
+
- + + + + + - -
+ + + + + + + +
+ + + + - - - - - - - - -
- -

- -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Operational Account - - -
-
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination - - -
-
- - - - -
- Currency - - -
-

- -

-
-
-
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + Currency Code + + + + +
+ + + + + + + + + Issuer + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + Destination + + + + +
+ + + + +

+ +

+ + +
+ + + +
- + + ``` diff --git a/docs/tutorials/javascript/send-payments/index.md b/docs/tutorials/javascript/send-payments/index.md index 417d57b7408..9d8a791ba7c 100644 --- a/docs/tutorials/javascript/send-payments/index.md +++ b/docs/tutorials/javascript/send-payments/index.md @@ -1,7 +1,12 @@ --- -html: send-payments-using-javascript.html -parent: javascript.html top_nav_grouping: Article Types +seo: + description: Send XRP and Issued Currencies on the XRPL. +labels: + - Accounts + - Transactions + - XRP + - Issued Currencies metadata: indexPage: true --- @@ -9,5 +14,7 @@ metadata: Send XRP and issued currency on the XRP Ledger using JavaScript. +Download and expand the [Payment Modular Tutorial Samples](/_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. + {% child-pages /%} diff --git a/docs/tutorials/javascript/send-payments/send-and-cash-checks.md b/docs/tutorials/javascript/send-payments/send-and-cash-checks.md index 245527b3545..803b66f0e5e 100644 --- a/docs/tutorials/javascript/send-payments/send-and-cash-checks.md +++ b/docs/tutorials/javascript/send-payments/send-and-cash-checks.md @@ -1,9 +1,7 @@ --- -html: send-and-cash-checks.html -parent: send-payments-using-javascript.html labels: - Accounts - - Quickstart + - Modular Tutorials - Transaction Sending - Checks - XRP @@ -23,11 +21,11 @@ Checks offer another option for transferring funds between accounts. Checks have 2. The receiver can choose to accept less than the full amount of the check. This allows you to authorize a maximum amount when the actual cost is not finalized. -[![Empty Check Form](/docs/img/quickstart-checks1.png)](/docs/img/quickstart-checks1.png) +[![Empty Check Form](/docs/img/mt-send-checks-1-empty-form.png)](/docs/img/mt-send-checks-1-empty-form.png) ## Prerequisites -Clone or download the {% repo-link path="_code-samples/quickstart/js/" %}Modular Tutorial Samples{% /repo-link %}. +Download and expand the [Modular Tutorials](../../../../_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. {% admonition type="info" name="Note" %} Without the Modular Tutorial Samples, you will not be able to try the examples that follow. @@ -37,47 +35,51 @@ Without the Modular Tutorial Samples, you will not be able to try the examples t To get test accounts: -1. Open and launch `10check.html`. -2. Click **Get Standby Account**. -3. Click **Get Operational Account**. +1. Open `send-checks.html` in a browser. +2. Get test accounts. + 1. If you copied the gathered information from another tutorial: + 1. Paste the gathered information to the **Result** field. + 2. Click **Distribute Account Info**. + 2. If you have an existing account seed: + 1. Paste the account seed to the **Account 1 Seed** or **Account 2 Seed** field. + 2. Click **Get Account 1 from Seed** or **Get Account 2 from Seed**. + 2. If you do not have existing accounts: + 1. Click **Get New Account 1**. + 2. Click **Get New Account 2**. -[![Form with New Accounts](/docs/img/quickstart-checks2.png)](/docs/img/quickstart-checks2.png) - -You can transfer XRP between your new accounts. Each account has its own fields and buttons. - -
- -
+[![Form with Accounts](/docs/img/mt-send-checks-2-form-with-accounts.png)](/docs/img/mt-send-checks-2-form-with-accounts.png) ### Send a Check for XRP -To send a check for XRP from the Standby account to the Operational account: +To send a check for XRP: -1. On the Standby (left) side of the form, enter the **Amount** of XRP to send, in drops. -2. Copy and paste the **Operational Account** field to the Standby **Destination** field. -3. Set the **Currency** to _XRP_. +1. Select **Account 1** or **Account 2**. +2. Enter the **Amount** of XRP to send, in drops. +2. Enter the receiving account address in the **Destination** field. +3. Set the **Currency Code** to _XRP_. 4. Click **Send Check**. -[![Send Check Settings](/docs/img/quickstart-checks3.png)](/docs/img/quickstart-checks3.png) +[![Send Check Settings](/docs/img/mt-send-checks-3-send-xrp.png)](/docs/img/mt-send-checks-3-send-xrp.png) ### Send a Check for an Issued Currency -To send a check for an issued currency token from the Standby account to the Operational account: +To send a check for an issued currency token: -1. On the Standby side of the form, enter the **Amount** of currency to send. -2. Copy and paste the **Operational Account** field to the Standby **Destination** field. -3. Copy the **Standby Account** field and paste the value in the **Issuer** field. -4. Enter the **Currency** code for your token. -5. Click **Send Check**. +1. Choose **Account 1** or **Account 2**. +2. Enter the **Amount** of currency to send. +3. Enter the receiving account address in the **Destination** field. +4. Enter the issuing account in the **Issuer** field (for example, the account sending the check). +5. Enter the **Currency** code for your issued currency token. +6. Click **Send Check**. -[![Send Token Check Settings](/docs/img/quickstart-checks4.png)](/docs/img/quickstart-checks4.png) +[![Send Token Check Settings](/docs/img/mt-send-checks-4-send-currency.png)](/docs/img/mt-send-checks-4-send-currency.png) ### Get Checks Click **Get Checks** to get a list of the current checks you have sent or received. To uniquely identify a check (for example, when cashing a check), use the check's ledger entry ID, in the `index` field. -[![Get Checks with index highlighted](/docs/img/quickstart-checks5.png)](/docs/img/quickstart-checks5.png) +[![Get Checks with index highlighted](/docs/img/mt-send-checks-5-get-checks.png)](/docs/img/mt-send-checks-5-get-checks.png) ### Cash Check @@ -86,20 +88,19 @@ To cash a check you have received: 1. Enter the **Check ID** (**index** value). 2. Enter the **Amount** you want to collect, up to the full amount of the check. 3. Enter the currency code. - a. If you cashing a check for XRP, enter _XRP_ in the **Currency** field. - b. If you are cashing a check for an issued currency token: + a. If you are cashing a check for XRP, enter _XRP_ in the **Currency Code** field. + b. If you are cashing a check for an issued currency token: 1. Enter the **Issuer** of the token. - 2. Enter the **Currency** code for the token. + 2. Enter the **Currency Code** code for the token. 4. Click **Cash Check**. -[![Cashed check results](/docs/img/quickstart-checks6.png)](/docs/img/quickstart-checks6.png) - +[![Cashed check results](/docs/img/mt-send-checks-6-cash-check.png)](/docs/img/mt-send-checks-6-cash-check.png) -### Get Balances +### Get Token Balance -Click **Get Balances** to get a list of obligations and assets for each account. +Click **Get Token Balance** to get a list of obligations and assets for the account. -[![Account Balances](/docs/img/quickstart-checks7.png)](/docs/img/quickstart-checks7.png) +[![Account Balance](/docs/img/mt-send-checks-7-get-balance.png)](/docs/img/mt-send-checks-7-get-balance.png) ### Cancel Check @@ -108,14 +109,13 @@ To cancel a check you have previously sent to another account. 1. Enter the **Check ID** (`index` value). 2. Click **Cancel Check**. -[![Canceled check results](/docs/img/quickstart-checks8.png)](/docs/img/quickstart-checks8.png) - +[![Canceled check results](/docs/img/mt-send-checks-8-cancel-check.png)](/docs/img/mt-send-checks-8-cancel-check.png) # Code Walkthrough -You can download the {% repo-link path="_code-samples/quickstart/js/" %}Modular Tutorial Samples{% /repo-link %} in the source repository for this website. +Download and expand the [Modular Tutorials](../../../../_code-samples/modular-tutorials/payment-modular-tutorials.zip) archive. -## ripplex10-check.js +## send-checks.js ### sendCheck() @@ -125,779 +125,539 @@ Connect to the XRP ledger. async function sendCheck() { let net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results await client.connect() - results += '\nConnected.' - standbyResultField.value = results + results = `\n===Connected to ${net}.===\n===Sending check.===\n` + resultField.value = results ``` -Instantiate the account wallets. +Prepare the transaction. Set the *check_amount* variable to the value in the **Amount** field. ```javascript - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + let check_amount = amountField.value ``` -Create the `check_amount` variable, based on the standby amount field. + If the currency field is not _XRP_, create an `amount` object with the _currency_, _value_, and _issuer_. Otherwise, use the *check_amount* value as is. -```javascript - var check_amount = standbyAmountField.value -``` + ```javascript + if (currencyField.value != "XRP") { + check_amount = { + "currency": currencyField.value, + "value": amountField.value, + "issuer": wallet.address + } + } + ``` -If the currency is anything but _XRP_, it's an issued currency. Update the `check_amount` variable to include the `currency` and `issuer` fields. + Create the transaction object. -```javascript - if (standbyCurrencyField.value != "XRP") { - check_amount = { - "currency": standbyCurrencyField.value, - "value": standbyAmountField.value, - "issuer": standby_wallet.address - } - } -``` - -Define the `CheckCreate` transaction. - -```javascript + ```javascript const send_check_tx = { "TransactionType": "CheckCreate", - "Account": standby_wallet.address, + "Account": wallet.address, "SendMax": check_amount, - "Destination": standbyDestinationField.value + "Destination": destinationField.value } ``` -Prepare and sign the transaction. +Autofill the remaining values and sign the prepared transaction. ```javascript - const check_prepared = await client.autofill(send_check_tx) - const check_signed = standby_wallet.sign(check_prepared) - results += 'Sending ' + check_amount + ' ' + standbyCurrencyField + ' to ' + - standbyDestinationField.value + '...' - standbyResultField.value = results -``` - -Submit the transaction to the XRP Ledger and wait for the response. - -``` - const check_result = await client.submitAndWait(check_signed.tx_blob) + const check_prepared = await client.autofill(send_check_tx) + const check_signed = wallet.sign(check_prepared) ``` -Report the results +Send the transaction and wait for the results. ```javascript - if (check_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded: https://testnet.xrpl.org/transactions/${check_signed.hash}' - standbyResultField.value = JSON.stringify(check_result.result, null, 2) - } else { - results += 'Transaction failed: See JavaScript console for details.' - standbyResultField.value = results - throw 'Error sending transaction: ${check_result.result.meta.TransactionResult}' - } + results += '\n===Sending ' + amountField.value + ' ' + currencyField. + value + ' to ' + destinationField.value + '.===\n' + resultField.value = results + const check_result = await client.submitAndWait(check_signed.tx_blob) ``` -Update the XRP balance fields. +Report the results. ```javascript - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) + if (check_result.result.meta.TransactionResult == "tesSUCCESS") { + results = '===Transaction succeeded===\n\n' + resultField.value += results + JSON.stringify(check_result.result, null, 2) + } ``` -Disconnect from the XRP Ledger. +Update the **XRP Balance** field. ```javascript - client.disconnect() -} // end of sendCheck() + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) ``` -### getChecks() +Report any errors, then disconnect from the XRP ledger. ```javascript -async function getChecks() { + } catch (error) { + results = `Error sending transaction: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } +}//end of sendCheck() ``` -Connect to the XRP Ledger. +## getChecks() +Connect to the XRP Ledger. ```javascript +async function getChecks() { let net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results await client.connect() - results += '\nConnected.' - standbyResultField.value = results - results= "\nGetting standby account checks...\n" + let results = `\n===Connected to ${net}.===\n===Getting account checks.===\n\n` + resultField.value = results ``` -Define and send the `account_objects` request, specifying `check` objects. +Define an `account_objects` query, filtering for the _check_ object type. ```javascript - const check_objects = await client.request({ - "id": 5, - "command": "account_objects", - "account": standbyAccountField.value, - "ledger_index": "validated", - "type": "check" - }) + try { + const check_objects = await client.request({ + "id": 5, + "command": "account_objects", + "account": accountAddressField.value, + "ledger_index": "validated", + "type": "check" + }) ``` - -Report the results. +Display the retrieved `Check` objects in the result field. ```javascript - standbyResultField.value = JSON.stringify(check_objects.result, null, 2) + resultField.value += JSON.stringify(check_objects.result, null, 2) ``` -Disconnect from the XRP Ledger. +Catch and report any errors, then disconnect from the XRP Ledger. ```javascript - client.disconnect() + } catch (error) { + results = `Error getting checks: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } } // End of getChecks() ``` -### cashCheck() -Connect to the XRP Ledger and instantiate the account wallets. +## cashCheck() + +Connect to the XRP Ledger and get the account wallet ```javascript async function cashCheck() { let net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results await client.connect() - results += '\nConnected.' - standbyResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) + results = `\n===Connected to ${net}.===\n===Cashing check.===\n` + resultField.value = results ``` -Set the `check_amount` variable to the value in the **Amount** field. +Set the check amount. ```javascript - var check_amount = standbyAmountField.value + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + let check_amount = amountField.value ``` -If the **Currency** is anything other than `XRP`, the check is for an issued currency. Redefine the variable to include the `currency` and `issuer` for the token. +If the currency is not _XRP_, create an `amount` object with _value_, _currency_, and _issuer_. +```javascript + if (currencyField.value != "XRP") { + check_amount = { + "value": amountField.value, + "currency": currencyField.value, + "issuer": issuerField.value + } + } ``` - if (standbyCurrencyField.value != "XRP") { - check_amount = { - "value": standbyAmountField.value, - "currency": standbyCurrencyField.value, - "issuer": standbyIssuerField.value - } - } + +Create the `CheckCash` transaction object. + +```javascript + const cash_check_tx = { + "TransactionType": "CheckCash", + "Account": wallet.address, + "Amount": check_amount, + "CheckID": checkIdField.value + } ``` -Define the `CheckCash` transaction. +Autofill the transaction details. ```javascript - const cash_check_tx = { - "TransactionType": "CheckCash", - "Account": standby_wallet.address, - "Amount": check_amount, - "CheckID": standbyCheckID.value - } + const cash_prepared = await client.autofill(cash_check_tx) ``` -Prepare and sign the transaction. +Sign the prepared transaction. ```javascript - const cash_prepared = await client.autofill(cash_check_tx) - const cash_signed = standby_wallet.sign(cash_prepared) - results += ' Receiving ' + standbyAmountField.value + ' ' + standbyCurrencyField.value + '.\n' - standbyResultField.value = results + const cash_signed = wallet.sign(cash_prepared) + results = ' Receiving ' + amountField.value + ' ' + currencyField.value + '.\n' + resultField.value += results ``` -Submit the transaction and wait for the results. +Submit the transaction and wait for the result. ```javascript const check_result = await client.submitAndWait(cash_signed.tx_blob) -``` + ``` -Report the results. +Report the transaction results. ```javascript - if (check_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded: https://testnet.xrpl.org/transactions/${cash_signed.hash}' - standbyResultField.value = results - } else { - results += 'Transaction failed: See JavaScript console for details.' - standbyResultField.value = results - throw 'Error sending transaction: ${check_result.result.meta.TransactionResult}' - } + if (check_result.result.meta.TransactionResult == "tesSUCCESS") { + results = '===Transaction succeeded===\n' + JSON.stringify(check_result.result, null, 2) + resultField.value += results + } ``` -Update the XRP balance fields. +Update the XRP Balance field. ```javascript - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)); ``` -Disconnect from the XRP Ledger. +Catch and report any errors, then disconnect from the XRP ledger. ```javascript - client.disconnect() + } catch (error) { + results = `Error sending transaction: ${error}` + resultField.value += results + } + finally { + client.disconnect() } // end of cashCheck() ``` -### cancelCheck +## cancelCheck() -Connect to the XRP Ledger and instantiate the account wallets. +Connect to the XRP Ledger. ```javascript async function cancelCheck() { let net = getNet() const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - standbyResultField.value = results await client.connect() - results += '\nConnected.' - standbyResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) + results = `\n===Connected to ${net}.===\n===Cancelling check.===\n` + resultField.value = results ``` -Define the `CheckCancel` transaction. +Create the CheckCancel transaction object, passing the wallet address and the Check ID value (the _Index_). ```javascript - const cancel_check_tx = { - "TransactionType": "CheckCancel", - "Account": standby_wallet.address, - "CheckID": standbyCheckID.value - } + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const cancel_check_tx = { + "TransactionType": "CheckCancel", + "Account": wallet.address, + "CheckID": checkIdField.value + } ``` -Prepare and sign the transaction object. +Autofill the transaction details. ```javascript - const cancel_prepared = await client.autofill(cancel_check_tx) - const cancel_signed = standby_wallet.sign(cancel_prepared) - results += ' Cancelling check.\n' - standbyResultField.value = results + const cancel_prepared = await client.autofill(cancel_check_tx) ``` -Submit the transaction and wait for the results. +Sign the prepared transaction. ```javascript - const check_result = await client.submitAndWait(cancel_signed.tx_blob) + const cancel_signed = wallet.sign(cancel_prepared) ``` -Report the results. +Submit the transaction and wait for the results. ```javascript - if (check_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded: https://testnet.xrpl.org/transactions/${cash_signed.hash}' - standbyResultField.value = results - } else { - results += 'Transaction failed: See JavaScript console for details.' - standbyResultField.value = results - throw 'Error sending transaction: ${check_result.result.meta.TransactionResult}' - } + const check_result = await client.submitAndWait(cancel_signed.tx_blob) ``` -Update the XRP balance fields. +Report the transaction results. ```javascript - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) + if (check_result.result.meta.TransactionResult == "tesSUCCESS") { + results += `===Transaction succeeded===\n${check_result.result.meta.TransactionResult}` + resultField.value = results + } ``` -Disconnect from the XRP Ledger. +Update the XRP Balance field. ```javascript - client.disconnect() -} // end of cancelCheck() + xrpBalanceField.value = (await client.getXrpBalance(wallet.address)) ``` -### Reciprocal functions for the Operational account. +Catch and report any errors, then disconnect from the XRP ledger. ```javascript -// ******************************************************* -// ************ Operational Send Check ******************* -// ******************************************************* -async function opSendCheck() { - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - operationalResultField.value = results - await client.connect() - results += '\nConnected.' - operationalResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - - const issue_quantity = operationalAmountField.value - var check_amount = operationalAmountField.value - - if (operationalCurrencyField.value != "XRP") { - check_amount = { - "currency": operationalCurrencyField.value, - "value": operationalAmountField.value, - "issuer": operational_wallet.address - } - } - const send_check_tx = { - "TransactionType": "CheckCreate", - "Account": operational_wallet.address, - "SendMax": check_amount, - "Destination": operationalDestinationField.value - } - const check_prepared = await client.autofill(send_check_tx) - const check_signed = operational_wallet.sign(check_prepared) - results += '\nSending check to ' + - operationalDestinationField.value + '...' - operationalResultField.value = results - const check_result = await client.submitAndWait(check_signed.tx_blob) - if (check_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded: https://testnet.xrpl.org/transactions/${check_signed.hash}' - operationalResultField.value = JSON.stringify(check_result.result, null, 2) - } else { - results += 'Transaction failed: See JavaScript console for details.' - operationalResultField.value = results - throw 'Error sending transaction: ${check_result.result.meta.TransactionResult}' - } - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - client.disconnect() -} // end of opSendCheck() - -// ******************************************************* -// ************ Operational Get Checks ******************* -// ******************************************************* - -async function opGetChecks() { - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - operationalResultField.value = results - await client.connect() - results += '\nConnected.' - operationalResultField.value = results - - results= "\nGetting standby account checks...\n" - const check_objects = await client.request({ - "id": 5, - "command": "account_objects", - "account": operationalAccountField.value, - "ledger_index": "validated", - "type": "check" - }) - operationalResultField.value = JSON.stringify(check_objects.result, null, 2) - client.disconnect() -} // End of opGetChecks() - - -// ******************************************************* -// ************* Operational Cash Check ****************** -// ******************************************************* - -async function opCashCheck() { - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - operationalResultField.value = results - await client.connect() - results += '\nConnected.' - operationalResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - - var check_amount = operationalAmountField.value - - if (operationalCurrencyField.value != "XRP") { - check_amount = { - "value": operationalAmountField.value, - "currency": operationalCurrencyField.value, - "issuer": operationalIssuerField.value - } - } - const cash_check_tx = { - "TransactionType": "CheckCash", - "Account": operational_wallet.address, - "Amount": check_amount, - "CheckID": operationalCheckIDField.value - } - const cash_prepared = await client.autofill(cash_check_tx) - const cash_signed = operational_wallet.sign(cash_prepared) - results += ' Receiving ' + operationalAmountField.value + ' ' + operationalCurrencyField.value + '.\n' - operationalResultField.value = results - const check_result = await client.submitAndWait(cash_signed.tx_blob) - if (check_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded: https://testnet.xrpl.org/transactions/${cash_signed.hash}' - operationalResultField.value = results - } else { - results += 'Transaction failed: See JavaScript console for details.' - operationalResultField.value = results - throw 'Error sending transaction: ${check_result.result.meta.TransactionResult}' + } catch (error) { + results = `Error sending transaction: ${error}` + resultField.value += results } - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - client.disconnect() -} -// end of opCashCheck() - -// ******************************************************* -// ************* Operational Cancel Check **************** -// ******************************************************* - -async function opCancelCheck() { - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '....' - operationalResultField.value = results - await client.connect() - results += '\nConnected.' - operationalResultField.value = results - - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - - const cancel_check_tx = { - "TransactionType": "CheckCancel", - "Account": operational_wallet.address, - "CheckID": operationalCheckIDField.value + finally { + client.disconnect() } - - const cancel_prepared = await client.autofill(cancel_check_tx) - const cancel_signed = operational_wallet.sign(cancel_prepared) - results += ' Cancelling check.\n' - operationalResultField.value = results - const check_result = await client.submitAndWait(cancel_signed.tx_blob) - if (check_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded: https://testnet.xrpl.org/transactions/${cash_signed.hash}' - operationalResultField.value = results - } else { - results += 'Transaction failed: See JavaScript console for details.' - operationalResultField.value = results - throw 'Error sending transaction: ${check_result.result.meta.TransactionResult}' - } - standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) - operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) - client.disconnect() } // end of cancelCheck() ``` -## 10.check.html +## 10.send-checks.html ```html - - Token Test Harness + + Send Checks - - - - - - - - + + + + + + + + + - -

Token Test Harness

+ +

Send Checks

- Choose your ledger instance: -    - - -    - - -

- -
- -

- - - - - -
- - + + Choose your ledger instance: + +    + + +    + + +

+
+ + + + + + + + + + + + + + + + + + + + - + + +
+ + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Standby Account - - -
-
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination - - -
-
- Issuer - - -
-
- Check ID - - -
-
- - -
- Currency - - -
-

- -

+
+ + + - - - - - - -
- -

- -
- -
- -
- -
- -
-
-
+
- + + + + + - -
+ + + + + + + +
+ + + + - - - - - - - - -
- -

- -
- -
- -
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Operational Account - - -
-
- Public Key - - -
-
- Private Key - - -
-
- Seed - - -
-
- XRP Balance - - -
-
- Amount - - -
-
- Destination - - -
-
- Issuer - - -
-
- Check ID - - -
-
- - - - -
- Currency - - -
-

- -

-
-
-
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + Currency Code + + + + +
+ + + + + + + + + Issuer + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + Destination + + + + +
+ + + + + + + + + Check ID + + + + +
+ + + + + + + +

+ +

+ + +
+ + + +
- + + ``` diff --git a/docs/tutorials/javascript/send-payments/sending-mpts.md b/docs/tutorials/javascript/send-payments/sending-mpts.md index 52cfa2c32bb..e4e9679c22e 100644 --- a/docs/tutorials/javascript/send-payments/sending-mpts.md +++ b/docs/tutorials/javascript/send-payments/sending-mpts.md @@ -17,7 +17,7 @@ Once an account receives an MPT, it can send the MPT to another account, provide The Send MPT utility lets you create an account, authorize it to receive a specific MPT issuance, then send it the authorized MPT from an issuer or holder account. (You can issue an MPT using the [MPT Generator](../../../use-cases/tokenization/creating-an-asset-backed-multi-purpose-token.md) utility.) -![MPT Sender Utility](../../../img/tut-send-mpt-0-empty-form.png) +[![MPT Sender Utility](../../../img/mt-send-mpt-0-empty-form.png)](../../../img/mt-send-mpt-0-empty-form.png) You can download a [standalone version of the MPT Sender](../../../../_code-samples/mpt-sender/send-mpt.zip) as sample code. @@ -31,13 +31,13 @@ To get the accounts: 2. Choose your ledger instance (**Devnet** or **Testnet**). 3. If you used the MPT Generator: 1. Paste the gathered info in the **Result** field. - ![Gathered information in Result field](../../../img/tut-send-mpt-1-gathered-info.png) + [![Gathered information in Result field](../../../img/mt-send-mpt-1-gathered-info.png)](../../../img/mt-send-mpt-1-gathered-info.png) 2. Cut and paste the MPT Issuance ID to the **MPT Issuance ID** field. 3. Click **Distribute Account Info** to populate the **Account 1** fields.

- (If you did not use the MPT Generator, enter the **Account 1 Name**, **Account 1 Address**, **Account 1 Seed**, and **MPT Issuance ID** in the corresponding fields.) -4. Click **Get New Account 2**. + If you did not use the MPT Generator, enter the **Account 1 Name**, **Account 1 Address**, **Account 1 Seed**, and **MPT Issuance ID** in the corresponding fields.) +4. Click **Get New Account 2**, or use a seed to **Get Account 2 from Seed**. 5. Optionally, add the **Account 2 Name**, an arbitrary human-readable name that helps to differentiate the accounts. -![Get New Account 2](../../../img/tut-send-mpt-2-account-2.png) +[![Get New Account 2](../../../img/mt-send-mpt-2-account-2.png)](../../../img/mt-send-mpt-2-account-2.png) ## Authorize MPT @@ -48,7 +48,7 @@ To authorize Account 2 to accept MPTs: 1. Click the **Account 2** radio button. 2. Enter an **Amount**, the maximum number of MPTs the account will accept. 2. Click **Authorize MPTs**. -![Authorize MPTs](../../../img/tut-send-mpt-2-authorize-mpt.png) +[![Authorize MPTs](../../../img/mt-send-mpt-2-authorize-mpt.png)](../../../img/mt-send-mpt-2-authorize-mpt.png) ## Send MPT @@ -59,7 +59,7 @@ To send an MPT: 2. Enter an **Amount** of MPTs to send. 3. Enter the **Destination** (likely the value in the **Account 2 Address** field, but it can be any account on the same ledger instance). 4. Click **Send MPT**. -![Send MPTs](../../../img/tut-send-mpt-3-send-mpt.png) +[![Send MPTs](../../../img/mt-send-mpt-3-send-mpt.png)](../../../img/mt-send-mpt-3-send-mpt.png) ## Get MPTs @@ -67,7 +67,7 @@ To verify receipt of the MPTs: 1. Click the **Account 2** radio button. 2. Click **Get MPTs**. -![Get MPTs](../../../img/tut-send-mpt-4-get-mpts.png) +[![Get MPTs](../../../img/mt-send-mpt-4-get-mpts.png)](../../../img/mt-send-mpt-4-get-mpts.png) # Code Walkthrough @@ -79,62 +79,69 @@ The code that supports the MPT features is in the `send-mpt.js` file. Standard s ### sendMPT() -Connect to the network and instantiate the account wallet. +Connect to the XRP Ledger. ```javascript async function sendMPT() { let net = getNet() const client = new xrpl.Client(net) await client.connect() - let results = `Connected to ${net}....` + let results = `===Connected to ${net}.===\n===Sending MPT.===\n` resultField.value = results - const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) ``` Instantiate the parameter variables. ```javascript - const mpt_issuance_id = mptIdField.value - const mpt_quantity = amountField.value + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const mpt_issuance_id = mptIdField.value + const mpt_quantity = amountField.value ``` Create a Payment transaction using the MPT for the Amount. ```javascript - const send_mpt_tx = { - "TransactionType": "Payment", - "Account": wallet.address, - "Amount": { - "mpt_issuance_id": mpt_issuance_id, - "value": mpt_quantity, - }, - "Destination": destinationField.value, - } + const send_mpt_tx = { + "TransactionType": "Payment", + "Account": wallet.address, + "Amount": { + "mpt_issuance_id": mpt_issuance_id, + "value": mpt_quantity, + }, + "Destination": destinationField.value, + } ``` Prepare and sign the transaction. ```javascript - const pay_prepared = await client.autofill(send_mpt_tx) - const pay_signed = wallet.sign(pay_prepared) + const pay_prepared = await client.autofill(send_mpt_tx) + const pay_signed = wallet.sign(pay_prepared) ``` Send the prepared transaction and report the results. ```javascript - results += `\n\nSending ${mpt_quantity} ${mpt_issuance_id} to ${destinationField.value} ...` - resultField.value = results - const pay_result = await client.submitAndWait(pay_signed.tx_blob) - if (pay_result.result.meta.TransactionResult == "tesSUCCESS") { - results += 'Transaction succeeded.\n\n' - results += JSON.stringify(pay_result.result, null, 2) + results += `\n===Sending ${mpt_quantity} ${mpt_issuance_id} to ${destinationField.value} ...` resultField.value = results - } else { - results += `\nTransaction failed: ${pay_result.result.meta.TransactionResult}\n\n` + const pay_result = await client.submitAndWait(pay_signed.tx_blob) + results += '\n\n===Transaction succeeded.\n' results += JSON.stringify(pay_result.result, null, 2) - resultField.value = results + resultField.value += results + } +``` + +Catch and report any errors, then disconnect from the XRP Ledger. + +```javascript + catch (error) { + results = `Error sending MPT: ${error}` + resultField.value += results + } + finally { + client.disconnect() } - client.disconnect() } // end of sendMPT() ``` @@ -142,7 +149,7 @@ Send the prepared transaction and report the results. Get all of the MPTs for the selected account by filtering for MPT objects and looping through the array to display them one at a time. -Connect to the XRPL instance and get the account wallet. +Connect to the XRPL ledger. ```javascript async function getMPTs() { @@ -150,46 +157,59 @@ async function getMPTs() { const client = new xrpl.Client(net) await client.connect() const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) - let results = `Connected to ${net}....` - resultField.value = results + let results = '' + resultField.value = `===Connected to ${net}. Getting MPTs.===` ``` -Send an `account_objects` request, specifying the type _mptoken_. +Send an `account_objects` request, specifying the type _mptoken_. Wait for the results. ```javascript - const mpts = await client.request({ - command: "account_objects", - account: wallet.address, - ledger_index: "validated", - type: "mptoken" - }) + try { + const wallet = xrpl.Wallet.fromSeed(accountSeedField.value) + const mpts = await client.request({ + command: "account_objects", + account: wallet.address, + ledger_index: "validated", + type: "mptoken" + }) ``` Stringify and parse the JSON result string. ```javascript - let JSONString = JSON.stringify(mpts.result, null, 2) - let JSONParse = JSON.parse(JSONString) - let numberOfMPTs = JSONParse.account_objects.length + let JSONString = JSON.stringify(mpts.result, null, 2) + let JSONParse = JSON.parse(JSONString) + let numberOfMPTs = JSONParse.account_objects.length ``` Loop through the filtered array of account_objects to list all of the MPTs held by the account. ```javascript - let x = 0 - while (x < numberOfMPTs){ - results += "\n\nMPT Issuance ID: " + JSONParse.account_objects[x].MPTokenIssuanceID - + "\nMPT Amount: " + JSONParse.account_objects[x].MPTAmount - x++ - } + let x = 0 + while (x < numberOfMPTs){ + results += "\n\n===MPT Issuance ID: " + JSONParse.account_objects[x].MPTokenIssuanceID + + "\n===MPT Amount: " + JSONParse.account_objects[x].MPTAmount + x++ + } ``` Return the parsed results, followed by the raw results. ```javascript - results += "\n\n" + JSONString - resultField.value = results - client.disconnect() + results += "\n\n" + JSONString + resultField.value += results +``` + +Catch and report any errors, then disconnect from the XRP Ledger. + +```javascript + } catch (error) { + results = `===Error getting MPTs: ${error}` + resultField.value += results + } + finally { + client.disconnect() + } } // End of getMPTs() ``` diff --git a/docs/tutorials/python/send-payments/create-time-based-escrows.md b/docs/tutorials/python/send-payments/create-time-based-escrows.md index 307f2551c4e..d8dc76dfe15 100644 --- a/docs/tutorials/python/send-payments/create-time-based-escrows.md +++ b/docs/tutorials/python/send-payments/create-time-based-escrows.md @@ -45,7 +45,7 @@ To get test accounts: 3. Click **Get Operational Account**. 4. Click **Get Op Account Info**. -[![Escrow Tester with Account Information](/docs/img/quickstart-escrow2.png)](/docs/img/quickstart-py-escrow2.png) +[![Escrow Tester with Account Information](/docs/img/quickstart-py-escrow2.png)](/docs/img/quickstart-py-escrow2.png) ## Create Escrow diff --git a/docs/use-cases/tokenization/creating-an-asset-backed-multi-purpose-token.md b/docs/use-cases/tokenization/creating-an-asset-backed-multi-purpose-token.md index f81f48ac416..e23a4b432fe 100644 --- a/docs/use-cases/tokenization/creating-an-asset-backed-multi-purpose-token.md +++ b/docs/use-cases/tokenization/creating-an-asset-backed-multi-purpose-token.md @@ -385,11 +385,12 @@ The form sets the standard flags for an Issuer account and displays additional c #### Issuer Account Flag Settings -Use the sliders to configure the standard suggested flag settings. Overall, you want holders of your T-bill to be able to trade with other holders, so rippling is an essential function. You want to be careful about what other accounts are able to send to your account, so you should disallow most types of transfers. One exception is trust lines, which you do want other accounts to be able to create to your issuing account. +Use the sliders to configure the standard suggested flag settings. You want to be careful about what other accounts are able to send to your account, so you should disallow most types of transfers. One exception is trust lines, which you do want other accounts to be able to create to your issuing account. + +One difference between an MPT issuer and other tokens is that there is no concern about rippling, since MPTs are self-contained. If the only purpose for this issuing account is to issue MPTs, you do not have to enable rippling by default. |Flag |Purpose | |------------------------------|------------------------------------------------------------------------------------| -| defaultRipple | Allow transfers to third-party holders by default. | | depositAuth | Require authorization for another account to deposit to this account. | | disallowIncomingCheck | Prevent other accounts from sending checks to this account. | | disallowIncomingNFTokenOffer | Prevent other accounts from sending NFTokenOffers to this account. | diff --git a/package-lock.json b/package-lock.json index 418a3472b1c..2681fb3a91e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,12 +12,14 @@ "@codemirror/state": "6.5.2", "@codemirror/view": "^6.22.2", "@docsearch/react": "^3.8.0", + "@esbuild/darwin-arm64": "^0.25.4", "@lezer/highlight": "^1.2.0", "@redocly/realm": "0.120.2", "@uiw/codemirror-themes": "4.21.21", "@uiw/react-codemirror": "^4.21.21", "@xrplf/isomorphic": "^1.0.0-beta.1", "clsx": "^2.0.0", + "five-bells-condition": "^5.0.1", "lottie-react": "^2.4.0", "moment": "^2.29.4", "node-fetch": "^3.3.2", @@ -35,34 +37,34 @@ } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", - "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", - "@algolia/autocomplete-shared": "1.17.9" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", - "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.17.9" + "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", - "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.17.9" + "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -70,9 +72,9 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", - "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -80,180 +82,180 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.23.4.tgz", - "integrity": "sha512-WIMT2Kxy+FFWXWQxIU8QgbTioL+SGE24zhpj0kipG4uQbzXwONaWt7ffaYLjfge3gcGSgJVv+1VlahVckafluQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.15.0.tgz", + "integrity": "sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.23.4.tgz", - "integrity": "sha512-4B9gChENsQA9kFmFlb+x3YhBz2Gx3vSsm81FHI1yJ3fn2zlxREHmfrjyqYoMunsU7BybT/o5Nb7ccCbm/vfseA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.15.0.tgz", + "integrity": "sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.23.4.tgz", - "integrity": "sha512-bsj0lwU2ytiWLtl7sPunr+oLe+0YJql9FozJln5BnIiqfKOaseSDdV42060vUy+D4373f2XBI009K/rm2IXYMA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.15.0.tgz", + "integrity": "sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.23.4.tgz", - "integrity": "sha512-XSCtAYvJ/hnfDHfRVMbBH0dayR+2ofVZy3jf5qyifjguC6rwxDsSdQvXpT0QFVyG+h8UPGtDhMPoUIng4wIcZA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.15.0.tgz", + "integrity": "sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.23.4.tgz", - "integrity": "sha512-l/0QvqgRFFOf7BnKSJ3myd1WbDr86ftVaa3PQwlsNh7IpIHmvVcT83Bi5zlORozVGMwaKfyPZo6O48PZELsOeA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.15.0.tgz", + "integrity": "sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.23.4.tgz", - "integrity": "sha512-TB0htrDgVacVGtPDyENoM6VIeYqR+pMsDovW94dfi2JoaRxfqu/tYmLpvgWcOknP6wLbr8bA+G7t/NiGksNAwQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.15.0.tgz", + "integrity": "sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.23.4.tgz", - "integrity": "sha512-uBGo6KwUP6z+u6HZWRui8UJClS7fgUIAiYd1prUqCbkzDiCngTOzxaJbEvrdkK0hGCQtnPDiuNhC5MhtVNN4Eg==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.15.0.tgz", + "integrity": "sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.23.4", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.23.4.tgz", - "integrity": "sha512-Si6rFuGnSeEUPU9QchYvbknvEIyCRK7nkeaPVQdZpABU7m4V/tsiWdHmjVodtx3h20VZivJdHeQO9XbHxBOcCw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.15.0.tgz", + "integrity": "sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.23.4", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.23.4.tgz", - "integrity": "sha512-EXGoVVTshraqPJgr5cMd1fq7Jm71Ew6MpGCEaxI5PErBpJAmKdtjRIzs6JOGKHRaWLi+jdbJPYc2y8RN4qcx5Q==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.15.0.tgz", + "integrity": "sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.23.4.tgz", - "integrity": "sha512-1t6glwKVCkjvBNlng2itTf8fwaLSqkL4JaMENgR3WTGR8mmW2akocUy/ZYSQcG4TcR7qu4zW2UMGAwLoWoflgQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.15.0.tgz", + "integrity": "sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "@algolia/client-common": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.23.4.tgz", - "integrity": "sha512-UUuizcgc5+VSY8hqzDFVdJ3Wcto03lpbFRGPgW12pHTlUQHUTADtIpIhkLLOZRCjXmCVhtr97Z+eR6LcRYXa3Q==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.15.0.tgz", + "integrity": "sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4" + "@algolia/client-common": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.23.4.tgz", - "integrity": "sha512-UhDg6elsek6NnV5z4VG1qMwR6vbp+rTMBEnl/v4hUyXQazU+CNdYkl++cpdmLwGI/7nXc28xtZiL90Es3I7viQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.15.0.tgz", + "integrity": "sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4" + "@algolia/client-common": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.23.4.tgz", - "integrity": "sha512-jXGzGBRUS0oywQwnaCA6mMDJO7LoC3dYSLsyNfIqxDR4SNGLhtg3je0Y31lc24OA4nYyKAYgVLtjfrpcpsWShg==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.15.0.tgz", + "integrity": "sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.23.4" + "@algolia/client-common": "5.15.0" }, "engines": { "node": ">= 14.0.0" @@ -263,7 +265,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -273,13 +274,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -287,30 +286,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "license": "MIT", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", - "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.5", - "@babel/parser": "^7.23.5", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -329,48 +327,45 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", - "license": "MIT", + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/types": "^7.25.4", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -382,7 +377,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -391,33 +385,31 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -427,61 +419,84 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "license": "MIT", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", - "license": "MIT", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.25.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -491,12 +506,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -506,10 +521,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", - "license": "MIT", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -518,30 +532,28 @@ } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.4", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -550,13 +562,13 @@ } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -567,7 +579,6 @@ "resolved": "https://registry.npmjs.org/@cocalc/ansi-to-react/-/ansi-to-react-7.0.0.tgz", "integrity": "sha512-FOuHtOnuBtqTZSPR78Zg5w86/n+WJ/AOd0Y0PTh7Sx2TttyN3KjXRD8gSD8zEp1Ewf3Qv30tP3m8kNoPQa3lTw==", "hasInstallScript": true, - "license": "BSD-3-Clause", "dependencies": { "anser": "^2.1.1", "escape-carriage": "^1.3.0" @@ -578,22 +589,26 @@ } }, "node_modules/@codemirror/autocomplete": { - "version": "6.18.6", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", - "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", - "license": "MIT", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.0.tgz", + "integrity": "sha512-5DbOvBbY4qW5l57cjDsmmpDh3/TeK1vXfTHa+BUMrRzdWdcxKZ4U4V7vQaTtOpApNU4kLS4FQ6cINtLg245LXA==", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" + }, + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0" } }, "node_modules/@codemirror/commands": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", - "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", - "license": "MIT", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.6.0.tgz", + "integrity": "sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", @@ -671,10 +686,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", - "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==", - "license": "MIT", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz", + "integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", @@ -685,21 +699,19 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.8.5", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", - "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", - "license": "MIT", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.1.tgz", + "integrity": "sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==", "dependencies": { "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.35.0", + "@codemirror/view": "^6.0.0", "crelt": "^1.0.5" } }, "node_modules/@codemirror/search": { - "version": "6.5.10", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.10.tgz", - "integrity": "sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==", - "license": "MIT", + "version": "6.5.6", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.6.tgz", + "integrity": "sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -710,6 +722,7 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", + "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } @@ -718,7 +731,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz", "integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==", - "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -727,12 +739,11 @@ } }, "node_modules/@codemirror/view": { - "version": "6.36.5", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.5.tgz", - "integrity": "sha512-cd+FZEUlu3GQCYnguYm3EkhJ8KJVisqqUsCOKedBoAt/d9c76JUUap6U0UrpElln5k6VyrEOYliMuDAKIeDQLg==", - "license": "MIT", + "version": "6.33.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.33.0.tgz", + "integrity": "sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==", "dependencies": { - "@codemirror/state": "^6.5.0", + "@codemirror/state": "^6.4.0", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } @@ -760,26 +771,26 @@ } }, "node_modules/@docsearch/css": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", - "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz", + "integrity": "sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==", "license": "MIT" }, "node_modules/@docsearch/react": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", - "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz", + "integrity": "sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-core": "1.17.9", - "@algolia/autocomplete-preset-algolia": "1.17.9", - "@docsearch/css": "3.9.0", - "algoliasearch": "^5.14.2" + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.0", + "algoliasearch": "^5.12.0" }, "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0", + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "peerDependenciesMeta": { @@ -822,6 +833,18 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@emotion/cache": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", @@ -981,19 +1004,18 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", - "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], "license": "MIT", - "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { @@ -1291,21 +1313,21 @@ "license": "MIT" }, "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.6.0", + "@floating-ui/core": "^1.7.0", "@floating-ui/utils": "^0.2.9" } }, @@ -1347,10 +1369,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "license": "MIT", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1364,7 +1385,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1373,7 +1393,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1381,14 +1400,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1416,10 +1433,9 @@ "license": "MIT" }, "node_modules/@lezer/common": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", - "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", - "license": "MIT" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" }, "node_modules/@lezer/css": { "version": "1.1.11", @@ -1436,7 +1452,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", - "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" } @@ -1478,7 +1493,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", - "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" } @@ -1497,7 +1511,8 @@ "node_modules/@marijn/find-cluster-break": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==" + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" }, "node_modules/@markdoc/markdoc": { "version": "0.5.1", @@ -1525,39 +1540,22 @@ } }, "node_modules/@noble/curves": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", - "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", - "license": "MIT", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dependencies": { - "@noble/hashes": "1.7.2" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", - "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -2316,6 +2314,45 @@ "react-dom": "^18.0.0" } }, + "node_modules/@redocly/realm/node_modules/@babel/core": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", + "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.5", + "@babel/parser": "^7.23.5", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@redocly/realm/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@redocly/realm/node_modules/node-fetch": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", @@ -2426,203 +2463,303 @@ } }, "node_modules/@remix-run/router": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", - "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz", + "integrity": "sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@scure/base": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.4.tgz", - "integrity": "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==", - "license": "MIT", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz", + "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", - "license": "MIT", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", - "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", - "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@shikijs/core": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", - "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.4.tgz", + "integrity": "sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==", "license": "MIT", "dependencies": { - "@shikijs/engine-javascript": "1.29.2", - "@shikijs/engine-oniguruma": "1.29.2", - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1", + "@shikijs/engine-javascript": "1.24.4", + "@shikijs/engine-oniguruma": "1.24.4", + "@shikijs/types": "1.24.4", + "@shikijs/vscode-textmate": "^9.3.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", - "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.4.tgz", + "integrity": "sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==", "license": "MIT", "dependencies": { - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1", - "oniguruma-to-es": "^2.2.0" + "@shikijs/types": "1.24.4", + "@shikijs/vscode-textmate": "^9.3.1", + "oniguruma-to-es": "0.8.1" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", - "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.4.tgz", + "integrity": "sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==", "license": "MIT", "dependencies": { - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1" + "@shikijs/types": "1.24.4", + "@shikijs/vscode-textmate": "^9.3.1" } }, - "node_modules/@shikijs/transformers": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.29.2.tgz", - "integrity": "sha512-NHQuA+gM7zGuxGWP9/Ub4vpbwrYCrho9nQCLcCPfOe3Yc7LOYwmSuhElI688oiqIXk9dlZwDiyAG9vPBTuPJMA==", + "node_modules/@shikijs/langs": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.27.2.tgz", + "integrity": "sha512-MSrknKL0DbeXvhtSigMLIzjPOOQfvK7fsbcRv2NUUB0EvuTTomY8/U+lAkczYrXY2+dygKOapJKk8ScFYbtoNw==", "license": "MIT", "dependencies": { - "@shikijs/core": "1.29.2", - "@shikijs/types": "1.29.2" + "@shikijs/types": "1.27.2" } }, - "node_modules/@shikijs/types": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", - "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "node_modules/@shikijs/langs/node_modules/@shikijs/types": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.27.2.tgz", + "integrity": "sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "node_modules/@shikijs/langs/node_modules/@shikijs/vscode-textmate": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", "license": "MIT" }, - "node_modules/@styled-system/background": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/background/-/background-5.1.2.tgz", - "integrity": "sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==", + "node_modules/@shikijs/themes": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.27.2.tgz", + "integrity": "sha512-Yw/uV7EijjWavIIZLoWneTAohcbBqEKj6XMX1bfMqO3llqTKsyXukPp1evf8qPqzUHY7ibauqEaQchhfi857mg==", "license": "MIT", - "peer": true, "dependencies": { - "@styled-system/core": "^5.1.2" + "@shikijs/types": "1.27.2" } }, - "node_modules/@styled-system/border": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/border/-/border-5.1.5.tgz", - "integrity": "sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==", + "node_modules/@shikijs/themes/node_modules/@shikijs/types": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.27.2.tgz", + "integrity": "sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==", "license": "MIT", - "peer": true, "dependencies": { - "@styled-system/core": "^5.1.2" + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" } }, - "node_modules/@styled-system/color": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/color/-/color-5.1.2.tgz", - "integrity": "sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==", + "node_modules/@shikijs/themes/node_modules/@shikijs/vscode-textmate": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", + "license": "MIT" + }, + "node_modules/@shikijs/transformers": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.27.2.tgz", + "integrity": "sha512-BJFeXP9/zlYidJocv2ShkOvXI22fepS2oK/vItfCbCcuJ0783eWgEn6/mMrXmk+p+Twu49ntDVQe665uy6RPWw==", "license": "MIT", - "peer": true, "dependencies": { - "@styled-system/core": "^5.1.2" + "shiki": "1.27.2" } }, - "node_modules/@styled-system/core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/core/-/core-5.1.2.tgz", - "integrity": "sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==", + "node_modules/@shikijs/transformers/node_modules/@shikijs/core": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.27.2.tgz", + "integrity": "sha512-ns1dokDr0KE1lQ9mWd4rqaBkhSApk0qGCK1+lOqwnkQSkVZ08UGqXj1Ef8dAcTMZNFkN6PSNjkL5TYNX7pyPbQ==", "license": "MIT", - "peer": true, "dependencies": { - "object-assign": "^4.1.1" + "@shikijs/engine-javascript": "1.27.2", + "@shikijs/engine-oniguruma": "1.27.2", + "@shikijs/types": "1.27.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" } }, - "node_modules/@styled-system/css": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", - "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==", - "license": "MIT", - "peer": true - }, - "node_modules/@styled-system/flexbox": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/flexbox/-/flexbox-5.1.2.tgz", - "integrity": "sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==", + "node_modules/@shikijs/transformers/node_modules/@shikijs/engine-javascript": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.27.2.tgz", + "integrity": "sha512-0JB7U5vJc16NShBdxv9hSSJYSKX79+32O7F4oXIxJLdYfomyFvx4B982ackUI9ftO9T3WwagkiiD3nOxOOLiGA==", "license": "MIT", - "peer": true, "dependencies": { - "@styled-system/core": "^5.1.2" + "@shikijs/types": "1.27.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.0.0" } }, - "node_modules/@styled-system/grid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/grid/-/grid-5.1.2.tgz", - "integrity": "sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==", + "node_modules/@shikijs/transformers/node_modules/@shikijs/engine-oniguruma": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.27.2.tgz", + "integrity": "sha512-FZYKD1KN7srvpkz4lbGLOYWlyDU4Rd+2RtuKfABTkafAPOFr+J6umfIwY/TzOQqfNtWjL7SAwPAO0dcOraRLaQ==", "license": "MIT", - "peer": true, "dependencies": { - "@styled-system/core": "^5.1.2" + "@shikijs/types": "1.27.2", + "@shikijs/vscode-textmate": "^10.0.1" } }, - "node_modules/@styled-system/layout": { + "node_modules/@shikijs/transformers/node_modules/@shikijs/types": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.27.2.tgz", + "integrity": "sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/transformers/node_modules/@shikijs/vscode-textmate": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", + "license": "MIT" + }, + "node_modules/@shikijs/transformers/node_modules/oniguruma-to-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.0.0.tgz", + "integrity": "sha512-pE7+9jQgomy10aK6BJKRNHj1Nth0YLOzb3iRuhlz4gRzNSBSd7hga6U8BE6o0SoSuSkqv+PPtt511Msd1Hkl0w==", + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/@shikijs/transformers/node_modules/shiki": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.27.2.tgz", + "integrity": "sha512-QtA1C41oEVixKog+V8I3ia7jjGls7oCZ8Yul8vdHrVBga5uPoyTtMvFF4lMMXIyAZo5A5QbXq91bot2vA6Q+eQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.27.2", + "@shikijs/engine-javascript": "1.27.2", + "@shikijs/engine-oniguruma": "1.27.2", + "@shikijs/langs": "1.27.2", + "@shikijs/themes": "1.27.2", + "@shikijs/types": "1.27.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/types": { + "version": "1.24.4", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.4.tgz", + "integrity": "sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^9.3.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", + "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==", + "license": "MIT" + }, + "node_modules/@styled-system/background": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/background/-/background-5.1.2.tgz", + "integrity": "sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/border": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/border/-/border-5.1.5.tgz", + "integrity": "sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/color": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/color/-/color-5.1.2.tgz", + "integrity": "sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/core/-/core-5.1.2.tgz", + "integrity": "sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==", + "license": "MIT", + "peer": true, + "dependencies": { + "object-assign": "^4.1.1" + } + }, + "node_modules/@styled-system/css": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", + "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==", + "license": "MIT", + "peer": true + }, + "node_modules/@styled-system/flexbox": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/flexbox/-/flexbox-5.1.2.tgz", + "integrity": "sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/grid": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@styled-system/grid/-/grid-5.1.2.tgz", + "integrity": "sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/layout": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@styled-system/layout/-/layout-5.1.2.tgz", "integrity": "sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==", @@ -2853,12 +2990,12 @@ "optional": true }, "node_modules/@types/node": { - "version": "22.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", - "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~6.19.2" } }, "node_modules/@types/parse-json": { @@ -2868,15 +3005,15 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", + "version": "18.3.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz", + "integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2921,10 +3058,9 @@ "license": "MIT" }, "node_modules/@uiw/codemirror-extensions-basic-setup": { - "version": "4.23.10", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.23.10.tgz", - "integrity": "sha512-zpbmSeNs3OU/f/Eyd6brFnjsBUYwv2mFjWxlAsIRSwTlW+skIT60rQHFBSfsj/5UVSxSLWVeUYczN7AyXvgTGQ==", - "license": "MIT", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.23.0.tgz", + "integrity": "sha512-+k5nkRpUWGaHr1JWT8jcKsVewlXw5qBgSopm9LW8fZ6KnSNZBycz8kHxh0+WSvckmXEESGptkIsb7dlkmJT/hQ==", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", @@ -2948,21 +3084,21 @@ } }, "node_modules/@uiw/codemirror-theme-material": { - "version": "4.23.10", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-material/-/codemirror-theme-material-4.23.10.tgz", - "integrity": "sha512-RN+K7Vc/qea+ky5w0KVCtfwfVqtedicOMKxeBu/fs82tyU5Q5oQ2UlS5Y94Sv05BRkHYluOvMwypUwWkSq2q6g==", + "version": "4.23.12", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-material/-/codemirror-theme-material-4.23.12.tgz", + "integrity": "sha512-M7yo5mE0QDKjWm02sN6Sw3Ld4/3XvAuJZcEdKYgqmiGI7GKL/nAV8HDfD8iMNm0HGnyozK402WLzb84oB57gAg==", "license": "MIT", "dependencies": { - "@uiw/codemirror-themes": "4.23.10" + "@uiw/codemirror-themes": "4.23.12" }, "funding": { "url": "https://jaywcjlove.github.io/#/sponsor" } }, "node_modules/@uiw/codemirror-theme-material/node_modules/@uiw/codemirror-themes": { - "version": "4.23.10", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.23.10.tgz", - "integrity": "sha512-dU0UgEEgEXCAYpxuVDQ6fovE82XsqgHZckTJOH6Bs8xCi3Z7dwBKO4pXuiA8qGDwTOXOMjSzfi+pRViDm7OfWw==", + "version": "4.23.12", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.23.12.tgz", + "integrity": "sha512-8etEByfS9yttFZW0rcWhdZc7/JXJKRWlU5lHmJCI3GydZNGCzydNA+HtK9nWKpJUndVc58Q2sqSC5OIcwq8y6A==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -2982,7 +3118,6 @@ "version": "4.21.21", "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.21.21.tgz", "integrity": "sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==", - "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -2998,16 +3133,15 @@ } }, "node_modules/@uiw/react-codemirror": { - "version": "4.23.10", - "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.23.10.tgz", - "integrity": "sha512-AbN4eVHOL4ckRuIXpZxkzEqL/1ChVA+BSdEnAKjIB68pLQvKsVoYbiFP8zkXkYc4+Fcgq5KbAjvYqdo4ewemKw==", - "license": "MIT", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.23.0.tgz", + "integrity": "sha512-MnqTXfgeLA3fsUUQjqjJgemEuNyoGALgsExVm0NQAllAAi1wfj+IoKFeK+h3XXMlTFRCFYOUh4AHDv0YXJLsOg==", "dependencies": { "@babel/runtime": "^7.18.6", "@codemirror/commands": "^6.1.0", "@codemirror/state": "^6.1.1", "@codemirror/theme-one-dark": "^6.0.0", - "@uiw/codemirror-extensions-basic-setup": "4.23.10", + "@uiw/codemirror-extensions-basic-setup": "4.23.0", "codemirror": "^6.0.0" }, "funding": { @@ -3024,9 +3158,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", "license": "ISC" }, "node_modules/@wojtekmaj/date-utils": { @@ -3091,7 +3225,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz", "integrity": "sha512-0bIpgx8PDjYdrLFeC3csF305QQ1L7sxaWnL5y71mCvhenZzJgku9QsA+9QCXBC1eNYtxWO/xR91zrXJy2T/ixg==", - "license": "ISC", "dependencies": { "@noble/hashes": "^1.0.0", "eventemitter3": "5.0.1", @@ -3105,16 +3238,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-1.0.0.tgz", "integrity": "sha512-qsCLGyqe1zaq9j7PZJopK+iGTGRbk6akkg6iZXJJgxKwck0C5x5Gnwlb1HKYGOwPKyrXWpV6a2YmcpNpUFctGg==", - "license": "ISC", "dependencies": { "@xrplf/isomorphic": "^1.0.0", "ripple-keypairs": "^2.0.0" } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3187,34 +3319,33 @@ } }, "node_modules/algoliasearch": { - "version": "5.23.4", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.23.4.tgz", - "integrity": "sha512-QzAKFHl3fm53s44VHrTdEo0TkpL3XVUYQpnZy1r6/EHvMAyIg+O4hwprzlsNmcCHTNyVcF2S13DAUn7XhkC6qg==", - "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.23.4", - "@algolia/client-analytics": "5.23.4", - "@algolia/client-common": "5.23.4", - "@algolia/client-insights": "5.23.4", - "@algolia/client-personalization": "5.23.4", - "@algolia/client-query-suggestions": "5.23.4", - "@algolia/client-search": "5.23.4", - "@algolia/ingestion": "1.23.4", - "@algolia/monitoring": "1.23.4", - "@algolia/recommend": "5.23.4", - "@algolia/requester-browser-xhr": "5.23.4", - "@algolia/requester-fetch": "5.23.4", - "@algolia/requester-node-http": "5.23.4" + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.15.0.tgz", + "integrity": "sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==", + "license": "MIT", + "dependencies": { + "@algolia/client-abtesting": "5.15.0", + "@algolia/client-analytics": "5.15.0", + "@algolia/client-common": "5.15.0", + "@algolia/client-insights": "5.15.0", + "@algolia/client-personalization": "5.15.0", + "@algolia/client-query-suggestions": "5.15.0", + "@algolia/client-search": "5.15.0", + "@algolia/ingestion": "1.15.0", + "@algolia/monitoring": "1.15.0", + "@algolia/recommend": "5.15.0", + "@algolia/requester-browser-xhr": "5.15.0", + "@algolia/requester-fetch": "5.15.0", + "@algolia/requester-node-http": "5.15.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/anser": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/anser/-/anser-2.3.2.tgz", - "integrity": "sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==", - "license": "MIT" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/anser/-/anser-2.1.1.tgz", + "integrity": "sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==" }, "node_modules/ansi-colors": { "version": "4.1.3", @@ -3235,25 +3366,20 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3279,17 +3405,26 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8" } @@ -3297,8 +3432,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.7", @@ -3320,7 +3454,6 @@ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } @@ -3329,8 +3462,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/axios": { "version": "1.8.4", @@ -3343,21 +3475,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -3400,7 +3517,6 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } @@ -3418,7 +3534,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -3426,6 +3541,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, "node_modules/bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", @@ -3441,7 +3562,6 @@ "url": "https://opencollective.com/bootstrap" } ], - "license": "MIT", "peerDependencies": { "jquery": "1.9.1 - 3", "popper.js": "^1.16.1" @@ -3460,7 +3580,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -3478,9 +3597,9 @@ ] }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -3495,12 +3614,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -3512,8 +3630,7 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "license": "MIT" + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" }, "node_modules/call-bind": { "version": "1.0.8", @@ -3577,16 +3694,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/camelize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", @@ -3597,9 +3704,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001715", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", - "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "funding": [ { "type": "opencollective", @@ -3613,15 +3720,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/ccount": { "version": "2.0.1", @@ -3633,6 +3738,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", @@ -3657,7 +3775,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3678,9 +3795,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", "license": "MIT" }, "node_modules/classnames": { @@ -3707,7 +3824,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -3717,7 +3833,6 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3726,7 +3841,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", - "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", @@ -3738,34 +3852,27 @@ } }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3786,8 +3893,7 @@ "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/copy-to-clipboard": { "version": "3.3.3", @@ -3799,9 +3905,9 @@ } }, "node_modules/core-js": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", - "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", + "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", "hasInstallScript": true, "license": "MIT", "peer": true, @@ -3811,10 +3917,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -3841,8 +3946,7 @@ "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" }, "node_modules/crypto-js": { "version": "4.2.0", @@ -3874,15 +3978,13 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cssstyle": { "version": "0.2.37", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", "dev": true, - "license": "MIT", "dependencies": { "cssom": "0.3.x" } @@ -3890,15 +3992,13 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" }, @@ -3922,12 +4022,11 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { - "ms": "^2.1.3" + "ms": "2.1.2" }, "engines": { "node": ">=6.0" @@ -3943,7 +4042,6 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3978,7 +4076,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -4038,7 +4135,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -4048,7 +4144,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -4067,14 +4162,12 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -4095,10 +4188,9 @@ } }, "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -4112,7 +4204,6 @@ "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -4139,17 +4230,15 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, - "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "node_modules/electron-to-chromium": { - "version": "1.5.140", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.140.tgz", - "integrity": "sha512-o82Rj+ONp4Ip7Cl1r7lrqx/pXhbp/lh9DpKcMNscFJdh8ebyRofnc7Sh01B4jx403RI0oqTBvlZ7OBIZLMr2+Q==", - "license": "ISC" + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -4179,7 +4268,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -4191,7 +4279,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -4226,21 +4313,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -4284,11 +4356,26 @@ "@esbuild/win32-x64": "0.17.15" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", + "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -4296,26 +4383,20 @@ "node_modules/escape-carriage": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz", - "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==", - "license": "MIT" + "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==" }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4327,21 +4408,18 @@ "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -4356,21 +4434,18 @@ "dev": true, "engines": [ "node >=0.6.0" - ], - "license": "MIT" + ] }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-safe-stringify": { "version": "2.1.1", @@ -4438,8 +4513,7 @@ "node_modules/fflate": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", - "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", - "license": "MIT" + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==" }, "node_modules/file-saver": { "version": "2.0.5", @@ -4451,7 +4525,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4465,18 +4538,17 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "license": "MIT" }, - "node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "license": "MIT", + "node_modules/five-bells-condition": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/five-bells-condition/-/five-bells-condition-5.0.1.tgz", + "integrity": "sha512-rmVJAyyTBOBIYTWHGQzxCWKlSobwwuOb3adeHrBANddTs4IH5HDkWsbNFjGtx8LlGRPHN2/UoU/f6iA1QlaIow==", + "license": "Apache-2.0", "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "asn1.js": "^4.9.0", + "tweetnacl": "^0.14.1" }, - "engines": { - "node": ">=0.10.0" + "optionalDependencies": { + "ed25519": "0.0.4" } }, "node_modules/flexsearch": { @@ -4486,16 +4558,15 @@ "license": "Apache-2.0" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4531,24 +4602,21 @@ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/formdata-polyfill": { @@ -4563,25 +4631,10 @@ "node": ">=12.20.0" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4590,7 +4643,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -4664,7 +4716,6 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" } @@ -4673,7 +4724,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4685,7 +4735,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", "engines": { "node": ">=4" } @@ -4706,8 +4755,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/graphql": { "version": "16.9.0", @@ -4722,7 +4770,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -4737,7 +4784,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -4746,7 +4792,6 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4760,7 +4805,6 @@ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, - "license": "ISC", "engines": { "node": ">=4" } @@ -4771,7 +4815,6 @@ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -4785,7 +4828,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4801,14 +4843,12 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -4856,7 +4896,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4865,9 +4904,9 @@ } }, "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", + "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -4877,7 +4916,7 @@ "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", + "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" @@ -4935,8 +4974,7 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/hotkeys-js": { "version": "3.10.1", @@ -4965,7 +5003,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -4978,7 +5015,6 @@ "resolved": "https://registry.npmjs.org/htmltojsx/-/htmltojsx-0.3.0.tgz", "integrity": "sha512-ivWTGWn15hph8NIYRRdU1/KdG5qHXe1FW4Q1w7IcJ8zPK+9CSYnEY9yEiaBm8tBhhkVC8Vs+SmHLcCvsWhyqEg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "jsdom-no-contextify": "~3.1.0", "react": "~15.4.1", @@ -4994,7 +5030,15 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/htmltojsx/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5004,7 +5048,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -5016,7 +5059,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, - "license": "MIT", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -5029,7 +5071,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, - "license": "MIT", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5044,7 +5085,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -5057,7 +5097,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dev": true, - "license": "MIT", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -5070,15 +5109,13 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/htmltojsx/node_modules/yargs": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", "dev": true, - "license": "MIT", "dependencies": { "camelcase": "^2.0.1", "cliui": "^3.2.0", @@ -5099,7 +5136,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^3.0.0", "lodash.assign": "^4.0.6" @@ -5110,7 +5146,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5120,7 +5155,6 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -5196,12 +5230,12 @@ } }, "node_modules/import-in-the-middle": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", - "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.12.0.tgz", + "integrity": "sha512-yAgSE7GmtRcu4ZUSFX/4v69UGXwugFFSdIQJ14LHPOPPQrWv8Y7O9PHsw8Ovk7bKCLe4sjXMbZFqGFcLHpZ89w==", "license": "Apache-2.0", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.8.2", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" @@ -5210,15 +5244,13 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5242,14 +5274,12 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -5270,10 +5300,9 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { "hasown": "^2.0.2" }, @@ -5288,7 +5317,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5297,7 +5325,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5333,7 +5360,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -5345,7 +5371,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -5405,15 +5430,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/isarray": { "version": "1.0.0", @@ -5425,13 +5448,12 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jotai": { - "version": "2.12.3", - "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.12.3.tgz", - "integrity": "sha512-DpoddSkmPGXMFtdfnoIHfueFeGP643nqYUWC6REjUcME+PG2UkAtYnLbffRDw3OURI9ZUTcRWkRGLsOvxuWMCg==", + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.12.4.tgz", + "integrity": "sha512-eFXLJol4oOLM8BS1+QV+XwaYQITG8n1tatBCFl4F5HE3zR5j2WIK8QpMt7VJIYmlogNUZfvB7wjwLoVk+umB9Q==", "license": "MIT", "engines": { "node": ">=12.20.0" @@ -5454,7 +5476,6 @@ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/js-levenshtein": { @@ -5469,8 +5490,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -5488,15 +5508,13 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jsdom-no-contextify": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsdom-no-contextify/-/jsdom-no-contextify-3.1.0.tgz", "integrity": "sha512-djD5JXh841BOTx27kxYJghei3WWIdcJnv7IWfHrj9JnPjsCVaJLfChopLiAi/s+MIBhp0y7equb/BeSgj26IoA==", "dev": true, - "license": "MIT", "dependencies": { "browser-request": ">= 0.3.1 < 0.4.0", "cssom": ">= 0.3.0 < 0.4.0", @@ -5514,7 +5532,6 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -5530,15 +5547,13 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/jsdom-no-contextify/node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -5547,15 +5562,13 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/jsdom-no-contextify/node_modules/domhandler": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "1" } @@ -5565,7 +5578,6 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -5575,15 +5587,13 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/jsdom-no-contextify/node_modules/htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^1.3.1", "domhandler": "^2.3.0", @@ -5593,31 +5603,15 @@ "readable-stream": "^3.1.1" } }, - "node_modules/jsdom-no-contextify/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/json-parse-even-better-errors": { @@ -5639,8 +5633,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -5652,14 +5645,12 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5678,7 +5669,6 @@ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -5707,11 +5697,40 @@ "setimmediate": "^1.0.5" } }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5721,7 +5740,6 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", "dev": true, - "license": "MIT", "dependencies": { "invert-kv": "^1.0.0" }, @@ -5749,7 +5767,6 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -5766,7 +5783,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, - "license": "MIT", "dependencies": { "error-ex": "^1.2.0" }, @@ -5774,6 +5790,18 @@ "node": ">=0.10.0" } }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -5784,8 +5812,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -5813,16 +5840,15 @@ } }, "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==", "license": "Apache-2.0" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5831,29 +5857,26 @@ } }, "node_modules/lottie-react": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.1.tgz", - "integrity": "sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.0.tgz", + "integrity": "sha512-pDJGj+AQlnlyHvOHFK7vLdsDcvbuqvwPZdMlJ360wrzGFurXeKPr8SiRCjLf3LrNYKANQtSsh5dz9UYQHuqx4w==", "dependencies": { "lottie-web": "^5.10.2" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/lottie-web": { "version": "5.12.2", "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz", - "integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==", - "license": "MIT" + "integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==" }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", "engines": { "node": ">=12" } @@ -6023,9 +6046,9 @@ "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6042,7 +6065,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6051,7 +6073,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6068,6 +6089,12 @@ "node": ">=8" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, "node_modules/minimatch": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", @@ -6093,7 +6120,6 @@ "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", "engines": { "node": "*" } @@ -6102,22 +6128,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", "bin": { "mustache": "bin/mustache" } @@ -6144,7 +6167,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", "funding": [ { "type": "github", @@ -6200,17 +6222,15 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -6223,7 +6243,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -6232,7 +6251,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6248,7 +6266,6 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6257,8 +6274,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/oas-kit-common": { "version": "1.0.8", @@ -6335,7 +6351,6 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } @@ -6344,7 +6359,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6362,14 +6376,14 @@ } }, "node_modules/oniguruma-to-es": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", - "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.8.1.tgz", + "integrity": "sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==", "license": "MIT", "dependencies": { "emoji-regex-xs": "^1.0.0", - "regex": "^5.1.1", - "regex-recursion": "^5.1.1" + "regex": "^5.0.2", + "regex-recursion": "^5.0.0" } }, "node_modules/openapi-sampler": { @@ -6386,15 +6400,13 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "license": "MIT" + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, "node_modules/os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", "dev": true, - "license": "MIT", "dependencies": { "lcid": "^1.0.0" }, @@ -6459,24 +6471,10 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "license": "MIT" }, - "node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-type": { "version": "4.0.0", @@ -6491,20 +6489,17 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6517,7 +6512,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6527,7 +6521,6 @@ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6537,7 +6530,6 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, - "license": "MIT", "dependencies": { "pinkie": "^2.0.0" }, @@ -6550,7 +6542,6 @@ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-1.1.3.tgz", "integrity": "sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^1.0.0", "load-json-file": "^1.1.0", @@ -6561,6 +6552,31 @@ "node": ">=0.10.0" } }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -6576,7 +6592,6 @@ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", "dev": true, - "license": "MIT", "peer": true, "funding": { "type": "opencollective", @@ -6608,7 +6623,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -6618,13 +6632,12 @@ "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/property-information": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", - "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "license": "MIT", "funding": { "type": "github", @@ -6632,9 +6645,9 @@ } }, "node_modules/protobufjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", - "integrity": "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -6658,37 +6671,18 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/psl/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -6698,7 +6692,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } @@ -6774,7 +6767,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -6786,7 +6778,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/react-alert/-/react-alert-7.0.3.tgz", "integrity": "sha512-cZ2ZhxytECTxljDfBKpQmwWbfJQFzFf2Qf03L/IB5shbEXtWhDD2JjiW60rwmKT1oZoU+GEnUQw5MFM5+f0B6A==", - "license": "MIT", "dependencies": { "prop-types": "^15.7.2", "react-transition-group": "^4.4.1" @@ -7034,7 +7025,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -7046,8 +7036,7 @@ "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, "node_modules/react-fit": { "version": "1.7.1", @@ -7081,7 +7070,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "license": "MIT", "dependencies": { "object-assign": "^4.1.1", "prop-types": "^15.7.2", @@ -7110,12 +7098,12 @@ } }, "node_modules/react-router": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", - "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", + "version": "6.21.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz", + "integrity": "sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.0" + "@remix-run/router": "1.14.1" }, "engines": { "node": ">=14.0.0" @@ -7125,13 +7113,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.30.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", - "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", + "version": "6.21.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz", + "integrity": "sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.0", - "react-router": "6.30.0" + "@remix-run/router": "1.14.1", + "react-router": "6.21.1" }, "engines": { "node": ">=14.0.0" @@ -7166,7 +7154,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", - "license": "MIT", "peerDependencies": { "react": "^16.3.0 || ^17.0.0 || ^18.0.0" } @@ -7175,7 +7162,6 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", "integrity": "sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -7217,7 +7203,6 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -7253,13 +7238,9 @@ "license": "MIT" }, "node_modules/react18-json-view": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.9.tgz", - "integrity": "sha512-z3JQgCwZRKbmWh54U94loCU6vE0ZoDBK7C8ZpcMYQB8jYMi+mR/fcgMI9jKgATeF0I6+OAF025PD+UKkXIqueQ==", - "license": "MIT", - "dependencies": { - "copy-to-clipboard": "^3.3.3" - }, + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.8.tgz", + "integrity": "sha512-uJlcf5PEDaba6yTqfcDAcMSYECZ15SLcpP94mLFTa/+fa1kZANjERqKzS7YxxsrGP4+jDxt6sIaglR0PbQcKPw==", "peerDependencies": { "react": ">=16.8.0" } @@ -7268,7 +7249,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/reactjs-popup/-/reactjs-popup-2.0.6.tgz", "integrity": "sha512-A+tt+x9wdgZiZjv0e2WzYLD3IfFwJALaRaqwrCSXGjo0iQdsry/EtBEbQXRSmQs7cHmOi5eytCiSlOm8k4C+dg==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -7282,7 +7262,6 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dev": true, - "license": "MIT", "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -7297,7 +7276,6 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -7306,12 +7284,36 @@ "node": ">=0.10.0" } }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-pkg/node_modules/path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -7322,25 +7324,22 @@ } }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -7379,8 +7378,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regex": { "version": "5.1.1", @@ -7413,7 +7411,6 @@ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, - "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -7440,6 +7437,20 @@ "node": ">= 6" } }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7459,9 +7470,9 @@ } }, "node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", + "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -7476,8 +7487,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", @@ -7486,21 +7496,17 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7518,7 +7524,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-5.0.0.tgz", "integrity": "sha512-de7osLRH/pt5HX2xw2TRJtbdLLWHu0RXirpQaEeCnWKY5DYHykh3ETSkofvm0aX0LJiV7kwkegJxQkmbO94gWw==", - "license": "ISC", "dependencies": { "@scure/base": "^1.1.3", "@xrplf/isomorphic": "^1.0.0" @@ -7545,7 +7550,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz", "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==", - "license": "ISC", "dependencies": { "@noble/curves": "^1.0.0", "@xrplf/isomorphic": "^1.0.0", @@ -7556,10 +7560,23 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safe-regex-test": { "version": "1.1.0", @@ -7582,15 +7599,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/sass": { "version": "1.26.10", "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": ">=2.0.0 <4.0.0" }, @@ -7611,7 +7626,6 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } @@ -7627,7 +7641,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -7672,8 +7685,7 @@ "node_modules/serialize-query-params": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/serialize-query-params/-/serialize-query-params-2.0.2.tgz", - "integrity": "sha512-1chMo1dST4pFA9RDXAtF0Rbjaut4is7bzFbI1Z26IuMub68pNCILku85aYmeFhvnY//BXUPUhoRMjYcsT93J/Q==", - "license": "ISC" + "integrity": "sha512-1chMo1dST4pFA9RDXAtF0Rbjaut4is7bzFbI1Z26IuMub68pNCILku85aYmeFhvnY//BXUPUhoRMjYcsT93J/Q==" }, "node_modules/set-function-length": { "version": "1.2.2", @@ -7718,68 +7730,6 @@ "@types/hast": "^3.0.4" } }, - "node_modules/shiki/node_modules/@shikijs/core": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.4.tgz", - "integrity": "sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==", - "license": "MIT", - "dependencies": { - "@shikijs/engine-javascript": "1.24.4", - "@shikijs/engine-oniguruma": "1.24.4", - "@shikijs/types": "1.24.4", - "@shikijs/vscode-textmate": "^9.3.1", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" - } - }, - "node_modules/shiki/node_modules/@shikijs/engine-javascript": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.4.tgz", - "integrity": "sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.24.4", - "@shikijs/vscode-textmate": "^9.3.1", - "oniguruma-to-es": "0.8.1" - } - }, - "node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.4.tgz", - "integrity": "sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.24.4", - "@shikijs/vscode-textmate": "^9.3.1" - } - }, - "node_modules/shiki/node_modules/@shikijs/types": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.4.tgz", - "integrity": "sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^9.3.1", - "@types/hast": "^3.0.4" - } - }, - "node_modules/shiki/node_modules/@shikijs/vscode-textmate": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", - "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==", - "license": "MIT" - }, - "node_modules/shiki/node_modules/oniguruma-to-es": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.8.1.tgz", - "integrity": "sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==", - "license": "MIT", - "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^5.0.2", - "regex-recursion": "^5.0.0" - } - }, "node_modules/shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", @@ -7962,10 +7912,9 @@ } }, "node_modules/smol-toml": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.3.tgz", - "integrity": "sha512-KMVLNWu490KlNfD0lbfDBUktJIEaZRBj1eeK0SMfdpO/rfyARIzlnPVI1Ge4l0vtSJmQUAiGKxMyLGrCT38iyA==", - "license": "BSD-3-Clause", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.1.tgz", + "integrity": "sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==", "engines": { "node": ">= 18" }, @@ -7997,7 +7946,6 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -8007,39 +7955,34 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true, - "license": "CC0-1.0" + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/sshpk": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, - "license": "MIT", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -8064,7 +8007,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -8072,27 +8014,12 @@ "xtend": "^4.0.2" } }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { @@ -8149,24 +8076,10 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8186,8 +8099,7 @@ "node_modules/style-mod": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT" + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" }, "node_modules/styled-components": { "version": "5.3.11", @@ -8257,7 +8169,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -8269,7 +8180,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8328,8 +8238,7 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.2.3.tgz", "integrity": "sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==", - "dev": true, - "license": "MPLv2.0" + "dev": true }, "node_modules/timeago.js": { "version": "4.0.2", @@ -8347,7 +8256,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -8366,7 +8274,6 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -8449,15 +8356,13 @@ "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "license": "MIT" + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -8468,9 +8373,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/typescript": { "version": "5.8.3", @@ -8503,18 +8406,18 @@ } }, "node_modules/ulid": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.4.0.tgz", - "integrity": "sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", + "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==", "license": "MIT", "bin": { "ulid": "bin/cli.js" } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, "node_modules/unist-util-is": { @@ -8586,9 +8489,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -8603,10 +8506,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -8629,7 +8531,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -8698,7 +8599,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/use-query-params/-/use-query-params-2.2.1.tgz", "integrity": "sha512-i6alcyLB8w9i3ZK3caNftdb+UnbfBRNPDnc89CNQWkGRmDrm/gfydHvMBfVsQJRq3NoHOM2dt/ceBWG2397v1Q==", - "license": "ISC", "dependencies": { "serialize-query-params": "^2.0.2" }, @@ -8755,8 +8655,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "3.4.0", @@ -8764,7 +8663,6 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, - "license": "MIT", "bin": { "uuid": "bin/uuid" } @@ -8780,7 +8678,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -8794,20 +8691,12 @@ "engines": [ "node >=0.6.0" ], - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -8857,8 +8746,7 @@ "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" }, "node_modules/warning": { "version": "4.0.3", @@ -8926,7 +8814,6 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", "dev": true, - "license": "MIT", "bin": { "window-size": "cli.js" }, @@ -8957,11 +8844,43 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, @@ -9005,15 +8924,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-1.0.0.tgz", "integrity": "sha512-XDmXffxxQs/+0VLW9NB2oSIbSoSINj6dQdhegY3kEM81LOoLr6NfsFE9RR59qrwsKEHaZLxa1MOSahFA0CE9Ow==", - "dev": true, - "license": "WTFPL" + "dev": true }, "node_modules/xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -9051,7 +8968,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", "engines": { "node": ">=0.4" } @@ -9068,8 +8984,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index ea19ee4c941..b7ceed90059 100644 --- a/package.json +++ b/package.json @@ -15,12 +15,14 @@ "@codemirror/state": "6.5.2", "@codemirror/view": "^6.22.2", "@docsearch/react": "^3.8.0", + "@esbuild/darwin-arm64": "^0.25.4", "@lezer/highlight": "^1.2.0", "@redocly/realm": "0.120.2", "@uiw/codemirror-themes": "4.21.21", "@uiw/react-codemirror": "^4.21.21", "@xrplf/isomorphic": "^1.0.0-beta.1", "clsx": "^2.0.0", + "five-bells-condition": "^5.0.1", "lottie-react": "^2.4.0", "moment": "^2.29.4", "node-fetch": "^3.3.2",