divvy-rest
Version:
A RESTful API for submitting payments and monitoring accounts on the Divvy network.
732 lines (717 loc) • 22 kB
JavaScript
var _ = require('lodash');
var addresses = require('./../fixtures').addresses;
const DEFAULTS = {
account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
flags: 2147483648,
hash: '0F480D344CFC610DFA5CAC62CC1621C92953A05FE8C319281CA49C5C162AF40E',
currency: 'USD',
limit: '1'
};
module.exports.requestPath = function(address, params) {
return '/v1/accounts/' + address + '/trustlines' + ( params || '' );
};
module.exports.accountLinesResponse = function(request, options) {
options = options || {};
_.defaults(options, {
validated: true
});
return JSON.stringify({
id: request.id,
status: 'success',
type: 'response',
result: {
account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
marker: options.marker,
limit: request.limit,
ledger_index: options.ledger,
validated: options.validated,
lines: [
{
account: 'r3vi7mWxru9rJCxETCyA1CHvzL96eZWx5z',
balance: '0',
currency: 'ASP',
limit: '0',
limit_peer: '10',
quality_in: 0,
quality_out: 0
},
{
account: 'r3vi7mWxru9rJCxETCyA1CHvzL96eZWx5z',
balance: '0',
currency: 'XAU',
limit: '0',
limit_peer: '0',
no_divvy: true,
no_divvy_peer: true,
quality_in: 0,
quality_out: 0
},
{
account: addresses.COUNTERPARTY,
balance: '2.497605752725159',
currency: 'USD',
limit: '5',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rHpXfibHgSb64n8kK9QWDpdbfqSpYbM9a4',
balance: '481.992867407479',
currency: 'MXN',
limit: '1000',
limit_peer: '0',
quality_in: 0,
quality_out: 0
},
{
account: 'rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun',
balance: '0.793598266778297',
currency: 'EUR',
limit: '1',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rnuF96W4SZoCJmbHYBFoJZpR8eCaxNvekK',
balance: '0',
currency: 'CNY',
limit: '3',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rGwUWgN5BEg3QGNY3RX2HfYowjUTZdid3E',
balance: '1.294889190631542',
currency: 'DYM',
limit: '3',
limit_peer: '0',
quality_in: 0,
quality_out: 0
},
{
account: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
balance: '0.3488146605801446',
currency: 'CHF',
limit: '0',
limit_peer: '0',
quality_in: 0,
quality_out: 0
},
{
account: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
balance: '2.114103174931847',
currency: 'BTC',
limit: '3',
limit_peer: '0',
quality_in: 0,
quality_out: 0
},
{
account: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
balance: '0',
currency: 'USD',
limit: '5000',
limit_peer: '0',
quality_in: 0,
quality_out: 0
},
{
account: 'rpgKWEmNqSDAGFhy5WDnsyPqfQxbWxKeVd',
balance: '-0.00111',
currency: 'BTC',
limit: '0',
limit_peer: '10',
quality_in: 0,
quality_out: 0
},
{
account: 'rBJ3YjwXi2MGbg7GVLuTXUWQ8DjL7tDXh4',
balance: '-0.1010780000080207',
currency: 'BTC',
limit: '0',
limit_peer: '10',
quality_in: 0,
quality_out: 0,
freeze_peer: true
},
{
account: 'rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun',
balance: '1',
currency: 'USD',
limit: '1',
limit_peer: '0',
quality_in: 0,
quality_out: 0
},
{
account: 'razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA',
balance: '8.07619790068559',
currency: 'CNY',
limit: '100',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
balance: '7.292695098901099',
currency: 'JPY',
limit: '0',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0,
freeze: true
},
{
account: 'r3vi7mWxru9rJCxETCyA1CHvzL96eZWx5z',
balance: '0',
currency: 'AUX',
limit: '0',
limit_peer: '0',
no_divvy: true,
no_divvy_peer: true,
quality_in: 0,
quality_out: 0
},
{
account: 'r9vbV3EHvXWjSkeQ6CAcYVPGeq7TuiXY2X',
balance: '0',
currency: 'USD',
limit: '1',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
balance: '12.41688780720394',
currency: 'EUR',
limit: '100',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rfF3PNkwkq1DygW2wum2HK3RGfgkJjdPVD',
balance: '35',
currency: 'USD',
limit: '500',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rwUVoVMSURqNyvocPCcvLu3ygJzZyw8qwp',
balance: '-5',
currency: 'JOE',
limit: '0',
limit_peer: '50',
no_divvy_peer: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rE6R3DWF9fBD7CyiQciePF9SqK58Ubp8o2',
balance: '0',
currency: 'USD',
limit: '0',
limit_peer: '100',
no_divvy_peer: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rE6R3DWF9fBD7CyiQciePF9SqK58Ubp8o2',
balance: '0',
currency: 'JOE',
limit: '0',
limit_peer: '100',
no_divvy_peer: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rs9M85karFkCRjvc6KMWn8Coigm9cbcgcx',
balance: '0',
currency: '015841551A748AD2C1F76FF6ECB0CCCD00000000',
limit: '10.01037626125837',
limit_peer: '0',
no_divvy: true,
quality_in: 0,
quality_out: 0
},
{
account: 'rEhDDUUNxpXgEHVJtC2cjXAgyx5VCFxdMF',
balance: '0',
currency: 'USD',
limit: '0',
limit_peer: '1',
quality_in: 0,
quality_out: 0
}
]
}
});
};
module.exports.RESTAccountTrustlinesResponse = function(options) {
options = options || {};
_.defaults(options, {
validated: true,
limit: 200
});
return JSON.stringify({
success: true,
marker: options.marker,
limit: options.limit,
ledger: options.ledger,
validated: options.validated,
trustlines: [
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'r3vi7mWxru9rJCxETCyA1CHvzL96eZWx5z',
currency: 'ASP',
limit: '0',
reciprocated_limit: '10',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'r3vi7mWxru9rJCxETCyA1CHvzL96eZWx5z',
currency: 'XAU',
limit: '0',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: false,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: addresses.COUNTERPARTY,
currency: 'USD',
limit: '5',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rHpXfibHgSb64n8kK9QWDpdbfqSpYbM9a4',
currency: 'MXN',
limit: '1000',
reciprocated_limit: '0',
account_allows_rippling: true,
counterparty_allows_rippling: true ,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun',
currency: 'EUR',
limit: '1',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rnuF96W4SZoCJmbHYBFoJZpR8eCaxNvekK',
currency: 'CNY',
limit: '3',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rGwUWgN5BEg3QGNY3RX2HfYowjUTZdid3E',
currency: 'DYM',
limit: '3',
reciprocated_limit: '0',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
currency: 'CHF',
limit: '0',
reciprocated_limit: '0',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
currency: 'BTC',
limit: '3',
reciprocated_limit: '0',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
currency: 'USD',
limit: '5000',
reciprocated_limit: '0',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rpgKWEmNqSDAGFhy5WDnsyPqfQxbWxKeVd',
currency: 'BTC',
limit: '0',
reciprocated_limit: '10',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rBJ3YjwXi2MGbg7GVLuTXUWQ8DjL7tDXh4',
currency: 'BTC',
limit: '0',
reciprocated_limit: '10',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: true
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun',
currency: 'USD',
limit: '1',
reciprocated_limit: '0',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA',
currency: 'CNY',
limit: '100',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
currency: 'JPY',
limit: '0',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: true,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'r3vi7mWxru9rJCxETCyA1CHvzL96eZWx5z',
currency: 'AUX',
limit: '0',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: false,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'r9vbV3EHvXWjSkeQ6CAcYVPGeq7TuiXY2X',
currency: 'USD',
limit: '1',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
currency: 'EUR',
limit: '100',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rfF3PNkwkq1DygW2wum2HK3RGfgkJjdPVD',
currency: 'USD',
limit: '500',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rwUVoVMSURqNyvocPCcvLu3ygJzZyw8qwp',
currency: 'JOE',
limit: '0',
reciprocated_limit: '50',
account_allows_rippling: true,
counterparty_allows_rippling: false,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rE6R3DWF9fBD7CyiQciePF9SqK58Ubp8o2',
currency: 'USD',
limit: '0',
reciprocated_limit: '100',
account_allows_rippling: true,
counterparty_allows_rippling: false,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rE6R3DWF9fBD7CyiQciePF9SqK58Ubp8o2',
currency: 'JOE',
limit: '0',
reciprocated_limit: '100',
account_allows_rippling: true,
counterparty_allows_rippling: false,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rs9M85karFkCRjvc6KMWn8Coigm9cbcgcx',
currency: '015841551A748AD2C1F76FF6ECB0CCCD00000000',
limit: '10.01037626125837',
reciprocated_limit: '0',
account_allows_rippling: false,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
},
{ account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
counterparty: 'rEhDDUUNxpXgEHVJtC2cjXAgyx5VCFxdMF',
currency: 'USD',
limit: '0',
reciprocated_limit: '1',
account_allows_rippling: true,
counterparty_allows_rippling: true,
account_trustline_frozen: false,
counterparty_trustline_frozen: false
}
]
});
};
module.exports.accountNotFoundResponse = function(request) {
return JSON.stringify({
id: request.id,
status: 'error',
type: 'response',
account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
error: 'actNotFound',
error_code: 15,
error_message: 'Account not found.',
ledger_current_index: 8941468,
request: {
account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
command: 'account_info',
id: request.id
},
validated: false
});
};
module.exports.accountInfoResponse = function(request) {
return JSON.stringify({
id: request.id,
status: 'success',
type: 'response',
result: {
account_data: {
Account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
Balance: '922913243',
Domain: '6578616D706C652E636F6D',
EmailHash: '23463B99B62A72F26ED677CC556C44E8',
Flags: 655360,
LedgerEntryType: 'AccountRoot',
OwnerCount: 1,
PreviousTxnID: '19899273706A9E040FDB5885EE991A1DC2BAD878A0D6E7DBCFB714E63BF737F7',
PreviousTxnLgrSeq: 6614625,
Sequence: 2938,
TransferRate: 1002000000,
WalletLocator: '00000000000000000000000000000000000000000000000000000000DEADBEEF',
index: '396400950EA27EB5710C0D5BE1D2B4689139F168AC5D07C13B8140EC3F82AE71',
urlgravatar: 'http://www.gravatar.com/avatar/23463b99b62a72f26ed677cc556c44e8'
},
ledger_current_index: 6614628
}
});
};
module.exports.submitTrustlineResponse = function(request, options) {
options = options || {};
_.defaults(options, DEFAULTS);
return JSON.stringify({
id: request.id,
result: {
engine_result: 'tesSUCCESS',
engine_result_code: 0,
engine_result_message: 'The transaction was applied.',
tx_blob: request.tx_blob,
tx_json: {
Account: options.account,
Fee: '12',
Flags: options.flags,
LastLedgerSequence: 8819963,
LimitAmount: {
currency: options.currency,
issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
value: options.limit
},
Sequence: 3054,
SigningPubKey: '0306E9F38DF11402953A5B030C1AE8A88C47E348170C3B8EC6C8D775E797168462',
TransactionType: 'TrustSet',
TxnSignature: '304402202604A313678AC3BEC1A3C46A556258A512422ACB5EB0034D9024DDB45316F1BD02207AD751BF27C937AD5001ADD551312933C67670086155FA0B8B8107452CD00E41',
hash: options.hash
}
},
status: 'success',
type: 'response'
});
};
module.exports.ledgerSequenceTooHighResponse = function(request, options) {
options = options || {};
_.defaults(options, {
hash: '0F480D344CFC610DFA5CAC62CC1621C92953A05FE8C319281CA49C5C162AF40E'
});
return JSON.stringify({
id: request.id,
result: {
engine_result: 'tefMAX_LEDGER',
engine_result_code: -186,
engine_result_message: "Ledger sequence too high.",
tx_blob: request.tx_blob,
tx_json: {
Account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
Fee: '12',
Flags: 2147483648,
LastLedgerSequence: 8819963,
LimitAmount: {
currency: 'USD',
issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B',
value: '1'
},
Sequence: 3054,
SigningPubKey: '0306E9F38DF11402953A5B030C1AE8A88C47E348170C3B8EC6C8D775E797168462',
TransactionType: 'TrustSet',
TxnSignature: '304402202604A313678AC3BEC1A3C46A556258A512422ACB5EB0034D9024DDB45316F1BD02207AD751BF27C937AD5001ADD551312933C67670086155FA0B8B8107452CD00E41',
hash: options.hash
}
},
status: 'success',
type: 'response'
});
};
module.exports.setTrustValidatedResponse = function(options) {
options = options || {};
_.defaults(options, DEFAULTS);
return JSON.stringify({
engine_result: 'tesSUCCESS',
engine_result_code: 0,
engine_result_message: 'The transaction was applied.',
ledger_hash: 'E0B48625C74115865D83F777081163D1C33144AD11A3104292720092D2183770',
ledger_index: 9810402,
meta: {
AffectedNodes: [
{
ModifiedNode: {
FinalFields: {
Account: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
Balance: '792505355',
Flags: 0,
OwnerCount: 3,
Sequence: 12
},
LedgerEntryType: 'AccountRoot',
LedgerIndex: '25FF5CC1037AE7E2C491A2E4C6206CBE31D0F1609B6426E6E8C3626BAC8C3439',
PreviousFields: {
Balance: '792505367',
Sequence: 11
},
PreviousTxnID: 'B7B913FC00AE7838238F5021CE88ED8A5D408110726BED719BDC2A024FAE793D',
PreviousTxnLgrSeq: 9791833
}
},
{
ModifiedNode: {
FinalFields: {
Balance: {
currency: 'USD',
issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji',
value: '0.2899999999999999'
},
Flags: 1114112,
HighLimit: {
currency: 'USD',
issuer: addresses.COUNTERPARTY,
value: '0'
},
HighNode: '0000000000000163',
LowLimit: {
currency: 'USD',
issuer: 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE',
value: options.limit
},
LowNode: '0000000000000000'
},
LedgerEntryType: 'DivvyState',
LedgerIndex: '620379E07473AAE2E6CCCB196AE9DD13C5D036C4B47211BB3DAA55D019CB2226',
PreviousFields: {
Flags: 65536
},
PreviousTxnID: 'A1344FACEAE2FA0EC795A1A64B972F144DDBBB1441B9C253BF63AC6294258287',
PreviousTxnLgrSeq: 9791722
}
}
],
TransactionIndex: 0,
TransactionResult: 'tesSUCCESS'
},
status: 'closed',
transaction: {
Account: options.account,
Fee: '12',
Flags: options.flags,
LastLedgerSequence: 9810409,
LimitAmount: {
currency: 'USD',
issuer: addresses.COUNTERPARTY,
value: options.limit
},
Sequence: 11,
SigningPubKey: '02AFA3692CC78A804ACC11DBA23DBB99943C6F8D61D3CB07BBE6D28356EB5B9C57',
TransactionType: 'TrustSet',
TxnSignature: '304402201178957B6ABB7673DB21F05C58E66061D5C753B9D63158032B0C1CC9CB68C94802203CEB99C8B72BB33EF63684B2A6BF77A232448ECACBB5FFC9FD8DCC8065948847',
date: 468718190,
hash: options.hash
},
type: 'transaction',
validated: true
});
};