mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-08 06:45:49 +00:00
Compare commits
418 Commits
0.12.3
...
0.13.0-rc6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44d00d5ef4 | ||
|
|
d4d3efcb65 | ||
|
|
f23e105240 | ||
|
|
5a396a7060 | ||
|
|
513632299f | ||
|
|
0d40558f1e | ||
|
|
1ccbaf6776 | ||
|
|
ba6c703163 | ||
|
|
3b9eb02bbb | ||
|
|
bca7382015 | ||
|
|
67672bd389 | ||
|
|
232017d9a2 | ||
|
|
23653f67f0 | ||
|
|
e3b688d1dd | ||
|
|
a94b21ca3c | ||
|
|
9c9be3e6e4 | ||
|
|
062561686e | ||
|
|
761682c206 | ||
|
|
39c48d631c | ||
|
|
a55d26a726 | ||
|
|
597ae157b3 | ||
|
|
c1c7458914 | ||
|
|
0e97f269ab | ||
|
|
bbe4cd63a1 | ||
|
|
2515d17a85 | ||
|
|
d8e95a3c3b | ||
|
|
98f6bed8c9 | ||
|
|
bd000c2662 | ||
|
|
a46141111a | ||
|
|
f57c89c6e9 | ||
|
|
6d4cac948d | ||
|
|
1f54b3a0cf | ||
|
|
2f8655dc23 | ||
|
|
d624923cd8 | ||
|
|
2180c076dd | ||
|
|
0dbdf0a21a | ||
|
|
5cb63a258c | ||
|
|
39ac6caaef | ||
|
|
de4ef8b2b4 | ||
|
|
99cba09a4a | ||
|
|
300967f0f3 | ||
|
|
52879febb9 | ||
|
|
f077a563c4 | ||
|
|
92fbc61f47 | ||
|
|
5ac1bcc414 | ||
|
|
5837aa23ea | ||
|
|
8c431b4ec3 | ||
|
|
25086a7944 | ||
|
|
b0889b4afe | ||
|
|
ed971bc41c | ||
|
|
728595dc96 | ||
|
|
7fc6adb776 | ||
|
|
002102ce62 | ||
|
|
bf9da80d46 | ||
|
|
dda9994869 | ||
|
|
4c76ad159e | ||
|
|
f76a8daca8 | ||
|
|
3263629ebe | ||
|
|
fcbe7d3c98 | ||
|
|
a6662ccdff | ||
|
|
854fe85151 | ||
|
|
2b2fdf1b11 | ||
|
|
cbe44d6a96 | ||
|
|
420346faea | ||
|
|
6220162852 | ||
|
|
37198bde66 | ||
|
|
281c056f6c | ||
|
|
49a513cd07 | ||
|
|
7a95aabbf4 | ||
|
|
83874ec096 | ||
|
|
9270d0a33d | ||
|
|
30295efdb4 | ||
|
|
f1342c1456 | ||
|
|
194b73c293 | ||
|
|
89e5f79bbb | ||
|
|
82d7ce7ac2 | ||
|
|
0cc4c704f8 | ||
|
|
dde762a1d6 | ||
|
|
1c86e246c7 | ||
|
|
2d173c8e69 | ||
|
|
600fd34d30 | ||
|
|
4cb9cf801c | ||
|
|
50fb8789b4 | ||
|
|
fb8dc44ec1 | ||
|
|
0781caa8bc | ||
|
|
2cdb23f0dd | ||
|
|
8e536c00b9 | ||
|
|
8ff154cc2d | ||
|
|
daaae6e01e | ||
|
|
a64a4e697a | ||
|
|
3f51d8cc12 | ||
|
|
9f9e76f8b9 | ||
|
|
5b51db158d | ||
|
|
a4d1509448 | ||
|
|
bbd51a03b6 | ||
|
|
b55b82b2fd | ||
|
|
fdb0f101bd | ||
|
|
0afca5633d | ||
|
|
7c0d9a7172 | ||
|
|
f6b7e27c67 | ||
|
|
b8624bc55f | ||
|
|
2eec30756d | ||
|
|
6b44ce8973 | ||
|
|
ed0b501716 | ||
|
|
0fd391af72 | ||
|
|
fe9c1ada88 | ||
|
|
4c1f4ef58c | ||
|
|
10afc770ff | ||
|
|
8543e60f86 | ||
|
|
116d7e0f29 | ||
|
|
68adaec55b | ||
|
|
03640efef5 | ||
|
|
c6f450842e | ||
|
|
e583eb4592 | ||
|
|
7fffbe0c64 | ||
|
|
63e3b71eb5 | ||
|
|
823ef738fe | ||
|
|
0977ef0ec2 | ||
|
|
cecf3f3d22 | ||
|
|
472fbce23a | ||
|
|
e44aea1767 | ||
|
|
d682d90d86 | ||
|
|
141aa17dfc | ||
|
|
0b09e53479 | ||
|
|
528d8bf25d | ||
|
|
03a2109e24 | ||
|
|
b38b9bced6 | ||
|
|
ea063d0c95 | ||
|
|
7f93929014 | ||
|
|
4cd10ecb87 | ||
|
|
6ef30debd2 | ||
|
|
4766bace4e | ||
|
|
261500a3a4 | ||
|
|
fae22b7023 | ||
|
|
4568b39997 | ||
|
|
4a218cacfa | ||
|
|
34a4dd3077 | ||
|
|
a383bd7e52 | ||
|
|
e76e693bdb | ||
|
|
2c52e4aa69 | ||
|
|
13dee36e93 | ||
|
|
6e180439d1 | ||
|
|
e8d0c1ae95 | ||
|
|
068bda0c95 | ||
|
|
ab694381d5 | ||
|
|
dc2a6c75cf | ||
|
|
98dbba8f27 | ||
|
|
9a1b80d77a | ||
|
|
a655be30d6 | ||
|
|
e5aabc3072 | ||
|
|
2cd32d58ad | ||
|
|
0c02b92717 | ||
|
|
c58a077a2f | ||
|
|
6e7dc9d7d3 | ||
|
|
572c945274 | ||
|
|
c605efab61 | ||
|
|
2695f4302a | ||
|
|
a17011243e | ||
|
|
9a533ab807 | ||
|
|
a037952493 | ||
|
|
dc96795a02 | ||
|
|
8d9746d7b1 | ||
|
|
00342c4239 | ||
|
|
e48df2c1fd | ||
|
|
6ade0f6554 | ||
|
|
a88157bb92 | ||
|
|
00f318284f | ||
|
|
2e12dc6d53 | ||
|
|
34435d4d05 | ||
|
|
a99452b773 | ||
|
|
a05cb39ab0 | ||
|
|
0c69f7f10e | ||
|
|
8d50034265 | ||
|
|
64f451e904 | ||
|
|
b1b47d7d91 | ||
|
|
a93c580c92 | ||
|
|
030e2786d1 | ||
|
|
56bbe1d437 | ||
|
|
1fff5ea6dc | ||
|
|
ad9956375f | ||
|
|
4787e5d29a | ||
|
|
194f76d57f | ||
|
|
d2ee5cb0bc | ||
|
|
040298db2c | ||
|
|
b4e6d4b98c | ||
|
|
a2b31e2677 | ||
|
|
e997c44a18 | ||
|
|
b27011fb38 | ||
|
|
b477eb238b | ||
|
|
02bc256225 | ||
|
|
9f7293127c | ||
|
|
61a0ea7eac | ||
|
|
51ef93e23b | ||
|
|
ab11220e27 | ||
|
|
b23d588747 | ||
|
|
a71dc28523 | ||
|
|
2de0e13ec5 | ||
|
|
d0c922ed13 | ||
|
|
8c82ebec79 | ||
|
|
ddd83d10fa | ||
|
|
031375e701 | ||
|
|
4bc285313c | ||
|
|
f42dd69b53 | ||
|
|
1dae06fdd8 | ||
|
|
ff29247b9e | ||
|
|
d9eca203ed | ||
|
|
4a85182a79 | ||
|
|
055d275f0a | ||
|
|
eb7bbe5715 | ||
|
|
8d5752883f | ||
|
|
2b5f356de8 | ||
|
|
c9610900fd | ||
|
|
79b1a65a7b | ||
|
|
df21b9453f | ||
|
|
22257bdd2b | ||
|
|
aa3767b180 | ||
|
|
c073c2b7de | ||
|
|
529a55efb0 | ||
|
|
c36567e062 | ||
|
|
f7873f3b41 | ||
|
|
6b54f1c1eb | ||
|
|
1fb1bc7404 | ||
|
|
aa646a3acf | ||
|
|
18ac8a9d03 | ||
|
|
7c357c5d52 | ||
|
|
816db9e0dc | ||
|
|
fa9e1de4df | ||
|
|
137d947606 | ||
|
|
77a05c1881 | ||
|
|
ab13e3fe18 | ||
|
|
fc4b085026 | ||
|
|
67e8f6ab65 | ||
|
|
792b30c8b5 | ||
|
|
3407aadfb8 | ||
|
|
29e59ebfd2 | ||
|
|
286a684963 | ||
|
|
3ef586d2d3 | ||
|
|
5889037a71 | ||
|
|
5e3f3969f5 | ||
|
|
eecf45918b | ||
|
|
6d91e6e6b2 | ||
|
|
7808f87060 | ||
|
|
6c48b22eea | ||
|
|
7344f1178b | ||
|
|
5a6a3ce6e0 | ||
|
|
f3a54bf02a | ||
|
|
766dc5d0ce | ||
|
|
f8f196903a | ||
|
|
337c41fe10 | ||
|
|
fb8eefd00d | ||
|
|
3082b959f6 | ||
|
|
487371737c | ||
|
|
14ccc9359d | ||
|
|
665b76271c | ||
|
|
11ca00bb45 | ||
|
|
046d397dfb | ||
|
|
58cc01b6d3 | ||
|
|
6a3eb7b9b9 | ||
|
|
935a463d3b | ||
|
|
f2f4173d7b | ||
|
|
941aaf6d8b | ||
|
|
1068b68568 | ||
|
|
e76b9a9051 | ||
|
|
410ac117f6 | ||
|
|
fa89c4dee8 | ||
|
|
a464ca2368 | ||
|
|
befd89c3d7 | ||
|
|
49640cf282 | ||
|
|
2ac4549712 | ||
|
|
6bffe06c3b | ||
|
|
13e9ad45f9 | ||
|
|
193fcc9014 | ||
|
|
30529b7a04 | ||
|
|
38b254e7f0 | ||
|
|
c4b98d2139 | ||
|
|
1309b58592 | ||
|
|
9b9d2dc32b | ||
|
|
73020fb8ae | ||
|
|
8221db833f | ||
|
|
09b10d3f2c | ||
|
|
c31798c7f8 | ||
|
|
064c5e9e50 | ||
|
|
077a53475d | ||
|
|
32ca23a00b | ||
|
|
1a7cdd7d04 | ||
|
|
85befa467b | ||
|
|
9b956e57ac | ||
|
|
93c0c49002 | ||
|
|
44954621e0 | ||
|
|
96e5d484da | ||
|
|
4efe0b920e | ||
|
|
d158cc7fc1 | ||
|
|
034cd4eaf6 | ||
|
|
d5f3d90486 | ||
|
|
99e076b7dd | ||
|
|
8f9aec83f2 | ||
|
|
87a8745a64 | ||
|
|
2ab51d7a8a | ||
|
|
3e0f43e44e | ||
|
|
6a763fab18 | ||
|
|
3fe6726789 | ||
|
|
5b4deabd90 | ||
|
|
84bc7dd4aa | ||
|
|
3960b4e11f | ||
|
|
141215fc38 | ||
|
|
2446e2f6da | ||
|
|
81a9bc0739 | ||
|
|
64e86f403e | ||
|
|
77f1351e5b | ||
|
|
47a87f3a92 | ||
|
|
d2df75dc25 | ||
|
|
d92fbfb7aa | ||
|
|
1b3be55711 | ||
|
|
8d98e443c5 | ||
|
|
46121edd62 | ||
|
|
1a32536ac8 | ||
|
|
85bf6891f9 | ||
|
|
1ccca1c4ec | ||
|
|
22cd70e53f | ||
|
|
d8aad1444e | ||
|
|
621dfd9ca5 | ||
|
|
2ad6a1a77e | ||
|
|
8f37438a08 | ||
|
|
ff6ac0333c | ||
|
|
1b936d2aa2 | ||
|
|
df0cff969c | ||
|
|
46e2598499 | ||
|
|
0b32378ab5 | ||
|
|
bf25eb350f | ||
|
|
97cea2ce4d | ||
|
|
82ed402b16 | ||
|
|
ca7b69a2a0 | ||
|
|
d9c61a9431 | ||
|
|
3b636ce2d1 | ||
|
|
2196352335 | ||
|
|
823d7048ba | ||
|
|
d066e1145d | ||
|
|
fb7021abcc | ||
|
|
9c14fb2379 | ||
|
|
a114bf42c4 | ||
|
|
87b6c09de3 | ||
|
|
f1c95112bd | ||
|
|
76d8c8b061 | ||
|
|
7cbcb9a220 | ||
|
|
4433ac57bd | ||
|
|
5379da4874 | ||
|
|
d488ce55b3 | ||
|
|
908e306f04 | ||
|
|
62b5953abe | ||
|
|
35ae968d9f | ||
|
|
22dc39b920 | ||
|
|
278331cc4a | ||
|
|
16e3541a10 | ||
|
|
7d7970d318 | ||
|
|
f4fa10b9c0 | ||
|
|
e68096bd27 | ||
|
|
50cda426eb | ||
|
|
1038421428 | ||
|
|
a5046ab086 | ||
|
|
ebbec1954e | ||
|
|
4021018931 | ||
|
|
5824c3cb7c | ||
|
|
45a1b9471e | ||
|
|
70bc819665 | ||
|
|
e05f3e9b9c | ||
|
|
e93f1ab6f4 | ||
|
|
0878a8ecf0 | ||
|
|
6ea07139dc | ||
|
|
55fca2d7d5 | ||
|
|
8596dcef21 | ||
|
|
bca84d5508 | ||
|
|
65f7485497 | ||
|
|
457b02c781 | ||
|
|
c8e0fa85f3 | ||
|
|
5e714f6143 | ||
|
|
4ecbf31898 | ||
|
|
ea24bf0415 | ||
|
|
171f8349cb | ||
|
|
398f8d001f | ||
|
|
e66978fb48 | ||
|
|
c57d528db7 | ||
|
|
0c47310063 | ||
|
|
cb4f6e37a8 | ||
|
|
ab943f36c3 | ||
|
|
de7fc78ef0 | ||
|
|
9a502580fd | ||
|
|
d56e70b995 | ||
|
|
e9aaf50d59 | ||
|
|
ac0a4f521a | ||
|
|
a3380c5cdd | ||
|
|
6a6d2a0787 | ||
|
|
64809d9ae2 | ||
|
|
d14b38bc91 | ||
|
|
440dfb5785 | ||
|
|
d4a4b5f4fb | ||
|
|
0c000a7fee | ||
|
|
c655c2a20e | ||
|
|
3ba5a18b91 | ||
|
|
bdb3415855 | ||
|
|
5ef5bdd9d9 | ||
|
|
c7bbce8371 | ||
|
|
5e2c26a4a2 | ||
|
|
631faa20ec | ||
|
|
2db17ba67c | ||
|
|
50eca42e35 | ||
|
|
f327487157 | ||
|
|
85b64b7ac3 | ||
|
|
cf17a9e8d6 | ||
|
|
71a1282b89 | ||
|
|
85e1f2f47d | ||
|
|
1f68eba146 | ||
|
|
d71873442f | ||
|
|
10ca2da2d6 | ||
|
|
c7ba822320 | ||
|
|
ef3ce46d00 | ||
|
|
c4595e03ce | ||
|
|
26a7eb456b | ||
|
|
142a85d6a7 |
@@ -1,7 +1,14 @@
|
|||||||
[ignore]
|
[ignore]
|
||||||
|
.*/src/api/.*
|
||||||
|
.*/src/core/.*
|
||||||
|
.*/dist/.*
|
||||||
|
.*/test/fixtures/.*
|
||||||
|
.*/node_modules/flow-bin/.*
|
||||||
|
|
||||||
[include]
|
[include]
|
||||||
|
./node_modules/
|
||||||
|
|
||||||
[libs]
|
[libs]
|
||||||
|
|
||||||
[options]
|
[options]
|
||||||
|
module.system=node
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
# Ignore object files.
|
# Ignore object files.
|
||||||
*.o
|
*.o
|
||||||
build/*.js
|
build/
|
||||||
tags
|
tags
|
||||||
bin/rippled
|
bin/rippled
|
||||||
Debug/*.*
|
Debug/*.*
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
deploy
|
|
||||||
lib-cov
|
lib-cov
|
||||||
coverage.html
|
coverage.html
|
||||||
|
src
|
||||||
|
dist/bower
|
||||||
|
|||||||
17
.travis.yml
17
.travis.yml
@@ -1,18 +1,9 @@
|
|||||||
|
sudo: false # use faster docker containers
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- "0.10"
|
- "0.12"
|
||||||
before_script:
|
before_script:
|
||||||
- npm install -g eslint
|
- sh -c "git log | head -12"
|
||||||
- curl 'https://raw.githubusercontent.com/ripple/javascript-style-guide/master/eslintrc' > ./eslintrc
|
script: bin/ci.sh
|
||||||
- eslint --reset -c ./eslintrc $(git --no-pager diff --name-only --diff-filter=AM --relative $(git merge-base FETCH_HEAD origin/HEAD) FETCH_HEAD | grep "\.js$")
|
|
||||||
script: MOCHA_REPORTER=tap npm test --coverage
|
|
||||||
after_success:
|
|
||||||
- npm run coveralls
|
|
||||||
notifications:
|
notifications:
|
||||||
email: false
|
email: false
|
||||||
webhooks:
|
|
||||||
urls:
|
|
||||||
- https://webhooks.gitter.im/e/d1ec4245f90231619d30
|
|
||||||
on_success: change # options: [always|never|change] default: always
|
|
||||||
on_failure: always # options: [always|never|change] default: always
|
|
||||||
on_start: false # default: false
|
|
||||||
|
|||||||
157
Gulpfile.js
157
Gulpfile.js
@@ -1,75 +1,39 @@
|
|||||||
|
/* eslint-disable no-var, no-param-reassign */
|
||||||
|
/* these eslint rules are disabled because gulp does not support babel yet */
|
||||||
'use strict';
|
'use strict';
|
||||||
|
var _ = require('lodash');
|
||||||
var gulp = require('gulp');
|
var gulp = require('gulp');
|
||||||
var gutil = require('gulp-util');
|
|
||||||
var watch = require('gulp-watch');
|
|
||||||
var plumber = require('gulp-plumber');
|
|
||||||
var filelog = require('gulp-filelog');
|
|
||||||
var cleanDest = require('gulp-clean-dest');
|
|
||||||
var concat = require('gulp-concat');
|
|
||||||
var uglify = require('gulp-uglify');
|
var uglify = require('gulp-uglify');
|
||||||
var rename = require('gulp-rename');
|
var rename = require('gulp-rename');
|
||||||
var webpack = require('webpack');
|
var webpack = require('webpack');
|
||||||
var bump = require('gulp-bump');
|
var bump = require('gulp-bump');
|
||||||
var react = require('gulp-react');
|
|
||||||
var flow = require('gulp-flowtype');
|
|
||||||
var argv = require('yargs').argv;
|
var argv = require('yargs').argv;
|
||||||
// var header = require('gulp-header');
|
|
||||||
|
|
||||||
var pkg = require('./package.json');
|
var pkg = require('./package.json');
|
||||||
|
|
||||||
var sjclSrc = [
|
function webpackConfig(extension, overrides) {
|
||||||
'src/js/sjcl/core/sjcl.js',
|
overrides = overrides || {};
|
||||||
'src/js/sjcl/core/aes.js',
|
var defaults = {
|
||||||
'src/js/sjcl/core/bitArray.js',
|
|
||||||
'src/js/sjcl/core/codecString.js',
|
|
||||||
'src/js/sjcl/core/codecHex.js',
|
|
||||||
'src/js/sjcl/core/codecBase64.js',
|
|
||||||
'src/js/sjcl/core/codecBytes.js',
|
|
||||||
'src/js/sjcl/core/sha256.js',
|
|
||||||
'src/js/sjcl/core/sha512.js',
|
|
||||||
'src/js/sjcl/core/sha1.js',
|
|
||||||
'src/js/sjcl/core/ccm.js',
|
|
||||||
// 'src/js/sjcl/core/cbc.js',
|
|
||||||
// 'src/js/sjcl/core/ocb2.js',
|
|
||||||
'src/js/sjcl/core/hmac.js',
|
|
||||||
'src/js/sjcl/core/pbkdf2.js',
|
|
||||||
'src/js/sjcl/core/random.js',
|
|
||||||
'src/js/sjcl/core/convenience.js',
|
|
||||||
'src/js/sjcl/core/bn.js',
|
|
||||||
'src/js/sjcl/core/ecc.js',
|
|
||||||
'src/js/sjcl/core/srp.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-ecc-pointextras.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-secp256k1.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-ripemd160.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-extramath.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-montgomery.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-validecc.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-ecdsa-canonical.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-ecdsa-der.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-ecdsa-recoverablepublickey.js',
|
|
||||||
'src/js/sjcl-custom/sjcl-jacobi.js'
|
|
||||||
];
|
|
||||||
|
|
||||||
function logPluginError(error) {
|
|
||||||
gutil.log(error.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task('concat-sjcl', function() {
|
|
||||||
return gulp.src(sjclSrc)
|
|
||||||
.pipe(concat('sjcl.js'))
|
|
||||||
.pipe(gulp.dest('./build/'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('build', ['concat-sjcl'], function(callback) {
|
|
||||||
webpack({
|
|
||||||
cache: true,
|
cache: true,
|
||||||
entry: './src/js/ripple/index.js',
|
entry: './src/index.js',
|
||||||
output: {
|
output: {
|
||||||
library: 'ripple',
|
library: 'ripple',
|
||||||
path: './build/',
|
path: './build/',
|
||||||
filename: ['ripple-', '.js'].join(pkg.version)
|
filename: ['ripple-', extension].join(pkg.version)
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
loaders: [{
|
||||||
|
test: /\.js$/,
|
||||||
|
exclude: /node_modules/,
|
||||||
|
loader: 'babel-loader?optional=runtime'
|
||||||
|
}]
|
||||||
}
|
}
|
||||||
}, callback);
|
};
|
||||||
|
return _.assign({}, defaults, overrides);
|
||||||
|
}
|
||||||
|
|
||||||
|
gulp.task('build', function(callback) {
|
||||||
|
webpack(webpackConfig('.js'), callback);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('build-min', ['build'], function() {
|
gulp.task('build-min', ['build'], function() {
|
||||||
@@ -79,18 +43,9 @@ gulp.task('build-min', ['build'], function() {
|
|||||||
.pipe(gulp.dest('./build/'));
|
.pipe(gulp.dest('./build/'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('build-debug', ['concat-sjcl'], function(callback) {
|
gulp.task('build-debug', function(callback) {
|
||||||
webpack({
|
var configOverrides = {debug: true, devtool: 'eval'};
|
||||||
cache: true,
|
webpack(webpackConfig('-debug.js', configOverrides), callback);
|
||||||
entry: './src/js/ripple/index.js',
|
|
||||||
output: {
|
|
||||||
library: 'ripple',
|
|
||||||
path: './build/',
|
|
||||||
filename: ['ripple-', '-debug.js'].join(pkg.version)
|
|
||||||
},
|
|
||||||
debug: true,
|
|
||||||
devtool: 'eval'
|
|
||||||
}, callback);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -104,78 +59,52 @@ function buildUseError(cons) {
|
|||||||
.replace(new RegExp('<CONS>', 'g'), cons);
|
.replace(new RegExp('<CONS>', 'g'), cons);
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task('build-core', ['concat-sjcl'], function(callback) {
|
gulp.task('build-core', function(callback) {
|
||||||
webpack({
|
var configOverrides = {
|
||||||
entry: [
|
cache: false,
|
||||||
'./src/js/ripple/remote.js'
|
entry: './src/remote.js',
|
||||||
],
|
externals: [{
|
||||||
externals: [
|
'./transaction': buildUseError('Transaction'),
|
||||||
{
|
'./orderbook': buildUseError('OrderBook'),
|
||||||
'./transaction': buildUseError('Transaction'),
|
'./account': buildUseError('Account'),
|
||||||
'./orderbook': buildUseError('OrderBook'),
|
'./serializedobject': buildUseError('SerializedObject')
|
||||||
'./account': buildUseError('Account'),
|
}],
|
||||||
'./serializedobject': buildUseError('SerializedObject')
|
|
||||||
}
|
|
||||||
],
|
|
||||||
output: {
|
|
||||||
library: 'ripple',
|
|
||||||
path: './build/',
|
|
||||||
filename: ['ripple-', '-core.js'].join(pkg.version)
|
|
||||||
},
|
|
||||||
plugins: [
|
plugins: [
|
||||||
new webpack.optimize.UglifyJsPlugin()
|
new webpack.optimize.UglifyJsPlugin()
|
||||||
]
|
]
|
||||||
}, callback);
|
};
|
||||||
|
webpack(webpackConfig('-core.js', configOverrides), callback);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('bower-build', ['build'], function() {
|
gulp.task('bower-build', ['build'], function() {
|
||||||
return gulp.src(['./build/ripple-', '.js'].join(pkg.version))
|
return gulp.src(['./build/ripple-', '.js'].join(pkg.version))
|
||||||
.pipe(rename('ripple.js'))
|
.pipe(rename('ripple.js'))
|
||||||
.pipe(gulp.dest('./dist/'));
|
.pipe(gulp.dest('./dist/bower'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('bower-build-min', ['build-min'], function() {
|
gulp.task('bower-build-min', ['build-min'], function() {
|
||||||
return gulp.src(['./build/ripple-', '-min.js'].join(pkg.version))
|
return gulp.src(['./build/ripple-', '-min.js'].join(pkg.version))
|
||||||
.pipe(rename('ripple-min.js'))
|
.pipe(rename('ripple-min.js'))
|
||||||
.pipe(gulp.dest('./dist/'));
|
.pipe(gulp.dest('./dist/bower'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('bower-build-debug', ['build-debug'], function() {
|
gulp.task('bower-build-debug', ['build-debug'], function() {
|
||||||
return gulp.src(['./build/ripple-', '-debug.js'].join(pkg.version))
|
return gulp.src(['./build/ripple-', '-debug.js'].join(pkg.version))
|
||||||
.pipe(rename('ripple-debug.js'))
|
.pipe(rename('ripple-debug.js'))
|
||||||
.pipe(gulp.dest('./dist/'));
|
.pipe(gulp.dest('./dist/bower'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('bower-version', function() {
|
gulp.task('bower-version', function() {
|
||||||
gulp.src('./dist/bower.json')
|
gulp.src('./dist/bower/bower.json')
|
||||||
.pipe(bump({version: pkg.version}))
|
.pipe(bump({version: pkg.version}))
|
||||||
.pipe(gulp.dest('./dist/'));
|
.pipe(gulp.dest('./dist/bower'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('bower', ['bower-build', 'bower-build-min', 'bower-build-debug',
|
gulp.task('bower', ['bower-build', 'bower-build-min', 'bower-build-debug',
|
||||||
'bower-version']);
|
'bower-version']);
|
||||||
|
|
||||||
gulp.task('watch', function() {
|
gulp.task('watch', function() {
|
||||||
gulp.watch('src/js/ripple/*', ['build-debug']);
|
gulp.watch('src/*', ['build-debug']);
|
||||||
});
|
|
||||||
|
|
||||||
// To use this, each javascript file must have /* @flow */ on the first line
|
|
||||||
gulp.task('typecheck', function() {
|
|
||||||
return gulp.src('src/js/ripple/*.js')
|
|
||||||
.pipe(flow({ // note: do not set the 'all' option, it is broken
|
|
||||||
weak: true, // remove this after all errors are addressed
|
|
||||||
killFlow: true
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('strip', function() {
|
|
||||||
return gulp.src('src/js/ripple/*.js')
|
|
||||||
.pipe(watch('src/js/ripple/*.js'))
|
|
||||||
.pipe(cleanDest('out')) // delete outdated output file before stripping
|
|
||||||
.pipe(plumber()) // prevent an error in one file from ending build
|
|
||||||
.pipe(react({stripTypes: true}).on('error', logPluginError))
|
|
||||||
.pipe(filelog())
|
|
||||||
.pipe(gulp.dest('out'));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('version-bump', function() {
|
gulp.task('version-bump', function() {
|
||||||
@@ -194,4 +123,4 @@ gulp.task('version-beta', function() {
|
|||||||
.pipe(gulp.dest('./'));
|
.pipe(gulp.dest('./'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('default', ['concat-sjcl', 'build', 'build-debug', 'build-min']);
|
gulp.task('default', ['build', 'build-debug', 'build-min']);
|
||||||
|
|||||||
45
HISTORY.md
45
HISTORY.md
@@ -1,3 +1,48 @@
|
|||||||
|
##0.13.0 (release candidate)
|
||||||
|
|
||||||
|
+ [Fix: Emit error events and return error on pathfind](https://github.com/ripple/ripple-lib/commit/1ccbaf677631a1944eb05d90f7afc5f3690a03dd)
|
||||||
|
+ [Deprecate core and remove snake case method copying](https://github.com/ripple/ripple-lib/commit/fb8dc44ec1d49bb05cd0cdbe6dd4ab211195868a)
|
||||||
|
+ Add new RippleAPI interface
|
||||||
|
- [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)
|
||||||
|
+ [Fix RangeSet for validated_ledger as single ledger](https://github.com/ripple/ripple-lib/commit/9f9e76f8b933201651af59307135f67cfa7d60e8)
|
||||||
|
+ [Fix bug where the paths would be set with an empty array](https://github.com/ripple/ripple-lib/commit/83874ec0962da311b76f2385623e51c68bc39035)
|
||||||
|
+ [Fix reserve calculation](https://github.com/ripple/ripple-lib/commit/52879febb92d876f01f2e4d70871baa07af631fb)
|
||||||
|
|
||||||
|
##0.12.6
|
||||||
|
|
||||||
|
+ [Fix webpack require failure due to "./" notation](https://github.com/ripple/ripple-lib/commit/8d9746d7b10be203ee613df523c2522012ff1baf)
|
||||||
|
|
||||||
|
##0.12.15
|
||||||
|
|
||||||
|
+ [Add offer autobridging](https://github.com/ripple/ripple-lib/commit/c7bbce83719c1e8c6a4fae5ca850e7515db1a4a5)
|
||||||
|
|
||||||
|
+ [Prevent crash when listening for "model" events on the OrderBook class](https://github.com/ripple/ripple-lib/commit/5824c3cb7cb6bd834d6e037f69943aebf3d83351)
|
||||||
|
|
||||||
|
+ [Fix empty order edgecase](https://github.com/ripple/ripple-lib/commit/64809d9ae23dc24f47accd4b4788b48f49880d3e)
|
||||||
|
|
||||||
|
+ [Fix AutobridgeCalculator (RT-3445)](https://github.com/ripple/ripple-lib/commit/1fff5ea6dcbcee856536df26f3b9cf1aec3c3b55)
|
||||||
|
|
||||||
|
+ [Update sjcl and delete custom ripemd160, montgomery, and jacobi](https://github.com/ripple/ripple-lib/commit/50cda426eb83599c38c0b725e1524a01fc415da2)
|
||||||
|
|
||||||
|
+ [Fix transaction summary for transactions that fail with remoteError](https://github.com/ripple/ripple-lib/commit/5e714f6143464d7912f42537acaa553b88eaf6dc)
|
||||||
|
|
||||||
|
+ [Fix serializedobject append for excessively large bytes length](https://github.com/ripple/ripple-lib/commit/e93f1ab6f4aaad347450aee75a169af0faa2121c)
|
||||||
|
|
||||||
|
+ [Switch to sjcl npm module](https://github.com/ripple/ripple-lib/commit/9a502580fd89ec6a9aa55f4e5847f6a4a2cb5bba)
|
||||||
|
|
||||||
|
+ [Add babel transpiler](https://github.com/ripple/ripple-lib/commit/398f8d001f758bf575b959537a17e79e4042d17b)
|
||||||
|
|
||||||
|
+ [Remove unused float.js and wallet.js](https://github.com/ripple/ripple-lib/commit/d4a4b5f4fbbf09677a59ce81bace35c6426a2fda)
|
||||||
|
|
||||||
|
+ [Remove config singleton to reduce global state](https://github.com/ripple/ripple-lib/commit/c655c2a20ee5d150a4b5a1b6717b9fb81f636025)
|
||||||
|
|
||||||
|
##0.12.4
|
||||||
|
|
||||||
|
+ [Improve entropy security](https://github.com/ripple/ripple-lib/commit/c7ba822320880037796f57876d1abb4e525648ed)
|
||||||
|
|
||||||
|
+ [Remove unused crypt.js file](https://github.com/ripple/ripple-lib/commit/1f68eba1461bca03a4d22872450d15ae5a185334)
|
||||||
|
|
||||||
##0.12.3
|
##0.12.3
|
||||||
|
|
||||||
+ [Add getLedgerSequence to Remote](https://github.com/ripple/ripple-lib/commit/d09548d04d3238fca653d482ec1d5faa7254559a)
|
+ [Add getLedgerSequence to Remote](https://github.com/ripple/ripple-lib/commit/d09548d04d3238fca653d482ec1d5faa7254559a)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
A JavaScript API for interacting with Ripple in Node.js and the browser
|
A JavaScript API for interacting with Ripple in Node.js and the browser
|
||||||
|
|
||||||
[](https://travis-ci.org/ripple/ripple-lib) [](https://coveralls.io/r/ripple/ripple-lib?branch=develop)
|
[](https://circleci.com/gh/ripple/ripple-lib/tree/develop) [](https://coveralls.io/r/ripple/ripple-lib?branch=develop)
|
||||||
|
|
||||||
[](https://www.npmjs.org/package/ripple-lib)
|
[](https://www.npmjs.org/package/ripple-lib)
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ A JavaScript API for interacting with Ripple in Node.js and the browser
|
|||||||
$ bower install ripple
|
$ bower install ripple
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [bower-ripple repo](https://github.com/ripple/bower-ripple) for additional bower instructions
|
See the [bower-ripple repo](https://github.com/ripple/bower-ripple) for additional bower instructions.
|
||||||
|
|
||||||
|
|
||||||
**Building ripple-lib for browser environments**
|
**Building ripple-lib for browser environments**
|
||||||
|
|||||||
61
bin/ci.sh
Executable file
61
bin/ci.sh
Executable file
@@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/bash -ex
|
||||||
|
|
||||||
|
NODE_INDEX="$1"
|
||||||
|
TOTAL_NODES="$2"
|
||||||
|
|
||||||
|
typecheck() {
|
||||||
|
npm install -g flow-bin
|
||||||
|
flow --version
|
||||||
|
npm run typecheck
|
||||||
|
}
|
||||||
|
|
||||||
|
lint() {
|
||||||
|
echo "eslint $(node_modules/.bin/eslint --version)"
|
||||||
|
npm list babel-eslint | grep babel-eslint
|
||||||
|
REPO_URL="https://raw.githubusercontent.com/ripple/javascript-style-guide"
|
||||||
|
curl "$REPO_URL/es6/eslintrc" > ./eslintrc
|
||||||
|
echo "parser: babel-eslint" >> ./eslintrc
|
||||||
|
node_modules/.bin/eslint -c ./eslintrc $(git --no-pager diff --name-only -M100% --diff-filter=AM --relative $(git merge-base FETCH_HEAD origin/HEAD) FETCH_HEAD | grep "\.js$")
|
||||||
|
}
|
||||||
|
|
||||||
|
unittest() {
|
||||||
|
# test "src"
|
||||||
|
npm test --coverage
|
||||||
|
npm run coveralls
|
||||||
|
|
||||||
|
# test compiled version in "dist/npm"
|
||||||
|
ln -nfs ../../dist/npm/core test/node_modules/ripple-lib
|
||||||
|
ln -nfs ../../dist/npm test/node_modules/ripple-api
|
||||||
|
npm test
|
||||||
|
}
|
||||||
|
|
||||||
|
oneNode() {
|
||||||
|
lint
|
||||||
|
typecheck
|
||||||
|
unittest
|
||||||
|
}
|
||||||
|
|
||||||
|
twoNodes() {
|
||||||
|
case "$NODE_INDEX" in
|
||||||
|
0) lint && unittest;;
|
||||||
|
1) typecheck;;
|
||||||
|
*) echo "ERROR: invalid usage"; exit 2;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
threeNodes() {
|
||||||
|
case "$NODE_INDEX" in
|
||||||
|
0) lint;;
|
||||||
|
1) typecheck;;
|
||||||
|
2) unittest;;
|
||||||
|
*) echo "ERROR: invalid usage"; exit 2;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$TOTAL_NODES" in
|
||||||
|
"") oneNode;;
|
||||||
|
1) oneNode;;
|
||||||
|
2) twoNodes;;
|
||||||
|
3) threeNodes;;
|
||||||
|
*) echo "ERROR: invalid usage"; exit 2;;
|
||||||
|
esac
|
||||||
@@ -1,47 +1,52 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
/* eslint-disable no-var */
|
||||||
|
'use strict';
|
||||||
|
var SerializedObject = require('..').SerializedObject;
|
||||||
|
|
||||||
var SerializedObject = require('../src/js/ripple/serializedobject').SerializedObject;
|
function main() {
|
||||||
|
var argv = process.argv.slice(2);
|
||||||
|
var blob = argv.shift();
|
||||||
|
|
||||||
var argv = process.argv.slice(2);
|
if (blob === '-') {
|
||||||
|
read_input(ready);
|
||||||
var blob;
|
} else {
|
||||||
|
ready(blob);
|
||||||
blob = argv.shift();
|
}
|
||||||
|
|
||||||
if (blob === '-') {
|
|
||||||
read_input(ready);
|
|
||||||
} else {
|
|
||||||
ready();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function read_input(callback) {
|
function read_input(callback) {
|
||||||
tx_json = '';
|
var tx_json = '';
|
||||||
process.stdin.on('data', function(data) { tx_json += data; });
|
process.stdin.on('data', function(data) {
|
||||||
|
tx_json += data;
|
||||||
|
});
|
||||||
process.stdin.on('end', callback);
|
process.stdin.on('end', callback);
|
||||||
process.stdin.resume();
|
process.stdin.resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
function ready() {
|
function ready(blob) {
|
||||||
var valid_arguments = blob;
|
var valid_arguments = blob;
|
||||||
|
|
||||||
if (!valid_arguments) {
|
if (!valid_arguments) {
|
||||||
console.error('Invalid arguments\n');
|
console.error('Invalid arguments\n');
|
||||||
print_usage();
|
print_usage();
|
||||||
} else {
|
} else {
|
||||||
decode();
|
decode(blob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function print_usage() {
|
function print_usage() {
|
||||||
|
/* eslint-disable max-len */
|
||||||
console.log(
|
console.log(
|
||||||
'Usage: decode_binary.js <hex_blob>\n\n',
|
'Usage: decode_binary.js <hex_blob>\n\n',
|
||||||
'Example: decode_binary.js 120000240000000161D6871AFD498D00000000000000000000000000005553440000000000550FC62003E785DC231A1058A05E56E3F09CF4E668400000000000000A732102AE75B908F0A95F740A7BFA96057637E5C2170BC8DAD13B2F7B52AE75FAEBEFCF811450F97A072F1C4357F1AD84566A609479D927C9428314550FC62003E785DC231A1058A05E56E3F09CF4E6'
|
'Example: decode_binary.js 120000240000000161D6871AFD498D00000000000000000000000000005553440000000000550FC62003E785DC231A1058A05E56E3F09CF4E668400000000000000A732102AE75B908F0A95F740A7BFA96057637E5C2170BC8DAD13B2F7B52AE75FAEBEFCF811450F97A072F1C4357F1AD84566A609479D927C9428314550FC62003E785DC231A1058A05E56E3F09CF4E6'
|
||||||
);
|
);
|
||||||
};
|
/* eslint-enable max-len */
|
||||||
|
}
|
||||||
|
|
||||||
function decode() {
|
function decode(blob) {
|
||||||
buffer = new SerializedObject(blob);
|
var buffer = new SerializedObject(blob);
|
||||||
console.log(buffer.to_json());
|
console.log(buffer.to_json());
|
||||||
};
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
// vim:sw=2:sts=2:ts=8:et
|
// vim:sw=2:sts=2:ts=8:et
|
||||||
|
|||||||
123
bin/rsign.js
123
bin/rsign.js
@@ -1,62 +1,23 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
/* eslint-disable no-var */
|
||||||
var Transaction = require('../src/js/ripple/transaction').Transaction;
|
'use strict';
|
||||||
|
var Transaction = require('..').Transaction;
|
||||||
var argv = process.argv.slice(2);
|
|
||||||
|
|
||||||
var verbose;
|
|
||||||
var secret;
|
|
||||||
var tx_json;
|
|
||||||
|
|
||||||
if (~argv.indexOf('-v')){
|
|
||||||
argv.splice(argv.indexOf('-v'), 1);
|
|
||||||
verbose = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
secret = argv.shift();
|
|
||||||
tx_json = argv.shift();
|
|
||||||
|
|
||||||
if (tx_json === '-') {
|
|
||||||
read_input(ready);
|
|
||||||
} else {
|
|
||||||
ready();
|
|
||||||
}
|
|
||||||
|
|
||||||
function read_input(callback) {
|
function read_input(callback) {
|
||||||
tx_json = '';
|
var stdin = '';
|
||||||
process.stdin.on('data', function(data) { tx_json += data; });
|
process.stdin.on('data', function(data) {
|
||||||
process.stdin.on('end', callback);
|
stdin += data;
|
||||||
|
});
|
||||||
|
process.stdin.on('end', function() {
|
||||||
|
callback(stdin);
|
||||||
|
});
|
||||||
process.stdin.resume();
|
process.stdin.resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
function ready() {
|
|
||||||
var valid_arguments = secret && tx_json;
|
|
||||||
|
|
||||||
if (!valid_arguments) {
|
|
||||||
console.error('Invalid arguments\n');
|
|
||||||
print_usage();
|
|
||||||
} else {
|
|
||||||
var valid_json = true;
|
|
||||||
|
|
||||||
try {
|
|
||||||
tx_json = JSON.parse(tx_json);
|
|
||||||
} catch(exception) {
|
|
||||||
valid_json = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!valid_json) {
|
|
||||||
console.error('Invalid JSON\n');
|
|
||||||
print_usage();
|
|
||||||
} else {
|
|
||||||
sign_transaction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function print_usage() {
|
function print_usage() {
|
||||||
console.log(
|
console.log(
|
||||||
'Usage: rsign.js <secret> <json>\n\n',
|
'Usage: rsign.js <secret> <json>\n\n',
|
||||||
'Example: rsign.js ssq55ueDob4yV3kPVnNQLHB6icwpC','\''+
|
'Example: rsign.js ssq55ueDob4yV3kPVnNQLHB6icwpC', '\'' +
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
TransactionType: 'Payment',
|
TransactionType: 'Payment',
|
||||||
Account: 'r3P9vH81KBayazSTrQj6S25jW6kDb779Gi',
|
Account: 'r3P9vH81KBayazSTrQj6S25jW6kDb779Gi',
|
||||||
@@ -64,14 +25,14 @@ function print_usage() {
|
|||||||
Amount: '200000000',
|
Amount: '200000000',
|
||||||
Fee: '10',
|
Fee: '10',
|
||||||
Sequence: 1
|
Sequence: 1
|
||||||
})+'\''
|
}) + '\''
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
|
||||||
function sign_transaction() {
|
function sign_transaction(tx_json_object, secret, verbose) {
|
||||||
var tx = new Transaction();
|
var tx = new Transaction();
|
||||||
|
|
||||||
tx.tx_json = tx_json;
|
tx.tx_json = tx_json_object;
|
||||||
tx._secret = secret;
|
tx._secret = secret;
|
||||||
tx.complete();
|
tx.complete();
|
||||||
|
|
||||||
@@ -81,16 +42,56 @@ function sign_transaction() {
|
|||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
var sim = { };
|
var sim = { };
|
||||||
|
sim.tx_blob = tx.serialize().to_hex();
|
||||||
sim.tx_blob = tx.serialize().to_hex();
|
sim.tx_json = tx.tx_json;
|
||||||
sim.tx_json = tx.tx_json;
|
|
||||||
sim.tx_signing_hash = unsigned_hash;
|
sim.tx_signing_hash = unsigned_hash;
|
||||||
sim.tx_unsigned = unsigned_blob;
|
sim.tx_unsigned = unsigned_blob;
|
||||||
|
|
||||||
console.log(JSON.stringify(sim, null, 2));
|
console.log(JSON.stringify(sim, null, 2));
|
||||||
} else {
|
} else {
|
||||||
console.log(tx.serialize().to_hex());
|
console.log(tx.serialize().to_hex());
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
function ready(tx_json, secret, verbose) {
|
||||||
|
if (!(tx_json && secret)) {
|
||||||
|
console.error('Invalid arguments\n');
|
||||||
|
print_usage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var tx_json_object;
|
||||||
|
try {
|
||||||
|
tx_json_object = JSON.parse(tx_json);
|
||||||
|
} catch(exception) {
|
||||||
|
console.error('Invalid JSON\n');
|
||||||
|
print_usage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sign_transaction(tx_json_object, secret, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
var argv = process.argv.slice(2);
|
||||||
|
var verbose;
|
||||||
|
var secret;
|
||||||
|
var tx_json;
|
||||||
|
|
||||||
|
if (~argv.indexOf('-v')) {
|
||||||
|
argv.splice(argv.indexOf('-v'), 1);
|
||||||
|
verbose = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
secret = argv.shift();
|
||||||
|
tx_json = argv.shift();
|
||||||
|
|
||||||
|
if (tx_json === '-') {
|
||||||
|
read_input(function(stdin) {
|
||||||
|
ready(stdin, secret, verbose);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
ready(tx_json, secret, verbose);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
// vim:sw=2:sts=2:ts=8:et
|
// vim:sw=2:sts=2:ts=8:et
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
/* eslint-disable no-var */
|
||||||
|
'use strict';
|
||||||
|
var UInt160 = require('..').UInt160;
|
||||||
|
|
||||||
var UInt160 = require('../').UInt160;
|
function main() {
|
||||||
var address = process.argv[2];
|
var address = process.argv[2];
|
||||||
|
|
||||||
if (address === '-') {
|
if (address === '-') {
|
||||||
readInput(validateAddress);
|
readInput(validateAddress);
|
||||||
} else {
|
} else {
|
||||||
validateAddress(address);
|
validateAddress(address);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function readInput(callback) {
|
function readInput(callback) {
|
||||||
@@ -19,8 +23,10 @@ function readInput(callback) {
|
|||||||
process.stdin.on('end', function() {
|
process.stdin.on('end', function() {
|
||||||
callback(result);
|
callback(result);
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function validateAddress(address) {
|
function validateAddress(address) {
|
||||||
process.stdout.write((UInt160.is_valid(address.trim()) ? '0' : '1') + '\r\n');
|
process.stdout.write((UInt160.is_valid(address.trim()) ? '0' : '1') + '\r\n');
|
||||||
};
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
|
|||||||
7
circle.yml
Normal file
7
circle.yml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
machine:
|
||||||
|
node:
|
||||||
|
version: 0.12.0
|
||||||
|
test:
|
||||||
|
override:
|
||||||
|
- bin/ci.sh "$CIRCLE_NODE_INDEX" "$CIRCLE_NODE_TOTAL":
|
||||||
|
parallel: true
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
start newcoin
|
|
||||||
sleep 4
|
|
||||||
start index.html
|
|
||||||
@@ -37,7 +37,7 @@ This file provides step-by-step walkthroughs for some of the most common usages
|
|||||||
servers: [
|
servers: [
|
||||||
{ host: 's-west.ripple.com', port: 443, secure: true }
|
{ host: 's-west.ripple.com', port: 443, secure: true }
|
||||||
]
|
]
|
||||||
}
|
};
|
||||||
|
|
||||||
var remote = new Remote(options);
|
var remote = new Remote(options);
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ See the [wiki](https://ripple.com/wiki/JSON_Messages#subscribe) for details on s
|
|||||||
|
|
||||||
##Submitting a payment to the network
|
##Submitting a payment to the network
|
||||||
|
|
||||||
Submitting a payment transaction to the Ripple network involves connecting to a `Remote`, creating a transaction, signing it with the user's secret, and submitting it to the `rippled` server. Note that the `Amount` module is used to convert human-readable amounts like '1XRP' or '10.50USD' to the type of Amount object used by the Ripple network.
|
Submitting a payment transaction to the Ripple network involves connecting to a `Remote`, creating a transaction, signing it with the user's secret, and submitting it to the `rippled` server. Note that the `Amount` module is used to convert human-readable amounts like '1 XRP' or '10.50 USD' to the type of Amount object used by the Ripple network.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
/* Loading ripple-lib Remote and Amount modules in Node.js */
|
/* Loading ripple-lib Remote and Amount modules in Node.js */
|
||||||
@@ -187,7 +187,7 @@ var Amount = require('ripple-lib').Amount;
|
|||||||
var MY_ADDRESS = 'rrrMyAddress';
|
var MY_ADDRESS = 'rrrMyAddress';
|
||||||
var MY_SECRET = 'secret';
|
var MY_SECRET = 'secret';
|
||||||
var RECIPIENT = 'rrrRecipient';
|
var RECIPIENT = 'rrrRecipient';
|
||||||
var AMOUNT = Amount.from_human('1XRP');
|
var AMOUNT = Amount.from_human('1 USD').set_issuer('rrrIssuer');
|
||||||
|
|
||||||
var remote = new Remote({ /* Remote options */ });
|
var remote = new Remote({ /* Remote options */ });
|
||||||
|
|
||||||
|
|||||||
358
docs/api.html
Normal file
358
docs/api.html
Normal file
@@ -0,0 +1,358 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.method {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.details {
|
||||||
|
font-family: "Courier New", monospace;
|
||||||
|
white-space: pre;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="text/javascript">
|
||||||
|
function toggle(element) {
|
||||||
|
var results = element.parentElement.getElementsByClassName('details');
|
||||||
|
if (results.length > 0) {
|
||||||
|
var style = results[0].style;
|
||||||
|
style.display = (style.display === 'block') ? 'none' : 'block';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h2><a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/index.js">RippleAPI</a></h2>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
connect()
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
disconnect()
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
isConnected()
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
getServerInfo()
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
getFee()
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
getLedgerVersion()
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-transaction.json">getTransaction</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/hash256.json">identifier</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/transaction-options.json">options</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
identifier: txhash
|
||||||
|
options: {minLedgerVersion: int, maxLedgerVersion: int}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-transactions.json">getTransactions</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/transactions-options.json">options</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
options: {
|
||||||
|
start: txhash,
|
||||||
|
limit: int,
|
||||||
|
minLedgerVersion: int,
|
||||||
|
maxLedgerVersion: int,
|
||||||
|
earliestFirst: bool,
|
||||||
|
excludeFailures: bool,
|
||||||
|
initiated: bool,
|
||||||
|
counterparty: address,
|
||||||
|
types: [string],
|
||||||
|
binary: bool
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-trustlines.json">getTrustlines</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/trustlines-options.json">options</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
options: {counterparty: address, currency: string, limit: int, ledgerVersion: int}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-balances.json">getBalances</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/trustlines-options.json">options</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
options: {counterparty: address, currency: string, limit: int, ledgerVersion: int}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-paths.json">getPaths</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/pathfind.json">pathfind</a>
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
pathfind: {
|
||||||
|
source: {
|
||||||
|
address: address,
|
||||||
|
currencies: [{
|
||||||
|
currency: string,
|
||||||
|
counterparty: address
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
destination: adjustment
|
||||||
|
}
|
||||||
|
|
||||||
|
adjustment = {address: address, amount: amount, tag?: int}
|
||||||
|
amount = {currency: string, counterparty: address, value: floatstr}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-orders.json">getOrders</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/orders-options.json">options</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
options: {limit: int, ledverVersion: int}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-orderbook.json">getOrderbook</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/orderbook.json">orderbook</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/orders-options.json">options</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
orderbook: {
|
||||||
|
base: {
|
||||||
|
currency,
|
||||||
|
counterparty
|
||||||
|
},
|
||||||
|
counter: {
|
||||||
|
currency,
|
||||||
|
counterparty
|
||||||
|
}
|
||||||
|
}
|
||||||
|
options: {limit: int, ledverVersion: int}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-settings.json">getSettings</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/settings-options.json">options</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
options: {ledgerVersion: int}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/get-account-info.json">getAccountInfo</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/settings-options.json">options</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
options: {ledgerVersion: int}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/tx.json">preparePayment</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/payment.json">payment</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/instructions.json">instructions</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
payment: {
|
||||||
|
source: adjustment,
|
||||||
|
destination: adjustment,
|
||||||
|
paths?: string,
|
||||||
|
slippage?: strfloat,
|
||||||
|
memos?: [{
|
||||||
|
type: string,
|
||||||
|
format: string,
|
||||||
|
data: string
|
||||||
|
}],
|
||||||
|
invoiceID?: hash256,
|
||||||
|
allowPartialPayment?: bool,
|
||||||
|
noDirectRipple?: bool,
|
||||||
|
limitQuality?: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
adjustment = {address: address, amount: amount, tag?: int}
|
||||||
|
amount = {currency: string, counterparty: address, value: floatstr}
|
||||||
|
|
||||||
|
instructions: {
|
||||||
|
sequence: int,
|
||||||
|
fee: floatstr,
|
||||||
|
maxFee: floatstr,
|
||||||
|
maxLedgerVersion: int,
|
||||||
|
maxLedgerVersionOffset: int
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/tx.json">prepareTrustline</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/trustline.json">trustline</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/instructions.json">instructions</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
trustline: {
|
||||||
|
currency: string,
|
||||||
|
counterparty: address,
|
||||||
|
limit: strfloat,
|
||||||
|
qualityIn?: float,
|
||||||
|
qualityOut?: float,
|
||||||
|
allowRippling?: bool,
|
||||||
|
authorized?: bool,
|
||||||
|
frozen?: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
instructions: {
|
||||||
|
sequence: int,
|
||||||
|
fee: floatstr,
|
||||||
|
maxFee: floatstr,
|
||||||
|
maxLedgerVersion: int,
|
||||||
|
maxLedgerVersionOffset: int
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/tx.json">prepareOrder</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/order.json">order</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/instructions.json">instructions</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
order: {
|
||||||
|
direction: ("buy"|"sell"),
|
||||||
|
quantity: amount,
|
||||||
|
totalPrice: amount,
|
||||||
|
immediateOrCancel?: bool,
|
||||||
|
fillOrKill?: bool,
|
||||||
|
passive?: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
amount = {currency: string, counterparty: address, value: floatstr}
|
||||||
|
|
||||||
|
instructions: {
|
||||||
|
sequence: int,
|
||||||
|
fee: floatstr,
|
||||||
|
maxFee: floatstr,
|
||||||
|
maxLedgerVersion: int,
|
||||||
|
maxLedgerVersionOffset: int
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/tx.json">prepareOrderCancellation</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/sequence.json">sequence</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/instructions.json">instructions</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
sequence: int
|
||||||
|
|
||||||
|
instructions: {
|
||||||
|
sequence: int,
|
||||||
|
fee: floatstr,
|
||||||
|
maxFee: floatstr,
|
||||||
|
maxLedgerVersion: int,
|
||||||
|
maxLedgerVersionOffset: int
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/tx.json">prepareSettings</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/address.json">account</a>,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/settings.json">settings</a>[,
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/instructions.json">instructions</a>]
|
||||||
|
)
|
||||||
|
<a href="#" onclick="javascript:toggle(this)">+</a>
|
||||||
|
<div class="details">
|
||||||
|
settings: {
|
||||||
|
passwordSpent: bool,
|
||||||
|
requireDestinationTag: bool,
|
||||||
|
requireAuthorization: bool,
|
||||||
|
disallowIncomingXRP: bool,
|
||||||
|
disableMasterKey: bool,
|
||||||
|
enableTransactionIDTracking: bool,
|
||||||
|
noFreeze: bool,
|
||||||
|
globalFreeze: bool,
|
||||||
|
defaultRipple: bool,
|
||||||
|
emailHash: hash128,
|
||||||
|
walletLocator: hash256,
|
||||||
|
walletSize: int,
|
||||||
|
messageKey: string,
|
||||||
|
domain: string,
|
||||||
|
transferRate: float,
|
||||||
|
signers: string,
|
||||||
|
regularKey: address
|
||||||
|
}
|
||||||
|
|
||||||
|
instructions: {
|
||||||
|
sequence: int,
|
||||||
|
fee: floatstr,
|
||||||
|
maxFee: floatstr,
|
||||||
|
maxLedgerVersion: int,
|
||||||
|
maxLedgerVersionOffset: int
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/sign.json">sign</a>(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/tx.json">txJSON</a>,
|
||||||
|
secret)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
submit(
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/schemas/blob.json">txBlob</a>
|
||||||
|
)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="method">
|
||||||
|
generateWallet()
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a href="https://github.com/ripple/ripple-lib/blob/develop/src/api/common/errors.js">errors</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
3
docs/samples/README
Normal file
3
docs/samples/README
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Usage:
|
||||||
|
babel-node balances.js
|
||||||
|
babel-node payment.js (requires setting address and secret in source file first)
|
||||||
12
docs/samples/balances.js
Normal file
12
docs/samples/balances.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
'use strict';
|
||||||
|
const RippleAPI = require('../../src').RippleAPI; // require('ripple-lib')
|
||||||
|
|
||||||
|
const api = new RippleAPI({servers: ['wss://s1.ripple.com:443']});
|
||||||
|
const address = 'r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV';
|
||||||
|
|
||||||
|
api.connect().then(() => {
|
||||||
|
api.getBalances(address).then(balances => {
|
||||||
|
console.log(JSON.stringify(balances, null, 2));
|
||||||
|
process.exit();
|
||||||
|
});
|
||||||
|
});
|
||||||
41
docs/samples/payment.js
Normal file
41
docs/samples/payment.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
'use strict';
|
||||||
|
const RippleAPI = require('../../src').RippleAPI; // require('ripple-lib')
|
||||||
|
|
||||||
|
const address = 'INSERT ADDRESS HERE';
|
||||||
|
const secret = 'INSERT SECRET HERE';
|
||||||
|
|
||||||
|
const api = new RippleAPI({servers: ['wss://s1.ripple.com:443']});
|
||||||
|
const instructions = {maxLedgerVersionOffset: 5};
|
||||||
|
|
||||||
|
const payment = {
|
||||||
|
source: {
|
||||||
|
address: address,
|
||||||
|
amount: {
|
||||||
|
value: '0.01',
|
||||||
|
currency: 'XRP'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
destination: {
|
||||||
|
address: 'rKmBGxocj9Abgy25J51Mk1iqFzW9aVF9Tc',
|
||||||
|
amount: {
|
||||||
|
value: '0.01',
|
||||||
|
currency: 'XRP'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
api.connect().then(() => {
|
||||||
|
console.log('Connected...');
|
||||||
|
api.preparePayment(address, payment, instructions).then(txJSON => {
|
||||||
|
console.log('Payment transaction prepared...');
|
||||||
|
const signedTransaction = api.sign(txJSON, secret).signedTransaction;
|
||||||
|
console.log('Payment transaction signed...');
|
||||||
|
api.submit(signedTransaction).then(response => {
|
||||||
|
console.log(response);
|
||||||
|
process.exit(0);
|
||||||
|
}).catch(error => {
|
||||||
|
console.log(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
281
npm-shrinkwrap.json
generated
281
npm-shrinkwrap.json
generated
@@ -1,181 +1,208 @@
|
|||||||
{
|
{
|
||||||
"name": "ripple-lib",
|
"name": "ripple-lib",
|
||||||
"version": "0.12.3",
|
"version": "0.13.0-rc6",
|
||||||
|
"npm-shrinkwrap-version": "5.4.0",
|
||||||
|
"node-version": "v0.12.7",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": {
|
"async": {
|
||||||
"version": "0.9.0",
|
"version": "0.9.2",
|
||||||
"from": "async@>=0.9.0 <0.10.0",
|
"resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz"
|
},
|
||||||
|
"babel-runtime": {
|
||||||
|
"version": "5.8.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.20.tgz",
|
||||||
|
"dependencies": {
|
||||||
|
"core-js": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.0.1.tgz"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"bignumber.js": {
|
"bignumber.js": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.7",
|
||||||
"from": "bignumber.js@>=2.0.3 <3.0.0",
|
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.0.7.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.0.3.tgz"
|
},
|
||||||
|
"bn.js": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-3.1.1.tgz"
|
||||||
|
},
|
||||||
|
"es6-promisify": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-2.0.0.tgz",
|
||||||
|
"dependencies": {
|
||||||
|
"es6-promise": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"extend": {
|
"extend": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"from": "extend@>=1.2.1 <1.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz"
|
"resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz"
|
||||||
},
|
},
|
||||||
"lodash": {
|
"hash.js": {
|
||||||
"version": "3.5.0",
|
"version": "1.0.3",
|
||||||
"from": "lodash@>=3.1.0 <4.0.0",
|
"resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz",
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.5.0.tgz"
|
|
||||||
},
|
|
||||||
"lru-cache": {
|
|
||||||
"version": "2.5.0",
|
|
||||||
"from": "lru-cache@>=2.5.0 <2.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
|
|
||||||
},
|
|
||||||
"ripple-wallet-generator": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"from": "ripple-wallet-generator@1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/ripple-wallet-generator/-/ripple-wallet-generator-1.0.2.tgz"
|
|
||||||
},
|
|
||||||
"superagent": {
|
|
||||||
"version": "0.18.2",
|
|
||||||
"from": "superagent@>=0.18.0 <0.19.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/superagent/-/superagent-0.18.2.tgz",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"qs": {
|
"inherits": {
|
||||||
"version": "0.6.6",
|
|
||||||
"from": "qs@0.6.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz"
|
|
||||||
},
|
|
||||||
"formidable": {
|
|
||||||
"version": "1.0.14",
|
|
||||||
"from": "formidable@1.0.14",
|
|
||||||
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz"
|
|
||||||
},
|
|
||||||
"mime": {
|
|
||||||
"version": "1.2.11",
|
|
||||||
"from": "mime@1.2.11",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz"
|
|
||||||
},
|
|
||||||
"component-emitter": {
|
|
||||||
"version": "1.1.2",
|
|
||||||
"from": "component-emitter@1.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz"
|
|
||||||
},
|
|
||||||
"methods": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"from": "methods@1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.0.1.tgz"
|
|
||||||
},
|
|
||||||
"cookiejar": {
|
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"from": "cookiejar@2.0.1",
|
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.1.tgz"
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"https-proxy-agent": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
|
||||||
|
"dependencies": {
|
||||||
|
"agent-base": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.0.tgz",
|
||||||
|
"dependencies": {
|
||||||
|
"semver": {
|
||||||
|
"version": "4.3.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"version": "1.0.4",
|
"version": "2.2.0",
|
||||||
"from": "debug@>=1.0.1 <1.1.0",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "0.6.2",
|
"version": "0.7.1",
|
||||||
"from": "ms@0.6.2",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"reduce-component": {
|
"extend": {
|
||||||
"version": "1.0.1",
|
"version": "3.0.0",
|
||||||
"from": "reduce-component@1.0.1",
|
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz"
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"is-my-json-valid": {
|
||||||
|
"version": "2.12.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.1.tgz",
|
||||||
|
"dependencies": {
|
||||||
|
"generate-function": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz"
|
||||||
},
|
},
|
||||||
"form-data": {
|
"generate-object-property": {
|
||||||
"version": "0.1.3",
|
"version": "1.2.0",
|
||||||
"from": "form-data@0.1.3",
|
"resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.3.tgz",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"combined-stream": {
|
"is-property": {
|
||||||
"version": "0.0.7",
|
"version": "1.0.2",
|
||||||
"from": "combined-stream@>=0.0.4 <0.1.0",
|
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz",
|
|
||||||
"dependencies": {
|
|
||||||
"delayed-stream": {
|
|
||||||
"version": "0.0.5",
|
|
||||||
"from": "delayed-stream@0.0.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"readable-stream": {
|
"jsonpointer": {
|
||||||
"version": "1.0.27-1",
|
"version": "1.1.0",
|
||||||
"from": "readable-stream@1.0.27-1",
|
"resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-1.1.0.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz",
|
},
|
||||||
|
"xtend": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lodash": {
|
||||||
|
"version": "3.10.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz"
|
||||||
|
},
|
||||||
|
"lru-cache": {
|
||||||
|
"version": "2.5.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz"
|
||||||
|
},
|
||||||
|
"ripple-address-codec": {
|
||||||
|
"version": "1.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-1.6.0.tgz",
|
||||||
|
"dependencies": {
|
||||||
|
"x-address-codec": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/x-address-codec/-/x-address-codec-0.6.0.tgz",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"core-util-is": {
|
"base-x": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"from": "core-util-is@>=1.0.0 <1.1.0",
|
"resolved": "https://registry.npmjs.org/base-x/-/base-x-1.0.1.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz"
|
}
|
||||||
},
|
}
|
||||||
"isarray": {
|
}
|
||||||
"version": "0.0.1",
|
}
|
||||||
"from": "isarray@0.0.1",
|
},
|
||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
|
"ripple-keypairs": {
|
||||||
},
|
"version": "0.8.0",
|
||||||
"string_decoder": {
|
"resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-0.8.0.tgz",
|
||||||
"version": "0.10.31",
|
"dependencies": {
|
||||||
"from": "string_decoder@>=0.10.0 <0.11.0",
|
"brorand": {
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
|
"version": "1.0.5",
|
||||||
},
|
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.5.tgz"
|
||||||
|
},
|
||||||
|
"elliptic": {
|
||||||
|
"version": "5.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-5.1.0.tgz",
|
||||||
|
"dependencies": {
|
||||||
"inherits": {
|
"inherits": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"from": "inherits@>=2.0.1 <2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
|
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ws": {
|
"ripple-lib-transactionparser": {
|
||||||
"version": "0.7.1",
|
"version": "0.5.0",
|
||||||
"from": "ws@>=0.7.1 <0.8.0",
|
"resolved": "https://registry.npmjs.org/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.5.0.tgz",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-0.7.1.tgz",
|
"dependencies": {
|
||||||
|
"bignumber.js": {
|
||||||
|
"version": "1.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-1.4.1.tgz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sjcl-codec": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/sjcl-codec/-/sjcl-codec-0.1.0.tgz"
|
||||||
|
},
|
||||||
|
"ws": {
|
||||||
|
"version": "0.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ws/-/ws-0.7.2.tgz",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"options": {
|
|
||||||
"version": "0.0.6",
|
|
||||||
"from": "options@>=0.0.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz"
|
|
||||||
},
|
|
||||||
"ultron": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"from": "ultron@>=1.0.0 <1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.1.tgz"
|
|
||||||
},
|
|
||||||
"bufferutil": {
|
"bufferutil": {
|
||||||
"version": "1.0.1",
|
"version": "1.1.0",
|
||||||
"from": "bufferutil@>=1.0.0 <1.1.0",
|
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.1.0.tgz",
|
||||||
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.0.1.tgz",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"from": "bindings@>=1.2.0 <1.3.0"
|
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz"
|
||||||
},
|
},
|
||||||
"nan": {
|
"nan": {
|
||||||
"version": "1.6.2",
|
"version": "1.8.4",
|
||||||
"from": "nan@>=1.6.0 <1.7.0",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-1.6.2.tgz"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"options": {
|
||||||
|
"version": "0.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz"
|
||||||
|
},
|
||||||
|
"ultron": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz"
|
||||||
|
},
|
||||||
"utf-8-validate": {
|
"utf-8-validate": {
|
||||||
"version": "1.0.1",
|
"version": "1.1.0",
|
||||||
"from": "utf-8-validate@>=1.0.0 <1.1.0",
|
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.1.0.tgz",
|
||||||
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.0.1.tgz",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"from": "bindings@>=1.2.0 <1.3.0"
|
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz"
|
||||||
},
|
},
|
||||||
"nan": {
|
"nan": {
|
||||||
"version": "1.6.2",
|
"version": "1.8.4",
|
||||||
"from": "nan@>=1.6.0 <1.7.0",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz"
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-1.6.2.tgz"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
58
package.json
58
package.json
@@ -1,58 +1,68 @@
|
|||||||
{
|
{
|
||||||
"name": "ripple-lib",
|
"name": "ripple-lib",
|
||||||
"version": "0.12.3",
|
"version": "0.13.0-rc6",
|
||||||
|
"license": "ISC",
|
||||||
"description": "A JavaScript API for interacting with Ripple in Node.js and the browser",
|
"description": "A JavaScript API for interacting with Ripple in Node.js and the browser",
|
||||||
"files": [
|
"files": [
|
||||||
"src/js/*",
|
"dist/npm/*",
|
||||||
"bin/*",
|
"bin/*",
|
||||||
"build/*",
|
"build/*",
|
||||||
"test/*",
|
"test/*",
|
||||||
"Makefile",
|
|
||||||
"Gulpfile.js"
|
"Gulpfile.js"
|
||||||
],
|
],
|
||||||
"main": "src/js/ripple",
|
"main": "dist/npm/",
|
||||||
"directories": {
|
"directories": {
|
||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "~0.9.0",
|
"async": "~0.9.0",
|
||||||
|
"babel-runtime": "^5.5.4",
|
||||||
"bignumber.js": "^2.0.3",
|
"bignumber.js": "^2.0.3",
|
||||||
|
"bn.js": "^3.1.1",
|
||||||
|
"es6-promisify": "^2.0.0",
|
||||||
"extend": "~1.2.1",
|
"extend": "~1.2.1",
|
||||||
|
"hash.js": "^1.0.3",
|
||||||
|
"https-proxy-agent": "^1.0.0",
|
||||||
|
"is-my-json-valid": "^2.12.0",
|
||||||
"lodash": "^3.1.0",
|
"lodash": "^3.1.0",
|
||||||
"lru-cache": "~2.5.0",
|
"lru-cache": "~2.5.0",
|
||||||
"ripple-wallet-generator": "1.0.2",
|
"ripple-address-codec": "^1.6.0",
|
||||||
"ws": "~0.7.1",
|
"ripple-keypairs": "^0.8.0",
|
||||||
"superagent": "^0.18.0"
|
"ripple-lib-transactionparser": "^0.5.0",
|
||||||
|
"sjcl-codec": "0.1.0",
|
||||||
|
"ws": "~0.7.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"assert-diff": "^1.0.1",
|
"assert-diff": "^1.0.1",
|
||||||
|
"babel": "^5.8.21",
|
||||||
|
"babel-core": "^5.8.22",
|
||||||
|
"babel-eslint": "^4.0.5",
|
||||||
|
"babel-loader": "^5.3.2",
|
||||||
"coveralls": "~2.10.0",
|
"coveralls": "~2.10.0",
|
||||||
"eslint": "^0.18.0",
|
"eslint": "^1.2.0",
|
||||||
|
"eslint-plugin-flowtype": "^1.0.0",
|
||||||
|
"eventemitter2": "^0.4.14",
|
||||||
|
"flow-bin": "^0.14",
|
||||||
"gulp": "~3.8.10",
|
"gulp": "~3.8.10",
|
||||||
"gulp-bump": "~0.1.13",
|
"gulp-bump": "~0.1.13",
|
||||||
"gulp-clean-dest": "^0.1.0",
|
|
||||||
"gulp-concat": "~2.4.3",
|
|
||||||
"gulp-filelog": "^0.4.1",
|
|
||||||
"gulp-flowtype": "^0.4.1",
|
|
||||||
"gulp-plumber": "^0.6.6",
|
|
||||||
"gulp-react": "^2.0.0",
|
|
||||||
"gulp-rename": "~1.2.0",
|
"gulp-rename": "~1.2.0",
|
||||||
"gulp-uglify": "~1.1.0",
|
"gulp-uglify": "~1.1.0",
|
||||||
"gulp-util": "^3.0.3",
|
|
||||||
"gulp-watch": "^4.1.0",
|
|
||||||
"istanbul": "~0.3.5",
|
"istanbul": "~0.3.5",
|
||||||
"map-stream": "~0.1.0",
|
|
||||||
"mocha": "~2.1.0",
|
"mocha": "~2.1.0",
|
||||||
"nock": "^0.34.1",
|
|
||||||
"webpack": "~1.5.3",
|
"webpack": "~1.5.3",
|
||||||
"yargs": "~1.3.1"
|
"yargs": "~1.3.1"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node_modules/.bin/gulp",
|
"build": "gulp",
|
||||||
"pretest": "node_modules/.bin/gulp concat-sjcl",
|
"clean": "rm -rf dist/npm && rm -rf build/flow",
|
||||||
"test": "./node_modules/.bin/istanbul test -x build/sjcl.js -x src/js/jsbn/* ./node_modules/mocha/bin/_mocha -- --reporter ${MOCHA_REPORTER:=spec} --timeout 10000 --slow 500 test/*-test.js",
|
"typecheck": "babel --optional runtime --blacklist flow -d build/flow/ src/ && flow check",
|
||||||
"coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls",
|
"compile": "babel -D --optional runtime -d dist/npm/ src/",
|
||||||
"lint": "if ! [ -f eslintrc ]; then curl -o eslintrc 'https://raw.githubusercontent.com/ripple/javascript-style-guide/master/eslintrc'; fi; eslint --reset -c eslintrc src/js/ripple/*.js",
|
"watch": "babel -w -D --optional runtime -d dist/npm/ src/",
|
||||||
|
"compile-with-source-maps": "babel -D --optional runtime -s -t -d dist/npm/ src/",
|
||||||
|
"prepublish": "npm run clean && npm run compile",
|
||||||
|
"test": "istanbul test _mocha",
|
||||||
|
"coveralls": "cat ./coverage/lcov.info | coveralls",
|
||||||
|
"lint": "if ! [ -f eslintrc ]; then curl -o eslintrc 'https://raw.githubusercontent.com/ripple/javascript-style-guide/es6/eslintrc'; echo 'parser: babel-eslint' >> eslintrc; fi; eslint -c eslintrc src/",
|
||||||
"perf": "./scripts/perf_test.sh"
|
"perf": "./scripts/perf_test.sh"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -61,6 +71,6 @@
|
|||||||
},
|
},
|
||||||
"readmeFilename": "README.md",
|
"readmeFilename": "README.md",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.12.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,4 +8,4 @@ then
|
|||||||
mkdir -p "$DIR/cache"
|
mkdir -p "$DIR/cache"
|
||||||
curl -L "$URL" > "$DEST"
|
curl -L "$URL" > "$DEST"
|
||||||
fi
|
fi
|
||||||
time node "$DIR/verify_ledger_json.js" "$DEST"
|
npm run compile && time node "$DIR/verify_ledger_json.js" "$DEST"
|
||||||
|
|||||||
@@ -17,15 +17,15 @@ echo "publish to npm"
|
|||||||
npm publish
|
npm publish
|
||||||
exit_on_error
|
exit_on_error
|
||||||
|
|
||||||
rm -rf dist
|
rm -rf dist/bower
|
||||||
echo ""
|
echo ""
|
||||||
echo "publish to bower"
|
echo "publish to bower"
|
||||||
|
|
||||||
git clone git@github.com:ripple/bower-ripple.git dist
|
git clone git@github.com:ripple/bower-ripple.git dist/bower
|
||||||
gulp bower
|
gulp bower
|
||||||
exit_on_error
|
exit_on_error
|
||||||
|
|
||||||
cd dist
|
cd dist/bower
|
||||||
version=$(cat bower.json | grep -Eo '([0-9]\.?)+(-rc[0-9])?')
|
version=$(cat bower.json | grep -Eo '([0-9]\.?)+(-rc[0-9])?')
|
||||||
echo "version: $version"
|
echo "version: $version"
|
||||||
git add ripple.js ripple-debug.js ripple-min.js bower.json
|
git add ripple.js ripple-debug.js ripple-min.js bower.json
|
||||||
|
|||||||
@@ -17,15 +17,15 @@ echo "publish rc to npm"
|
|||||||
npm publish --tag beta
|
npm publish --tag beta
|
||||||
exit_on_error
|
exit_on_error
|
||||||
|
|
||||||
rm -rf dist
|
rm -rf dist/bower
|
||||||
echo ""
|
echo ""
|
||||||
echo "publish to bower"
|
echo "publish to bower"
|
||||||
|
|
||||||
git clone git@github.com:ripple/bower-ripple.git dist
|
git clone git@github.com:ripple/bower-ripple.git dist/bower
|
||||||
gulp bower
|
gulp bower
|
||||||
exit_on_error
|
exit_on_error
|
||||||
|
|
||||||
cd dist
|
cd dist/bower
|
||||||
version=$(cat bower.json | grep -Eo '([0-9]\.?)+(-rc[0-9])?')
|
version=$(cat bower.json | grep -Eo '([0-9]\.?)+(-rc[0-9])?')
|
||||||
echo "version: $version"
|
echo "version: $version"
|
||||||
git add ripple.js ripple-debug.js ripple-min.js bower.json
|
git add ripple.js ripple-debug.js ripple-min.js bower.json
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
rm -rf dist
|
rm -rf dist/bower
|
||||||
git clone git@github.com:ripple/bower-ripple.git dist
|
git clone git@github.com:ripple/bower-ripple.git dist/bower
|
||||||
gulp bower
|
gulp bower
|
||||||
cd dist
|
cd dist/bower
|
||||||
version=$(cat bower.json | grep -Eo '([0-9]\.?)+(-rc[0-9])?')
|
version=$(cat bower.json | grep -Eo '([0-9]\.?)+(-rc[0-9])?')
|
||||||
echo "version: $version"
|
echo "version: $version"
|
||||||
git add ripple.js ripple-debug.js ripple-min.js bower.json
|
git add ripple.js ripple-debug.js ripple-min.js bower.json
|
||||||
|
|||||||
@@ -1,21 +1,23 @@
|
|||||||
|
/* eslint-disable no-var */
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var Amount = require('../src/js/ripple').Amount;
|
var ripple = require('../dist/npm')._DEPRECATED;
|
||||||
var Ledger = require('../src/js/ripple/ledger').Ledger;
|
var Amount = ripple.Amount;
|
||||||
|
var Ledger = ripple.Ledger;
|
||||||
|
|
||||||
function parse_options(from, flags) {
|
function parse_options(from, flags) {
|
||||||
var argv = from.slice(),
|
var argv = from.slice();
|
||||||
opts_ = {argv: argv};
|
var opts_ = {argv: argv};
|
||||||
|
|
||||||
flags.forEach(function(f) {
|
flags.forEach(function(f) {
|
||||||
// Do we have the flag?
|
// Do we have the flag?
|
||||||
var flag_index = argv.indexOf('--' + f);
|
var flag_index = argv.indexOf('--' + f);
|
||||||
// normalize the name of the flag
|
// normalize the name of the flag
|
||||||
f = f.replace('-', '_');
|
var flag = f.replace('-', '_');
|
||||||
// opts_ has Boolean value for normalized flag key
|
// opts_ has Boolean value for normalized flag key
|
||||||
opts_[f] = flag_index !== -1;
|
opts_[flag] = flag_index !== -1;
|
||||||
if (opts_[f]) {
|
if (opts_[flag]) {
|
||||||
// remove the flag from the argv
|
// remove the flag from the argv
|
||||||
argv.splice(flag_index, 1);
|
argv.splice(flag_index, 1);
|
||||||
}
|
}
|
||||||
|
|||||||
44
src/api/common/constants.js
Normal file
44
src/api/common/constants.js
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
'use strict';
|
||||||
|
const core = require('./utils').core;
|
||||||
|
const flagIndices = core.Transaction.set_clear_flags.AccountSet;
|
||||||
|
const flags = core.Remote.flags.account_root;
|
||||||
|
|
||||||
|
const AccountFlags = {
|
||||||
|
passwordSpent: flags.PasswordSpent,
|
||||||
|
requireDestinationTag: flags.RequireDestTag,
|
||||||
|
requireAuthorization: flags.RequireAuth,
|
||||||
|
disallowIncomingXRP: flags.DisallowXRP,
|
||||||
|
disableMasterKey: flags.DisableMaster,
|
||||||
|
noFreeze: flags.NoFreeze,
|
||||||
|
globalFreeze: flags.GlobalFreeze,
|
||||||
|
defaultRipple: flags.DefaultRipple
|
||||||
|
};
|
||||||
|
|
||||||
|
const AccountFlagIndices = {
|
||||||
|
requireDestinationTag: flagIndices.asfRequireDest,
|
||||||
|
requireAuthorization: flagIndices.asfRequireAuth,
|
||||||
|
disallowIncomingXRP: flagIndices.asfDisallowXRP,
|
||||||
|
disableMasterKey: flagIndices.asfDisableMaster,
|
||||||
|
enableTransactionIDTracking: flagIndices.asfAccountTxnID,
|
||||||
|
noFreeze: flagIndices.asfNoFreeze,
|
||||||
|
globalFreeze: flagIndices.asfGlobalFreeze,
|
||||||
|
defaultRipple: flagIndices.asfDefaultRipple
|
||||||
|
};
|
||||||
|
|
||||||
|
const AccountFields = {
|
||||||
|
EmailHash: {name: 'emailHash', encoding: 'hex',
|
||||||
|
length: 32, defaults: '0'},
|
||||||
|
WalletLocator: {name: 'walletLocator', encoding: 'hex',
|
||||||
|
length: 64, defaults: '0'},
|
||||||
|
WalletSize: {name: 'walletSize', defaults: 0},
|
||||||
|
MessageKey: {name: 'messageKey'},
|
||||||
|
Domain: {name: 'domain', encoding: 'hex'},
|
||||||
|
TransferRate: {name: 'transferRate', defaults: 0, shift: 9},
|
||||||
|
Signers: {name: 'signers'}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
AccountFields,
|
||||||
|
AccountFlagIndices,
|
||||||
|
AccountFlags
|
||||||
|
};
|
||||||
89
src/api/common/errors.js
Normal file
89
src/api/common/errors.js
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* eslint-disable valid-jsdoc */
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for all errors
|
||||||
|
*/
|
||||||
|
function RippleError(message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
RippleError.prototype = new Error();
|
||||||
|
RippleError.prototype.name = 'RippleError';
|
||||||
|
|
||||||
|
function ValidationError(message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
ValidationError.prototype = new RippleError();
|
||||||
|
ValidationError.prototype.name = 'ValidationError';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timeout, disconnects and too busy
|
||||||
|
*/
|
||||||
|
function NetworkError(message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
NetworkError.prototype = new RippleError();
|
||||||
|
NetworkError.prototype.name = 'NetworkError';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Failed transactions, no paths found, not enough balance, etc.
|
||||||
|
*/
|
||||||
|
function RippledNetworkError(message) {
|
||||||
|
this.message = message !== undefined ? message : 'Cannot connect to rippled';
|
||||||
|
}
|
||||||
|
RippledNetworkError.prototype = new NetworkError();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Failed transactions, no paths found, not enough balance, etc.
|
||||||
|
*/
|
||||||
|
function TransactionError(message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
TransactionError.prototype = new RippleError();
|
||||||
|
TransactionError.prototype.name = 'TransactionError';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asset could not be found
|
||||||
|
*/
|
||||||
|
function NotFoundError(message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
NotFoundError.prototype = new RippleError();
|
||||||
|
NotFoundError.prototype.name = 'NotFoundError';
|
||||||
|
|
||||||
|
function MissingLedgerHistoryError(message) {
|
||||||
|
this.message = message ||
|
||||||
|
'Server is missing ledger history in the specified range';
|
||||||
|
}
|
||||||
|
MissingLedgerHistoryError.prototype = new RippleError();
|
||||||
|
MissingLedgerHistoryError.prototype.name = 'MissingLedgerHistoryError';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request timed out
|
||||||
|
*/
|
||||||
|
function TimeOutError(message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
TimeOutError.prototype = new RippleError();
|
||||||
|
TimeOutError.prototype.name = 'TimeOutError';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API logic failed to do what it intended
|
||||||
|
*/
|
||||||
|
function ApiError(message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
ApiError.prototype = new RippleError();
|
||||||
|
ApiError.prototype.name = 'ApiError';
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
ValidationError,
|
||||||
|
NetworkError,
|
||||||
|
TransactionError,
|
||||||
|
RippledNetworkError,
|
||||||
|
NotFoundError,
|
||||||
|
MissingLedgerHistoryError,
|
||||||
|
TimeOutError,
|
||||||
|
ApiError,
|
||||||
|
RippleError
|
||||||
|
};
|
||||||
21
src/api/common/index.js
Normal file
21
src/api/common/index.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
'use strict';
|
||||||
|
const utils = require('./utils');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
core: utils.core,
|
||||||
|
constants: require('./constants'),
|
||||||
|
errors: require('./errors'),
|
||||||
|
validate: require('./validate'),
|
||||||
|
dropsToXrp: utils.dropsToXrp,
|
||||||
|
xrpToDrops: utils.xrpToDrops,
|
||||||
|
toRippledAmount: utils.toRippledAmount,
|
||||||
|
generateAddress: utils.generateAddress,
|
||||||
|
composeAsync: utils.composeAsync,
|
||||||
|
wrapCatch: utils.wrapCatch,
|
||||||
|
convertErrors: utils.convertErrors,
|
||||||
|
convertExceptions: utils.convertExceptions,
|
||||||
|
convertKeysFromSnakeCaseToCamelCase:
|
||||||
|
utils.convertKeysFromSnakeCaseToCamelCase,
|
||||||
|
promisify: utils.promisify,
|
||||||
|
isValidAddress: require('./schema-validator').isValidAddress
|
||||||
|
};
|
||||||
76
src/api/common/schema-validator.js
Normal file
76
src/api/common/schema-validator.js
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const _ = require('lodash');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const assert = require('assert');
|
||||||
|
const validator = require('is-my-json-valid');
|
||||||
|
const core = require('./utils').core;
|
||||||
|
const ValidationError = require('./errors').ValidationError;
|
||||||
|
|
||||||
|
let SCHEMAS = {};
|
||||||
|
|
||||||
|
function isValidAddress(address: string): boolean {
|
||||||
|
return typeof address === 'string' && address.length > 0 &&
|
||||||
|
address[0] === 'r' &&
|
||||||
|
core.UInt160.is_valid(address);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isValidLedgerHash(ledgerHash) {
|
||||||
|
return core.UInt256.is_valid(ledgerHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadSchema(filepath: string): {} {
|
||||||
|
try {
|
||||||
|
return JSON.parse(fs.readFileSync(filepath, 'utf8'));
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error('Failed to parse schema: ' + filepath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function endsWith(str, suffix) {
|
||||||
|
return str.indexOf(suffix, str.length - suffix.length) !== -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadSchemas(dir) {
|
||||||
|
const filenames = fs.readdirSync(dir).filter(name => endsWith(name, '.json'));
|
||||||
|
const schemas = filenames.map(name => loadSchema(path.join(dir, name)));
|
||||||
|
const titles = _.map(schemas, schema => schema.title);
|
||||||
|
const duplicates = _.keys(_.pick(_.countBy(titles), count => count > 1));
|
||||||
|
assert(duplicates.length === 0, 'Duplicate schemas for: ' + duplicates);
|
||||||
|
return _.indexBy(schemas, 'title');
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatSchemaError(error) {
|
||||||
|
return error.field + ' ' + error.message
|
||||||
|
+ (error.value ? ' (' + JSON.stringify(error.value) + ')' : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatSchemaErrors(errors) {
|
||||||
|
return errors.map(formatSchemaError).join(', ');
|
||||||
|
}
|
||||||
|
|
||||||
|
function schemaValidate(schemaName: string, object: any): void {
|
||||||
|
const formats = {address: isValidAddress,
|
||||||
|
ledgerHash: isValidLedgerHash};
|
||||||
|
const options = {schemas: SCHEMAS, formats: formats,
|
||||||
|
verbose: true, greedy: true};
|
||||||
|
const schema = SCHEMAS[schemaName];
|
||||||
|
if (schema === undefined) {
|
||||||
|
throw new Error('schema not found for: ' + schemaName);
|
||||||
|
}
|
||||||
|
const validate = validator(schema, options);
|
||||||
|
const isValid = validate(object);
|
||||||
|
if (!isValid) {
|
||||||
|
throw new ValidationError(formatSchemaErrors(validate.errors));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEMAS = loadSchemas(path.join(__dirname, './schemas'));
|
||||||
|
module.exports = {
|
||||||
|
schemaValidate: schemaValidate,
|
||||||
|
isValidAddress: isValidAddress,
|
||||||
|
loadSchema: loadSchema,
|
||||||
|
SCHEMAS: SCHEMAS
|
||||||
|
};
|
||||||
8
src/api/common/schemas/address.json
Normal file
8
src/api/common/schemas/address.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "address",
|
||||||
|
"description": "A Ripple account address",
|
||||||
|
"type": "string",
|
||||||
|
"format": "address",
|
||||||
|
"pattern": "^r[1-9A-HJ-NP-Za-km-z]{25,34}$"
|
||||||
|
}
|
||||||
24
src/api/common/schemas/adjustment.json
Normal file
24
src/api/common/schemas/adjustment.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "adjustment",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"address": {"$ref": "address"},
|
||||||
|
"amount": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"currency": {"$ref": "currency"},
|
||||||
|
"counterparty": {"$ref": "address"},
|
||||||
|
"value": {"$ref": "value"}
|
||||||
|
},
|
||||||
|
"required": ["currency", "value"],
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"tag": {
|
||||||
|
"description": "A string representing an unsigned 32-bit integer most commonly used to refer to a sender's hosted account at a Ripple gateway",
|
||||||
|
"$ref": "uint32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["address", "amount"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
9
src/api/common/schemas/amount.json
Normal file
9
src/api/common/schemas/amount.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "amount",
|
||||||
|
"description": "An Amount on the Ripple Protocol, used also for XRP in the ripple-rest API",
|
||||||
|
"allOf": [
|
||||||
|
{"$ref": "amountbase"},
|
||||||
|
{"required": ["value"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
44
src/api/common/schemas/amountbase.json
Normal file
44
src/api/common/schemas/amountbase.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "amountbase",
|
||||||
|
"description": "Base class for amount and issue",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"value": {
|
||||||
|
"description": "The quantity of the currency, denoted as a string to retain floating point precision",
|
||||||
|
"$ref": "value"
|
||||||
|
},
|
||||||
|
"currency": {
|
||||||
|
"description": "The three-character code or hex string used to denote currencies",
|
||||||
|
"$ref": "currency"
|
||||||
|
},
|
||||||
|
"counterparty": {
|
||||||
|
"description": "The Ripple account address of the currency's issuer or gateway",
|
||||||
|
"$ref": "address"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": ["currency"],
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"currency": {
|
||||||
|
"not": {
|
||||||
|
"enum": ["XRP"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["counterparty"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"currency": {
|
||||||
|
"enum": ["XRP"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"not": {
|
||||||
|
"required": ["counterparty"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
44
src/api/common/schemas/balance.json
Normal file
44
src/api/common/schemas/balance.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "balance",
|
||||||
|
"description": "Balance amount",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"value": {
|
||||||
|
"description": "The balance on the trustline",
|
||||||
|
"$ref": "signedValue"
|
||||||
|
},
|
||||||
|
"currency": {
|
||||||
|
"description": "The three-character code or hex string used to denote currencies",
|
||||||
|
"$ref": "currency"
|
||||||
|
},
|
||||||
|
"counterparty": {
|
||||||
|
"description": "The Ripple account address of the currency's issuer or gateway",
|
||||||
|
"$ref": "address"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": ["currency", "value"],
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"currency": {
|
||||||
|
"not": {
|
||||||
|
"enum": ["XRP"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["counterparty"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"currency": {
|
||||||
|
"enum": ["XRP"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"not": {
|
||||||
|
"required": ["counterparty"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
8
src/api/common/schemas/blob.json
Normal file
8
src/api/common/schemas/blob.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "blob",
|
||||||
|
"description": "An uppercase hex string representation of a transaction",
|
||||||
|
"type": "string",
|
||||||
|
"minLength": "1",
|
||||||
|
"pattern": "^[0-9A-F]*$"
|
||||||
|
}
|
||||||
7
src/api/common/schemas/currency.json
Normal file
7
src/api/common/schemas/currency.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "currency",
|
||||||
|
"description": "The three-character code or hex string used to denote currencies",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^([a-zA-Z0-9<>(){}[\\]|?!@#$%^&*]{3}|[A-F0-9]{40})$"
|
||||||
|
}
|
||||||
21
src/api/common/schemas/get-account-info.json
Normal file
21
src/api/common/schemas/get-account-info.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getAccountInfo",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"sequence": {"$ref": "sequence"},
|
||||||
|
"xrpBalance": {"$ref": "value"},
|
||||||
|
"ownerCount": {"type": "integer", "minimum": 0},
|
||||||
|
"previousInitiatedTransactionID": {"$ref": "hash256"},
|
||||||
|
"previousAffectingTransactionID": {"$ref": "hash256"},
|
||||||
|
"previousAffectingTransactionLedgerVersion": {"$ref": "ledgerVersion"}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"sequence",
|
||||||
|
"xrpBalance",
|
||||||
|
"ownerCount",
|
||||||
|
"previousAffectingTransactionID",
|
||||||
|
"previousAffectingTransactionLedgerVersion"
|
||||||
|
],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
6
src/api/common/schemas/get-balances.json
Normal file
6
src/api/common/schemas/get-balances.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getBalances",
|
||||||
|
"type": "array",
|
||||||
|
"items": {"$ref": "balance"}
|
||||||
|
}
|
||||||
39
src/api/common/schemas/get-ledger.json
Normal file
39
src/api/common/schemas/get-ledger.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getLedger",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"accepted": {"type": "boolean"},
|
||||||
|
"closed": {"type": "boolean"},
|
||||||
|
"stateHash": {"$ref": "hash256"},
|
||||||
|
"closeTime": {"type": "integer", "minimum": 0},
|
||||||
|
"closeTimeResolution": {"type": "integer", "minimum": 1},
|
||||||
|
"closeFlags": {"type": "integer", "minimum": 0},
|
||||||
|
"ledgerHash": {"$ref": "hash256"},
|
||||||
|
"ledgerVersion": {"$ref": "ledgerVersion"},
|
||||||
|
"parentLedgerHash": {"$ref": "hash256"},
|
||||||
|
"parentCloseTime": {"type": "integer", "minimum": 0},
|
||||||
|
"totalDrops": {"$ref": "value"},
|
||||||
|
"transactionHash": {"$ref": "hash256"},
|
||||||
|
"transactions": {"type": "array", "items": {"type": "object"}},
|
||||||
|
"rawTransactions": {"type": "string"},
|
||||||
|
"transactionHashes": {"type": "array", "items": {"$ref": "hash256"}},
|
||||||
|
"rawState": {"type": "string"},
|
||||||
|
"stateHashes": {"type": "array", "items": {"$ref": "hash256"}}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"accepted",
|
||||||
|
"closed",
|
||||||
|
"stateHash",
|
||||||
|
"closeTime",
|
||||||
|
"closeTimeResolution",
|
||||||
|
"closeFlags",
|
||||||
|
"ledgerHash",
|
||||||
|
"ledgerVersion",
|
||||||
|
"parentLedgerHash",
|
||||||
|
"parentCloseTime",
|
||||||
|
"totalDrops",
|
||||||
|
"transactionHash"
|
||||||
|
],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
11
src/api/common/schemas/get-orderbook.json
Normal file
11
src/api/common/schemas/get-orderbook.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getOrderbook",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"bids": {"$ref": "orderbookOrders"},
|
||||||
|
"asks": {"$ref": "orderbookOrders"}
|
||||||
|
},
|
||||||
|
"required": ["bids", "asks"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
23
src/api/common/schemas/get-orders.json
Normal file
23
src/api/common/schemas/get-orders.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getOrders",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"specification": {"$ref": "order"},
|
||||||
|
"properties": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"maker": {"$ref": "address"},
|
||||||
|
"sequence": {"$ref": "sequence"},
|
||||||
|
"makerExchangeRate": {"$ref": "value"}
|
||||||
|
},
|
||||||
|
"required": ["maker", "sequence", "makerExchangeRate"],
|
||||||
|
"addtionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["specification", "properties"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
}
|
||||||
15
src/api/common/schemas/get-paths.json
Normal file
15
src/api/common/schemas/get-paths.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getPaths",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"source": {"$ref": "adjustment"},
|
||||||
|
"destination": {"$ref": "adjustment"},
|
||||||
|
"paths": {"type": "string"}
|
||||||
|
},
|
||||||
|
"required": ["source", "destination", "paths"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
}
|
||||||
49
src/api/common/schemas/get-server-info.json
Normal file
49
src/api/common/schemas/get-server-info.json
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getServerInfo",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"buildVersion": {"type": "string"},
|
||||||
|
"completeLedgers": {"type": "string", "pattern": "[0-9,-]+"},
|
||||||
|
"hostid": {"type": "string"},
|
||||||
|
"ioLatencyMs": {"type": "number"},
|
||||||
|
"load": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"jobTypes": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {"type": "object"}
|
||||||
|
},
|
||||||
|
"threads": {"type": "number"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lastClose": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"convergeTimeS": {"type": "number"},
|
||||||
|
"proposers": {"type": "integer", "minimum": 0}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"loadFactor": {"type": "number"},
|
||||||
|
"peers": {"type": "integer", "minimum": 0},
|
||||||
|
"pubkeyNode": {"type": "string"},
|
||||||
|
"pubkeyValidator": {"type": "string"},
|
||||||
|
"serverState": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["disconnected", "connected", "syncing", "tracking", "full", "validating", "proposing"]
|
||||||
|
},
|
||||||
|
"validatedLedger": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"age": {"type": "integer", "minimum": 0},
|
||||||
|
"baseFeeXrp": {"type": "number"},
|
||||||
|
"hash": {"$ref": "hash256"},
|
||||||
|
"reserveBaseXrp": {"type": "integer", "minimum": 0},
|
||||||
|
"reserveIncXrp": {"type": "integer", "minimum": 0},
|
||||||
|
"seq": {"type": "integer", "minimum": 0}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"validationQuorum": {"type": "number"}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
40
src/api/common/schemas/get-settings.json
Normal file
40
src/api/common/schemas/get-settings.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getSettings",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"passwordSpent": {"type": "boolean"},
|
||||||
|
"requireDestinationTag": {"type": "boolean"},
|
||||||
|
"requireAuthorization": {"type": "boolean"},
|
||||||
|
"disallowIncomingXRP": {"type": "boolean"},
|
||||||
|
"disableMasterKey": {"type": "boolean"},
|
||||||
|
"enableTransactionIDTracking": {"type": "boolean"},
|
||||||
|
"noFreeze": {"type": "boolean"},
|
||||||
|
"globalFreeze": {"type": "boolean"},
|
||||||
|
"defaultRipple": {"type": "boolean"},
|
||||||
|
"emailHash": {
|
||||||
|
"oneOf": [
|
||||||
|
{"type": "null"},
|
||||||
|
{"$ref": "hash128"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"walletLocator": {
|
||||||
|
"oneOf": [
|
||||||
|
{"type": "null"},
|
||||||
|
{"$ref": "hash256"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"walletSize": {"type": ["integer", "null"]},
|
||||||
|
"messageKey": {"type": "string"},
|
||||||
|
"domain": {"type": "string"},
|
||||||
|
"transferRate": {
|
||||||
|
"oneOf": [
|
||||||
|
{"type": "null"},
|
||||||
|
{"type": "number", "minimum": 1, "maximum": 4.294967295}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"signers": {"type": "string"},
|
||||||
|
"regularKey": {"$ref": "address"}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
11
src/api/common/schemas/get-transaction.json
Normal file
11
src/api/common/schemas/get-transaction.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getTransaction",
|
||||||
|
"oneOf": [
|
||||||
|
{"$ref": "paymentTransaction"},
|
||||||
|
{"$ref": "orderTransaction"},
|
||||||
|
{"$ref": "orderCancellationTransaction"},
|
||||||
|
{"$ref": "trustlineTransaction"},
|
||||||
|
{"$ref": "settingsTransaction"}
|
||||||
|
]
|
||||||
|
}
|
||||||
6
src/api/common/schemas/get-transactions.json
Normal file
6
src/api/common/schemas/get-transactions.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getTransactions",
|
||||||
|
"type": "array",
|
||||||
|
"items": {"$ref": "getTransaction"}
|
||||||
|
}
|
||||||
29
src/api/common/schemas/get-trustlines.json
Normal file
29
src/api/common/schemas/get-trustlines.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "getTrustlines",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"properties": {
|
||||||
|
"specification": {"$ref": "trustline"},
|
||||||
|
"counterparty": {
|
||||||
|
"properties": {
|
||||||
|
"limit": {"$ref": "value"},
|
||||||
|
"ripplingDisabled": {"type": "boolean"},
|
||||||
|
"frozen": {"type": "boolean"},
|
||||||
|
"authorized": {"type": "boolean"}
|
||||||
|
},
|
||||||
|
"required": ["limit"],
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"state": {
|
||||||
|
"properties": {
|
||||||
|
"balance": {"$ref": "value"}
|
||||||
|
},
|
||||||
|
"required": ["balance"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["specification", "counterparty", "state"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
}
|
||||||
7
src/api/common/schemas/hash128.json
Normal file
7
src/api/common/schemas/hash128.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "hash128",
|
||||||
|
"description": "The hex representation of a 128-bit hash",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-F0-9]{32}$"
|
||||||
|
}
|
||||||
7
src/api/common/schemas/hash256.json
Normal file
7
src/api/common/schemas/hash256.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "hash256",
|
||||||
|
"description": "The hex representation of a 256-bit hash",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-F0-9]{64}$"
|
||||||
|
}
|
||||||
42
src/api/common/schemas/instructions.json
Normal file
42
src/api/common/schemas/instructions.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "instructions",
|
||||||
|
"description": "Instructions for executing a transaction",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"sequence": {
|
||||||
|
"description": "The sequence number, relative to the initiating account, of this transaction.",
|
||||||
|
"$ref": "sequence"
|
||||||
|
},
|
||||||
|
"fee": {
|
||||||
|
"description": "Fixed Fee",
|
||||||
|
"$ref": "value"
|
||||||
|
},
|
||||||
|
"maxFee": {
|
||||||
|
"description": "Max Fee",
|
||||||
|
"$ref": "value"
|
||||||
|
},
|
||||||
|
"maxLedgerVersion": {
|
||||||
|
"description": "Highest ledger version number that a transaction can appear in.",
|
||||||
|
"$ref": "ledgerVersion"
|
||||||
|
},
|
||||||
|
"maxLedgerVersionOffset": {
|
||||||
|
"description": "Offset from current legder version to highest ledger version that a transaction can appear in.",
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"not": {
|
||||||
|
"anyOf": [
|
||||||
|
{
|
||||||
|
"description": "fee and maxFee are mutually exclusive",
|
||||||
|
"required": ["fee", "maxFee"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "maxLedgerVersion and maxLedgerVersionOffset are mutually exclusive",
|
||||||
|
"required": ["maxLedgerVersion", "maxLedgerVersionOffset"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
9
src/api/common/schemas/issue.json
Normal file
9
src/api/common/schemas/issue.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "issue",
|
||||||
|
"description": "A currency-counterparty pair, or just currency if it's XRP",
|
||||||
|
"allOf": [
|
||||||
|
{"$ref": "amountbase"},
|
||||||
|
{"not": {"required": ["value"]}}
|
||||||
|
]
|
||||||
|
}
|
||||||
13
src/api/common/schemas/ledger-options.json
Normal file
13
src/api/common/schemas/ledger-options.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "ledger-options",
|
||||||
|
"description": "Options for getLedger",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"ledgerVersion": {"$ref": "ledgerVersion"},
|
||||||
|
"includeAllData": {"type": "boolean"},
|
||||||
|
"includeTransactions": {"type": "boolean"},
|
||||||
|
"includeState": {"type": "boolean"}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
7
src/api/common/schemas/ledgerversion.json
Normal file
7
src/api/common/schemas/ledgerversion.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "ledgerVersion",
|
||||||
|
"description": "A ledger version number",
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1
|
||||||
|
}
|
||||||
24
src/api/common/schemas/max-adjustment.json
Normal file
24
src/api/common/schemas/max-adjustment.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "maxAdjustment",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"address": {"$ref": "address"},
|
||||||
|
"maxAmount": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"currency": {"$ref": "currency"},
|
||||||
|
"counterparty": {"$ref": "address"},
|
||||||
|
"value": {"$ref": "value"}
|
||||||
|
},
|
||||||
|
"required": ["currency", "value"],
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"tag": {
|
||||||
|
"description": "A string representing an unsigned 32-bit integer most commonly used to refer to a sender's hosted account at a Ripple gateway",
|
||||||
|
"$ref": "uint32"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["address", "maxAmount"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
22
src/api/common/schemas/memo.json
Normal file
22
src/api/common/schemas/memo.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "memo",
|
||||||
|
"description": "Memo objects represent arbitrary data that can be included in a transaction",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"pattern": "^[A-Za-z0-9\\-._~:/?#[\\]@!$&'()*+,;=%]*$"
|
||||||
|
},
|
||||||
|
"format": {
|
||||||
|
"pattern": "^[A-Za-z0-9\\-._~:/?#[\\]@!$&'()*+,;=%]*$"
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"anyOf": [
|
||||||
|
{"required": ["data"]},
|
||||||
|
{"required": ["type"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
15
src/api/common/schemas/order-cancellation-transaction.json
Normal file
15
src/api/common/schemas/order-cancellation-transaction.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "orderCancellationTransaction",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"type": {"enum": ["orderCancellation"]},
|
||||||
|
"specification": {"$ref": "orderCancellation"},
|
||||||
|
"outcome": {"$ref": "outcome"},
|
||||||
|
"id": {"$ref": "hash256"},
|
||||||
|
"address": {"$ref": "address"},
|
||||||
|
"sequence": {"$ref": "sequence"}
|
||||||
|
},
|
||||||
|
"required": ["type", "id", "address", "sequence", "specification", "outcome"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
10
src/api/common/schemas/order-cancellation.json
Normal file
10
src/api/common/schemas/order-cancellation.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "orderCancellation",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"orderSequence": {"$ref": "sequence"}
|
||||||
|
},
|
||||||
|
"required": ["orderSequence"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
17
src/api/common/schemas/order-change.json
Normal file
17
src/api/common/schemas/order-change.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "orderChange",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"direction": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["buy", "sell"]
|
||||||
|
},
|
||||||
|
"quantity": {"$ref": "balance"},
|
||||||
|
"totalPrice": {"$ref": "balance"},
|
||||||
|
"sequence": {"$ref": "sequence"},
|
||||||
|
"status": {"enum": ["created", "open", "closed", "canceled"]}
|
||||||
|
},
|
||||||
|
"required": ["direction", "quantity", "totalPrice", "sequence", "status"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
15
src/api/common/schemas/order-transaction.json
Normal file
15
src/api/common/schemas/order-transaction.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "orderTransaction",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"type": {"enum": ["order"]},
|
||||||
|
"specification": {"$ref": "order"},
|
||||||
|
"outcome": {"$ref": "outcome"},
|
||||||
|
"id": {"$ref": "hash256"},
|
||||||
|
"address": {"$ref": "address"},
|
||||||
|
"sequence": {"$ref": "sequence"}
|
||||||
|
},
|
||||||
|
"required": ["type", "id", "address", "sequence", "specification", "outcome"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
25
src/api/common/schemas/order.json
Normal file
25
src/api/common/schemas/order.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "order",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"direction": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["buy", "sell"]
|
||||||
|
},
|
||||||
|
"quantity": {"$ref": "amount"},
|
||||||
|
"totalPrice": {"$ref": "amount"},
|
||||||
|
"immediateOrCancel": {"type": "boolean"},
|
||||||
|
"fillOrKill": {"type": "boolean"},
|
||||||
|
"passive": {
|
||||||
|
"description": "If enabled, the offer will not consume offers that exactly match it, and instead becomes an Offer node in the ledger. It will still consume offers that cross it.",
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["direction", "quantity", "totalPrice"],
|
||||||
|
"additionalProperties": false,
|
||||||
|
"not": {
|
||||||
|
"description": "immediateOrCancel and fillOrKill are mutually exclusive",
|
||||||
|
"required": ["immediateOrCancel", "fillOrKill"]
|
||||||
|
}
|
||||||
|
}
|
||||||
32
src/api/common/schemas/orderbook-orders.json
Normal file
32
src/api/common/schemas/orderbook-orders.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "orderbookOrders",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"specification": {"$ref": "order"},
|
||||||
|
"properties": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"maker": {"$ref": "address"},
|
||||||
|
"sequence": {"$ref": "sequence"},
|
||||||
|
"makerExchangeRate": {"$ref": "value"}
|
||||||
|
},
|
||||||
|
"required": ["maker", "sequence", "makerExchangeRate"],
|
||||||
|
"addtionalProperties": false
|
||||||
|
},
|
||||||
|
"state": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"fundedAmount": {"$ref": "amount"},
|
||||||
|
"priceOfFundedAmount": {"$ref": "amount"}
|
||||||
|
},
|
||||||
|
"required": ["fundedAmount", "priceOfFundedAmount"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["specification", "properties"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
}
|
||||||
11
src/api/common/schemas/orderbook.json
Normal file
11
src/api/common/schemas/orderbook.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "orderbook",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"base": {"$ref": "issue"},
|
||||||
|
"counter": {"$ref": "issue"}
|
||||||
|
},
|
||||||
|
"required": ["base", "counter"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
14
src/api/common/schemas/orders-options.json
Normal file
14
src/api/common/schemas/orders-options.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "orders-options",
|
||||||
|
"description": "Options for getOrders and getOrderbook",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"limit": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1
|
||||||
|
},
|
||||||
|
"ledgerVersion": {"$ref": "ledgerVersion"}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
31
src/api/common/schemas/outcome.json
Normal file
31
src/api/common/schemas/outcome.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "outcome",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"result": {"type": "string"},
|
||||||
|
"timestamp": {"type": "string"},
|
||||||
|
"fee": {"$ref": "value"},
|
||||||
|
"balanceChanges": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Key is the ripple address; value is an array of changes",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {"$ref": "balance"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"orderbookChanges": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Key is the maker's ripple address; value is an array of changes",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {"$ref": "orderChange"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ledgerVersion": {"$ref": "ledgerVersion"},
|
||||||
|
"indexInLedger": {"type": "integer", "minimum": 0}
|
||||||
|
},
|
||||||
|
"required": ["result", "fee", "balanceChanges",
|
||||||
|
"orderbookChanges", "ledgerVersion", "indexInLedger"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
31
src/api/common/schemas/pathfind.json
Normal file
31
src/api/common/schemas/pathfind.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "pathfind",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"source": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"address": {"$ref": "address"},
|
||||||
|
"currencies": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"currency": {"$ref": "currency"},
|
||||||
|
"counterparty": {"$ref": "address"}
|
||||||
|
},
|
||||||
|
"required": ["currency"],
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": ["address"]
|
||||||
|
},
|
||||||
|
"destination": {"$ref": "adjustment"}
|
||||||
|
},
|
||||||
|
"required": ["source", "destination"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
15
src/api/common/schemas/payment-transaction.json
Normal file
15
src/api/common/schemas/payment-transaction.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "paymentTransaction",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"type": {"enum": ["payment"]},
|
||||||
|
"specification": {"$ref": "payment"},
|
||||||
|
"outcome": {"$ref": "outcome"},
|
||||||
|
"id": {"$ref": "hash256"},
|
||||||
|
"address": {"$ref": "address"},
|
||||||
|
"sequence": {"$ref": "sequence"}
|
||||||
|
},
|
||||||
|
"required": ["type", "id", "address", "sequence", "specification", "outcome"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
31
src/api/common/schemas/payment.json
Normal file
31
src/api/common/schemas/payment.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "payment",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"source": {"$ref": "maxAdjustment"},
|
||||||
|
"destination": {"$ref": "adjustment"},
|
||||||
|
"paths": {"type": "string"},
|
||||||
|
"memos": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "memo"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"invoiceID": {
|
||||||
|
"description": "A 256-bit hash that can be used to identify a particular payment",
|
||||||
|
"$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",
|
||||||
|
"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",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"limitQuality": {"type": "boolean"}
|
||||||
|
},
|
||||||
|
"required": ["source", "destination"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
8
src/api/common/schemas/quality.json
Normal file
8
src/api/common/schemas/quality.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "quality",
|
||||||
|
"description": "Ratio for incoming/outgoing transit fees.",
|
||||||
|
"type": "number",
|
||||||
|
"minimum": 0.000000001,
|
||||||
|
"maximum": 4.294967295
|
||||||
|
}
|
||||||
10
src/api/common/schemas/remote-options.json
Normal file
10
src/api/common/schemas/remote-options.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "remote-options",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"trace": {"type": "boolean"},
|
||||||
|
"servers": {"type": "array", "items": {"type": "string", "format": "uri"}}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
7
src/api/common/schemas/sequence.json
Normal file
7
src/api/common/schemas/sequence.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "sequence",
|
||||||
|
"description": "An account transaction sequence number",
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1
|
||||||
|
}
|
||||||
10
src/api/common/schemas/settings-options.json
Normal file
10
src/api/common/schemas/settings-options.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "settings-options",
|
||||||
|
"description": "Options for getSettings and getAccountInfo",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"ledgerVersion": {"$ref": "ledgerVersion"}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
15
src/api/common/schemas/settings-transaction.json
Normal file
15
src/api/common/schemas/settings-transaction.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "settingsTransaction",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"type": {"enum": ["settings"]},
|
||||||
|
"specification": {"$ref": "getSettings"},
|
||||||
|
"outcome": {"$ref": "outcome"},
|
||||||
|
"id": {"$ref": "hash256"},
|
||||||
|
"address": {"$ref": "address"},
|
||||||
|
"sequence": {"$ref": "sequence"}
|
||||||
|
},
|
||||||
|
"required": ["type", "id", "address", "sequence", "specification"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
13
src/api/common/schemas/settings.json
Normal file
13
src/api/common/schemas/settings.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "settings",
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "getSettings"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minProperties": 1,
|
||||||
|
"maxProperties": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
14
src/api/common/schemas/sign.json
Normal file
14
src/api/common/schemas/sign.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "sign",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"signedTransaction": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-F0-9]+$"
|
||||||
|
},
|
||||||
|
"id": {"$ref": "hash256"}
|
||||||
|
},
|
||||||
|
"required": ["signedTransaction", "id"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
7
src/api/common/schemas/signed-value.json
Normal file
7
src/api/common/schemas/signed-value.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "signedValue",
|
||||||
|
"description": "A string representation of a floating point number",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[-]?[0-9]*[.]?[0-9]+([eE][-+]?[0-9]+)?$"
|
||||||
|
}
|
||||||
15
src/api/common/schemas/submit.json
Normal file
15
src/api/common/schemas/submit.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "submit",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"success": {"type": "boolean"},
|
||||||
|
"engineResult": {"type": "string"},
|
||||||
|
"engineResultCode": {"type": "integer"},
|
||||||
|
"engineResultMessage": {"type": "string"},
|
||||||
|
"txBlob": {"type": "string"},
|
||||||
|
"txJson": {"type": "object"}
|
||||||
|
},
|
||||||
|
"required": ["success", "engineResult", "engineResultCode"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
7
src/api/common/schemas/timestamp.json
Normal file
7
src/api/common/schemas/timestamp.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "timestamp",
|
||||||
|
"description": "An ISO 8601 combined date and time timestamp",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^$|^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T(2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9](Z|[+](2[0-3]|[01][0-9]):[0-5][0-9])$"
|
||||||
|
}
|
||||||
11
src/api/common/schemas/transaction-options.json
Normal file
11
src/api/common/schemas/transaction-options.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "transaction-options",
|
||||||
|
"description": "Options for getTransaction",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"minLedgerVersion": {"$ref": "ledgerVersion"},
|
||||||
|
"maxLedgerVersion": {"$ref": "ledgerVersion"}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
40
src/api/common/schemas/transactions-options.json
Normal file
40
src/api/common/schemas/transactions-options.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "transactions-options",
|
||||||
|
"description": "Options for getTransactions",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"start": {"$ref": "hash256"},
|
||||||
|
"limit": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1
|
||||||
|
},
|
||||||
|
"minLedgerVersion": {"$ref": "ledgerVersion"},
|
||||||
|
"maxLedgerVersion": {"$ref": "ledgerVersion"},
|
||||||
|
"earliestFirst": {"type": "boolean"},
|
||||||
|
"excludeFailures": {"type": "boolean"},
|
||||||
|
"initiated": {"type": "boolean"},
|
||||||
|
"counterparty": {"$ref": "address"},
|
||||||
|
"types": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"enum": [
|
||||||
|
"payment",
|
||||||
|
"trustline",
|
||||||
|
"order",
|
||||||
|
"orderCancellation",
|
||||||
|
"settings"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"binary": {"type": "boolean"}
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"not": {
|
||||||
|
"anyOf": [
|
||||||
|
{"required": ["incoming", "outgoing"]},
|
||||||
|
{"required": ["start", "minLedgerVersion"]},
|
||||||
|
{"required": ["start", "maxLedgerVersion"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
15
src/api/common/schemas/trustline-transaction.json
Normal file
15
src/api/common/schemas/trustline-transaction.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "trustlineTransaction",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"type": {"enum": ["trustline"]},
|
||||||
|
"specification": {"$ref": "trustline"},
|
||||||
|
"outcome": {"$ref": "outcome"},
|
||||||
|
"id": {"$ref": "hash256"},
|
||||||
|
"address": {"$ref": "address"},
|
||||||
|
"sequence": {"$ref": "sequence"}
|
||||||
|
},
|
||||||
|
"required": ["type", "id", "address", "sequence", "specification", "outcome"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
17
src/api/common/schemas/trustline.json
Normal file
17
src/api/common/schemas/trustline.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "trustline",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"currency": {"$ref": "currency"},
|
||||||
|
"counterparty": {"$ref": "address"},
|
||||||
|
"limit": {"$ref": "value"},
|
||||||
|
"qualityIn": {"$ref": "quality"},
|
||||||
|
"qualityOut": {"$ref": "quality"},
|
||||||
|
"ripplingDisabled": {"type": "boolean"},
|
||||||
|
"authorized": {"type": "boolean"},
|
||||||
|
"frozen": {"type": "boolean"}
|
||||||
|
},
|
||||||
|
"required": ["currency", "counterparty", "limit"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
16
src/api/common/schemas/trustlines-options.json
Normal file
16
src/api/common/schemas/trustlines-options.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "trustlines-options",
|
||||||
|
"description": "Options for getTrustlines and getBalances",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"counterparty": {"$ref": "address"},
|
||||||
|
"currency": {"$ref": "currency"},
|
||||||
|
"limit": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1
|
||||||
|
},
|
||||||
|
"ledgerVersion": {"$ref": "ledgerVersion"}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
10
src/api/common/schemas/tx.json
Normal file
10
src/api/common/schemas/tx.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "tx",
|
||||||
|
"description": "An object in rippled txJSON format",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"Account": {"$ref": "address"}
|
||||||
|
},
|
||||||
|
"required": ["Account"]
|
||||||
|
}
|
||||||
8
src/api/common/schemas/uint32.json
Normal file
8
src/api/common/schemas/uint32.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "uint32",
|
||||||
|
"description": "A 32-bit unsigned integer",
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 4294967295
|
||||||
|
}
|
||||||
7
src/api/common/schemas/value.json
Normal file
7
src/api/common/schemas/value.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||||
|
"title": "value",
|
||||||
|
"description": "A string representation of a non-negative floating point number",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[0-9]*[.]?[0-9]+([eE][-+]?[0-9]+)?$"
|
||||||
|
}
|
||||||
121
src/api/common/utils.js
Normal file
121
src/api/common/utils.js
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const _ = require('lodash');
|
||||||
|
const BigNumber = require('bignumber.js');
|
||||||
|
const core = require('../../core');
|
||||||
|
const errors = require('./errors');
|
||||||
|
const es6promisify = require('es6-promisify');
|
||||||
|
const keypairs = require('ripple-keypairs');
|
||||||
|
|
||||||
|
type Amount = {currency: string, issuer: string, value: string}
|
||||||
|
|
||||||
|
function dropsToXrp(drops: string): string {
|
||||||
|
return (new BigNumber(drops)).dividedBy(1000000.0).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
function xrpToDrops(xrp: string): string {
|
||||||
|
return (new BigNumber(xrp)).times(1000000.0).floor().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
function toRippledAmount(amount: Amount): string|Amount {
|
||||||
|
if (amount.currency === 'XRP') {
|
||||||
|
return xrpToDrops(amount.value);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
currency: amount.currency,
|
||||||
|
issuer: amount.counterparty ? amount.counterparty : amount.issuer,
|
||||||
|
value: amount.value
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateAddress(options?: Object): Object {
|
||||||
|
const {accountID, seed} = keypairs.generateWallet(options);
|
||||||
|
return {secret: seed, address: accountID};
|
||||||
|
}
|
||||||
|
|
||||||
|
type AsyncFunction = (...x: any) => void
|
||||||
|
|
||||||
|
function wrapCatch(asyncFunction: AsyncFunction): AsyncFunction {
|
||||||
|
return function() {
|
||||||
|
try {
|
||||||
|
asyncFunction.apply(this, arguments);
|
||||||
|
} catch (error) {
|
||||||
|
const callback = arguments[arguments.length - 1];
|
||||||
|
callback(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
type Callback = (err: any, data: any) => void
|
||||||
|
type Wrapper = (data: any) => any
|
||||||
|
|
||||||
|
function composeAsync(wrapper: Wrapper, callback: Callback): Callback {
|
||||||
|
return function(error, data) {
|
||||||
|
if (error) {
|
||||||
|
callback(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let result;
|
||||||
|
try {
|
||||||
|
result = wrapper(data);
|
||||||
|
} catch (exception) {
|
||||||
|
callback(exception);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
callback(null, result);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertErrors(callback: () => void): () => void {
|
||||||
|
return function(error, data) {
|
||||||
|
if (error && !(error instanceof errors.RippleError)) {
|
||||||
|
callback(new errors.RippleError(error));
|
||||||
|
} else {
|
||||||
|
callback(error, data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertExceptions<T>(f: () => T): () => T {
|
||||||
|
return function() {
|
||||||
|
try {
|
||||||
|
return f.apply(this, arguments);
|
||||||
|
} catch (error) {
|
||||||
|
throw new errors.ApiError(error.message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const FINDSNAKE = /([a-zA-Z]_[a-zA-Z])/g;
|
||||||
|
function convertKeysFromSnakeCaseToCamelCase(obj: any): any {
|
||||||
|
if (typeof obj === 'object') {
|
||||||
|
let newKey;
|
||||||
|
return _.reduce(obj, (result, value, key) => {
|
||||||
|
newKey = key;
|
||||||
|
if (FINDSNAKE.test(key)) {
|
||||||
|
newKey = key.replace(FINDSNAKE, r => r[0] + r[2].toUpperCase());
|
||||||
|
}
|
||||||
|
result[newKey] = convertKeysFromSnakeCaseToCamelCase(value);
|
||||||
|
return result;
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
function promisify(asyncFunction: AsyncFunction): Function {
|
||||||
|
return es6promisify(wrapCatch(asyncFunction));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
core,
|
||||||
|
dropsToXrp,
|
||||||
|
xrpToDrops,
|
||||||
|
toRippledAmount,
|
||||||
|
generateAddress,
|
||||||
|
composeAsync,
|
||||||
|
wrapCatch,
|
||||||
|
convertExceptions,
|
||||||
|
convertErrors,
|
||||||
|
convertKeysFromSnakeCaseToCamelCase,
|
||||||
|
promisify
|
||||||
|
};
|
||||||
81
src/api/common/validate.js
Normal file
81
src/api/common/validate.js
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const _ = require('lodash');
|
||||||
|
const core = require('./utils').core;
|
||||||
|
const ValidationError = require('./errors').ValidationError;
|
||||||
|
const schemaValidate = require('./schema-validator').schemaValidate;
|
||||||
|
|
||||||
|
function error(text) {
|
||||||
|
return new ValidationError(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateAddressAndSecret(obj: {address: string, secret: string}
|
||||||
|
): void {
|
||||||
|
const address = obj.address;
|
||||||
|
const secret = obj.secret;
|
||||||
|
schemaValidate('address', address);
|
||||||
|
if (!secret) {
|
||||||
|
throw error('Parameter missing: secret');
|
||||||
|
}
|
||||||
|
if (!core.Seed.from_json(secret).is_valid()) {
|
||||||
|
throw error('secret is invalid');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateSecret(secret: string): void {
|
||||||
|
if (!secret) {
|
||||||
|
throw error('Parameter missing: secret');
|
||||||
|
}
|
||||||
|
if (typeof secret !== 'string' || secret[0] !== 's') {
|
||||||
|
throw error('Invalid parameter');
|
||||||
|
}
|
||||||
|
|
||||||
|
const seed = new core.Seed().parse_base58(secret);
|
||||||
|
if (!seed.is_valid()) {
|
||||||
|
throw error('invalid seed');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateLedgerRange(options) {
|
||||||
|
if (!_.isUndefined(options.minLedgerVersion)
|
||||||
|
&& !_.isUndefined(options.maxLedgerVersion)) {
|
||||||
|
if (Number(options.minLedgerVersion) > Number(options.maxLedgerVersion)) {
|
||||||
|
throw error('minLedgerVersion must not be greater than maxLedgerVersion');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateOptions(schema, options) {
|
||||||
|
schemaValidate(schema, options);
|
||||||
|
validateLedgerRange(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
address: _.partial(schemaValidate, 'address'),
|
||||||
|
addressAndSecret: validateAddressAndSecret,
|
||||||
|
secret: validateSecret,
|
||||||
|
currency: _.partial(schemaValidate, 'currency'),
|
||||||
|
identifier: _.partial(schemaValidate, 'hash256'),
|
||||||
|
ledgerVersion: _.partial(schemaValidate, 'ledgerVersion'),
|
||||||
|
sequence: _.partial(schemaValidate, 'sequence'),
|
||||||
|
order: _.partial(schemaValidate, 'order'),
|
||||||
|
orderbook: _.partial(schemaValidate, 'orderbook'),
|
||||||
|
payment: _.partial(schemaValidate, 'payment'),
|
||||||
|
pathfind: _.partial(schemaValidate, 'pathfind'),
|
||||||
|
settings: _.partial(schemaValidate, 'settings'),
|
||||||
|
trustline: _.partial(schemaValidate, 'trustline'),
|
||||||
|
txJSON: _.partial(schemaValidate, 'tx'),
|
||||||
|
blob: _.partial(schemaValidate, 'blob'),
|
||||||
|
getTransactionsOptions: _.partial(validateOptions, 'transactions-options'),
|
||||||
|
getSettingsOptions: _.partial(validateOptions, 'settings-options'),
|
||||||
|
getAccountInfoOptions: _.partial(validateOptions, 'settings-options'),
|
||||||
|
getTrustlinesOptions: _.partial(validateOptions, 'trustlines-options'),
|
||||||
|
getBalancesOptions: _.partial(validateOptions, 'trustlines-options'),
|
||||||
|
getOrdersOptions: _.partial(validateOptions, 'orders-options'),
|
||||||
|
getOrderbookOptions: _.partial(validateOptions, 'orders-options'),
|
||||||
|
getTransactionOptions: _.partial(validateOptions, 'transaction-options'),
|
||||||
|
getLedgerOptions: _.partial(validateOptions, 'ledger-options'),
|
||||||
|
options: _.partial(validateOptions, 'options'),
|
||||||
|
remoteOptions: _.partial(schemaValidate, 'remote-options'),
|
||||||
|
instructions: _.partial(schemaValidate, 'instructions')
|
||||||
|
};
|
||||||
82
src/api/index.js
Normal file
82
src/api/index.js
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
/* @flow */
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
const _ = require('lodash');
|
||||||
|
const common = require('./common');
|
||||||
|
const server = require('./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;
|
||||||
|
const getTransaction = require('./ledger/transaction');
|
||||||
|
const getTransactions = require('./ledger/transactions');
|
||||||
|
const getTrustlines = require('./ledger/trustlines');
|
||||||
|
const getBalances = require('./ledger/balances');
|
||||||
|
const getPaths = require('./ledger/pathfind');
|
||||||
|
const getOrders = require('./ledger/orders');
|
||||||
|
const getOrderbook = require('./ledger/orderbook');
|
||||||
|
const getSettings = require('./ledger/settings');
|
||||||
|
const getAccountInfo = require('./ledger/accountinfo');
|
||||||
|
const preparePayment = require('./transaction/payment');
|
||||||
|
const prepareTrustline = require('./transaction/trustline');
|
||||||
|
const prepareOrder = require('./transaction/order');
|
||||||
|
const prepareOrderCancellation = require('./transaction/ordercancellation');
|
||||||
|
const prepareSettings = require('./transaction/settings');
|
||||||
|
const sign = require('./transaction/sign');
|
||||||
|
const submit = require('./transaction/submit');
|
||||||
|
const errors = require('./common').errors;
|
||||||
|
const convertExceptions = require('./common').convertExceptions;
|
||||||
|
const generateAddress = convertExceptions(common.generateAddress);
|
||||||
|
const computeLedgerHash = require('./offline/ledgerhash');
|
||||||
|
const getLedger = require('./ledger/ledger');
|
||||||
|
const isValidAddress = common.isValidAddress;
|
||||||
|
|
||||||
|
function RippleAPI(options: {}) {
|
||||||
|
common.validate.remoteOptions(options);
|
||||||
|
const _options = _.assign({}, options, {automatic_resubmission: false});
|
||||||
|
this.remote = new common.core.Remote(_options);
|
||||||
|
}
|
||||||
|
|
||||||
|
RippleAPI.prototype = {
|
||||||
|
connect,
|
||||||
|
disconnect,
|
||||||
|
isConnected,
|
||||||
|
getServerInfo,
|
||||||
|
getFee,
|
||||||
|
getLedgerVersion,
|
||||||
|
|
||||||
|
getTransaction,
|
||||||
|
getTransactions,
|
||||||
|
getTrustlines,
|
||||||
|
getBalances,
|
||||||
|
getPaths,
|
||||||
|
getOrders,
|
||||||
|
getOrderbook,
|
||||||
|
getSettings,
|
||||||
|
getAccountInfo,
|
||||||
|
getLedger,
|
||||||
|
|
||||||
|
preparePayment,
|
||||||
|
prepareTrustline,
|
||||||
|
prepareOrder,
|
||||||
|
prepareOrderCancellation,
|
||||||
|
prepareSettings,
|
||||||
|
sign,
|
||||||
|
submit,
|
||||||
|
|
||||||
|
computeLedgerHash,
|
||||||
|
isValidAddress,
|
||||||
|
generateAddress,
|
||||||
|
errors
|
||||||
|
};
|
||||||
|
|
||||||
|
// these are exposed only for use by unit tests; they are not part of the API
|
||||||
|
RippleAPI._PRIVATE = {
|
||||||
|
common: common,
|
||||||
|
ledgerUtils: require('./ledger/utils'),
|
||||||
|
schemaValidator: require('./common/schema-validator')
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = RippleAPI;
|
||||||
78
src/api/ledger/accountinfo.js
Normal file
78
src/api/ledger/accountinfo.js
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/* @flow */
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
const utils = require('./utils');
|
||||||
|
const removeUndefined = require('./parse/utils').removeUndefined;
|
||||||
|
const validate = utils.common.validate;
|
||||||
|
const composeAsync = utils.common.composeAsync;
|
||||||
|
const convertErrors = utils.common.convertErrors;
|
||||||
|
|
||||||
|
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 = {
|
||||||
|
ledgerVersion?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccountInfoCallback = (err: any, data: AccountInfoResponse) => void
|
||||||
|
|
||||||
|
type AccountInfoResponse = {
|
||||||
|
sequence: number,
|
||||||
|
xrpBalance: string,
|
||||||
|
ownerCount: number,
|
||||||
|
previousInitiatedTransactionID: string,
|
||||||
|
previousAffectingTransactionID: string,
|
||||||
|
previousAffectingTransactionLedgerVersion: number
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatAccountInfo(response: AccountDataResponse) {
|
||||||
|
const data = response.account_data;
|
||||||
|
return removeUndefined({
|
||||||
|
sequence: data.Sequence,
|
||||||
|
xrpBalance: utils.common.dropsToXrp(data.Balance),
|
||||||
|
ownerCount: data.OwnerCount,
|
||||||
|
previousInitiatedTransactionID: data.AccountTxnID,
|
||||||
|
previousAffectingTransactionID: data.PreviousTxnID,
|
||||||
|
previousAffectingTransactionLedgerVersion: data.PreviousTxnLgrSeq
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAccountInfoAsync(account: string, options: AccountInfoOptions,
|
||||||
|
callback: AccountInfoCallback
|
||||||
|
) {
|
||||||
|
validate.address(account);
|
||||||
|
validate.getAccountInfoOptions(options);
|
||||||
|
|
||||||
|
const request = {
|
||||||
|
account: account,
|
||||||
|
ledger: options.ledgerVersion || 'validated'
|
||||||
|
};
|
||||||
|
|
||||||
|
this.remote.requestAccountInfo(request,
|
||||||
|
composeAsync(formatAccountInfo, convertErrors(callback)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAccountInfo(account: string, options: AccountInfoOptions = {}
|
||||||
|
): Promise<AccountInfoResponse> {
|
||||||
|
return utils.promisify(getAccountInfoAsync).call(this, account, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = getAccountInfo;
|
||||||
50
src/api/ledger/balances.js
Normal file
50
src/api/ledger/balances.js
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const _ = require('lodash');
|
||||||
|
const async = require('async');
|
||||||
|
const utils = require('./utils');
|
||||||
|
const getTrustlines = require('./trustlines');
|
||||||
|
const validate = utils.common.validate;
|
||||||
|
const composeAsync = utils.common.composeAsync;
|
||||||
|
const convertErrors = utils.common.convertErrors;
|
||||||
|
|
||||||
|
function getTrustlineBalanceAmount(trustline) {
|
||||||
|
return {
|
||||||
|
currency: trustline.specification.currency,
|
||||||
|
counterparty: trustline.specification.counterparty,
|
||||||
|
value: trustline.state.balance
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatBalances(balances) {
|
||||||
|
const xrpBalance = {
|
||||||
|
currency: 'XRP',
|
||||||
|
value: balances.xrp
|
||||||
|
};
|
||||||
|
return [xrpBalance].concat(
|
||||||
|
balances.trustlines.map(getTrustlineBalanceAmount));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTrustlinesAsync(account, options, callback) {
|
||||||
|
getTrustlines.call(this, account, options)
|
||||||
|
.then(data => callback(null, data))
|
||||||
|
.catch(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBalancesAsync(account, options, callback) {
|
||||||
|
validate.address(account);
|
||||||
|
validate.getBalancesOptions(options);
|
||||||
|
|
||||||
|
const ledgerVersion = options.ledgerVersion
|
||||||
|
|| this.remote.getLedgerSequence();
|
||||||
|
async.parallel({
|
||||||
|
xrp: _.partial(utils.getXRPBalance, this.remote, account, ledgerVersion),
|
||||||
|
trustlines: _.partial(getTrustlinesAsync.bind(this), account, options)
|
||||||
|
}, composeAsync(formatBalances, convertErrors(callback)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBalances(account: string, options = {}) {
|
||||||
|
return utils.promisify(getBalancesAsync).call(this, account, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = getBalances;
|
||||||
28
src/api/ledger/ledger.js
Normal file
28
src/api/ledger/ledger.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const utils = require('./utils');
|
||||||
|
const validate = utils.common.validate;
|
||||||
|
const composeAsync = utils.common.composeAsync;
|
||||||
|
const convertErrors = utils.common.convertErrors;
|
||||||
|
const parseLedger = require('./parse/ledger');
|
||||||
|
|
||||||
|
function getLedgerAsync(options, callback) {
|
||||||
|
validate.getLedgerOptions(options);
|
||||||
|
|
||||||
|
const request = {
|
||||||
|
ledger: options.ledgerVersion || 'validated',
|
||||||
|
expand: options.includeAllData,
|
||||||
|
transactions: options.includeTransactions,
|
||||||
|
accounts: options.includeState
|
||||||
|
};
|
||||||
|
|
||||||
|
this.remote.requestLedger(request,
|
||||||
|
composeAsync(response => parseLedger(response.ledger),
|
||||||
|
convertErrors(callback)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLedger(options = {}) {
|
||||||
|
return utils.promisify(getLedgerAsync).call(this, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = getLedger;
|
||||||
86
src/api/ledger/orderbook.js
Normal file
86
src/api/ledger/orderbook.js
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const _ = require('lodash');
|
||||||
|
const async = require('async');
|
||||||
|
const utils = require('./utils');
|
||||||
|
const validate = utils.common.validate;
|
||||||
|
const composeAsync = utils.common.composeAsync;
|
||||||
|
const convertErrors = utils.common.convertErrors;
|
||||||
|
const parseOrderbookOrder = require('./parse/orderbook-order');
|
||||||
|
|
||||||
|
// account is to specify a "perspective", which affects which unfunded offers
|
||||||
|
// are returned
|
||||||
|
function getBookOffers(remote, account, ledgerVersion, limit,
|
||||||
|
takerGets, takerPays, callback
|
||||||
|
) {
|
||||||
|
remote.requestBookOffers(utils.renameCounterpartyToIssuerInOrder({
|
||||||
|
taker_gets: takerGets,
|
||||||
|
taker_pays: takerPays,
|
||||||
|
ledger: ledgerVersion || 'validated',
|
||||||
|
limit: limit,
|
||||||
|
taker: account
|
||||||
|
}), composeAsync(data => data.offers, convertErrors(callback)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function isSameIssue(a, b) {
|
||||||
|
return a.currency === b.currency && a.counterparty === b.counterparty;
|
||||||
|
}
|
||||||
|
|
||||||
|
function directionFilter(direction, order) {
|
||||||
|
return order.specification.direction === direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
function flipOrder(order) {
|
||||||
|
const specification = order.specification;
|
||||||
|
const flippedSpecification = {
|
||||||
|
quantity: specification.totalPrice,
|
||||||
|
totalPrice: specification.quantity,
|
||||||
|
direction: specification.direction === 'buy' ? 'sell' : 'buy'
|
||||||
|
};
|
||||||
|
const newSpecification = _.merge({}, specification, flippedSpecification);
|
||||||
|
return _.merge({}, order, {specification: newSpecification});
|
||||||
|
}
|
||||||
|
|
||||||
|
function alignOrder(base, order) {
|
||||||
|
const quantity = order.specification.quantity;
|
||||||
|
return isSameIssue(quantity, base) ? order : flipOrder(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatBidsAndAsks(orderbook, offers) {
|
||||||
|
// 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
|
||||||
|
// for bids: takerGets = totalPrice = counter, takerPays = quantity = base
|
||||||
|
// for asks: takerGets = quantity = base, takerPays = totalPrice = counter
|
||||||
|
// quality = takerPays / takerGets; price = totalPrice / quantity
|
||||||
|
// for bids: lowest quality => lowest quantity/totalPrice => highest price
|
||||||
|
// for asks: lowest quality => lowest totalPrice/quantity => lowest price
|
||||||
|
// for both bids and asks, lowest quality is closest to mid-market
|
||||||
|
// we sort the orders so that earlier orders are closer to mid-market
|
||||||
|
const orders = _.sortBy(offers, 'quality').map(parseOrderbookOrder);
|
||||||
|
const alignedOrders = orders.map(_.partial(alignOrder, orderbook.base));
|
||||||
|
const bids = alignedOrders.filter(_.partial(directionFilter, 'buy'));
|
||||||
|
const asks = alignedOrders.filter(_.partial(directionFilter, 'sell'));
|
||||||
|
return {bids, asks};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOrderbookAsync(account, orderbook, options, callback) {
|
||||||
|
validate.address(account);
|
||||||
|
validate.orderbook(orderbook);
|
||||||
|
validate.getOrderbookOptions(options);
|
||||||
|
|
||||||
|
const getter = _.partial(getBookOffers, this.remote, account,
|
||||||
|
options.ledgerVersion, options.limit);
|
||||||
|
const getOffers = _.partial(getter, orderbook.base, orderbook.counter);
|
||||||
|
const getReverseOffers = _.partial(getter, orderbook.counter, orderbook.base);
|
||||||
|
async.parallel([getOffers, getReverseOffers],
|
||||||
|
composeAsync((data) => formatBidsAndAsks(orderbook, _.flatten(data)),
|
||||||
|
callback));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOrderbook(account: string, orderbook: Object, options = {}) {
|
||||||
|
return utils.promisify(getOrderbookAsync).call(this,
|
||||||
|
account, orderbook, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = getOrderbook;
|
||||||
42
src/api/ledger/orders.js
Normal file
42
src/api/ledger/orders.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const _ = require('lodash');
|
||||||
|
const utils = require('./utils');
|
||||||
|
const validate = utils.common.validate;
|
||||||
|
const composeAsync = utils.common.composeAsync;
|
||||||
|
const convertErrors = utils.common.convertErrors;
|
||||||
|
const parseAccountOrder = require('./parse/account-order');
|
||||||
|
|
||||||
|
function requestAccountOffers(remote, address, ledgerVersion, marker, limit,
|
||||||
|
callback
|
||||||
|
) {
|
||||||
|
remote.requestAccountOffers({
|
||||||
|
account: address,
|
||||||
|
marker: marker,
|
||||||
|
limit: utils.clamp(limit, 10, 400),
|
||||||
|
ledger: ledgerVersion
|
||||||
|
},
|
||||||
|
composeAsync((data) => ({
|
||||||
|
marker: data.marker,
|
||||||
|
results: data.offers.map(_.partial(parseAccountOrder, address))
|
||||||
|
}), convertErrors(callback)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOrdersAsync(account, options, callback) {
|
||||||
|
validate.address(account);
|
||||||
|
validate.getOrdersOptions(options);
|
||||||
|
|
||||||
|
const ledgerVersion = options.ledgerVersion
|
||||||
|
|| this.remote.getLedgerSequence();
|
||||||
|
const getter = _.partial(requestAccountOffers, this.remote, account,
|
||||||
|
ledgerVersion);
|
||||||
|
utils.getRecursive(getter, options.limit,
|
||||||
|
composeAsync((orders) => _.sortBy(orders,
|
||||||
|
(order) => order.properties.sequence), callback));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOrders(account: string, options = {}) {
|
||||||
|
return utils.promisify(getOrdersAsync).call(this, account, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = getOrders;
|
||||||
41
src/api/ledger/parse/account-order.js
Normal file
41
src/api/ledger/parse/account-order.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const utils = require('./utils');
|
||||||
|
const flags = utils.core.Remote.flags.offer;
|
||||||
|
const parseAmount = require('./amount');
|
||||||
|
const BigNumber = require('bignumber.js');
|
||||||
|
|
||||||
|
// TODO: remove this function once rippled provides quality directly
|
||||||
|
function computeQuality(takerGets, takerPays) {
|
||||||
|
const quotient = new BigNumber(takerPays.value).dividedBy(takerGets.value);
|
||||||
|
return quotient.toDigits(16, BigNumber.ROUND_HALF_UP).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// rippled 'account_offers' returns a different format for orders than 'tx'
|
||||||
|
// the flags are also different
|
||||||
|
function parseAccountOrder(address: string, order: Object): Object {
|
||||||
|
const direction = (order.flags & flags.Sell) === 0 ? 'buy' : 'sell';
|
||||||
|
const takerGetsAmount = parseAmount(order.taker_gets);
|
||||||
|
const takerPaysAmount = parseAmount(order.taker_pays);
|
||||||
|
const quantity = (direction === 'buy') ? takerPaysAmount : takerGetsAmount;
|
||||||
|
const totalPrice = (direction === 'buy') ? takerGetsAmount : takerPaysAmount;
|
||||||
|
|
||||||
|
// note: immediateOrCancel and fillOrKill orders cannot enter the order book
|
||||||
|
// so we can omit those flags here
|
||||||
|
const specification = utils.removeUndefined({
|
||||||
|
direction: direction,
|
||||||
|
quantity: quantity,
|
||||||
|
totalPrice: totalPrice,
|
||||||
|
passive: ((order.flags & flags.Passive) !== 0) || undefined
|
||||||
|
});
|
||||||
|
|
||||||
|
const properties = {
|
||||||
|
maker: address,
|
||||||
|
sequence: order.seq,
|
||||||
|
makerExchangeRate: computeQuality(takerGetsAmount, takerPaysAmount)
|
||||||
|
};
|
||||||
|
|
||||||
|
return {specification, properties};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseAccountOrder;
|
||||||
46
src/api/ledger/parse/account-trustline.js
Normal file
46
src/api/ledger/parse/account-trustline.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const utils = require('./utils');
|
||||||
|
|
||||||
|
type Trustline = {
|
||||||
|
account: string, limit: number, currency: string, quality_in: ?number,
|
||||||
|
quality_out: ?number, 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
|
||||||
|
}
|
||||||
|
|
||||||
|
// rippled 'account_lines' returns a different format for
|
||||||
|
// trustlines than 'tx'
|
||||||
|
function parseAccountTrustline(trustline: Trustline): AccountTrustline {
|
||||||
|
const specification = utils.removeUndefined({
|
||||||
|
limit: trustline.limit,
|
||||||
|
currency: trustline.currency,
|
||||||
|
counterparty: trustline.account,
|
||||||
|
qualityIn: trustline.quality_in || undefined,
|
||||||
|
qualityOut: trustline.quality_out || undefined,
|
||||||
|
ripplingDisabled: trustline.no_ripple || undefined,
|
||||||
|
frozen: trustline.freeze || undefined,
|
||||||
|
authorized: trustline.authorized || undefined
|
||||||
|
});
|
||||||
|
// rippled doesn't provide the counterparty's qualities
|
||||||
|
const counterparty = utils.removeUndefined({
|
||||||
|
limit: trustline.limit_peer,
|
||||||
|
ripplingDisabled: trustline.no_ripple_peer || undefined,
|
||||||
|
frozen: trustline.freeze_peer || undefined,
|
||||||
|
authorized: trustline.peer_authorized || undefined
|
||||||
|
});
|
||||||
|
const state = {
|
||||||
|
balance: trustline.balance
|
||||||
|
};
|
||||||
|
return {specification, counterparty, state};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseAccountTrustline;
|
||||||
24
src/api/ledger/parse/amount.js
Normal file
24
src/api/ledger/parse/amount.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const utils = require('./utils');
|
||||||
|
|
||||||
|
type Amount = string | {currency: string, issuer: string, value: string}
|
||||||
|
type XRPAmount = {currency: string, value: string}
|
||||||
|
type IOUAmount = {currency: string, value: string, counterparty: string}
|
||||||
|
type Output = XRPAmount | IOUAmount
|
||||||
|
|
||||||
|
function parseAmount(amount: Amount): Output {
|
||||||
|
if (typeof amount === 'string') {
|
||||||
|
return {
|
||||||
|
currency: 'XRP',
|
||||||
|
value: utils.dropsToXrp(amount)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
currency: amount.currency,
|
||||||
|
value: amount.value,
|
||||||
|
counterparty: amount.issuer
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseAmount;
|
||||||
12
src/api/ledger/parse/cancellation.js
Normal file
12
src/api/ledger/parse/cancellation.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
function parseOrderCancellation(tx: Object): Object {
|
||||||
|
assert(tx.TransactionType === 'OfferCancel');
|
||||||
|
return {
|
||||||
|
orderSequence: tx.OfferSequence
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseOrderCancellation;
|
||||||
28
src/api/ledger/parse/fields.js
Normal file
28
src/api/ledger/parse/fields.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const BigNumber = require('bignumber.js');
|
||||||
|
const AccountFields = require('./utils').constants.AccountFields;
|
||||||
|
|
||||||
|
function parseField(info, value) {
|
||||||
|
if (info.encoding === 'hex' && !info.length) {
|
||||||
|
return new Buffer(value, 'hex').toString('ascii');
|
||||||
|
}
|
||||||
|
if (info.shift) {
|
||||||
|
return (new BigNumber(value)).shift(-info.shift).toNumber();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseFields(data: Object): Object {
|
||||||
|
const settings = {};
|
||||||
|
for (const fieldName in AccountFields) {
|
||||||
|
const fieldValue = data[fieldName];
|
||||||
|
if (fieldValue !== undefined) {
|
||||||
|
const info = AccountFields[fieldName];
|
||||||
|
settings[info.name] = parseField(info, fieldValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseFields;
|
||||||
50
src/api/ledger/parse/ledger.js
Normal file
50
src/api/ledger/parse/ledger.js
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/* @flow */
|
||||||
|
'use strict';
|
||||||
|
const _ = require('lodash');
|
||||||
|
const removeUndefined = require('./utils').removeUndefined;
|
||||||
|
const parseTransaction = require('./transaction');
|
||||||
|
|
||||||
|
function parseTransactions(transactions) {
|
||||||
|
if (_.isEmpty(transactions)) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (_.isString(transactions[0])) {
|
||||||
|
return {transactionHashes: transactions};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
transactions: _.map(transactions, parseTransaction),
|
||||||
|
rawTransactions: JSON.stringify(transactions)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseState(state) {
|
||||||
|
if (_.isEmpty(state)) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (_.isString(state[0])) {
|
||||||
|
return {stateHashes: state};
|
||||||
|
}
|
||||||
|
return {rawState: JSON.stringify(state)};
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseLedger(ledger: Object): Object {
|
||||||
|
return removeUndefined(_.assign({
|
||||||
|
accepted: ledger.accepted,
|
||||||
|
closed: ledger.closed,
|
||||||
|
stateHash: ledger.account_hash,
|
||||||
|
closeTime: ledger.close_time,
|
||||||
|
closeTimeResolution: ledger.close_time_resolution,
|
||||||
|
closeFlags: ledger.close_flags,
|
||||||
|
ledgerHash: ledger.hash || ledger.ledger_hash,
|
||||||
|
ledgerVersion: parseInt(ledger.ledger_index || ledger.seqNum, 10),
|
||||||
|
parentLedgerHash: ledger.parent_hash,
|
||||||
|
parentCloseTime: ledger.parent_close_time,
|
||||||
|
totalDrops: ledger.total_coins || ledger.totalCoins,
|
||||||
|
transactionHash: ledger.transaction_hash
|
||||||
|
},
|
||||||
|
parseTransactions(ledger.transactions),
|
||||||
|
parseState(ledger.accountState)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseLedger;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user