Compare commits

..

15 Commits

Author SHA1 Message Date
Elliot Lee
c3aa062edd Bump version to 0.19.0 and add release notes 2018-03-02 13:58:39 -08:00
Elliot Lee
0ad8c577c0 Export Check* transaction param types 2018-03-01 21:46:20 -08:00
Elliot Lee
facc513a52 Add support for Checks (#853)
- See https://github.com/ripple/rippled/pull/2245

* Add support for depositAuth flag

* Upgrade ripple-binary-codec to 0.1.13
2018-03-01 21:42:46 -08:00
Elliot Lee
df711ecb06 Import from 'server' to fix TS4029 2018-03-01 21:23:02 -08:00
Elliot Lee
144be08af0 Export types used by exported variables (#858)
Fixes TypeScript compile errors due to generating TS declaration files.

See #851
2018-03-01 17:48:28 -08:00
Fred K. Schott
c53db4844a Add .travis.yml (#859) 2018-03-01 17:32:31 -08:00
Elliot Lee
68b34f7532 Improve documentation of getTransactions params (#856)
* Improve documentation of getTransactions params

- Resolve #855
2018-02-26 17:39:06 -08:00
cryptcoin-junkey
3fe5d715a5 Generate/publish *.ts.d (#851)
For TypeScript
2018-02-24 23:52:45 -08:00
Elliot Lee
ca74cf1028 Apply automatic formatting 2018-02-23 16:50:40 -08:00
Elliot Lee
5b51ff6071 Support for the Deposit Authorization account root flag (#852)
* Add depositAuth flag tests
* Add support for depositAuth flag
2018-02-21 17:15:23 -08:00
Elliot Lee
3cad4f4aa3 Apply code formatting to API unit tests 2018-02-21 16:05:57 -08:00
Fred K. Schott
365de6d18a Add new request interface, implement first few request typings (#843)
* Add request interface & typings

- src/api: add basic implementation of request/requestAll()
- src/ledgers/account_info: refactor to simplify with request()
- src/ledgers/balances: refactor to simplify with request()
- src/ledgers/orderbook: refactor to simplify with requestAll()
- src/ledgers/orders: refactor to simplify with requestAll()
- src/ledgers/trustlines: refactor to simplify with requestAll()

* standardize on Formatted prefix
2018-02-20 11:44:36 -08:00
Elliot Lee
4a21360e37 Alphabetize properties for Settings object
- Generate docs to fix earlier typo (yarn run docgen)
2018-02-14 16:22:05 -08:00
Elliot Lee
43a3cfa010 HISTORY.md - remove broken link (404) 2018-02-14 16:00:51 -08:00
Elliot Lee
b89eae5cb1 Add test of getTrustlines with multiple pages of results (#850) 2018-02-14 15:57:35 -08:00
111 changed files with 2746 additions and 810 deletions

9
.travis.yml Normal file
View File

@@ -0,0 +1,9 @@
language: node_js
node_js:
- 6
- 8
- 9
script:
- yarn compile
- yarn test
- yarn build

View File

@@ -1,5 +1,22 @@
# ripple-lib Release History
## 0.19.0 (2018-03-02)
+ [Add support for Checks](https://github.com/ripple/ripple-lib/pull/853)
+ [Add support for the Deposit Authorization account root flag](https://github.com/ripple/ripple-lib/pull/852)
+ [Generate .ts.d TypeScript declaration files](https://github.com/ripple/ripple-lib/pull/851)
+ [Improve documentation of getTransactions params](https://github.com/ripple/ripple-lib/pull/856)
+ [Add new request interface](https://github.com/ripple/ripple-lib/pull/843) (private for now)
The SHA-256 checksums for the browser version of this release can be found
below.
```
% shasum -a 256 *
0e7ce4594b7e455fbc57ad81f6fddc391d1e1f349a49c96ad783be50f80fdc14 ripple-0.19.0-debug.js
6d716a0357929e51e476f22136880f7a0e5458fd396ac145ce9308f278ff7cc1 ripple-0.19.0-min.js
6715db1af638f99226ab7f8f244103306aa6e04d1b8c1da47a63431053bacb84 ripple-0.19.0.js
```
## 0.18.2 (2018-02-13)
+ [Fix: Publish updated browser builds to npm so that users can easily use
@@ -160,7 +177,6 @@ __OTHER CHANGES__
__BREAKING CHANGES__
+ Add new RippleAPI interface and delete old API
- [RippleAPI README and samples](https://github.com/ripple/ripple-lib/tree/develop/docs/samples)
- [Method documentation](https://rawgit.com/ripple/ripple-lib/develop/docs/api.html)
__OTHER CHANGES__
+ [Removed timeout method of Request and added default timeout](https://github.com/ripple/ripple-lib/commit/634fe5683a9082e57682ff7d5c4fb9483b4af818)

View File

@@ -27,6 +27,9 @@
- [Escrow Creation](#escrow-creation)
- [Escrow Cancellation](#escrow-cancellation)
- [Escrow Execution](#escrow-execution)
- [Check Create](#check-create)
- [Check Cancel](#check-cancel)
- [Check Cash](#check-cash)
- [Payment Channel Create](#payment-channel-create)
- [Payment Channel Fund](#payment-channel-fund)
- [Payment Channel Claim](#payment-channel-claim)
@@ -60,6 +63,9 @@
- [preparePaymentChannelCreate](#preparepaymentchannelcreate)
- [preparePaymentChannelClaim](#preparepaymentchannelclaim)
- [preparePaymentChannelFund](#preparepaymentchannelfund)
- [prepareCheckCreate](#preparecheckcreate)
- [prepareCheckCancel](#preparecheckcancel)
- [prepareCheckCash](#preparecheckcash)
- [sign](#sign)
- [combine](#combine)
- [submit](#submit)
@@ -266,6 +272,9 @@ Type | Description
[escrowCreation](#escrow-creation) | An `escrowCreation` transaction creates an escrow on the ledger, which locks XRP until a cryptographic condition is met or it expires. It is like an escrow service where the XRP Ledger acts as the escrow agent.
[escrowCancellation](#escrow-cancellation) | An `escrowCancellation` transaction unlocks the funds in an escrow and sends them back to the creator of the escrow, but it will only work after the escrow expires.
[escrowExecution](#escrow-execution) | An `escrowExecution` transaction unlocks the funds in an escrow and sends them to the destination of the escrow, but it will only work if the cryptographic condition is provided.
[checkCreate](#check-create) | A `checkCreate` transaction creates a check on the ledger, which is a deferred payment that can be cashed by its intended destination.
[checkCancel](#check-cancel) | A `checkCancel` transaction cancels an unreedemed Check, removing it from the ledger without sending any money.
[checkCash](#checkCash) | A `checkCash` transaction redeems a Check to receive up to the amount authorized by the corresponding `checkCreate` transaction. Only the `destination` address of a Check can cash it.
## Transaction Flow
@@ -280,6 +289,9 @@ Executing a transaction with `RippleAPI` requires the following four steps:
* [prepareEscrowCreation](#prepareescrowcreation)
* [prepareEscrowCancellation](#prepareescrowcancellation)
* [prepareEscrowExecution](#prepareescrowexecution)
* [prepareCheckCreate](#preparecheckcreate)
* [prepareCheckCancel](#preparecheckcancel)
* [prepareCheckCash](#preparecheckcash)
2. [Sign](#sign) - Cryptographically sign the transaction locally and save the [transaction ID](#transaction-id). Signing is how the owner of an account authorizes a transaction to take place. For multisignature transactions, the `signedTransaction` fields returned by `sign` must be collected and passed to the [combine](#combine) method.
3. [Submit](#submit) - Submit the transaction to the connected server.
4. Verify - Verify that the transaction got validated by querying with [getTransaction](#gettransaction). This is necessary because transactions may fail even if they were successfully submitted.
@@ -299,7 +311,7 @@ Name | Type | Description
fee | [value](#value) | *Optional* An exact fee to pay for the transaction. See [Transaction Fees](#transaction-fees) for more information.
maxFee | [value](#value) | *Optional* The maximum fee to pay for the transaction. See [Transaction Fees](#transaction-fees) for more information.
maxLedgerVersion | integer,null | *Optional* The highest ledger version that the transaction can be included in. If this option and `maxLedgerVersionOffset` are both omitted, the `maxLedgerVersion` option will default to 3 greater than the current validated ledger version (equivalent to `maxLedgerVersionOffset=3`). Use `null` to not set a maximum ledger version.
maxLedgerVersionOffset | integer | *Optional* Offset from current validated legder version to highest ledger version that the transaction can be included in.
maxLedgerVersionOffset | integer | *Optional* Offset from current validated ledger version to highest ledger version that the transaction can be included in.
sequence | [sequence](#account-sequence-number) | *Optional* The initiating account's sequence number for this transaction.
signersCount | integer | *Optional* Number of signers that will be signing this transaction.
@@ -346,11 +358,11 @@ destination | object | The destination of the funds to be sent.
*destination.* tag | integer | *Optional* An arbitrary unsigned 32-bit integer that identifies a reason for payment or a non-Ripple account.
*destination.* address | [address](#address) | The address to send to.
*destination.* minAmount | [laxAmount](#amount) | The minimum amount to be delivered. (This field is exclusive with destination.amount)
allowPartialPayment | boolean | *Optional* A boolean that, if set to true, indicates that this payment should go through even if the whole amount cannot be delivered because of a lack of liquidity or funds in the source account account
allowPartialPayment | boolean | *Optional* If true, this payment should proceed even if the whole amount cannot be delivered due to a lack of liquidity or a lack of funds in the source account.
invoiceID | string | *Optional* A 256-bit hash that can be used to identify a particular payment.
limitQuality | boolean | *Optional* Only take paths where all the conversions have an input:output ratio that is equal or better than the ratio of destination.amount:source.maxAmount.
memos | [memos](#transaction-memos) | *Optional* Array of memos to attach to the transaction.
noDirectRipple | boolean | *Optional* A boolean that can be set to true if paths are specified and the sender would like the Ripple Network to disregard any direct paths from the source account to the destination account. This may be used to take advantage of an arbitrage opportunity or by gateways wishing to issue balances from a hot wallet to a user who has mistakenly set a trustline directly to the hot wallet
noDirectRipple | boolean | *Optional* If true and paths are specified, the sender would like the XRP Ledger to disregard any direct paths from the source account to the destination account. This may be used to take advantage of an arbitrage opportunity or by gateways wishing to issue balances from a hot wallet to a user who has mistakenly set a trustline directly to the hot wallet.
paths | string | *Optional* The paths of trustlines and orders to use in executing the payment.
### Example
@@ -479,7 +491,8 @@ See [Transaction Types](#transaction-types) for a description.
Name | Type | Description
---- | ---- | -----------
defaultRipple | boolean | *Optional* Enable [rippling](https://ripple.com/knowledge_center/understanding-the-noripple-flag/) on this accounts trust lines by default. (New in [rippled 0.27.3](https://github.com/ripple/rippled/releases/tag/0.27.3))
defaultRipple | boolean | *Optional* Enable [rippling](https://ripple.com/build/understanding-the-noripple-flag/) on this accounts trust lines by default. (New in [rippled 0.27.3](https://github.com/ripple/rippled/releases/tag/0.27.3))
depositAuth | boolean | *Optional* Enable [Deposit Authorization](https://ripple.com/build/deposit-authorization/) on this account. If set, transactions cannot send value of any kind to this account unless the sender of those transactions is the account itself. (Requires the [DepositAuth amendment](https://ripple.com/build/known-amendments/#depositauth))
disableMasterKey | boolean | *Optional* Disallows use of the master key to sign transactions for this account.
disallowIncomingXRP | boolean | *Optional* Indicates that client applications should not send XRP to this account. Not enforced by rippled.
domain | string | *Optional* The domain that owns this account, as a hexadecimal string representing the ASCII for the domain in lowercase.
@@ -592,6 +605,74 @@ memos | [memos](#transaction-memos) | *Optional* Array of memos to attach to the
```
## Check Create
See [Transaction Types](#transaction-types) for a description.
Name | Type | Description
---- | ---- | -----------
destination | [address](#address) | Address of the account that can cash the check.
sendMax | [laxAmount](#amount) | Amount of source currency the check is allowed to debit the sender, including transfer fees on non-XRP currencies.
destinationTag | integer | *Optional* Destination tag that identifies the reason for the check, or a hosted recipient to pay.
expiration | date-time string | *Optional* Time after which the check is no longer valid.
invoiceID | string | *Optional* 256-bit hash, as a 64-character hexadecimal string, representing a specific reason or identifier for this check.
### Example
```json
{
"destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"sendMax": {
"currency": "XRP",
"value": "1"
}
}
```
## Check Cancel
See [Transaction Types](#transaction-types) for a description.
Name | Type | Description
---- | ---- | -----------
checkID | string | The ID of the Check ledger object to cancel, as a 64-character hexadecimal string.
### Example
```json
{
"checkID": "49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0"
}
```
## Check Cash
See [Transaction Types](#transaction-types) for a description.
Name | Type | Description
---- | ---- | -----------
checkID | string | The ID of the Check ledger object to cash, as a 64-character hexadecimal string.
amount | [laxAmount](#amount) | *Optional* Redeem the Check for exactly this amount, if possible. The currency must match that of the sendMax of the corresponding CheckCreate transaction. You must provide either this field or deliverMin.
deliverMin | [laxAmount](#amount) | *Optional* Redeem the Check for at least this amount and for as much as possible. The currency must match that of the sendMax of the corresponding CheckCreate transaction. You must provide either this field or amount.
### Example
```json
{
"amount": {
"currency": "XRP",
"value": "1"
},
"checkID": "838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334"
}
```
## Payment Channel Create
See [Transaction Types](#transaction-types) for a description.
@@ -1021,7 +1102,7 @@ options | object | *Optional* Options to filter the resulting transactions.
*options.* limit | integer | *Optional* If specified, return at most this many transactions.
*options.* maxLedgerVersion | integer | *Optional* Return only transactions in this ledger version or lower.
*options.* minLedgerVersion | integer | *Optional* Return only transactions in this ledger verion or higher.
*options.* start | string | *Optional* If specified, this transaction will be the first transaction in the result.
*options.* start | string | *Optional* If specified, this transaction will be the first transaction in the result. You cannot use `start` with `minLedgerVersion` or `maxLedgerVersion`. When `start` is specified, these ledger versions will be determined internally.
*options.* types | array\<[transactionType](#transaction-types)\> | *Optional* Only return transactions of the specified [Transaction Types](#transaction-types).
### Return Value
@@ -2718,7 +2799,8 @@ This method returns a promise that resolves with an array of objects with the fo
Name | Type | Description
---- | ---- | -----------
defaultRipple | boolean | *Optional* Enable [rippling](https://ripple.com/knowledge_center/understanding-the-noripple-flag/) on this accounts trust lines by default. (New in [rippled 0.27.3](https://github.com/ripple/rippled/releases/tag/0.27.3))
defaultRipple | boolean | *Optional* Enable [rippling](https://ripple.com/build/understanding-the-noripple-flag/) on this accounts trust lines by default. (New in [rippled 0.27.3](https://github.com/ripple/rippled/releases/tag/0.27.3))
depositAuth | boolean | *Optional* Enable [Deposit Authorization](https://ripple.com/build/deposit-authorization/) on this account. If set, transactions cannot send value of any kind to this account unless the sender of those transactions is the account itself. (Requires the [DepositAuth amendment](https://ripple.com/build/known-amendments/#depositauth))
disableMasterKey | boolean | *Optional* Disallows use of the master key to sign transactions for this account.
disallowIncomingXRP | boolean | *Optional* Indicates that client applications should not send XRP to this account. Not enforced by rippled.
domain | string | *Optional* The domain that owns this account, as a hexadecimal string representing the ASCII for the domain in lowercase.
@@ -3590,6 +3672,176 @@ return api.preparePaymentChannelFund(address, paymentChannelFund).then(prepared
```
## prepareCheckCreate
`prepareCheckCreate(address: string, checkCreate: Object, instructions: Object): Promise<Object>`
Prepare a Check creation transaction. The prepared transaction must subsequently be [signed](#sign) and [submitted](#submit).
### Parameters
Name | Type | Description
---- | ---- | -----------
address | [address](#address) | The address of the account that is creating the transaction.
checkCreate | [checkCreate](#check-create) | The specification of the Check create creation to prepare.
instructions | [instructions](#transaction-instructions) | *Optional* Instructions for executing the transaction
### Return Value
This method returns a promise that resolves with an object with the following structure:
<aside class="notice">
All "prepare*" methods have the same return type.
</aside>
Name | Type | Description
---- | ---- | -----------
txJSON | string | The prepared transaction in rippled JSON format.
instructions | object | The instructions for how to execute the transaction after adding automatic defaults.
*instructions.* fee | [value](#value) | An exact fee to pay for the transaction. See [Transaction Fees](#transaction-fees) for more information.
*instructions.* sequence | [sequence](#account-sequence-number) | The initiating account's sequence number for this transaction.
*instructions.* maxLedgerVersion | integer,null | The highest ledger version that the transaction can be included in. Set to `null` if there is no maximum.
### Example
```javascript
const address = 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59';
const checkCreate = {
"destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"sendMax": {
"currency": "XRP",
"value": "1"
}
};
return api.prepareCheckCreate(address, checkCreate).then(prepared =>
{/* ... */});
```
```json
{
"txJSON": "{\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"TransactionType\":\"CheckCreate\",\"Destination\":\"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW\",\"SendMax\":\"1000000\",\"Flags\":2147483648,\"LastLedgerSequence\":8820051,\"Sequence\":23,\"Fee\":\"12\"}",
"instructions": {
"fee": "0.000012",
"sequence": 23,
"maxLedgerVersion": 8820051
}
}
```
## prepareCheckCancel
`prepareCheckCancel(address: string, checkCancel: Object, instructions: Object): Promise<Object>`
Prepare a Check cancellation transaction. This cancels an unredeemed Check, removing it from the ledger without sending any money. The prepared transaction must subsequently be [signed](#sign) and [submitted](#submit).
### Parameters
Name | Type | Description
---- | ---- | -----------
address | [address](#address) | The address of the account that is creating the transaction.
checkCancel | [checkCancel](#check-cancel) | The specification of the Check cancellation to prepare.
instructions | [instructions](#transaction-instructions) | *Optional* Instructions for executing the transaction
### Return Value
This method returns a promise that resolves with an object with the following structure:
<aside class="notice">
All "prepare*" methods have the same return type.
</aside>
Name | Type | Description
---- | ---- | -----------
txJSON | string | The prepared transaction in rippled JSON format.
instructions | object | The instructions for how to execute the transaction after adding automatic defaults.
*instructions.* fee | [value](#value) | An exact fee to pay for the transaction. See [Transaction Fees](#transaction-fees) for more information.
*instructions.* sequence | [sequence](#account-sequence-number) | The initiating account's sequence number for this transaction.
*instructions.* maxLedgerVersion | integer,null | The highest ledger version that the transaction can be included in. Set to `null` if there is no maximum.
### Example
```javascript
const address = 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59';
const checkCancel = {
"checkID": "49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0"
};
return api.prepareCheckCancel(address, checkCancel).then(prepared =>
{/* ... */});
```
```json
{
"txJSON": "{\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"TransactionType\":\"CheckCancel\",\"CheckID\":\"49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0\",\"Flags\":2147483648,\"LastLedgerSequence\":8819954,\"Fee\":\"12\",\"Sequence\":23}",
"instructions": {
"fee": "0.000012",
"sequence": 23,
"maxLedgerVersion": 8819954
}
}
```
## prepareCheckCash
`prepareCheckCash(address: string, checkCash: Object, instructions: Object): Promise<Object>`
Prepare a Check cashing transaction. This redeems a Check to receive up to the amount authorized by the corresponding CheckCreate transaction. The prepared transaction must subsequently be [signed](#sign) and [submitted](#submit).
### Parameters
Name | Type | Description
---- | ---- | -----------
address | [address](#address) | The address of the account that is creating the transaction.
checkCash | [checkCash](#check-cash) | The specification of the Check cash to prepare.
instructions | [instructions](#transaction-instructions) | *Optional* Instructions for executing the transaction
### Return Value
This method returns a promise that resolves with an object with the following structure:
<aside class="notice">
All "prepare*" methods have the same return type.
</aside>
Name | Type | Description
---- | ---- | -----------
txJSON | string | The prepared transaction in rippled JSON format.
instructions | object | The instructions for how to execute the transaction after adding automatic defaults.
*instructions.* fee | [value](#value) | An exact fee to pay for the transaction. See [Transaction Fees](#transaction-fees) for more information.
*instructions.* sequence | [sequence](#account-sequence-number) | The initiating account's sequence number for this transaction.
*instructions.* maxLedgerVersion | integer,null | The highest ledger version that the transaction can be included in. Set to `null` if there is no maximum.
### Example
```javascript
const address = 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59';
const checkCash = {
"amount": {
"currency": "XRP",
"value": "1"
},
"checkID": "838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334"
};
return api.prepareCheckCash(address, checkCash).then(prepared =>
{/* ... */});
```
```json
{
"txJSON": "{\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"TransactionType\":\"CheckCash\",\"CheckID\":\"838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334\",\"Amount\":\"1000000\",\"Flags\":2147483648,\"LastLedgerSequence\":8819954,\"Sequence\":23,\"Fee\":\"12\"}",
"instructions": {
"fee": "0.000012",
"sequence": 23,
"maxLedgerVersion": 8819954
}
}
```
## sign
`sign(txJSON: string, secret: string, options: Object): {signedTransaction: string, id: string}`

View File

@@ -34,6 +34,9 @@
<% include preparePaymentChannelCreate.md.ejs %>
<% include preparePaymentChannelClaim.md.ejs %>
<% include preparePaymentChannelFund.md.ejs %>
<% include prepareCheckCreate.md.ejs %>
<% include prepareCheckCancel.md.ejs %>
<% include prepareCheckCash.md.ejs %>
<% include sign.md.ejs %>
<% include combine.md.ejs %>
<% include submit.md.ejs %>

View File

@@ -0,0 +1,30 @@
## prepareCheckCancel
`prepareCheckCancel(address: string, checkCancel: Object, instructions: Object): Promise<Object>`
Prepare a Check cancellation transaction. This cancels an unredeemed Check, removing it from the ledger without sending any money. The prepared transaction must subsequently be [signed](#sign) and [submitted](#submit).
### Parameters
<%- renderSchema('input/prepare-check-cancel.json') %>
### Return Value
This method returns a promise that resolves with an object with the following structure:
<aside class="notice">
All "prepare*" methods have the same return type.
</aside>
<%- renderSchema('output/prepare.json') %>
### Example
```javascript
const address = 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59';
const checkCancel = <%- importFile('test/fixtures/requests/prepare-check-cancel.json') %>;
return api.prepareCheckCancel(address, checkCancel).then(prepared =>
{/* ... */});
```
<%- renderFixture('responses/prepare-check-cancel.json') %>

View File

@@ -0,0 +1,30 @@
## prepareCheckCash
`prepareCheckCash(address: string, checkCash: Object, instructions: Object): Promise<Object>`
Prepare a Check cashing transaction. This redeems a Check to receive up to the amount authorized by the corresponding CheckCreate transaction. The prepared transaction must subsequently be [signed](#sign) and [submitted](#submit).
### Parameters
<%- renderSchema('input/prepare-check-cash.json') %>
### Return Value
This method returns a promise that resolves with an object with the following structure:
<aside class="notice">
All "prepare*" methods have the same return type.
</aside>
<%- renderSchema('output/prepare.json') %>
### Example
```javascript
const address = 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59';
const checkCash = <%- importFile('test/fixtures/requests/prepare-check-cash-amount.json') %>;
return api.prepareCheckCash(address, checkCash).then(prepared =>
{/* ... */});
```
<%- renderFixture('responses/prepare-check-cash-amount.json') %>

View File

@@ -0,0 +1,30 @@
## prepareCheckCreate
`prepareCheckCreate(address: string, checkCreate: Object, instructions: Object): Promise<Object>`
Prepare a Check creation transaction. The prepared transaction must subsequently be [signed](#sign) and [submitted](#submit).
### Parameters
<%- renderSchema('input/prepare-check-create.json') %>
### Return Value
This method returns a promise that resolves with an object with the following structure:
<aside class="notice">
All "prepare*" methods have the same return type.
</aside>
<%- renderSchema('output/prepare.json') %>
### Example
```javascript
const address = 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59';
const checkCreate = <%- importFile('test/fixtures/requests/prepare-check-create.json') %>;
return api.prepareCheckCreate(address, checkCreate).then(prepared =>
{/* ... */});
```
<%- renderFixture('responses/prepare-check-create.json') %>

View File

@@ -82,6 +82,36 @@ See [Transaction Types](#transaction-types) for a description.
<%- renderFixture('requests/prepare-escrow-execution.json') %>
## Check Create
See [Transaction Types](#transaction-types) for a description.
<%- renderSchema('specifications/check-create.json') %>
### Example
<%- renderFixture('requests/prepare-check-create.json') %>
## Check Cancel
See [Transaction Types](#transaction-types) for a description.
<%- renderSchema('specifications/check-cancel.json') %>
### Example
<%- renderFixture('requests/prepare-check-cancel.json') %>
## Check Cash
See [Transaction Types](#transaction-types) for a description.
<%- renderSchema('specifications/check-cash.json') %>
### Example
<%- renderFixture('requests/prepare-check-cash-amount.json') %>
## Payment Channel Create
See [Transaction Types](#transaction-types) for a description.

View File

@@ -14,6 +14,9 @@ Type | Description
[escrowCreation](#escrow-creation) | An `escrowCreation` transaction creates an escrow on the ledger, which locks XRP until a cryptographic condition is met or it expires. It is like an escrow service where the XRP Ledger acts as the escrow agent.
[escrowCancellation](#escrow-cancellation) | An `escrowCancellation` transaction unlocks the funds in an escrow and sends them back to the creator of the escrow, but it will only work after the escrow expires.
[escrowExecution](#escrow-execution) | An `escrowExecution` transaction unlocks the funds in an escrow and sends them to the destination of the escrow, but it will only work if the cryptographic condition is provided.
[checkCreate](#check-create) | A `checkCreate` transaction creates a check on the ledger, which is a deferred payment that can be cashed by its intended destination.
[checkCancel](#check-cancel) | A `checkCancel` transaction cancels an unreedemed Check, removing it from the ledger without sending any money.
[checkCash](#checkCash) | A `checkCash` transaction redeems a Check to receive up to the amount authorized by the corresponding `checkCreate` transaction. Only the `destination` address of a Check can cash it.
## Transaction Flow
@@ -28,6 +31,9 @@ Executing a transaction with `RippleAPI` requires the following four steps:
* [prepareEscrowCreation](#prepareescrowcreation)
* [prepareEscrowCancellation](#prepareescrowcancellation)
* [prepareEscrowExecution](#prepareescrowexecution)
* [prepareCheckCreate](#preparecheckcreate)
* [prepareCheckCancel](#preparecheckcancel)
* [prepareCheckCash](#preparecheckcash)
2. [Sign](#sign) - Cryptographically sign the transaction locally and save the [transaction ID](#transaction-id). Signing is how the owner of an account authorizes a transaction to take place. For multisignature transactions, the `signedTransaction` fields returned by `sign` must be collected and passed to the [combine](#combine) method.
3. [Submit](#submit) - Submit the transaction to the connected server.
4. Verify - Verify that the transaction got validated by querying with [getTransaction](#gettransaction). This is necessary because transactions may fail even if they were successfully submitted.

View File

@@ -1,6 +1,6 @@
{
"name": "ripple-lib",
"version": "0.18.2",
"version": "0.19.0",
"license": "ISC",
"description": "A JavaScript API for interacting with Ripple in Node.js and the browser",
"files": [
@@ -22,7 +22,7 @@
"jsonschema": "^1.1.1",
"lodash": "^4.17.4",
"ripple-address-codec": "^2.0.1",
"ripple-binary-codec": "^0.1.10",
"ripple-binary-codec": "^0.1.13",
"ripple-hashes": "^0.3.1",
"ripple-keypairs": "^0.10.1",
"ripple-lib-transactionparser": "^0.6.2",

View File

@@ -1,13 +1,15 @@
import * as _ from 'lodash'
import {EventEmitter} from 'events'
import {Connection, errors, validate} from './common'
import * as server from './server/server'
const connect = server.connect
const disconnect = server.disconnect
const getServerInfo = server.getServerInfo
const getFee = server.getFee
const isConnected = server.isConnected
const getLedgerVersion = server.getLedgerVersion
import {
connect,
disconnect,
isConnected,
getServerInfo,
getFee,
getLedgerVersion,
formatLedgerClose
} from './server/server'
import getTransaction from './ledger/transaction'
import getTransactions from './ledger/transactions'
import getTrustlines from './ledger/trustlines'
@@ -29,6 +31,9 @@ import prepareEscrowCancellation from './transaction/escrow-cancellation'
import preparePaymentChannelCreate from './transaction/payment-channel-create'
import preparePaymentChannelFund from './transaction/payment-channel-fund'
import preparePaymentChannelClaim from './transaction/payment-channel-claim'
import prepareCheckCreate from './transaction/check-create'
import prepareCheckCancel from './transaction/check-cancel'
import prepareCheckCash from './transaction/check-cash'
import prepareSettings from './transaction/settings'
import sign from './transaction/sign'
import combine from './transaction/combine'
@@ -39,12 +44,21 @@ import signPaymentChannelClaim from './offline/sign-payment-channel-claim'
import verifyPaymentChannelClaim from './offline/verify-payment-channel-claim'
import getLedger from './ledger/ledger'
import {
AccountOffersRequest, AccountOffersResponse,
AccountInfoRequest, AccountInfoResponse,
AccountLinesRequest, AccountLinesResponse,
BookOffersRequest, BookOffersResponse,
GatewayBalancesRequest, GatewayBalancesResponse
} from './common/types/commands'
import RangeSet from './common/rangeset'
import * as ledgerUtils from './ledger/utils'
import * as schemaValidator from './common/schema-validator'
import {clamp} from './ledger/utils'
type APIOptions = {
export type APIOptions = {
server?: string,
feeCushion?: number,
trace?: boolean,
@@ -52,8 +66,25 @@ type APIOptions = {
timeout?: number
}
/**
* Get the response key / property name that contains the listed data for a
* command. This varies from command to command, but we need to know it to
* properly count across many requests.
*/
function getCollectKeyFromCommand(command: string): string|undefined {
switch (command) {
case 'account_offers':
case 'book_offers':
return 'offers'
case 'account_lines':
return 'lines'
default:
return undefined
}
}
// prevent access to non-validated ledger versions
class RestrictedConnection extends Connection {
export class RestrictedConnection extends Connection {
request(request: any, timeout?: number) {
const ledger_index = request.ledger_index
if (ledger_index !== undefined && ledger_index !== 'validated') {
@@ -88,7 +119,7 @@ class RippleAPI extends EventEmitter {
if (serverURL !== undefined) {
this.connection = new RestrictedConnection(serverURL, options)
this.connection.on('ledgerClosed', message => {
this.emit('ledger', server.formatLedgerClose(message))
this.emit('ledger', formatLedgerClose(message))
})
this.connection.on('error', (errorCode, errorMessage, data) => {
this.emit('error', errorCode, errorMessage, data)
@@ -106,6 +137,92 @@ class RippleAPI extends EventEmitter {
}
}
/**
* Makes a simple request to the API with the given command and any
* additional request body parameters.
*
* NOTE: This command is under development and should not yet be relied
* on by external consumers.
*/
async _request(command: 'account_info', params: AccountInfoRequest):
Promise<AccountInfoResponse>
async _request(command: 'account_lines', params: AccountLinesRequest):
Promise<AccountLinesResponse>
async _request(command: 'account_offers', params: AccountOffersRequest):
Promise<AccountOffersResponse>
async _request(command: 'book_offers', params: BookOffersRequest):
Promise<BookOffersResponse>
async _request(command: 'gateway_balances', params: GatewayBalancesRequest):
Promise<GatewayBalancesResponse>
async _request(command: string, params: any = {}) {
return this.connection.request({
...params,
command
})
}
/**
* Makes multiple paged requests to the API to return a given number of
* resources. __requestAll() will make multiple requests until the `limit`
* number of resources is reached (if no `limit` is provided, a single request
* will be made).
*
* If the command is unknown, an additional `collect` property is required to
* know which response key contains the array of resources.
*
* NOTE: This command is under development and should not yet be relied
* on by external consumers.
*/
async _requestAll(command: 'account_offers', params: AccountOffersRequest):
Promise<AccountOffersResponse[]>
async _requestAll(command: 'book_offers', params: BookOffersRequest):
Promise<BookOffersResponse[]>
async _requestAll(command: 'account_lines', params: AccountLinesRequest):
Promise<AccountLinesResponse[]>
async _requestAll(
command: string,
params: any = {},
options: {collect?: string} = {}): Promise<any[]> {
// The data under collection is keyed based on the command. Fail if command
// not recognized and collection key not provided.
const collectKey = options.collect || getCollectKeyFromCommand(command)
if (!collectKey) {
throw new errors.ValidationError(`no collect key for command ${command}`)
}
// If limit is not provided, fetches all data over multiple requests.
// NOTE: This may return much more than needed. Set limit when possible.
const countTo: number =
(params.limit !== undefined) ? params.limit : Infinity
let count: number = 0
let marker: string = params.marker
let lastBatchLength: number
const results = []
do {
const countRemaining = clamp(countTo - count, 10, 400)
const repeatProps = {
...params,
limit: countRemaining,
marker
}
// NOTE: We have to generalize the `this._request()` function signature
// here until we add support for unknown commands (since command is some
// unknown string).
const singleResult = await (<Function>this._request)(command, repeatProps)
const collectedData = singleResult[collectKey]
marker = singleResult.marker
results.push(singleResult)
// Make sure we handle when no data (not even an empty array) is returned.
const isExpectedFormat = Array.isArray(collectedData)
if (isExpectedFormat) {
count += collectedData.length
lastBatchLength = collectedData.length
} else {
lastBatchLength = 0
}
} while(!!marker && count < countTo && lastBatchLength !== 0)
return results
}
connect = connect
disconnect = disconnect
isConnected = isConnected
@@ -136,6 +253,9 @@ class RippleAPI extends EventEmitter {
preparePaymentChannelCreate = preparePaymentChannelCreate
preparePaymentChannelFund = preparePaymentChannelFund
preparePaymentChannelClaim = preparePaymentChannelClaim
prepareCheckCreate = prepareCheckCreate
prepareCheckCash = prepareCheckCash
prepareCheckCancel = prepareCheckCancel
prepareSettings = prepareSettings
sign = sign
combine = combine

View File

@@ -13,7 +13,7 @@ function isStreamMessageType(type) {
type === 'path_find'
}
interface ConnectionOptions {
export interface ConnectionOptions {
trace?: boolean,
proxy?: string
proxyAuthorization?: string

View File

@@ -4,7 +4,8 @@ import {txFlagIndices} from './txflags'
const accountRootFlags = {
PasswordSpent: 0x00010000, // password set fee is spent
RequireDestTag: 0x00020000, // require a DestinationTag for payments
RequireAuth: 0x00040000, // require a authorization to hold IOUs
RequireAuth: 0x00040000, // require authorization to hold IOUs
DepositAuth: 0x01000000, // require account to auth deposits
DisallowXRP: 0x00080000, // disallow sending XRP
DisableMaster: 0x00100000, // force regular key
NoFreeze: 0x00200000, // permanently disallowed freezing trustlines
@@ -16,6 +17,7 @@ const AccountFlags = {
passwordSpent: accountRootFlags.PasswordSpent,
requireDestinationTag: accountRootFlags.RequireDestTag,
requireAuthorization: accountRootFlags.RequireAuth,
depositAuth: accountRootFlags.DepositAuth,
disallowIncomingXRP: accountRootFlags.DisallowXRP,
disableMasterKey: accountRootFlags.DisableMaster,
noFreeze: accountRootFlags.NoFreeze,
@@ -26,6 +28,7 @@ const AccountFlags = {
const AccountFlagIndices = {
requireDestinationTag: txFlagIndices.AccountSet.asfRequireDest,
requireAuthorization: txFlagIndices.AccountSet.asfRequireAuth,
depositAuth: txFlagIndices.AccountSet.asfDepositAuth,
disallowIncomingXRP: txFlagIndices.AccountSet.asfDisallowXRP,
disableMasterKey: txFlagIndices.AccountSet.asfDisableMaster,
enableTransactionIDTracking: txFlagIndices.AccountSet.asfAccountTxnID,

View File

@@ -29,7 +29,7 @@ class RippleError extends Error {
}
/* console.log in node uses util.inspect on object, and util.inspect allows
us to cutomize its output:
us to customize its output:
https://nodejs.org/api/util.html#util_custom_inspect_function_on_objects */
inspect() {
return this.toString()

View File

@@ -53,6 +53,9 @@ function loadSchemas() {
require('./schemas/specifications/payment-channel-create.json'),
require('./schemas/specifications/payment-channel-fund.json'),
require('./schemas/specifications/payment-channel-claim.json'),
require('./schemas/specifications/check-create.json'),
require('./schemas/specifications/check-cash.json'),
require('./schemas/specifications/check-cancel.json'),
require('./schemas/specifications/trustline.json'),
require('./schemas/output/sign.json'),
require('./schemas/output/submit.json'),
@@ -100,6 +103,9 @@ function loadSchemas() {
require('./schemas/input/prepare-payment-channel-create.json'),
require('./schemas/input/prepare-payment-channel-fund.json'),
require('./schemas/input/prepare-payment-channel-claim.json'),
require('./schemas/input/prepare-check-create.json'),
require('./schemas/input/prepare-check-cash.json'),
require('./schemas/input/prepare-check-cancel.json'),
require('./schemas/input/compute-ledger-hash.json'),
require('./schemas/input/sign.json'),
require('./schemas/input/submit.json'),

View File

@@ -13,7 +13,7 @@
"properties": {
"start": {
"$ref": "hash256",
"description": "If specified, this transaction will be the first transaction in the result."
"description": "If specified, this transaction will be the first transaction in the result. You cannot use `start` with `minLedgerVersion` or `maxLedgerVersion`. When `start` is specified, these ledger versions will be determined internally."
},
"limit": {
"type": "integer",

View File

@@ -0,0 +1,18 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "prepareCheckCancelParameters",
"type": "object",
"properties": {
"address": {
"$ref": "address",
"description": "The address of the account that is creating the transaction."
},
"checkCancel": {
"$ref": "checkCancel",
"description": "The specification of the Check cancellation to prepare."
},
"instructions": {"$ref": "instructions"}
},
"additionalProperties": false,
"required": ["address", "checkCancel"]
}

View File

@@ -0,0 +1,18 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "prepareCheckCashParameters",
"type": "object",
"properties": {
"address": {
"$ref": "address",
"description": "The address of the account that is creating the transaction."
},
"checkCash": {
"$ref": "checkCash",
"description": "The specification of the Check cash to prepare."
},
"instructions": {"$ref": "instructions"}
},
"additionalProperties": false,
"required": ["address", "checkCash"]
}

View File

@@ -0,0 +1,18 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "prepareCheckCreateParameters",
"type": "object",
"properties": {
"address": {
"$ref": "address",
"description": "The address of the account that is creating the transaction."
},
"checkCreate": {
"$ref": "checkCreate",
"description": "The specification of the Check create creation to prepare."
},
"instructions": {"$ref": "instructions"}
},
"additionalProperties": false,
"required": ["address", "checkCreate"]
}

View File

@@ -3,41 +3,25 @@
"title": "settingsPlusMemos",
"type": "object",
"properties": {
"passwordSpent": {
"defaultRipple": {
"type": "boolean",
"description": "Indicates that the account has used its free SetRegularKey transaction."
"description": "Enable [rippling](https://ripple.com/build/understanding-the-noripple-flag/) on this accounts trust lines by default. (New in [rippled 0.27.3](https://github.com/ripple/rippled/releases/tag/0.27.3))"
},
"requireDestinationTag": {
"depositAuth": {
"type": "boolean",
"description": "Requires incoming payments to specify a destination tag."
},
"requireAuthorization": {
"type": "boolean",
"description": "If set, this account must individually approve other users in order for those users to hold this accounts issuances."
},
"disallowIncomingXRP": {
"type": "boolean",
"description": "Indicates that client applications should not send XRP to this account. Not enforced by rippled."
"description": "Enable [Deposit Authorization](https://ripple.com/build/deposit-authorization/) on this account. If set, transactions cannot send value of any kind to this account unless the sender of those transactions is the account itself. (Requires the [DepositAuth amendment](https://ripple.com/build/known-amendments/#depositauth))"
},
"disableMasterKey": {
"type": "boolean",
"description": "Disallows use of the master key to sign transactions for this account."
},
"enableTransactionIDTracking": {
"disallowIncomingXRP": {
"type": "boolean",
"description": "Track the ID of this accounts most recent transaction."
"description": "Indicates that client applications should not send XRP to this account. Not enforced by rippled."
},
"noFreeze": {
"type": "boolean",
"description": "Permanently give up the ability to freeze individual trust lines. This flag can never be disabled after being enabled."
},
"globalFreeze": {
"type": "boolean",
"description": "Freeze all assets issued by this account."
},
"defaultRipple": {
"type": "boolean",
"description": "Enable [rippling](https://ripple.com/knowledge_center/understanding-the-noripple-flag/) on this accounts trust lines by default. (New in [rippled 0.27.3](https://github.com/ripple/rippled/releases/tag/0.27.3))"
"domain": {
"type": "string",
"description": " The domain that owns this account, as a hexadecimal string representing the ASCII for the domain in lowercase."
},
"emailHash": {
"description": "Hash of an email address to be used for generating an avatar image. Conventionally, clients use Gravatar to display this image. Use `null` to clear.",
@@ -46,20 +30,26 @@
{"$ref": "hash128"}
]
},
"enableTransactionIDTracking": {
"type": "boolean",
"description": "Track the ID of this accounts most recent transaction."
},
"globalFreeze": {
"type": "boolean",
"description": "Freeze all assets issued by this account."
},
"memos": {"$ref": "memos"},
"messageKey": {
"type": "string",
"description": "Public key for sending encrypted messages to this account. Conventionally, it should be a secp256k1 key, the same encryption that is used by the rest of Ripple."
},
"domain": {
"type": "string",
"description": " The domain that owns this account, as a hexadecimal string representing the ASCII for the domain in lowercase."
"noFreeze": {
"type": "boolean",
"description": "Permanently give up the ability to freeze individual trust lines. This flag can never be disabled after being enabled."
},
"transferRate": {
"description": " The fee to charge when users transfer this accounts issuances, as the decimal amount that must be sent to deliver 1 unit. Has precision up to 9 digits beyond the decimal point. Use `null` to set no fee.",
"oneOf": [
{"type": "null"},
{"type": "number", "minimum": 1, "maximum": 4.294967295}
]
"passwordSpent": {
"type": "boolean",
"description": "Indicates that the account has used its free SetRegularKey transaction."
},
"regularKey": {
"oneOf": [
@@ -68,6 +58,14 @@
],
"description": "The public key of a new keypair, to use as the regular key to this account, as a base-58-encoded string in the same format as an account address. Use `null` to remove the regular key."
},
"requireAuthorization": {
"type": "boolean",
"description": "If set, this account must individually approve other users in order for those users to hold this accounts issuances."
},
"requireDestinationTag": {
"type": "boolean",
"description": "Requires incoming payments to specify a destination tag."
},
"signers": {
"type": "object",
"description": "Settings that determine what sets of accounts can be used to sign a transaction on behalf of this account using multisigning.",
@@ -97,7 +95,13 @@
}
}
},
"memos": {"$ref": "memos"}
"transferRate": {
"description": " The fee to charge when users transfer this accounts issuances, as the decimal amount that must be sent to deliver 1 unit. Has precision up to 9 digits beyond the decimal point. Use `null` to set no fee.",
"oneOf": [
{"type": "null"},
{"type": "number", "minimum": 1, "maximum": 4.294967295}
]
}
},
"additionalProperties": false
}

View File

@@ -4,8 +4,20 @@
"link": "transaction-types",
"description": "The type of the transaction.",
"type": "string",
"enum": ["payment", "order", "orderCancellation", "trustline", "settings",
"escrowCreation", "escrowCancellation",
"escrowExecution", "paymentChannelCreate",
"paymentChannelFund", "paymentChannelClaim"]
"enum": [
"payment",
"order",
"orderCancellation",
"trustline",
"settings",
"escrowCreation",
"escrowCancellation",
"escrowExecution",
"paymentChannelCreate",
"paymentChannelFund",
"paymentChannelClaim",
"checkCreate",
"checkCancel",
"checkCash"
]
}

View File

@@ -3,7 +3,9 @@
"title": "getTransaction",
"link": "gettransaction",
"properties": {
"type": {"$ref": "transactionType"},
"type": {
"$ref": "transactionType"
},
"specification": {
"description": "A specification that would produce the same outcome as this transaction. The structure of the specification depends on the value of the `type` field (see [Transaction Types](#transaction-types) for details). *Note:* This is **not** necessarily the same as the original specification."
},
@@ -24,73 +26,182 @@
"description": "The account sequence number of the transaction for the account that initiated it."
}
},
"required": ["id", "address", "sequence", "type", "specification", "outcome"],
"required": [
"id",
"address",
"sequence",
"type",
"specification",
"outcome"
],
"additionalProperties": false,
"oneOf": [
{
"properties": {
"type": {"enum": ["payment"]},
"specification": {"$ref": "payment"}
"type": {
"enum": [
"payment"
]
},
"specification": {
"$ref": "payment"
}
}
},
{
"properties": {
"type": {"enum": ["order"]},
"specification": {"$ref": "order"}
"type": {
"enum": [
"order"
]
},
"specification": {
"$ref": "order"
}
}
},
{
"properties": {
"type": {"enum": ["orderCancellation"]},
"specification": {"$ref": "orderCancellation"}
"type": {
"enum": [
"orderCancellation"
]
},
"specification": {
"$ref": "orderCancellation"
}
}
},
{
"properties": {
"type": {"enum": ["trustline"]},
"specification": {"$ref": "trustline"}
"type": {
"enum": [
"trustline"
]
},
"specification": {
"$ref": "trustline"
}
}
},
{
"properties": {
"type": {"enum": ["settings"]},
"specification": {"$ref": "getSettings"}
"type": {
"enum": [
"settings"
]
},
"specification": {
"$ref": "getSettings"
}
}
},
{
"properties": {
"type": {"enum": ["escrowCreation"]},
"specification": {"$ref": "escrowCreation"}
"type": {
"enum": [
"checkCreate"
]
},
"specification": {
"$ref": "checkCreate"
}
}
},
{
"properties": {
"type": {"enum": ["escrowCancellation"]},
"specification": {"$ref": "escrowCancellation"}
"type": {
"enum": [
"checkCancel"
]
},
"specification": {
"$ref": "checkCancel"
}
}
},
{
"properties": {
"type": {"enum": ["escrowExecution"]},
"specification": {"$ref": "escrowExecution"}
"type": {
"enum": [
"checkCash"
]
},
"specification": {
"$ref": "checkCash"
}
}
},
{
"properties": {
"type": {"enum": ["paymentChannelCreate"]},
"specification": {"$ref": "paymentChannelCreate"}
"type": {
"enum": [
"escrowCreation"
]
},
"specification": {
"$ref": "escrowCreation"
}
}
},
{
"properties": {
"type": {"enum": ["paymentChannelFund"]},
"specification": {"$ref": "paymentChannelFund"}
"type": {
"enum": [
"escrowCancellation"
]
},
"specification": {
"$ref": "escrowCancellation"
}
}
},
{
"properties": {
"type": {"enum": ["paymentChannelClaim"]},
"specification": {"$ref": "paymentChannelClaim"}
"type": {
"enum": [
"escrowExecution"
]
},
"specification": {
"$ref": "escrowExecution"
}
}
},
{
"properties": {
"type": {
"enum": [
"paymentChannelCreate"
]
},
"specification": {
"$ref": "paymentChannelCreate"
}
}
},
{
"properties": {
"type": {
"enum": [
"paymentChannelFund"
]
},
"specification": {
"$ref": "paymentChannelFund"
}
}
},
{
"properties": {
"type": {
"enum": [
"paymentChannelClaim"
]
},
"specification": {
"$ref": "paymentChannelClaim"
}
}
}
]

View File

@@ -2,5 +2,7 @@
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "getTransactions",
"type": "array",
"items": {"$ref": "getTransaction"}
"items": {
"$ref": "getTransaction"
}
}

View File

@@ -0,0 +1,14 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "checkCancel",
"link": "check-cancel",
"type": "object",
"properties": {
"checkID": {
"$ref": "hash256",
"description": "The ID of the Check ledger object to cancel, as a 64-character hexadecimal string."
}
},
"required": ["checkID"],
"additionalProperties": false
}

View File

@@ -0,0 +1,26 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "checkCash",
"link": "check-cash",
"type": "object",
"properties": {
"checkID": {
"$ref": "hash256",
"description": "The ID of the Check ledger object to cash, as a 64-character hexadecimal string."
},
"amount": {
"$ref": "laxAmount",
"description": "Redeem the Check for exactly this amount, if possible. The currency must match that of the sendMax of the corresponding CheckCreate transaction. You must provide either this field or deliverMin."
},
"deliverMin": {
"$ref": "laxAmount",
"description": "Redeem the Check for at least this amount and for as much as possible. The currency must match that of the sendMax of the corresponding CheckCreate transaction. You must provide either this field or amount."
}
},
"required": ["checkID"],
"oneOf": [
{"required": ["amount"]},
{"required": ["deliverMin"]}
],
"additionalProperties": false
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "checkCreate",
"link": "check-create",
"type": "object",
"properties": {
"destination": {
"$ref": "address",
"description": "Address of the account that can cash the check."
},
"sendMax": {
"$ref": "laxAmount",
"description": "Amount of source currency the check is allowed to debit the sender, including transfer fees on non-XRP currencies."
},
"destinationTag": {
"$ref": "tag",
"description": "Destination tag that identifies the reason for the check, or a hosted recipient to pay."
},
"expiration": {
"type": "string",
"format": "date-time",
"description": "Time after which the check is no longer valid."
},
"invoiceID": {
"$ref": "hash256",
"description": "256-bit hash, as a 64-character hexadecimal string, representing a specific reason or identifier for this check."
}
},
"required": ["destination", "sendMax"],
"additionalProperties": false
}

View File

@@ -22,11 +22,11 @@
"$ref": "hash256"
},
"allowPartialPayment": {
"description": "A boolean that, if set to true, indicates that this payment should go through even if the whole amount cannot be delivered because of a lack of liquidity or funds in the source account account",
"description": "If true, this payment should proceed even if the whole amount cannot be delivered due to a lack of liquidity or a lack of funds in the source account.",
"type": "boolean"
},
"noDirectRipple": {
"description": "A boolean that can be set to true if paths are specified and the sender would like the Ripple Network to disregard any direct paths from the source account to the destination account. This may be used to take advantage of an arbitrage opportunity or by gateways wishing to issue balances from a hot wallet to a user who has mistakenly set a trustline directly to the hot wallet",
"description": "If true and paths are specified, the sender would like the XRP Ledger to disregard any direct paths from the source account to the destination account. This may be used to take advantage of an arbitrage opportunity or by gateways wishing to issue balances from a hot wallet to a user who has mistakenly set a trustline directly to the hot wallet.",
"type": "boolean"
},
"limitQuality": {

View File

@@ -55,7 +55,8 @@ const txFlagIndices = {
asfAccountTxnID: 5,
asfNoFreeze: 6,
asfGlobalFreeze: 7,
asfDefaultRipple: 8
asfDefaultRipple: 8,
asfDepositAuth: 9
}
}

View File

@@ -1,63 +0,0 @@
export type RippledAmountIOU = {
currency: string,
value: string,
issuer?: string
}
export type RippledAmount = string | RippledAmountIOU
export type Amount = {
value: string,
currency: string,
issuer?: string,
counterparty?: string
}
// Amount where counterparty and value are optional
export type LaxLaxAmount = {
currency: string,
value?: string,
issuer?: string,
counterparty?: string
}
// A currency-counterparty pair, or just currency if it's XRP
export type Issue = {
currency: string,
issuer?: string,
counterparty?: string
}
export type Adjustment = {
address: string,
amount: Amount,
tag?: number
}
export type MaxAdjustment = {
address: string,
maxAmount: Amount,
tag?: number
}
export type MinAdjustment = {
address: string,
minAmount: Amount,
tag?: number
}
export type Memo = {
type?: string,
format?: string,
data?: string
}
export type ApiMemo = {
MemoData?: string,
MemoType?: string,
MemoFormat?: string
}

View File

@@ -0,0 +1,36 @@
import {AccountRoot, SignerList} from '../objects'
export interface AccountInfoRequest {
account: string,
strict?: boolean,
queue?: boolean,
ledger_hash?: string,
ledger_index?: number | ('validated' | 'closed' | 'current'),
signer_lists?: boolean
}
export interface AccountInfoResponse {
account_data: AccountRoot,
signer_lists?: SignerList[],
ledger_current_index?: number,
ledger_index?: number,
queue_data?: QueueData,
validated?: boolean
}
export interface QueueData {
txn_count: number,
auth_change_queued?: boolean,
lowest_sequence?: number,
highest_sequence?: number,
max_spend_drops_total?: string,
transactions?: TransactionData[]
}
export interface TransactionData {
auth_change?: boolean,
fee?: string,
fee_level?: string,
max_spend_drops?: string,
seq?: number
}

View File

@@ -0,0 +1,19 @@
import {Trustline} from '../objects'
export interface AccountLinesRequest {
account: string,
ledger_hash?: string,
ledger_index?: number | ('validated' | 'closed' | 'current'),
peer?: string,
limit?: number,
marker?: any,
}
export interface AccountLinesResponse {
account: string,
lines: Trustline[],
ledger_current_index?: number,
ledger_index?: number,
ledger_hash?: string,
marker?: any,
}

View File

@@ -0,0 +1,27 @@
import {RippledAmount} from '../objects'
export interface AccountOffersRequest {
account: string,
ledger_hash?: string,
ledger_index?: number | ('validated' | 'closed' | 'current'),
limit?: number,
marker?: any,
}
export interface AccountOffersResponse {
account: string,
ledger_hash?: string,
ledger_current_index?: number,
ledger_index?: number,
marker?: any,
offers?: AccountOffer[],
}
export interface AccountOffer {
seq: number,
flags: number,
taker_gets: RippledAmount,
taker_pays: RippledAmount,
quality: string,
expiration?: number
}

View File

@@ -0,0 +1,30 @@
import {
TakerRequestAmount,
OfferCreateTransaction,
RippledAmount
} from '../objects'
export interface BookOffersRequest {
taker?: string,
taker_gets: TakerRequestAmount,
taker_pays: TakerRequestAmount,
ledger_hash?: string,
ledger_index?: number | ('validated' | 'closed' | 'current'),
limit?: number,
marker?: any
}
export interface BookOffersResponse {
offers: OrderBookOffer[],
ledger_hash?: string,
ledger_current_index?: number,
ledger_index?: number,
marker?: any
}
export interface OrderBookOffer extends OfferCreateTransaction {
quality?: number
owner_funds?: string,
taker_gets_funded?: RippledAmount,
taker_pays_funded?: RippledAmount
}

View File

@@ -0,0 +1,20 @@
import {Amount} from '../objects'
export interface GatewayBalancesRequest {
account: string,
strict?: boolean,
hotwallet: string|Array<string>,
ledger_hash?: string,
ledger_index?: number | ('validated' | 'closed' | 'current')
}
export interface GatewayBalancesResponse {
account: string,
obligations?: {[currency: string]: string},
balances?: {[address: string]: Amount[]},
assets?: {[address: string]: Amount[]},
ledger_hash?: string,
ledger_current_index?: number,
ledger_index?: number
}

View File

@@ -0,0 +1,5 @@
export * from './account_info'
export * from './account_lines'
export * from './account_offers'
export * from './book_offers'
export * from './gateway_balances'

View File

@@ -0,0 +1,17 @@
export interface AccountRoot {
LedgerEntryType: string,
Account: string,
Flags: number,
Sequence: number,
Balance: string,
OwnerCount: number,
PreviousTxnID: string,
PreviousTxnLgrSeq: number,
AccountTxnID?: string,
RegularKey?: string,
EmailHash?: string,
MessageKey?: string
TickSize?: number,
TransferRate?: number,
Domain?: string
}

View File

@@ -0,0 +1,19 @@
import {Amount} from './amounts'
export type Adjustment = {
address: string,
amount: Amount,
tag?: number
}
export type MaxAdjustment = {
address: string,
maxAmount: Amount,
tag?: number
}
export type MinAdjustment = {
address: string,
minAmount: Amount,
tag?: number
}

View File

@@ -0,0 +1,28 @@
export type Amount = {
value: string,
currency: string,
issuer?: string,
counterparty?: string
}
export type RippledAmount = string | Amount
/**
* Specification of which currency the account taking the offer would pay/
* receive, as an object with currency and issuer fields (omit issuer for XRP).
* Similar to currency amounts.
*/
export interface TakerRequestAmount {
currency: string
issuer?: string
}
/**
* A currency-counterparty pair, or just currency if it's XRP.
*/
export type Issue = {
currency: string,
issuer?: string,
counterparty?: string
}

View File

@@ -0,0 +1,7 @@
export * from './accounts'
export * from './adjustments'
export * from './amounts'
export * from './memos'
export * from './signers'
export * from './transactions'
export * from './trustlines'

View File

@@ -0,0 +1,6 @@
export type Memo = {
type?: string,
format?: string,
data?: string
}

View File

@@ -0,0 +1,14 @@
export interface SignerList {
LedgerEntryType: string,
OwnerNode: string,
SignerQuorum: number,
SignerEntries: SignerEntry[],
SignerListID: number,
PreviousTxnID: string,
PreviousTxnLgrSeq: number
}
export interface SignerEntry {
Account: string,
SignerWeight: number
}

View File

@@ -0,0 +1,22 @@
import {RippledAmount} from './amounts'
import {Memo} from './memos'
export interface OfferCreateTransaction {
TransactionType: 'OfferCreate',
Account: string,
AccountTxnID?: string,
Fee: string,
Field: any,
Flags: number,
LastLedgerSequence?: number,
Sequence: number,
Signers: any[],
SigningPubKey: string,
SourceTag?: number,
TakerGets: RippledAmount,
TakerPays: RippledAmount,
TxnSignature: string,
Expiration?: number,
Memos?: Memo[],
OfferSequence?: number,
}

View File

@@ -0,0 +1,42 @@
import {Memo} from './memos'
export interface Trustline {
account: string,
balance: string,
currency: string,
limit: string,
limit_peer: string,
quality_in: number,
quality_out: number,
no_ripple?: boolean,
no_ripple_peer?: boolean,
freeze?: boolean,
freeze_peer?: boolean,
authorized?: boolean,
peer_authorized?: boolean,
}
export type FormattedTrustlineSpecification = {
currency: string,
counterparty: string,
limit: string,
qualityIn?: number,
qualityOut?: number,
ripplingDisabled?: boolean,
authorized?: boolean,
frozen?: boolean,
memos?: Memo[]
}
export type FormattedTrustline = {
specification: FormattedTrustlineSpecification,
counterparty: {
limit: string,
ripplingDisabled?: boolean,
frozen?: boolean,
authorized?: boolean
},
state: {
balance: string
}
}

View File

@@ -2,7 +2,7 @@ import * as _ from 'lodash'
import BigNumber from 'bignumber.js'
const {deriveKeypair} = require('ripple-keypairs')
import {Amount, RippledAmount} from './types'
import {Amount, RippledAmount} from './types/objects'
function isValidSecret(secret: string): boolean {
try {

View File

@@ -89,6 +89,15 @@ _.partial(schemaValidate, 'preparePaymentChannelFundParameters')
export const preparePaymentChannelClaim =
_.partial(schemaValidate, 'preparePaymentChannelClaimParameters')
export const prepareCheckCreate =
_.partial(schemaValidate, 'prepareCheckCreateParameters')
export const prepareCheckCash =
_.partial(schemaValidate, 'prepareCheckCashParameters')
export const prepareCheckCancel =
_.partial(schemaValidate, 'prepareCheckCancelParameters')
export const sign =
_.partial(schemaValidate, 'signParameters')

View File

@@ -1,31 +1,12 @@
import {validate, removeUndefined, dropsToXrp} from '../common'
import {RippleAPI} from '../api'
import {AccountInfoResponse} from '../common/types/commands/account_info'
type AccountData = {
Sequence: number,
Account: string,
Balance: string,
Flags: number,
LedgerEntryType: string,
OwnerCount: number,
PreviousTxnID: string,
AccountTxnID?: string,
PreviousTxnLgrSeq: number,
index: string
}
type AccountDataResponse = {
account_data: AccountData,
ledger_current_index?: number,
ledger_hash?: string,
ledger_index: number,
validated: boolean
}
type AccountInfoOptions = {
export type GetAccountInfoOptions = {
ledgerVersion?: number
}
type AccountInfoResponse = {
export type FormattedGetAccountInfoResponse = {
sequence: number,
xrpBalance: string,
ownerCount: number,
@@ -34,7 +15,9 @@ type AccountInfoResponse = {
previousAffectingTransactionLedgerVersion: number
}
function formatAccountInfo(response: AccountDataResponse) {
function formatAccountInfo(
response: AccountInfoResponse
): FormattedGetAccountInfoResponse {
const data = response.account_data
return removeUndefined({
sequence: data.Sequence,
@@ -46,17 +29,16 @@ function formatAccountInfo(response: AccountDataResponse) {
})
}
function getAccountInfo(address: string, options: AccountInfoOptions = {}
): Promise<AccountInfoResponse> {
export default async function getAccountInfo(
this: RippleAPI, address: string, options: GetAccountInfoOptions = {}
): Promise<FormattedGetAccountInfoResponse> {
// 1. Validate
validate.getAccountInfo({address, options})
const request = {
command: 'account_info',
// 2. Make Request
const response = await this._request('account_info', {
account: address,
ledger_index: options.ledgerVersion || 'validated'
}
return this.connection.request(request).then(formatAccountInfo)
})
// 3. Return Formatted Response
return formatAccountInfo(response)
}
export default getAccountInfo

View File

@@ -1,14 +1,15 @@
import * as _ from 'lodash'
import * as utils from './utils'
import {validate} from '../common'
import {Amount} from '../common/types'
import {Amount} from '../common/types/objects'
import {ensureLedgerVersion} from './utils'
import {RippleAPI} from '../api'
type BalanceSheetOptions = {
export type BalanceSheetOptions = {
excludeAddresses?: Array<string>,
ledgerVersion?: number
}
type GetBalanceSheet = {
export type GetBalanceSheet = {
balances?: Array<Amount>,
assets?: Array<Amount>,
obligations?: Array<{
@@ -46,21 +47,21 @@ function formatBalanceSheet(balanceSheet): GetBalanceSheet {
return result
}
function getBalanceSheet(address: string, options: BalanceSheetOptions = {}
async function getBalanceSheet(
this: RippleAPI, address: string, options: BalanceSheetOptions = {}
): Promise<GetBalanceSheet> {
// 1. Validate
validate.getBalanceSheet({address, options})
return utils.ensureLedgerVersion.call(this, options).then(_options => {
const request = {
command: 'gateway_balances',
account: address,
strict: true,
hotwallet: _options.excludeAddresses,
ledger_index: _options.ledgerVersion
}
return this.connection.request(request).then(formatBalanceSheet)
options = await ensureLedgerVersion.call(this, options)
// 2. Make Request
const response = await this._request('gateway_balances', {
account: address,
strict: true,
hotwallet: options.excludeAddresses,
ledger_index: options.ledgerVersion
})
// 3. Return Formatted Response
return formatBalanceSheet(response)
}
export default getBalanceSheet

View File

@@ -1,18 +1,19 @@
import * as utils from './utils'
import {validate} from '../common'
import {Connection} from '../common'
import {TrustlinesOptions, Trustline} from './trustlines-types'
import {GetTrustlinesOptions} from './trustlines'
import {FormattedTrustline} from '../common/types/objects/trustlines'
type Balance = {
export type Balance = {
value: string,
currency: string,
counterparty?: string
}
type GetBalances = Array<Balance>
export type GetBalances = Array<Balance>
function getTrustlineBalanceAmount(trustline: Trustline) {
function getTrustlineBalanceAmount(trustline: FormattedTrustline) {
return {
currency: trustline.specification.currency,
counterparty: trustline.specification.counterparty,
@@ -46,7 +47,7 @@ function getLedgerVersionHelper(connection: Connection, optionValue?: number
return connection.getLedgerVersion()
}
function getBalances(address: string, options: TrustlinesOptions = {}
function getBalances(address: string, options: GetTrustlinesOptions = {}
): Promise<GetBalances> {
validate.getTrustlines({address, options})

View File

@@ -2,7 +2,7 @@ import {validate} from '../common'
import parseLedger from './parse/ledger'
import {GetLedger} from './types'
type LedgerOptions = {
export type LedgerOptions = {
ledgerVersion?: number,
includeAllData?: boolean,
includeTransactions?: boolean,

View File

@@ -2,16 +2,22 @@ import * as _ from 'lodash'
import * as utils from './utils'
import parseOrderbookOrder from './parse/orderbook-order'
import {validate} from '../common'
import {Connection} from '../common'
import {OrdersOptions, OrderSpecification} from './types'
import {Amount, Issue} from '../common/types'
import {OrderSpecification} from './types'
import {Amount, Issue} from '../common/types/objects'
import {RippleAPI} from '../api'
import {OfferCreateTransaction} from '../common/types/objects'
type Orderbook = {
export type OrdersOptions = {
limit?: number,
ledgerVersion?: number
}
export type Orderbook = {
base: Issue,
counter: Issue
}
type OrderbookItem = {
export type OrderbookItem = {
specification: OrderSpecification,
properties: {
maker: string,
@@ -24,33 +30,13 @@ type OrderbookItem = {
}
}
type OrderbookOrders = Array<OrderbookItem>
export type OrderbookOrders = Array<OrderbookItem>
type GetOrderbook = {
export type GetOrderbook = {
bids: OrderbookOrders,
asks: OrderbookOrders
}
// account is to specify a "perspective", which affects which unfunded offers
// are returned
function getBookOffers(connection: Connection, account: string,
ledgerVersion: number|undefined, limit: number|undefined, takerGets: Issue,
takerPays: Issue
): Promise<Object[]> {
const orderData = utils.renameCounterpartyToIssuerInOrder({
taker_gets: takerGets,
taker_pays: takerPays
})
return connection.request({
command: 'book_offers',
taker_gets: orderData.taker_gets,
taker_pays: orderData.taker_pays,
ledger_index: ledgerVersion || 'validated',
limit: limit,
taker: account
}).then(data => data.offers)
}
function isSameIssue(a: Amount, b: Amount) {
return a.currency === b.currency && a.counterparty === b.counterparty
}
@@ -75,7 +61,8 @@ function alignOrder(base: Amount, order: OrderbookItem) {
return isSameIssue(quantity, base) ? order : flipOrder(order)
}
function formatBidsAndAsks(orderbook: Orderbook, offers) {
function formatBidsAndAsks(
orderbook: Orderbook, offers: OfferCreateTransaction[]) {
// the "base" currency is the currency that you are buying or selling
// the "counter" is the currency that the "base" is priced in
// a "bid"/"ask" is an order to buy/sell the base, respectively
@@ -93,17 +80,42 @@ function formatBidsAndAsks(orderbook: Orderbook, offers) {
return {bids, asks}
}
function getOrderbook(address: string, orderbook: Orderbook,
options: OrdersOptions = {}
): Promise<GetOrderbook> {
validate.getOrderbook({address, orderbook, options})
const getter = _.partial(getBookOffers, this.connection, address,
options.ledgerVersion, options.limit)
const getOffers = _.partial(getter, orderbook.base, orderbook.counter)
const getReverseOffers = _.partial(getter, orderbook.counter, orderbook.base)
return Promise.all([getOffers(), getReverseOffers()]).then(data =>
formatBidsAndAsks(orderbook, _.flatten(data)))
// account is to specify a "perspective", which affects which unfunded offers
// are returned
async function makeRequest(
api: RippleAPI, taker: string, options: OrdersOptions,
takerGets: Issue, takerPays: Issue
) {
const orderData = utils.renameCounterpartyToIssuerInOrder({
taker_gets: takerGets,
taker_pays: takerPays
})
return api._requestAll('book_offers', {
taker_gets: orderData.taker_gets,
taker_pays: orderData.taker_pays,
ledger_index: options.ledgerVersion || 'validated',
limit: options.limit,
taker
})
}
export default getOrderbook
export default async function getOrderbook(
this: RippleAPI,
address: string,
orderbook: Orderbook,
options: OrdersOptions = {}
): Promise<GetOrderbook> {
// 1. Validate
validate.getOrderbook({address, orderbook, options})
// 2. Make Request
const [directOfferResults, reverseOfferResults] = await Promise.all([
makeRequest(this, address, options, orderbook.base, orderbook.counter),
makeRequest(this, address, options, orderbook.counter, orderbook.base)
])
// 3. Return Formatted Response
const directOffers = _.flatMap(directOfferResults,
directOfferResult => directOfferResult.offers)
const reverseOffers = _.flatMap(reverseOfferResults,
reverseOfferResult => reverseOfferResult.offers)
return formatBidsAndAsks(orderbook, [...directOffers, ...reverseOffers])
}

View File

@@ -1,37 +1,39 @@
import * as _ from 'lodash'
import * as utils from './utils'
import {validate} from '../common'
import {Connection} from '../common'
import parseAccountOrder from './parse/account-order'
import {OrdersOptions, Order} from './types'
import {Order} from './types'
import {RippleAPI} from '../api'
import {AccountOffersResponse} from '../common/types/commands/account_offers'
type GetOrders = Array<Order>
function requestAccountOffers(connection: Connection, address: string,
ledgerVersion: number, marker: string, limit: number
): Promise<Object> {
return connection.request({
command: 'account_offers',
account: address,
marker: marker,
limit: utils.clamp(limit, 10, 400),
ledger_index: ledgerVersion
}).then(data => ({
marker: data.marker,
results: data.offers.map(_.partial(parseAccountOrder, address))
}))
export type GetOrdersOptions = {
limit?: number,
ledgerVersion?: number
}
function getOrders(address: string, options: OrdersOptions = {}
): Promise<GetOrders> {
function formatResponse(
address: string, responses: AccountOffersResponse[]
): Order[] {
let orders: Order[] = []
for (const response of responses) {
const offers = response.offers.map(offer => {
return parseAccountOrder(address, offer)
})
orders = orders.concat(offers)
}
return _.sortBy(orders, order => order.properties.sequence)
}
export default async function getOrders(
this: RippleAPI, address: string, options: GetOrdersOptions = {}
): Promise<Order[]> {
// 1. Validate
validate.getOrders({address, options})
return utils.ensureLedgerVersion.call(this, options).then(_options => {
const getter = _.partial(requestAccountOffers, this.connection, address,
_options.ledgerVersion)
return utils.getRecursive(getter, _options.limit).then(orders =>
_.sortBy(orders, order => order.properties.sequence))
// 2. Make Request
const responses = await this._requestAll('account_offers', {
account: address,
ledger_index: options.ledgerVersion || await this.getLedgerVersion(),
limit: options.limit
})
// 3. Return Formatted Response
return formatResponse(address, responses)
}
export default getOrders

View File

@@ -3,6 +3,7 @@ import parseAmount from './amount'
import {parseTimestamp, adjustQualityForXRP} from './utils'
import {removeUndefined} from '../../common'
import {orderFlags} from './flags'
import {Order} from '../types'
// TODO: remove this function once rippled provides quality directly
function computeQuality(takerGets, takerPays) {
@@ -12,7 +13,7 @@ function computeQuality(takerGets, takerPays) {
// rippled 'account_offers' returns a different format for orders than 'tx'
// the flags are also different
function parseAccountOrder(address: string, order: any): Object {
function parseAccountOrder(address: string, order: any): Order {
const direction = (order.flags & orderFlags.Sell) === 0 ? 'buy' : 'sell'
const takerGetsAmount = parseAmount(order.taker_gets)
const takerPaysAmount = parseAmount(order.taker_pays)

View File

@@ -1,24 +1,13 @@
import {parseQuality} from './utils'
import {removeUndefined} from '../../common'
type Trustline = {
account: string, limit: number, currency: string, quality_in: number|null,
quality_out: number|null, no_ripple: boolean, freeze: boolean,
authorized: boolean, limit_peer: string, no_ripple_peer: boolean,
freeze_peer: boolean, peer_authorized: boolean, balance: any
}
type TrustlineSpecification = {}
type TrustlineCounterParty = {}
type TrustlineState = {balance: number}
type AccountTrustline = {
specification: TrustlineSpecification, counterparty: TrustlineCounterParty,
state: TrustlineState
}
import {
Trustline,
FormattedTrustline
} from '../../common/types/objects/trustlines'
// rippled 'account_lines' returns a different format for
// trustlines than 'tx'
function parseAccountTrustline(trustline: Trustline): AccountTrustline {
function parseAccountTrustline(trustline: Trustline): FormattedTrustline {
const specification = removeUndefined({
limit: trustline.limit,
currency: trustline.currency,

View File

@@ -1,5 +1,5 @@
import * as common from '../../common'
import {Amount, RippledAmount} from '../../common/types'
import {Amount, RippledAmount} from '../../common/types/objects'
function parseAmount(amount: RippledAmount): Amount {

View File

@@ -0,0 +1,18 @@
import * as assert from 'assert'
import {removeUndefined} from '../../common'
export type FormattedCheckCancel = {
// ID of the Check ledger object to cancel.
checkID: string
}
function parseCheckCancel(tx: any): FormattedCheckCancel {
assert(tx.TransactionType === 'CheckCancel')
return removeUndefined({
checkID: tx.CheckID
})
}
export default parseCheckCancel

View File

@@ -0,0 +1,35 @@
import * as assert from 'assert'
import {removeUndefined} from '../../common'
import parseAmount from './amount'
import {Amount} from '../../common/types/objects'
export type FormattedCheckCash = {
// ID of the Check ledger object to cash.
checkID: string,
// (Optional) redeem the Check for exactly this amount, if possible.
// The currency must match that of the `SendMax` of the corresponding
// `CheckCreate` transaction.
amount: Amount,
// (Optional) redeem the Check for at least this amount and
// for as much as possible.
// The currency must match that of the `SendMax` of the corresponding
// `CheckCreate` transaction.
deliverMin: Amount
// *must* include either Amount or DeliverMin, but not both.
}
function parseCheckCash(tx: any): FormattedCheckCash {
assert(tx.TransactionType === 'CheckCash')
return removeUndefined({
checkID: tx.CheckID,
amount: tx.Amount && parseAmount(tx.Amount),
deliverMin: tx.DeliverMin && parseAmount(tx.DeliverMin)
})
}
export default parseCheckCash

View File

@@ -0,0 +1,38 @@
import * as assert from 'assert'
import {parseTimestamp} from './utils'
import {removeUndefined} from '../../common'
import parseAmount from './amount'
import {Amount} from '../../common/types/objects'
export type FormattedCheckCreate = {
// account that can cash the check.
destination: string,
// amount the check is allowed to debit the sender,
// including transfer fees on non-XRP currencies.
sendMax: Amount,
// (Optional) identifies the reason for the check, or a hosted recipient.
destinationTag?: string,
// (Optional) time in seconds since the Ripple Epoch.
expiration?: string,
// (Optional) 256-bit hash representing a specific reason or identifier.
invoiceID?: string
}
function parseCheckCreate(tx: any): FormattedCheckCreate {
assert(tx.TransactionType === 'CheckCreate')
return removeUndefined({
destination: tx.Destination,
sendMax: parseAmount(tx.SendMax),
destinationTag: tx.DestinationTag,
expiration: tx.Expiration && parseTimestamp(tx.Expiration),
invoiceID: tx.InvoiceID
})
}
export default parseCheckCreate

View File

@@ -1,6 +1,6 @@
import * as _ from 'lodash'
import parseAmount from './amount'
import {Amount, RippledAmount} from '../../common/types'
import {Amount, RippledAmount} from '../../common/types/objects'
import {Path, GetPaths, RippledPathsResponse} from '../pathfind-types'
function parsePaths(paths) {

View File

@@ -29,7 +29,7 @@ export type LedgerEntryResponse = {
validated: boolean
}
type PaymentChannelResponse = {
export type PaymentChannelResponse = {
account: string,
balance: string,
publicKey: string,

View File

@@ -9,6 +9,9 @@ import parseSettings from './settings'
import parseEscrowCreation from './escrow-creation'
import parseEscrowExecution from './escrow-execution'
import parseEscrowCancellation from './escrow-cancellation'
import parseCheckCreate from './check-create'
import parseCheckCash from './check-cash'
import parseCheckCancel from './check-cancel'
import parsePaymentChannelCreate from './payment-channel-create'
import parsePaymentChannelFund from './payment-channel-fund'
import parsePaymentChannelClaim from './payment-channel-claim'
@@ -26,6 +29,9 @@ function parseTransactionType(type) {
EscrowCreate: 'escrowCreation',
EscrowFinish: 'escrowExecution',
EscrowCancel: 'escrowCancellation',
CheckCreate: 'checkCreate',
CheckCash: 'checkCash',
CheckCancel: 'checkCancel',
PaymentChannelCreate: 'paymentChannelCreate',
PaymentChannelFund: 'paymentChannelFund',
PaymentChannelClaim: 'paymentChannelClaim',
@@ -47,6 +53,9 @@ function parseTransaction(tx: any): any {
'escrowCreation': parseEscrowCreation,
'escrowExecution': parseEscrowExecution,
'escrowCancellation': parseEscrowCancellation,
'checkCreate': parseCheckCreate,
'checkCash': parseCheckCash,
'checkCancel': parseCheckCancel,
'paymentChannelCreate': parsePaymentChannelCreate,
'paymentChannelFund': parsePaymentChannelFund,
'paymentChannelClaim': parsePaymentChannelClaim,

View File

@@ -4,7 +4,7 @@ import BigNumber from 'bignumber.js'
import * as common from '../../common'
import parseAmount from './amount'
import {Amount, Memo} from '../../common/types'
import {Amount, Memo} from '../../common/types/objects'
function adjustQualityForXRP(
quality: string, takerGetsCurrency: string, takerPaysCurrency: string

View File

@@ -1,7 +1,14 @@
import {Amount, LaxLaxAmount, RippledAmount, Adjustment, MaxAdjustment,
MinAdjustment} from '../common/types'
import {Amount, RippledAmount, Adjustment, MaxAdjustment,
MinAdjustment} from '../common/types/objects'
// Amount where counterparty and value are optional
export type LaxLaxAmount = {
currency: string,
value?: string,
issuer?: string,
counterparty?: string
}
export type Path = {
source: Adjustment | MaxAdjustment,

View File

@@ -4,7 +4,7 @@ import {getXRPBalance, renameCounterpartyToIssuer} from './utils'
import {validate, toRippledAmount, errors} from '../common'
import {Connection} from '../common'
import parsePathfind from './parse/pathfind'
import {RippledAmount, Amount} from '../common/types'
import {RippledAmount, Amount} from '../common/types/objects'
import {
GetPaths, PathFind, RippledPathsResponse, PathFindRequest
} from './pathfind-types'

View File

@@ -3,14 +3,15 @@ import parseFields from './parse/fields'
import {validate, constants} from '../common'
const AccountFlags = constants.AccountFlags
type SettingsOptions = {
export type SettingsOptions = {
ledgerVersion?: number
}
type GetSettings = {
export type GetSettings = {
passwordSpent?: boolean,
requireDestinationTag?: boolean,
requireAuthorization?: boolean,
depositAuthorization?: boolean,
disallowIncomingXRP?: boolean,
disableMasterKey?: boolean,
enableTransactionIDTracking?: boolean,

View File

@@ -1,7 +1,7 @@
import {Amount, Memo} from '../common/types'
import {Amount, Memo} from '../common/types/objects'
type Outcome = {
export type Outcome = {
result: string,
ledgerVersion: number,
indexInLedger: number,
@@ -17,7 +17,7 @@ type Outcome = {
timestamp?: string
}
type Adjustment = {
export type Adjustment = {
address: string,
amount: {
currency: string,
@@ -27,7 +27,7 @@ type Adjustment = {
tag?: number
}
type Trustline = {
export type Trustline = {
currency: string,
counterparty: string,
limit: string,
@@ -38,10 +38,11 @@ type Trustline = {
frozen?: boolean
}
type Settings = {
export type Settings = {
passwordSpent?: boolean,
requireDestinationTag?: boolean,
requireAuthorization?: boolean,
depositAuthorization?: boolean,
disallowIncomingXRP?: boolean,
disableMasterKey?: boolean,
enableTransactionIDTracking?: boolean,
@@ -55,11 +56,11 @@ type Settings = {
regularKey?: string
}
type OrderCancellation = {
export type OrderCancellation = {
orderSequence: number
}
type Payment = {
export type Payment = {
source: Adjustment,
destination: Adjustment,
paths?: string,
@@ -70,7 +71,7 @@ type Payment = {
limitQuality?: boolean
}
type PaymentTransaction = {
export type PaymentTransaction = {
type: string,
specification: Payment,
outcome: Outcome,
@@ -91,7 +92,7 @@ export type Order = {
memos?: Memo[]
}
type OrderTransaction = {
export type OrderTransaction = {
type: string,
specification: Order,
outcome: Outcome,
@@ -100,7 +101,7 @@ type OrderTransaction = {
sequence: number
}
type OrderCancellationTransaction = {
export type OrderCancellationTransaction = {
type: string,
specification: OrderCancellation,
outcome: Outcome,
@@ -109,7 +110,7 @@ type OrderCancellationTransaction = {
sequence: number
}
type TrustlineTransaction = {
export type TrustlineTransaction = {
type: string,
specification: Trustline,
outcome: Outcome,
@@ -118,7 +119,7 @@ type TrustlineTransaction = {
sequence: number
}
type SettingsTransaction = {
export type SettingsTransaction = {
type: string,
specification: Settings,
outcome: Outcome,

View File

@@ -9,7 +9,7 @@ import {Connection} from '../common'
import {TransactionType} from './transaction-types'
type TransactionsOptions = {
export type TransactionsOptions = {
start?: string,
limit?: number,
minLedgerVersion?: number,
@@ -23,7 +23,7 @@ type TransactionsOptions = {
startTx?: TransactionType
}
type GetTransactionsResponse = Array<TransactionType>
export type GetTransactionsResponse = Array<TransactionType>
function parseBinaryTransaction(transaction) {
const tx = binary.decode(transaction.tx_blob)

View File

@@ -1,33 +0,0 @@
import {Memo} from '../common/types'
export type TrustLineSpecification = {
currency: string,
counterparty: string,
limit: string,
qualityIn?: number,
qualityOut?: number,
ripplingDisabled?: boolean,
authorized?: boolean,
frozen?: boolean,
memos?: Memo[]
}
export type Trustline = {
specification: TrustLineSpecification,
counterparty: {
limit: string,
ripplingDisabled?: boolean,
frozen?: boolean,
authorized?: boolean
},
state: {
balance: string
}
}
export type TrustlinesOptions = {
counterparty?: string,
currency?: string,
limit?: number,
ledgerVersion?: number
}

View File

@@ -1,53 +1,37 @@
import * as _ from 'lodash'
import * as utils from './utils'
import {validate} from '../common'
import {Connection} from '../common'
import parseAccountTrustline from './parse/account-trustline'
import {TrustlinesOptions, Trustline} from './trustlines-types'
import {RippleAPI} from '../api'
import {FormattedTrustline} from '../common/types/objects/trustlines'
type GetTrustlinesResponse = Array<Trustline>
interface GetAccountLinesResponse {
marker?: any,
results: Trustline[]
export type GetTrustlinesOptions = {
counterparty?: string,
currency?: string,
limit?: number,
ledgerVersion?: number
}
function currencyFilter(currency: string, trustline: Trustline) {
function currencyFilter(currency: string, trustline: FormattedTrustline) {
return currency === null || trustline.specification.currency === currency
}
function formatResponse(options: TrustlinesOptions, data: any) {
return {
marker: data.marker,
results: data.lines.map(parseAccountTrustline)
.filter(_.partial(currencyFilter, options.currency || null))
}
}
function getAccountLines(connection: Connection, address: string,
ledgerVersion: number, options: TrustlinesOptions, marker: string,
limit: number
): Promise<GetAccountLinesResponse> {
const request = {
command: 'account_lines',
async function getTrustlines(
this: RippleAPI, address: string, options: GetTrustlinesOptions = {}
): Promise<FormattedTrustline[]> {
// 1. Validate
validate.getTrustlines({address, options})
const ledgerVersion = await this.getLedgerVersion()
// 2. Make Request
const responses = await this._requestAll('account_lines', {
account: address,
ledger_index: ledgerVersion,
marker: marker,
limit: utils.clamp(limit, 10, 400),
limit: options.limit,
peer: options.counterparty
}
return connection.request(request).then(_.partial(formatResponse, options))
}
function getTrustlines(address: string, options: TrustlinesOptions = {}
): Promise<GetTrustlinesResponse> {
validate.getTrustlines({address, options})
return this.getLedgerVersion().then(ledgerVersion => {
const getter = _.partial(getAccountLines, this.connection, address,
options.ledgerVersion || ledgerVersion, options)
return utils.getRecursive(getter, options.limit)
})
// 3. Return Formatted Response
const trustlines = _.flatMap(responses, response => response.lines)
return trustlines.map(parseAccountTrustline).filter(trustline => {
return currencyFilter(options.currency || null, trustline)
})
}

View File

@@ -1,10 +1,5 @@
import {Amount} from '../common/types'
export type OrdersOptions = {
limit?: number,
ledgerVersion?: number
}
import {Amount} from '../common/types/objects'
export type OrderSpecification = {
direction: string,

View File

@@ -3,14 +3,14 @@ import * as assert from 'assert'
import * as common from '../common'
import {Connection} from '../common'
import {TransactionType} from './transaction-types'
import {Issue} from '../common/types'
import {Issue} from '../common/types/objects'
type RecursiveData = {
export type RecursiveData = {
marker: string,
results: Array<any>
}
type Getter = (marker?: string, limit?: number) => Promise<RecursiveData>
export type Getter = (marker?: string, limit?: number) => Promise<RecursiveData>
function clamp(value: number, min: number, max: number): number {
assert(min <= max, 'Illegal clamp bounds')
@@ -59,7 +59,7 @@ function renameCounterpartyToIssuer<T>(
return withIssuer
}
type RequestBookOffersArgs = {taker_gets: Issue, taker_pays: Issue}
export type RequestBookOffersArgs = {taker_gets: Issue, taker_pays: Issue}
function renameCounterpartyToIssuerInOrder(order: RequestBookOffersArgs) {
const taker_gets = renameCounterpartyToIssuer(order.taker_gets)

View File

@@ -0,0 +1,32 @@
import * as utils from './utils'
import {validate} from '../common'
import {Instructions, Prepare} from './types'
export type CheckCancel = {
checkID: string
}
function createCheckCancelTransaction(account: string,
cancel: CheckCancel
): object {
const txJSON = {
Account: account,
TransactionType: 'CheckCancel',
CheckID: cancel.checkID
}
return txJSON
}
function prepareCheckCancel(address: string,
checkCancel: CheckCancel,
instructions: Instructions = {}
): Promise<Prepare> {
validate.prepareCheckCancel(
{address, checkCancel, instructions})
const txJSON = createCheckCancelTransaction(
address, checkCancel)
return utils.prepareTransaction(txJSON, this, instructions)
}
export default prepareCheckCancel

View File

@@ -0,0 +1,50 @@
import * as utils from './utils'
const ValidationError = utils.common.errors.ValidationError
const toRippledAmount = utils.common.toRippledAmount
import {validate} from '../common'
import {Instructions, Prepare} from './types'
import {Amount} from '../common/types/objects'
export type CheckCash = {
checkID: string,
amount?: Amount,
deliverMin?: Amount
}
function createCheckCashTransaction(account: string,
checkCash: CheckCash
): object {
if (checkCash.amount && checkCash.deliverMin) {
throw new ValidationError('"amount" and "deliverMin" properties on '
+ 'CheckCash are mutually exclusive')
}
const txJSON: any = {
Account: account,
TransactionType: 'CheckCash',
CheckID: checkCash.checkID
}
if (checkCash.amount !== undefined) {
txJSON.Amount = toRippledAmount(checkCash.amount)
}
if (checkCash.deliverMin !== undefined) {
txJSON.DeliverMin = toRippledAmount(checkCash.deliverMin)
}
return txJSON
}
function prepareCheckCash(address: string,
checkCash: CheckCash,
instructions: Instructions = {}
): Promise<Prepare> {
validate.prepareCheckCash(
{address, checkCash, instructions})
const txJSON = createCheckCashTransaction(
address, checkCash)
return utils.prepareTransaction(txJSON, this, instructions)
}
export default prepareCheckCash

View File

@@ -0,0 +1,51 @@
import * as utils from './utils'
const toRippledAmount = utils.common.toRippledAmount
import {validate, iso8601ToRippleTime} from '../common'
import {Instructions, Prepare} from './types'
import {Amount} from '../common/types/objects'
export type CheckCreate = {
destination: string,
sendMax: Amount,
destinationTag?: number,
expiration?: string,
invoiceID?: string
}
function createCheckCreateTransaction(account: string,
check: CheckCreate
): object {
const txJSON: any = {
Account: account,
TransactionType: 'CheckCreate',
Destination: check.destination,
SendMax: toRippledAmount(check.sendMax)
}
if (check.destinationTag !== undefined) {
txJSON.DestinationTag = check.destinationTag
}
if (check.expiration !== undefined) {
txJSON.Expiration = iso8601ToRippleTime(check.expiration)
}
if (check.invoiceID !== undefined) {
txJSON.InvoiceID = check.invoiceID
}
return txJSON
}
function prepareCheckCreate(address: string,
checkCreate: CheckCreate,
instructions: Instructions = {}
): Promise<Prepare> {
validate.prepareCheckCreate(
{address, checkCreate, instructions})
const txJSON = createCheckCreateTransaction(
address, checkCreate)
return utils.prepareTransaction(txJSON, this, instructions)
}
export default prepareCheckCreate

View File

@@ -2,9 +2,9 @@ import * as _ from 'lodash'
import * as utils from './utils'
const validate = utils.common.validate
import {Instructions, Prepare} from './types'
import {Memo} from '../common/types'
import {Memo} from '../common/types/objects'
type EscrowCancellation = {
export type EscrowCancellation = {
owner: string,
escrowSequence: number,
memos?: Array<Memo>

View File

@@ -3,9 +3,9 @@ import * as utils from './utils'
import {validate, iso8601ToRippleTime, xrpToDrops} from '../common'
const ValidationError = utils.common.errors.ValidationError
import {Instructions, Prepare} from './types'
import {Memo} from '../common/types'
import {Memo} from '../common/types/objects'
type EscrowCreation = {
export type EscrowCreation = {
amount: string,
destination: string,
memos?: Array<Memo>,

View File

@@ -3,9 +3,9 @@ import * as utils from './utils'
const validate = utils.common.validate
const ValidationError = utils.common.errors.ValidationError
import {Instructions, Prepare} from './types'
import {Memo} from '../common/types'
import {Memo} from '../common/types/objects'
type EscrowExecution = {
export type EscrowExecution = {
owner: string,
escrowSequence: number,
memos?: Array<Memo>,

View File

@@ -4,7 +4,7 @@ const claimFlags = utils.common.txFlags.PaymentChannelClaim
import {validate, xrpToDrops} from '../common'
import {Instructions, Prepare} from './types'
type PaymentChannelClaim = {
export type PaymentChannelClaim = {
channel: string,
balance?: string,
amount?: string,

View File

@@ -2,7 +2,7 @@ import * as utils from './utils'
import {validate, iso8601ToRippleTime, xrpToDrops} from '../common'
import {Instructions, Prepare} from './types'
type PaymentChannelCreate = {
export type PaymentChannelCreate = {
amount: string,
destination: string,
settleDelay: number,

View File

@@ -2,7 +2,7 @@ import * as utils from './utils'
import {validate, iso8601ToRippleTime, xrpToDrops} from '../common'
import {Instructions, Prepare} from './types'
type PaymentChannelFund = {
export type PaymentChannelFund = {
channel: string,
amount: string,
expiration?: string

View File

@@ -6,10 +6,10 @@ const paymentFlags = utils.common.txFlags.Payment
const ValidationError = utils.common.errors.ValidationError
import {Instructions, Prepare} from './types'
import {Amount, Adjustment, MaxAdjustment,
MinAdjustment, Memo} from '../common/types'
MinAdjustment, Memo} from '../common/types/objects'
type Payment = {
export type Payment = {
source: Adjustment & MaxAdjustment,
destination: Adjustment & MinAdjustment,
paths?: string,

View File

@@ -6,14 +6,14 @@ const validate = utils.common.validate
const AccountFlagIndices = utils.common.constants.AccountFlagIndices
const AccountFields = utils.common.constants.AccountFields
import {Instructions, Prepare} from './types'
import {Memo} from '../common/types'
import {Memo} from '../common/types/objects'
type WeightedSigner = {address: string, weight: number}
type SettingsSigners = {
export type WeightedSigner = {address: string, weight: number}
export type SettingsSigners = {
threshold?: number,
weights: WeightedSigner[]
}
type Settings = {
export type Settings = {
passwordSpent?: boolean,
requireDestinationTag?: boolean,
requireAuthorization?: boolean,

View File

@@ -4,14 +4,16 @@ import * as utils from './utils'
const validate = utils.common.validate
const trustlineFlags = utils.common.txFlags.TrustSet
import {Instructions, Prepare} from './types'
import {TrustLineSpecification} from '../ledger/trustlines-types'
import {
FormattedTrustlineSpecification
} from '../common/types/objects/trustlines'
function convertQuality(quality) {
return (new BigNumber(quality)).shift(9).truncated().toNumber()
}
function createTrustlineTransaction(account: string,
trustline: TrustLineSpecification
trustline: FormattedTrustlineSpecification
): Object {
const limit = {
currency: trustline.currency,
@@ -49,7 +51,7 @@ function createTrustlineTransaction(account: string,
}
function prepareTrustline(address: string,
trustline: TrustLineSpecification, instructions: Instructions = {}
trustline: FormattedTrustlineSpecification, instructions: Instructions = {}
): Promise<Prepare> {
validate.prepareTrustline({address, trustline, instructions})
const txJSON = createTrustlineTransaction(address, trustline)

View File

@@ -1,10 +1,16 @@
import BigNumber from 'bignumber.js'
import * as common from '../common'
import {Memo, ApiMemo} from '../common/types'
import {Memo} from '../common/types/objects'
const txFlags = common.txFlags
import {Instructions, Prepare} from './types'
import {RippleAPI} from '../api'
export type ApiMemo = {
MemoData?: string,
MemoType?: string,
MemoFormat?: string
}
function formatPrepareResponse(txJSON: any): Prepare {
const instructions = {
fee: common.dropsToXrp(txJSON.Fee),

File diff suppressed because it is too large Load Diff

View File

@@ -38,6 +38,17 @@ module.exports = {
normal: require('./prepare-escrow-cancellation'),
memos: require('./prepare-escrow-cancellation-memos')
},
prepareCheckCreate: {
normal: require('./prepare-check-create'),
full: require('./prepare-check-create-full')
},
prepareCheckCash: {
amount: require('./prepare-check-cash-amount'),
deliverMin: require('./prepare-check-cash-delivermin')
},
prepareCheckCancel: {
normal: require('./prepare-check-cancel')
},
preparePaymentChannelCreate: {
normal: require('./prepare-payment-channel-create'),
full: require('./prepare-payment-channel-create-full')

View File

@@ -0,0 +1,3 @@
{
"checkID": "49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0"
}

View File

@@ -0,0 +1,7 @@
{
"amount": {
"currency": "XRP",
"value": "1"
},
"checkID": "838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334"
}

View File

@@ -0,0 +1,7 @@
{
"deliverMin": {
"currency": "XRP",
"value": "0.8"
},
"checkID": "838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334"
}

View File

@@ -0,0 +1,10 @@
{
"destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"sendMax": {
"currency": "XRP",
"value": "1"
},
"destinationTag": 2,
"expiration": "2018-09-24T21:21:50.000Z",
"invoiceID": "1F40FC92DA241694750979EE6CF582F2D5D7D28E18335DE05ABC54D0560E0F53"
}

View File

@@ -0,0 +1,7 @@
{
"destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"sendMax": {
"currency": "XRP",
"value": "1"
}
}

View File

@@ -0,0 +1,25 @@
{
"type": "checkCancel",
"address": "rNpdNFXNMvEcaXDqMypi48gdSABZkYuyQE",
"sequence": 6,
"id": "B4105D1B2D83819647E4692B7C5843D674283F669524BD50C9614182E3A12CD4",
"specification": {
"checkID": "6EE1727598693635183A3D967342A46C739FC06F973CA6A3277A92E8D997E7A8"
},
"outcome": {
"result": "tesSUCCESS",
"timestamp": "2018-02-23T22:45:41.000Z",
"fee": "0.000012",
"balanceChanges": {
"rNpdNFXNMvEcaXDqMypi48gdSABZkYuyQE": [
{
"currency": "XRP",
"value": "-0.000012"
}
]
},
"orderbookChanges": {},
"ledgerVersion": 6967970,
"indexInLedger": 4
}
}

View File

@@ -0,0 +1,35 @@
{
"type": "checkCash",
"address": "raLHvSZXacoGiCoWrdBhVGstZm6GhF7oRr",
"sequence": 3,
"id": "8321208465F70BA52C28BCC4F646BAF3B012BA13B57576C0336F42D77E3E0749",
"specification": {
"checkID": "4F6DDA7972A5E8C8F2AA3D2A475E56475FA573C65B935E26EABDA5F06A982C70",
"amount": {
"currency": "XRP",
"value": "2.5"
}
},
"outcome": {
"result": "tesSUCCESS",
"timestamp": "2018-02-23T22:26:52.000Z",
"fee": "0.000012",
"balanceChanges": {
"raLHvSZXacoGiCoWrdBhVGstZm6GhF7oRr": [
{
"currency": "XRP",
"value": "2.499988"
}
],
"rNpdNFXNMvEcaXDqMypi48gdSABZkYuyQE": [
{
"currency": "XRP",
"value": "-2.5"
}
]
},
"orderbookChanges": {},
"ledgerVersion": 6967596,
"indexInLedger": 0
}
}

View File

@@ -0,0 +1,32 @@
{
"type": "checkCreate",
"address": "rNpdNFXNMvEcaXDqMypi48gdSABZkYuyQE",
"sequence": 3,
"id": "605A2E2C8E48AECAF5C56085D1AEAA0348DC838CE122C9188F94EB19DA05C2FE",
"specification": {
"destination": "raLHvSZXacoGiCoWrdBhVGstZm6GhF7oRr",
"sendMax": {
"currency": "XRP",
"value": "3"
},
"destinationTag": 1235,
"expiration": "2018-02-25T21:22:47.000Z",
"invoiceID": "DEADBEEF2FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B"
},
"outcome": {
"result": "tesSUCCESS",
"timestamp": "2018-02-23T22:20:01.000Z",
"fee": "0.000012",
"balanceChanges": {
"rNpdNFXNMvEcaXDqMypi48gdSABZkYuyQE": [
{
"currency": "XRP",
"value": "-0.000012"
}
]
},
"orderbookChanges": {},
"ledgerVersion": 6967458,
"indexInLedger": 1
}
}

View File

@@ -1,5 +1,9 @@
'use strict'; // eslint-disable-line strict
function buildList(options) {
return new Array(options.count).fill(options.item);
}
module.exports = {
generateAddress: require('./generate-address.json'),
getAccountInfo: require('./get-account-info.json'),
@@ -38,8 +42,14 @@ module.exports = {
trustlineFrozenOff: require('./get-transaction-trust-set-frozen-off.json'),
trustlineNoQuality: require('./get-transaction-trust-no-quality.json'),
notValidated: require('./get-transaction-not-validated.json'),
checkCreate:
require('./get-transaction-check-create.json'),
checkCancel:
require('./get-transaction-check-cancel.json'),
checkCash:
require('./get-transaction-check-cash.json'),
escrowCreation:
require('./get-transaction-escrow-create.json'),
require('./get-transaction-escrow-creation.json'),
escrowCancellation:
require('./get-transaction-escrow-cancellation.json'),
escrowExecution:
@@ -61,6 +71,10 @@ module.exports = {
},
getTrustlines: {
filtered: require('./get-trustlines.json'),
moreThan400Items: buildList({
item: require('./trustline-item.json'),
count: 401
}),
all: require('./get-trustlines-all.json')
},
getLedger: {
@@ -96,6 +110,8 @@ module.exports = {
flagsMultisign: require('./prepare-settings-multisign.json'),
flagSet: require('./prepare-settings-flag-set.json'),
flagClear: require('./prepare-settings-flag-clear.json'),
flagSetDepositAuth: require('./prepare-settings-flag-set-deposit-auth.json'),
flagClearDepositAuth: require('./prepare-settings-flag-clear-deposit-auth.json'),
setTransferRate: require('./prepare-settings-set-transfer-rate.json'),
fieldClear: require('./prepare-settings-field-clear.json'),
noInstructions: require('./prepare-settings-no-instructions.json'),
@@ -103,6 +119,17 @@ module.exports = {
noMaxLedgerVersion: require('./prepare-settings-no-maxledgerversion.json'),
signers: require('./prepare-settings-signers.json')
},
prepareCheckCreate: {
normal: require('./prepare-check-create'),
full: require('./prepare-check-create-full')
},
prepareCheckCash: {
amount: require('./prepare-check-cash-amount'),
deliverMin: require('./prepare-check-cash-delivermin')
},
prepareCheckCancel: {
normal: require('./prepare-check-cancel')
},
prepareEscrowCreation: {
normal: require('./prepare-escrow-creation'),
full: require('./prepare-escrow-creation-full')

View File

@@ -0,0 +1,8 @@
{
"txJSON": "{\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"TransactionType\":\"CheckCancel\",\"CheckID\":\"49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0\",\"Flags\":2147483648,\"LastLedgerSequence\":8819954,\"Fee\":\"12\",\"Sequence\":23}",
"instructions": {
"fee": "0.000012",
"sequence": 23,
"maxLedgerVersion": 8819954
}
}

View File

@@ -0,0 +1,8 @@
{
"txJSON": "{\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"TransactionType\":\"CheckCash\",\"CheckID\":\"838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334\",\"Amount\":\"1000000\",\"Flags\":2147483648,\"LastLedgerSequence\":8819954,\"Sequence\":23,\"Fee\":\"12\"}",
"instructions": {
"fee": "0.000012",
"sequence": 23,
"maxLedgerVersion": 8819954
}
}

View File

@@ -0,0 +1,8 @@
{
"txJSON": "{\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"TransactionType\":\"CheckCash\",\"CheckID\":\"838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334\",\"DeliverMin\":\"800000\",\"Flags\":2147483648,\"LastLedgerSequence\":8819954,\"Sequence\":23,\"Fee\":\"12\"}",
"instructions": {
"fee": "0.000012",
"sequence": 23,
"maxLedgerVersion": 8819954
}
}

View File

@@ -0,0 +1,8 @@
{
"txJSON": "{\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"TransactionType\":\"CheckCreate\",\"Destination\":\"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW\",\"SendMax\":\"1000000\",\"DestinationTag\":2,\"Expiration\":591139310,\"InvoiceID\":\"1F40FC92DA241694750979EE6CF582F2D5D7D28E18335DE05ABC54D0560E0F53\",\"Flags\":2147483648,\"LastLedgerSequence\":8819954,\"Sequence\":23,\"Fee\":\"12\"}",
"instructions": {
"fee": "0.000012",
"sequence": 23,
"maxLedgerVersion": 8819954
}
}

View File

@@ -0,0 +1,8 @@
{
"txJSON": "{\"Account\":\"r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59\",\"TransactionType\":\"CheckCreate\",\"Destination\":\"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW\",\"SendMax\":\"1000000\",\"Flags\":2147483648,\"LastLedgerSequence\":8820051,\"Sequence\":23,\"Fee\":\"12\"}",
"instructions": {
"fee": "0.000012",
"sequence": 23,
"maxLedgerVersion": 8820051
}
}

Some files were not shown because too many files have changed in this diff Show More