mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2026-04-29 15:37:48 +00:00
115 lines
3.6 KiB
JavaScript
115 lines
3.6 KiB
JavaScript
import { Client, dropsToXrp, rippleTimeToISOTime } from 'xrpl'
|
|
|
|
// Set up client and address
|
|
const address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn'
|
|
console.log('Connecting to Mainnet...')
|
|
const client = new Client('wss://xrplcluster.com/')
|
|
await client.connect()
|
|
|
|
// Look up the official close time of the validated ledger ---------------------
|
|
const ledger = await client.request({
|
|
command: 'ledger',
|
|
ledger_index: 'validated'
|
|
})
|
|
if (ledger.error) {
|
|
console.error(`Error looking up validated ledger: ${ledger.error}`)
|
|
client.disconnect()
|
|
process.exit(1)
|
|
}
|
|
const close_time = ledger.result.ledger.close_time
|
|
const ledger_hash = ledger.result.ledger.ledger_hash
|
|
|
|
// Look up objects filtered to escrows, handling pagination --------------------
|
|
let marker
|
|
const escrows = []
|
|
while (true) {
|
|
console.log(`Requesting page of account_objects with marker ${marker}`)
|
|
const resp = await client.request({
|
|
command: 'account_objects',
|
|
account: address,
|
|
ledger_hash, // Caution: if you use a shortcut
|
|
// such as "validated", the ledger may
|
|
// change during iteration, leading to
|
|
// inconsistent results.
|
|
type: 'escrow',
|
|
marker
|
|
})
|
|
if (resp.error) {
|
|
console.error('account_objects failed with error', resp)
|
|
client.disconnect()
|
|
process.exit(1)
|
|
}
|
|
|
|
// Add new escrows to the full list
|
|
for (const escrow of resp.result.account_objects) {
|
|
escrows.push(escrow)
|
|
}
|
|
|
|
// If there's a marker, loop and fetch the next page of results
|
|
if (resp.result.marker) {
|
|
marker = resp.result.marker
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
|
|
// Define helper function for displaying amounts -------------------------------
|
|
function display_amount (amount) {
|
|
if (typeof amount === 'string') {
|
|
// amount is drops of XRP.
|
|
const decimal_xrp = dropsToXrp(amount)
|
|
return `${decimal_xrp} XRP`
|
|
} else if (amount.hasOwnProperty('mpt_issuance_id')) {
|
|
// amount is an MPT.
|
|
// More info may be available, but that would require looking it up.
|
|
return `${amount.value} units of MPT ${amount.mpt_issuance_id}`
|
|
} else if (amount.hasOwnProperty('issuer')) {
|
|
// amount is a trust line token.
|
|
// Currency may be 3 chars or hex. For guidelines parsing hex codes,
|
|
// see "Normalize Currency Codes" code sample.
|
|
return `${amount.value} ${amount.currency} issued by ${amount.issuer}`
|
|
}
|
|
console.error(`Unexpected type of amount: ${amount}`)
|
|
client.disconnect()
|
|
process.exit(1)
|
|
}
|
|
|
|
// Summarize results -----------------------------------------------------------
|
|
console.log(`Found ${escrows.length} escrow(s).`)
|
|
|
|
for (const escrow of escrows) {
|
|
if (escrow.Account === address) {
|
|
console.log(`Outgoing escrow to ${escrow.Destination}`)
|
|
} else if (escrow.Destination === address) {
|
|
console.log(`Incoming escrow from ${escrow.Account}`)
|
|
} else {
|
|
console.log('Neither incoming nor outgoing? This is unexexpected.')
|
|
}
|
|
|
|
console.log(` Amount: ${display_amount(escrow.Amount)}`)
|
|
|
|
if (escrow.hasOwnProperty('Condition')) {
|
|
console.log(` Condition: ${escrow.Condition}`)
|
|
}
|
|
|
|
if (escrow.FinishAfter) {
|
|
const mature_time_display = rippleTimeToISOTime(escrow.FinishAfter)
|
|
if (escrow.FinishAfter < close_time) {
|
|
console.log(` Matured at ${mature_time_display}`)
|
|
} else {
|
|
console.log(` Will mature at ${mature_time_display}`)
|
|
}
|
|
}
|
|
|
|
if (escrow.hasOwnProperty('CancelAfter')) {
|
|
const cancel_time_display = rippleTimeToISOTime(escrow.CancelAfter)
|
|
if (escrow.CancelAfter < close_time) {
|
|
console.log(` EXPIRED at ${cancel_time_display}`)
|
|
} else {
|
|
console.log(` Expires at ${cancel_time_display}`)
|
|
}
|
|
}
|
|
}
|
|
|
|
client.disconnect()
|