mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-20 04:05:52 +00:00
update Paths snippet test (#2765)
* update Paths snippet test: perform prerequisite test setup within the test, remove dependence on theexternal state of testnet * fix lint errors * remove bridge snippet test, the sidechain has been shut down * [FIX] Update paths snippet. Replace RipplePathFind with PathFind RPC (fixes #2385)
This commit is contained in:
committed by
GitHub
parent
f3960c3ccc
commit
385a56a1f7
@@ -1,170 +0,0 @@
|
||||
/* eslint-disable max-depth -- needed for attestation checking */
|
||||
/* eslint-disable @typescript-eslint/consistent-type-assertions -- needed here */
|
||||
/* eslint-disable no-await-in-loop -- needed here */
|
||||
import {
|
||||
AccountObjectsRequest,
|
||||
LedgerEntry,
|
||||
Client,
|
||||
XChainAccountCreateCommit,
|
||||
XChainBridge,
|
||||
XChainCommit,
|
||||
XChainCreateClaimID,
|
||||
xrpToDrops,
|
||||
Wallet,
|
||||
getXChainClaimID,
|
||||
} from '../../src'
|
||||
|
||||
async function sleep(sec: number): Promise<void> {
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(resolve, sec * 1000)
|
||||
})
|
||||
}
|
||||
|
||||
const lockingClient = new Client('wss://s.devnet.rippletest.net:51233')
|
||||
const issuingClient = new Client(
|
||||
'wss://sidechain-net2.devnet.rippletest.net:51233',
|
||||
)
|
||||
const MAX_LEDGERS_WAITED = 5
|
||||
const LEDGER_CLOSE_TIME = 4
|
||||
|
||||
void bridgeTransfer()
|
||||
|
||||
async function bridgeTransfer(): Promise<void> {
|
||||
await lockingClient.connect()
|
||||
await issuingClient.connect()
|
||||
const lockingChainDoor = 'rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ'
|
||||
|
||||
const accountObjectsRequest: AccountObjectsRequest = {
|
||||
command: 'account_objects',
|
||||
account: lockingChainDoor,
|
||||
type: 'bridge',
|
||||
}
|
||||
const lockingAccountObjects = (
|
||||
await lockingClient.request(accountObjectsRequest)
|
||||
).result.account_objects
|
||||
// There will only be one here - a door account can only have one bridge per currency
|
||||
const bridgeData = lockingAccountObjects.filter(
|
||||
(obj) =>
|
||||
obj.LedgerEntryType === 'Bridge' &&
|
||||
obj.XChainBridge.LockingChainIssue.currency === 'XRP',
|
||||
)[0] as LedgerEntry.Bridge
|
||||
const bridge: XChainBridge = bridgeData.XChainBridge
|
||||
console.log(bridge)
|
||||
|
||||
console.log('Creating wallet on the locking chain via the faucet...')
|
||||
const { wallet: wallet1 } = await lockingClient.fundWallet()
|
||||
console.log(wallet1)
|
||||
const wallet2 = Wallet.generate()
|
||||
|
||||
console.log(
|
||||
`Creating ${wallet2.classicAddress} on the issuing chain via the bridge...`,
|
||||
)
|
||||
|
||||
const fundTx: XChainAccountCreateCommit = {
|
||||
TransactionType: 'XChainAccountCreateCommit',
|
||||
Account: wallet1.classicAddress,
|
||||
XChainBridge: bridge,
|
||||
SignatureReward: bridgeData.SignatureReward,
|
||||
Destination: wallet2.classicAddress,
|
||||
Amount: (
|
||||
parseInt(bridgeData.MinAccountCreateAmount as string, 10) * 2
|
||||
).toString(),
|
||||
}
|
||||
const fundResponse = await lockingClient.submitAndWait(fundTx, {
|
||||
wallet: wallet1,
|
||||
})
|
||||
console.log(fundResponse)
|
||||
|
||||
console.log(
|
||||
'Waiting for the attestation to go through... (usually 8-12 seconds)',
|
||||
)
|
||||
let ledgersWaited = 0
|
||||
let initialBalance = 0
|
||||
while (ledgersWaited < MAX_LEDGERS_WAITED) {
|
||||
await sleep(LEDGER_CLOSE_TIME)
|
||||
try {
|
||||
initialBalance = await issuingClient.getXrpBalance(wallet2.classicAddress)
|
||||
console.log(
|
||||
`Wallet ${wallet2.classicAddress} has been funded with a balance of ${initialBalance} XRP`,
|
||||
)
|
||||
break
|
||||
} catch (_error) {
|
||||
ledgersWaited += 1
|
||||
if (ledgersWaited === MAX_LEDGERS_WAITED) {
|
||||
// This error should never be hit if the bridge is running
|
||||
throw Error('Destination account creation via the bridge failed.')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(
|
||||
`Transferring funds from ${wallet1.classicAddress} on the locking chain to ` +
|
||||
`${wallet2.classicAddress} on the issuing_chain...`,
|
||||
)
|
||||
|
||||
// Fetch the claim ID for the transfer
|
||||
console.log('Step 1: Fetching the claim ID for the transfer...')
|
||||
const claimIdTx: XChainCreateClaimID = {
|
||||
TransactionType: 'XChainCreateClaimID',
|
||||
Account: wallet2.classicAddress,
|
||||
XChainBridge: bridge,
|
||||
SignatureReward: bridgeData.SignatureReward,
|
||||
OtherChainSource: wallet1.classicAddress,
|
||||
}
|
||||
const claimIdResult = await issuingClient.submitAndWait(claimIdTx, {
|
||||
wallet: wallet2,
|
||||
})
|
||||
console.log(claimIdResult)
|
||||
|
||||
// Extract new claim ID from metadata
|
||||
const xchainClaimId = getXChainClaimID(claimIdResult.result.meta)
|
||||
if (xchainClaimId == null) {
|
||||
// This shouldn't trigger assuming the transaction succeeded
|
||||
throw Error('Could not extract XChainClaimID')
|
||||
}
|
||||
|
||||
console.log(`Claim ID for the transfer: ${xchainClaimId}`)
|
||||
|
||||
console.log(
|
||||
'Step 2: Locking the funds on the locking chain with an XChainCommit transaction...',
|
||||
)
|
||||
const commitTx: XChainCommit = {
|
||||
TransactionType: 'XChainCommit',
|
||||
Account: wallet1.classicAddress,
|
||||
Amount: xrpToDrops(1),
|
||||
XChainBridge: bridge,
|
||||
XChainClaimID: xchainClaimId,
|
||||
OtherChainDestination: wallet2.classicAddress,
|
||||
}
|
||||
const commitResult = await lockingClient.submitAndWait(commitTx, {
|
||||
wallet: wallet1,
|
||||
})
|
||||
console.log(commitResult)
|
||||
|
||||
console.log(
|
||||
'Waiting for the attestation to go through... (usually 8-12 seconds)',
|
||||
)
|
||||
ledgersWaited = 0
|
||||
while (ledgersWaited < MAX_LEDGERS_WAITED) {
|
||||
await sleep(LEDGER_CLOSE_TIME)
|
||||
const currentBalance = await issuingClient.getXrpBalance(
|
||||
wallet2.classicAddress,
|
||||
)
|
||||
console.log(initialBalance, currentBalance)
|
||||
if (currentBalance > initialBalance) {
|
||||
console.log('Transfer is complete')
|
||||
console.log(
|
||||
`New balance of ${wallet2.classicAddress} is ${currentBalance} XRP`,
|
||||
)
|
||||
break
|
||||
}
|
||||
|
||||
ledgersWaited += 1
|
||||
if (ledgersWaited === MAX_LEDGERS_WAITED) {
|
||||
throw Error('Bridge transfer failed.')
|
||||
}
|
||||
}
|
||||
|
||||
await lockingClient.disconnect()
|
||||
await issuingClient.disconnect()
|
||||
}
|
||||
@@ -1,5 +1,11 @@
|
||||
import { Client, Payment } from '../../src'
|
||||
|
||||
// Prerequisites for this snippet. Please verify these conditions after a reset of the
|
||||
// test network:
|
||||
// - destination_account must have a trust line with the destination_amount.issuer
|
||||
// - There must be appropriate DEX Offers or XRP/TST AMM for the cross-currency exchange
|
||||
|
||||
// PathFind RPC requires the use of a Websocket client only
|
||||
const client = new Client('wss://s.altnet.rippletest.net:51233')
|
||||
|
||||
async function createTxWithPaths(): Promise<void> {
|
||||
@@ -8,22 +14,17 @@ async function createTxWithPaths(): Promise<void> {
|
||||
const { wallet } = await client.fundWallet(null, {
|
||||
usageContext: 'code snippets',
|
||||
})
|
||||
const destination_account = 'rKT4JX4cCof6LcDYRz8o3rGRu7qxzZ2Zwj'
|
||||
const destination_account = 'rJPeZVPty1bXXbDR9oKscg2irqABr7sP3t'
|
||||
const destination_amount = {
|
||||
value: '0.001',
|
||||
currency: 'USD',
|
||||
issuer: 'rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc',
|
||||
currency: 'TST',
|
||||
issuer: 'rP9jPyP5kyvFRb6ZiRghAGw5u8SGAmU4bd',
|
||||
}
|
||||
|
||||
const resp = await client.request({
|
||||
// TOOD: Replace with path_find - https://github.com/XRPLF/xrpl.js/issues/2385
|
||||
command: 'ripple_path_find',
|
||||
command: 'path_find',
|
||||
subcommand: 'create',
|
||||
source_account: wallet.classicAddress,
|
||||
source_currencies: [
|
||||
{
|
||||
currency: 'XRP',
|
||||
},
|
||||
],
|
||||
destination_account,
|
||||
destination_amount,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user