Files
xahau.js/test/client/prepareTransaction.ts
Mayukha Vadari 949cc031ee Lints top-level test files (#1594)
* lint broadcastClient

* lint client

* fix most of connection

* remove unused files

* lint mockRippled

* lint mockRippledTest

* lint runClientTests

* lint setupClient

* lint setupClientWeb

* lint shamap

* lint testUtils

* resolve tsc issues

* Fix tests

* lint rest of connection

* respond to comments
2021-10-04 14:10:12 -04:00

1539 lines
59 KiB
TypeScript

import { ValidationError } from 'xrpl-local/common/errors'
// import requests from '../fixtures/requests'
import { xrpToDrops, ISOTimeToRippleTime } from '../../src/utils'
import addresses from '../fixtures/addresses.json'
import responses from '../fixtures/responses'
import rippled from '../fixtures/rippled'
import { setupClient, teardownClient } from '../setupClient'
import { assertRejects, assertResultMatch } from '../testUtils'
const instructionsWithMaxLedgerVersionOffset = { maxLedgerVersionOffset: 100 }
describe('client.prepareTransaction', function () {
beforeEach(setupClient)
afterEach(teardownClient)
it('auto-fillable fields - does not overwrite Fee in txJSON', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = instructionsWithMaxLedgerVersionOffset
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Fee: '10',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Authorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"10","Sequence":23}`,
instructions: {
fee: '0.00001', // Notice there are not always 6 digits after the decimal point as trailing zeros are omitted
sequence: 23,
maxLedgerVersion: 8820051,
},
}
return assertResultMatch(response, expected, 'prepare')
})
it('does not overwrite Fee in Instructions', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
fee: '0.000014', // CAUTION: This `fee` is specified in XRP, not drops.
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Authorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"14","Sequence":23}`,
instructions: {
fee: '0.000014',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
return assertResultMatch(response, expected, 'prepare')
})
it('rejects Promise if both are set, even when txJSON.Fee matches instructions.fee', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
fee: '0.000016',
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Fee: '16',
}
await assertRejects(
this.client.prepareTransaction(txJSON, localInstructions),
ValidationError,
'`Fee` in txJSON and `fee` in `instructions` cannot both be set',
)
}),
it('rejects Promise if both are set, when txJSON.Fee does not match instructions.fee', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
fee: '0.000018',
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Fee: '20',
}
await assertRejects(
this.client.prepareTransaction(txJSON, localInstructions),
ValidationError,
'`Fee` in txJSON and `fee` in `instructions` cannot both be set',
)
})
// it("rejects Promise when the Fee is capitalized in Instructions", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// Fee: "0.000022", // Intentionally capitalized in this test, but the correct field would be `fee`
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// 'instance additionalProperty "Fee" exists in instance when not allowed'
// );
// });
it('rejects Promise when the fee is specified in txJSON', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = instructionsWithMaxLedgerVersionOffset
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
fee: '10',
}
await assertRejects(
this.client.prepareTransaction(txJSON, localInstructions),
ValidationError,
'txJSON additionalProperty "fee" exists in instance when not allowed',
)
})
it('does not overwrite Sequence in txJSON', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = instructionsWithMaxLedgerVersionOffset
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
fee: '10',
}
await assertRejects(
this.client.prepareTransaction(txJSON, localInstructions),
ValidationError,
'txJSON additionalProperty "fee" exists in instance when not allowed',
)
})
it('does not overwrite Sequence in Instructions', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
sequence: 100,
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Authorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"12","Sequence":100}`,
instructions: {
fee: '0.000012',
sequence: 100,
maxLedgerVersion: 8820051,
},
}
return assertResultMatch(response, expected, 'prepare')
})
it('does not overwrite Sequence when same sequence is provided in both txJSON and Instructions', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
sequence: 100,
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Authorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"12","Sequence":100}`,
instructions: {
fee: '0.000012',
sequence: 100,
maxLedgerVersion: 8820051,
},
}
return assertResultMatch(response, expected, 'prepare')
})
it('rejects Promise when Sequence in txJSON does not match sequence in Instructions', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
sequence: 100,
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Sequence: 101,
}
await assertRejects(
this.client.prepareTransaction(txJSON, localInstructions),
ValidationError,
'`Sequence` in txJSON must match `sequence` in `instructions`',
)
})
// it("rejects Promise when the Sequence is capitalized in Instructions", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: "0.000012",
// Sequence: 100, // Intentionally capitalized in this test, but the correct field would be `sequence`
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// 'instance additionalProperty "Sequence" exists in instance when not allowed'
// );
// });
// LastLedgerSequence aka maxLedgerVersion/maxLedgerVersionOffset:
// it("does not overwrite LastLedgerSequence in txJSON", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: "0.000012",
// Sequence: 100, // Intentionally capitalized in this test, but the correct field would be `sequence`
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// 'instance additionalProperty "Sequence" exists in instance when not allowed'
// );
// });
it('does not overwrite maxLedgerVersion in Instructions', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
maxLedgerVersion: 8890000,
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Authorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8890000,"Fee":"12","Sequence":23}`,
instructions: {
fee: '0.000012',
sequence: 23,
maxLedgerVersion: 8890000,
},
}
return assertResultMatch(response, expected, 'prepare')
})
it('does not overwrite maxLedgerVersionOffset in Instructions', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxLedgerVersionOffset: 124,
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Authorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8820075,"Fee":"12","Sequence":23}`,
instructions: {
fee: '0.000012',
sequence: 23,
maxLedgerVersion: 8820075,
},
}
return assertResultMatch(response, expected, 'prepare')
})
// it("rejects Promise if txJSON.LastLedgerSequence and instructions.maxLedgerVersion both are set", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// maxLedgerVersion: 8900000,
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// Fee: "16",
// LastLedgerSequence: 8900000,
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "`LastLedgerSequence` in txJSON and `maxLedgerVersion` in `instructions` cannot both be set"
// );
// });
// it("rejects Promise if txJSON.LastLedgerSequence and instructions.maxLedgerVersionOffset both are set", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxLedgerVersionOffset: 123,
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// Fee: "16",
// LastLedgerSequence: 8900000,
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "`LastLedgerSequence` in txJSON and `maxLedgerVersionOffset` in `instructions` cannot both be set"
// );
// });
// it("rejects Promise if instructions.maxLedgerVersion and instructions.maxLedgerVersionOffset both are set", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxLedgerVersion: 8900000,
// maxLedgerVersionOffset: 123,
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// Fee: "16",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "instance is of prohibited type [object Object]"
// );
// });
// it("rejects Promise if txJSON.LastLedgerSequence and instructions.maxLedgerVersion and instructions.maxLedgerVersionOffset all are set", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxLedgerVersion: 8900000,
// maxLedgerVersionOffset: 123,
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// Fee: "16",
// LastLedgerSequence: 8900000,
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "instance is of prohibited type [object Object]"
// );
// });
// it("rejects Promise when the maxLedgerVersion is capitalized in Instructions", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// MaxLedgerVersion: 8900000, // Intentionally capitalized in this test, but the correct field would be `maxLedgerVersion`
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// 'instance additionalProperty "MaxLedgerVersion" exists in instance when not allowed'
// );
// });
// it("rejects Promise when the maxLedgerVersion is specified in txJSON", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxLedgerVersion: 8900000,
// maxLedgerVersionOffset: 123,
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// Fee: "16",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "instance is of prohibited type [object Object]"
// );
// });
it('rejects Promise when the maxLedgerVersionOffset is specified in txJSON', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = instructionsWithMaxLedgerVersionOffset
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
maxLedgerVersionOffset: 8900000,
}
await assertRejects(
this.client.prepareTransaction(txJSON, localInstructions),
ValidationError,
'txJSON additionalProperty "maxLedgerVersionOffset" exists in instance when not allowed',
)
})
it('rejects Promise when the sequence is specified in txJSON', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = instructionsWithMaxLedgerVersionOffset
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
sequence: 8900000,
}
await assertRejects(
this.client.prepareTransaction(txJSON, localInstructions),
ValidationError,
'txJSON additionalProperty "sequence" exists in instance when not allowed',
)
})
// Paths: is not auto-filled by ripple-lib.
// Other errors:
// it("rejects Promise when an unrecognized field is in Instructions", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: "0.000012",
// foo: "bar",
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// 'instance additionalProperty "foo" exists in instance when not allowed'
// );
// });
// it("rejects Promise when Account is missing", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: "0.000012",
// };
// // Marking as "any" to get around the fact that TS won't allow this.
// const txJSON: any = {
// TransactionType: "DepositPreauth",
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// 'instance requires property "Account"'
// );
// });
// it("rejects Promise when Account is not a string", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: "0.000012",
// };
// // Marking as "any" to get around the fact that TS won't allow this.
// const txJSON: any = {
// Account: 1234,
// TransactionType: "DepositPreauth",
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "instance.Account is not of a type(s) string,instance.Account is not exactly one from <xAddress>,<classicAddress>"
// );
// });
// it("rejects Promise when Account is invalid", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: "0.000012",
// };
// const txJSON = {
// Account: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xkXXXX", // Invalid checksum
// TransactionType: "DepositPreauth",
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "instance.Account is not exactly one from <xAddress>,<classicAddress>"
// );
// });
// 'rejects Promise when Account is valid but non-existent on the ledger': async (
// client
// ) => {
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: '0.000012'
// }
// const txJSON = {
// Account: 'rogvkYnY8SWjxkJNgU4ZRVfLeRyt5DR9i',
// TransactionType: 'DepositPreauth',
// Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo'
// }
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// RippledError,
// 'Account not found.'
// )
// },
// it("rejects Promise when TransactionType is missing", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: "0.000012",
// };
// // Marking as "any" to get around the fact that TS won't allow this.
// const txJSON: any = {
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// 'instance requires property "TransactionType"'
// );
// });
// Note: This transaction will fail at the `sign` step:
//
// Error: DepositPreXXXX is not a valid name or ordinal for TransactionType
//
// at Function.from (ripple-binary-codec/distrib/npm/enums/index.js:43:15)
it('prepares tx when TransactionType is invalid', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
Account: addresses.ACCOUNT,
TransactionType: 'DepositPreXXXX',
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreXXXX","Account":"${addresses.ACCOUNT}","Authorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"12","Sequence":23}`,
instructions: {
fee: '0.000012',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
return assertResultMatch(response, expected, 'prepare')
})
// it("rejects Promise when TransactionType is not a string", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ...instructionsWithMaxLedgerVersionOffset,
// maxFee: "0.000012",
// };
// // Marking as "any" to get around the fact that TS won't allow this.
// const txJSON: any = {
// Account: addresses.ACCOUNT,
// TransactionType: 1234,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "instance.TransactionType is not of a type(s) string"
// );
// });
// Note: This transaction will fail at the `submit` step:
//
// [RippledError(Submit failed, { resultCode: 'temMALFORMED',
// resultMessage: 'Malformed transaction.',
// engine_result: 'temMALFORMED',
// engine_result_code: -299,
// engine_result_message: 'Malformed transaction.',
// tx_blob:
// '120013240000000468400000000000000C732102E1EA8199F570E7F997A7B34EDFDA0A7D8B38173A17450B121A2EB048FDD16CA97446304402201F0EF6A2DE7F96966F7082294D14F3EC1EF59C21E29443E5858A0120079357A302203CDB7FEBDEAAD93FF39CB589B55778CB80DC3979F96F27E828D5E659BEB26B7A8114D51F9A17208CF113AF23B97ECD5FCD314FBAE52E',
// tx_json:
// { Account: 'rLRt8bmZFBEeM5VMSxZy15k8KKJEs68W6C',
// Fee: '12',
// Sequence: 4,
// SigningPubKey:
// '02E1EA8199F570E7F997A7B34EDFDA0A7D8B38173A17450B121A2EB048FDD16CA9',
// TransactionType: 'DepositPreauth',
// TxnSignature:
// '304402201F0EF6A2DE7F96966F7082294D14F3EC1EF59C21E29443E5858A0120079357A302203CDB7FEBDEAAD93FF39CB589B55778CB80DC3979F96F27E828D5E659BEB26B7A',
// hash:
// 'C181D470684311658852713DA81F8201062535C8DE2FF853F7DD9981BB85312F' } })]
it('prepares tx when a required field is missing', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
Account: addresses.ACCOUNT,
TransactionType: 'DepositPreauth',
// Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo' // Normally required, intentionally removed
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"12","Sequence":23}`,
instructions: {
fee: '0.000012',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
return assertResultMatch(response, expected, 'prepare')
})
it('DepositPreauth - Authorize', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Authorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
}
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Authorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"12","Sequence":23}`,
instructions: {
fee: '0.000012',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
return assertResultMatch(response, expected, 'prepare')
})
it('DepositPreauth - Unauthorize', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
TransactionType: 'DepositPreauth',
Account: addresses.ACCOUNT,
Unauthorize: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"DepositPreauth","Account":"${addresses.ACCOUNT}","Unauthorize":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"12","Sequence":23}`,
instructions: {
fee: '0.000012',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
return assertResultMatch(response, expected, 'prepare')
})
it('AccountDelete', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '5.0', // 5 XRP fee for AccountDelete
}
const txJSON = {
TransactionType: 'AccountDelete',
Account: addresses.ACCOUNT,
Destination: 'rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe',
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
const expected = {
txJSON: `{"TransactionType":"AccountDelete","Account":"${addresses.ACCOUNT}","Destination":"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe","Flags":2147483648,"LastLedgerSequence":8820051,"Fee":"12","Sequence":23}`,
instructions: {
fee: '0.000012',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
return assertResultMatch(response, expected, 'prepare')
})
// prepareTransaction - Payment
it('Payment - normal', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
TransactionType: 'Payment',
Account: addresses.ACCOUNT,
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: {
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
value: '0.01',
},
SendMax: {
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
value: '0.01',
},
Flags: 0,
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(response, responses.preparePayment.normal, 'prepare')
})
it('min amount xrp', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
TransactionType: 'Payment',
Account: addresses.ACCOUNT,
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
// Max amount to send. Use 100 billion XRP to
// ensure that we send the full SendMax amount.
Amount: '100000000000000000',
SendMax: {
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
value: '0.01',
},
DeliverMin: '10000',
Flags: this.client.txFlags.Payment.PartialPayment,
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(
response,
responses.preparePayment.minAmountXRP,
'prepare',
)
})
it('min amount xrp2xrp', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const txJSON = {
TransactionType: 'Payment',
Account: addresses.ACCOUNT,
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: '10000',
Flags: 0,
}
const response = await this.client.prepareTransaction(
txJSON,
instructionsWithMaxLedgerVersionOffset,
)
assertResultMatch(
response,
responses.preparePayment.minAmountXRPXRP,
'prepare',
)
})
// 'with all options specified': async (client, addresses.ACCOUNT) => {
// const ledgerResponse = await this.client.request({
// command: 'ledger',
// ledger_index: 'validated'
// })
// const version = ledgerResponse.result.ledger_index
// const localInstructions = {
// maxLedgerVersion: version + 100,
// fee: '0.000012'
// }
// const txJSON = {
// TransactionType: 'Payment',
// Account: addresses.ACCOUNT,
// Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
// Amount: '10000',
// InvoiceID:
// 'A98FD36C17BE2B8511AD36DC335478E7E89F06262949F36EB88E2D683BBCC50A',
// SourceTag: 14,
// DestinationTag: 58,
// Memos: [
// {
// Memo: {
// MemoType: this.client.convertStringToHex('test'),
// MemoFormat: this.client.convertStringToHex('text/plain'),
// MemoData: this.client.convertStringToHex('texted data')
// }
// }
// ],
// Flags:
// 0 |
// this.client.txFlags.Payment.NoRippleDirect |
// this.client.txFlags.Payment.LimitQuality
// }
// const response = await this.client.prepareTransaction(txJSON, localInstructions)
// assertResultMatch(response, responses.preparePayment.allOptions, 'prepare')
// },
it('fee is capped at default maxFee of 2 XRP (using txJSON.LastLedgerSequence)', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
this.client.feeCushion = 1000000
const txJSON = {
Flags: 2147483648,
TransactionType: 'Payment',
Account: 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59',
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: {
value: '0.01',
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
},
SendMax: {
value: '0.01',
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
},
LastLedgerSequence: 8820051,
}
const localInstructions = {}
const expectedResponse = {
txJSON:
'{"Flags":2147483648,"TransactionType":"Payment","Account":"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59","Destination":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Amount":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"SendMax":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"LastLedgerSequence":8820051,"Fee":"2000000","Sequence":23}',
instructions: {
fee: '2',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(response, expectedResponse, 'prepare')
})
it('fee is capped at default maxFee of 2 XRP (using instructions.maxLedgerVersion)', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
this.client.feeCushion = 1000000
const txJSON = {
Flags: 2147483648,
TransactionType: 'Payment',
Account: 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59',
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: {
value: '0.01',
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
},
SendMax: {
value: '0.01',
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
},
}
const localInstructions = {
maxLedgerVersion: 8820051,
}
const expectedResponse = {
txJSON:
'{"Flags":2147483648,"TransactionType":"Payment","Account":"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59","Destination":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Amount":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"SendMax":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"LastLedgerSequence":8820051,"Fee":"2000000","Sequence":23}',
instructions: {
fee: '2',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(response, expectedResponse, 'prepare')
})
// prepareTransaction - Payment
it('fee is capped to custom maxFeeXRP when maxFee exceeds maxFeeXRP', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
this.client.feeCushion = 1000000
this.client.maxFeeXRP = '3'
const localInstructions = {
maxFee: '4', // We are testing that this does not matter; fee is still capped to maxFeeXRP
}
const txJSON = {
Flags: 2147483648,
TransactionType: 'Payment',
Account: 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59',
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: {
value: '0.01',
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
},
SendMax: {
value: '0.01',
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
},
LastLedgerSequence: 8820051,
}
const expectedResponse = {
txJSON:
'{"Flags":2147483648,"TransactionType":"Payment","Account":"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59","Destination":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Amount":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"SendMax":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"LastLedgerSequence":8820051,"Fee":"3000000","Sequence":23}',
instructions: {
fee: '3',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(response, expectedResponse, 'prepare')
})
// prepareTransaction - Payment
it('fee is capped to maxFee', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
this.client.feeCushion = 1000000
this.client.maxFeeXRP = '5'
const localInstructions = {
maxFee: '4', // maxFeeXRP does not matter if maxFee is lower than maxFeeXRP
}
const txJSON = {
Flags: 2147483648,
TransactionType: 'Payment',
Account: 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59',
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: {
value: '0.01',
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
},
SendMax: {
value: '0.01',
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
},
LastLedgerSequence: 8820051,
}
const expectedResponse = {
txJSON:
'{"Flags":2147483648,"TransactionType":"Payment","Account":"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59","Destination":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Amount":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"SendMax":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"LastLedgerSequence":8820051,"Fee":"4000000","Sequence":23}',
instructions: {
fee: '4',
sequence: 23,
maxLedgerVersion: 8820051,
},
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(response, expectedResponse, 'prepare')
})
// 'fee - calculated fee does not use more than 6 decimal places': async (
// client,
// addresses.ACCOUNT
// ) => {
// this.client.connection.request({
// command: 'config',
// data: {loadFactor: 5407.96875}
// })
// const expectedResponse = {
// txJSON:
// '{"Flags":2147483648,"TransactionType":"Payment","Account":"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59","Destination":"rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo","Amount":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"SendMax":{"value":"0.01","currency":"USD","issuer":"rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM"},"LastLedgerSequence":8820051,"Fee":"64896","Sequence":23}',
// instructions: {
// fee: '0.064896',
// sequence: 23,
// maxLedgerVersion: 8820051
// }
// }
// const response = await this.client.preparePayment(
// addresses.ACCOUNT,
// requests.preparePayment.normal,
// instructionsWithMaxLedgerVersionOffset
// )
// assertResultMatch(response, expectedResponse, 'prepare')
// },
it('xaddresses.ACCOUNT-issuer', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
TransactionType: 'Payment',
Account: addresses.ACCOUNT,
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: {
currency: 'USD',
issuer: 'XVbehP2sFMQAd5orFAy8Lt6vLHGiDhA7VMAnsv9H6WpuB1s',
value: '0.01',
},
SendMax: {
currency: 'USD',
issuer: 'XVbehP2sFMQAd5orFAy8Lt6vLHGiDhA7VMAnsv9H6WpuB1s',
value: '0.01',
},
Flags: 0,
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(response, responses.preparePayment.normal, 'prepare')
})
it('PaymentChannelCreate', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const response = await this.client.prepareTransaction(
{
Account: addresses.ACCOUNT,
TransactionType: 'PaymentChannelCreate',
Amount: '1000000', // 1 XRP in drops. Use a string-encoded integer.
Destination: 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW',
SettleDelay: 86400,
PublicKey:
'32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A',
// If cancelAfter is used, you must use RippleTime.
// You can use `ISOTimeToRippleTime()` to convert to RippleTime.
// Other fields are available (but not used in this test),
// including `sourceTag` and `destinationTag`.
},
localInstructions,
)
assertResultMatch(
response,
responses.preparePaymentChannelCreate.normal,
'prepare',
)
})
it('PaymentChannelCreate full', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const txJSON = {
Account: addresses.ACCOUNT,
TransactionType: 'PaymentChannelCreate',
Amount: xrpToDrops('1'), // or '1000000'
Destination: 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW',
SettleDelay: 86400,
// Ensure this is in upper case if it is not already
PublicKey:
'32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A'.toUpperCase(),
CancelAfter: ISOTimeToRippleTime('2017-02-17T15:04:57Z'),
SourceTag: 11747,
DestinationTag: 23480,
}
const response = await this.client.prepareTransaction(txJSON)
assertResultMatch(
response,
responses.preparePaymentChannelCreate.full,
'prepare',
)
})
it('PaymentChannelFund', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
Account: addresses.ACCOUNT,
TransactionType: 'PaymentChannelFund',
Channel:
'C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198',
Amount: xrpToDrops('1'), // or '1000000'
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(
response,
responses.preparePaymentChannelFund.normal,
'prepare',
)
})
it('PaymentChannelFund full', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const txJSON = {
Account: addresses.ACCOUNT,
TransactionType: 'PaymentChannelFund',
Channel:
'C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198',
Amount: xrpToDrops('1'), // or '1000000'
Expiration: ISOTimeToRippleTime('2017-02-17T15:04:57Z'),
}
const response = await this.client.prepareTransaction(txJSON)
assertResultMatch(
response,
responses.preparePaymentChannelFund.full,
'prepare',
)
})
it('PaymentChannelClaim', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
Account: addresses.ACCOUNT,
TransactionType: 'PaymentChannelClaim',
Channel:
'C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198',
Flags: 0,
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(
response,
responses.preparePaymentChannelClaim.normal,
'prepare',
)
})
it('PaymentChannelClaim with renew', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
Account: addresses.ACCOUNT,
TransactionType: 'PaymentChannelClaim',
Channel:
'C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198',
Balance: xrpToDrops('1'), // or '1000000'
Amount: xrpToDrops('1'), // or '1000000'
Signature:
'30440220718D264EF05CAED7C781FF6DE298DCAC68D002562C9BF3A07C1E721B420C0DAB02203A5A4779EF4D2CCC7BC3EF886676D803A9981B928D3B8ACA483B80ECA3CD7B9B',
PublicKey:
'32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A',
Flags: 0,
}
txJSON.Flags |= this.client.txFlags.PaymentChannelClaim.Renew
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(
response,
responses.preparePaymentChannelClaim.renew,
'prepare',
)
})
it('PaymentChannelClaim with close', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
}
const txJSON = {
Account: addresses.ACCOUNT,
TransactionType: 'PaymentChannelClaim',
Channel:
'C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198',
Balance: xrpToDrops('1'), // or 1000000
Amount: xrpToDrops('1'), // or 1000000
Signature:
'30440220718D264EF05CAED7C781FF6DE298DCAC68D002562C9BF3A07C1E721B420C0DAB02203A5A4779EF4D2CCC7BC3EF886676D803A9981B928D3B8ACA483B80ECA3CD7B9B',
PublicKey:
'32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A',
Flags: 0,
}
txJSON.Flags |= this.client.txFlags.PaymentChannelClaim.Close
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(
response,
responses.preparePaymentChannelClaim.close,
'prepare',
)
})
// it("rejects Promise if both sequence and ticketSequence are set", async function () {
// this.mockRippled.addResponse("server_info", rippled.server_info.normal);
// this.mockRippled.addResponse("fee", rippled.fee);
// this.mockRippled.addResponse("ledger_current", rippled.ledger_current);
// this.mockRippled.addResponse("account_info", rippled.account_info.normal);
// const localInstructions = {
// ticketSequence: 23,
// sequence: 23,
// };
// const txJSON = {
// TransactionType: "DepositPreauth",
// Account: addresses.ACCOUNT,
// Authorize: "rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo",
// Fee: "16",
// };
// await assertRejects(
// this.client.prepareTransaction(txJSON, localInstructions),
// ValidationError,
// "instance is of prohibited type [object Object]"
// );
// });
it('sets sequence to 0 if a ticketSequence is passed', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
ticketSequence: 23,
}
const txJSON = {
TransactionType: 'Payment',
Account: addresses.ACCOUNT,
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: {
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
value: '0.01',
},
SendMax: {
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
value: '0.01',
},
Flags: 0,
}
const response = await this.client.prepareTransaction(
txJSON,
localInstructions,
)
assertResultMatch(response, responses.preparePayment.ticket, 'prepare')
})
it('rejects Promise if a sequence with value 0 is passed', async function () {
this.mockRippled.addResponse('server_info', rippled.server_info.normal)
this.mockRippled.addResponse('fee', rippled.fee)
this.mockRippled.addResponse('ledger_current', rippled.ledger_current)
this.mockRippled.addResponse('account_info', rippled.account_info.normal)
const localInstructions = {
...instructionsWithMaxLedgerVersionOffset,
maxFee: '0.000012',
sequence: 0,
}
const txJSON = {
TransactionType: 'Payment',
Account: addresses.ACCOUNT,
Destination: 'rpZc4mVfWUif9CRoHRKKcmhu1nx2xktxBo',
Amount: {
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
value: '0.01',
},
SendMax: {
currency: 'USD',
issuer: 'rMH4UxPrbuMa1spCBR98hLLyNJp4d8p4tM',
value: '0.01',
},
Flags: 0,
}
await assertRejects(
this.client.prepareTransaction(txJSON, localInstructions),
ValidationError,
'`sequence` cannot be 0',
)
})
})