mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-22 12:45:50 +00:00
rippleapi quickstart - script explanation and submit-and-verify script
This commit is contained in:
181
content/code_samples/rippleapi_quickstart/eslintrc
Normal file
181
content/code_samples/rippleapi_quickstart/eslintrc
Normal file
@@ -0,0 +1,181 @@
|
||||
# ESLint documentation can be found at http://eslint.org/docs/
|
||||
env:
|
||||
browser: true
|
||||
node: true
|
||||
amd: false
|
||||
mocha: true
|
||||
jasmine: false
|
||||
rules:
|
||||
no-alert: 2
|
||||
no-array-constructor: 2
|
||||
no-bitwise: 0
|
||||
no-caller: 2
|
||||
no-catch-shadow: 2
|
||||
comma-dangle: 2
|
||||
no-class-assign: 2
|
||||
no-cond-assign: [2, 'always']
|
||||
no-console: 0
|
||||
no-const-assign: 2
|
||||
no-constant-condition: 2
|
||||
no-control-regex: 2
|
||||
no-debugger: 2
|
||||
no-delete-var: 2
|
||||
no-div-regex: 0
|
||||
no-dupe-keys: 2
|
||||
no-dupe-args: 2
|
||||
no-duplicate-case: 2
|
||||
no-else-return: 2
|
||||
no-empty: 2
|
||||
no-empty-character-class: 2
|
||||
no-empty-label: 2
|
||||
no-eq-null: 2
|
||||
no-eval: 2
|
||||
no-ex-assign: 2
|
||||
no-extend-native: 2
|
||||
no-extra-bind: 2
|
||||
no-extra-boolean-cast: 2
|
||||
no-extra-parens: [2, 'functions']
|
||||
no-extra-semi: 2
|
||||
no-fallthrough: 2
|
||||
no-floating-decimal: 0
|
||||
no-func-assign: 2
|
||||
no-implicit-coercion: 2
|
||||
no-implied-eval: 2
|
||||
no-inline-comments: 0
|
||||
no-inner-declarations: [2, 'functions']
|
||||
no-invalid-regexp: 2
|
||||
no-irregular-whitespace: 2
|
||||
no-iterator: 2
|
||||
no-label-var: 2
|
||||
no-labels: 2
|
||||
no-lone-blocks: 2
|
||||
no-lonely-if: 2
|
||||
no-loop-func: 2
|
||||
no-mixed-requires: [0, false]
|
||||
no-mixed-spaces-and-tabs: [2, false]
|
||||
no-multi-spaces: 2
|
||||
no-multi-str: 2
|
||||
no-multiple-empty-lines: [2, {max: 2}]
|
||||
no-native-reassign: 2
|
||||
no-negated-in-lhs: 2
|
||||
no-nested-ternary: 0
|
||||
no-new: 2
|
||||
no-new-func: 2
|
||||
no-new-object: 2
|
||||
no-new-require: 0
|
||||
no-new-wrappers: 2
|
||||
no-obj-calls: 2
|
||||
no-octal: 2
|
||||
no-octal-escape: 2
|
||||
no-param-reassign: 2
|
||||
no-path-concat: 0
|
||||
no-plusplus: 0
|
||||
no-process-env: 0
|
||||
no-process-exit: 0
|
||||
no-proto: 2
|
||||
no-redeclare: 2
|
||||
no-regex-spaces: 2
|
||||
no-restricted-modules: 0
|
||||
no-return-assign: 2
|
||||
no-script-url: 2
|
||||
no-self-compare: 2
|
||||
no-sequences: 2
|
||||
no-shadow: 2
|
||||
no-shadow-restricted-names: 2
|
||||
semi-spacing: 2
|
||||
no-spaced-func: 2
|
||||
no-sparse-arrays: 2
|
||||
no-sync: 0
|
||||
no-ternary: 0
|
||||
no-trailing-spaces: 2
|
||||
no-undef: 2
|
||||
no-undef-init: 2
|
||||
no-undefined: 0
|
||||
no-underscore-dangle: 0
|
||||
no-unreachable: 2
|
||||
no-unused-expressions: 2
|
||||
no-unused-vars: [2, {vars: 'all', args: 'all'}]
|
||||
no-use-before-define: 2
|
||||
no-void: 2
|
||||
no-var: 2
|
||||
prefer-const: 2
|
||||
no-warning-comments: [0, {terms: ['todo', 'fixme', 'xxx'], location: 'start'}]
|
||||
no-with: 2
|
||||
block-scoped-var: 2
|
||||
brace-style: 2
|
||||
camelcase: 0
|
||||
comma-spacing: 2
|
||||
comma-style: 2
|
||||
complexity: [0, 11]
|
||||
consistent-return: 2
|
||||
consistent-this: [2, 'self']
|
||||
curly: [2, 'all']
|
||||
default-case: 0
|
||||
dot-notation: [2, {allowKeywords: true}]
|
||||
eol-last: 2
|
||||
eqeqeq: 2
|
||||
func-names: 0
|
||||
func-style: [2, 'declaration']
|
||||
generator-star: 0
|
||||
guard-for-in: 0
|
||||
handle-callback-err: 2
|
||||
indent: [2, 2, {SwitchCase: 1}]
|
||||
key-spacing: [2, {beforeColon: false, afterColon: true}]
|
||||
max-depth: [1, 4]
|
||||
max-len: [2, 80]
|
||||
max-nested-callbacks: [1, 2]
|
||||
max-params: [1, 4]
|
||||
max-statements: [0, 10]
|
||||
new-cap: 2
|
||||
new-parens: 2
|
||||
one-var: [2, 'never']
|
||||
operator-assignment: [0, 'always']
|
||||
padded-blocks: 0
|
||||
quote-props: 0
|
||||
quotes: [2, 'single']
|
||||
radix: 2
|
||||
semi: 2
|
||||
sort-vars: 0
|
||||
space-after-keywords: 2
|
||||
space-before-blocks: 2
|
||||
space-before-function-paren: [2, 'never']
|
||||
object-curly-spacing: [2, 'never']
|
||||
array-bracket-spacing: [2, 'never']
|
||||
space-in-parens: 2
|
||||
space-infix-ops: 2
|
||||
space-return-throw-case: 2
|
||||
space-unary-ops: [2, {words: true, nonwords: false}]
|
||||
spaced-comment: 2
|
||||
strict: [2, 'global']
|
||||
use-isnan: 2
|
||||
valid-jsdoc: 2
|
||||
valid-typeof: 2
|
||||
vars-on-top: 0
|
||||
wrap-iife: 0
|
||||
wrap-regex: 0
|
||||
yoda: [2, 'never']
|
||||
ecmaFeatures:
|
||||
arrowFunctions: true
|
||||
binaryLiterals: true
|
||||
blockBindings: true
|
||||
classes: true
|
||||
defaultParams: true
|
||||
destructuring: true
|
||||
forOf: true
|
||||
generators: true
|
||||
# not sure about the implications of globalReturn
|
||||
# globalReturn: true
|
||||
jsx: true
|
||||
objectLiteralComputedProperties: true
|
||||
objectLiteralShorthandMethods: true
|
||||
objectLiteralShorthandProperties: true
|
||||
# duplicate properties may be required but we are not
|
||||
# sure at this point
|
||||
# objectLiteralDuplicateProperties: true
|
||||
octalLiterals: true
|
||||
regexUFlag: true
|
||||
regexYFlag: true
|
||||
restParams: true
|
||||
spread: true
|
||||
templateStrings: true
|
||||
unicodeCodePointEscapes: true
|
||||
@@ -1,22 +1,24 @@
|
||||
'use strict';
|
||||
const {RippleAPI} = require('ripple-lib');
|
||||
|
||||
|
||||
const api = new RippleAPI({
|
||||
server: 'wss://s1.ripple.com' // Public rippled server
|
||||
});
|
||||
api.connect().then(() => {
|
||||
/* begin custom code ------------------------------------ */
|
||||
var my_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
||||
|
||||
console.log("getting account info for",my_address);
|
||||
api.getAccountInfo(my_address).then( info => {
|
||||
console.log(info);
|
||||
console.log("getAccountInfo done");
|
||||
} ).catch(console.error);
|
||||
|
||||
const my_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||
|
||||
console.log('getting account info for', my_address);
|
||||
return api.getAccountInfo(my_address);
|
||||
|
||||
// info => {...} is just a shorter syntax for function(info) {...}
|
||||
}).then(info => {
|
||||
console.log(info);
|
||||
console.log('getAccountInfo done');
|
||||
|
||||
/* end custom code -------------------------------------- */
|
||||
}).then(() => {
|
||||
return api.disconnect().then(()=> {
|
||||
console.log("done and disconnected.");
|
||||
}).catch(console.error);
|
||||
return api.disconnect();
|
||||
}).then(()=> {
|
||||
console.log('done and disconnected.');
|
||||
}).catch(console.error);
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
'use strict';
|
||||
/* import RippleAPI and support libraies*/
|
||||
const {RippleAPI} = require('ripple-lib');
|
||||
const assert = require('assert');
|
||||
|
||||
/* Credentials of the account placing the offer */
|
||||
const my_addr = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||
const my_secret = 's████████████████████████████';
|
||||
|
||||
/* Define the order to place here */
|
||||
const my_order = {
|
||||
'direction': 'buy',
|
||||
'quantity': {
|
||||
'currency': '',
|
||||
'counterparty': '',
|
||||
'value': ''
|
||||
},
|
||||
'totalPrice': {
|
||||
'currency': '',
|
||||
'counterparty': '',
|
||||
'value': ''
|
||||
}
|
||||
};
|
||||
|
||||
/* milliseconds to wait between ledger checks*/
|
||||
const INTERVAL = 1000;
|
||||
/* Instantiate RippleAPI */
|
||||
const api = new RippleAPI({server: 'wss://s1.ripple.com'});
|
||||
/* number of ledgers to check for valid transaction before fail */
|
||||
const ledgerOffset = 5;
|
||||
const my_instructions = {maxLedgerVersionOffset: ledgerOffset};
|
||||
|
||||
|
||||
/* function to verify a transaction is on the RCL */
|
||||
function verifyTransaction(hash, options) {
|
||||
console.log('Verifing Transaction');
|
||||
return api.getTransaction(hash, options).then(data => {
|
||||
console.log('Result: ', data.outcome.result);
|
||||
console.log('Validated in Ledger: ', data.outcome.ledgerVersion);
|
||||
console.log('Sequence: ', data.sequence);
|
||||
return data.outcome.result === 'tesSUCCESS';
|
||||
}).catch(error => {
|
||||
/* if transaction not on current ledger try again until max ledger hit */
|
||||
if (error instanceof api.errors.PendingLedgerVersionError) {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => verifyTransaction(hash, options)
|
||||
.then(resolve, reject), INTERVAL);
|
||||
});
|
||||
}
|
||||
return result;// TODO: Fix this. It's currently undefined.
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/* function to prepare, sign, and submit a transaction to the RCL
|
||||
success verifies the transaction is being considered for the next ledger.
|
||||
Still requires vlaidation */
|
||||
function submitTransaction(lastClosedLedgerVersion, prepared, secret) {
|
||||
const signedData = api.sign(prepared.txJSON, secret);
|
||||
return api.submit(signedData.signedTransaction).then(data => {
|
||||
console.log('Result: ', data.resultCode);
|
||||
console.log('Message: ', data.resultMessage);
|
||||
/* if transaction was not successfully submitted throw error */
|
||||
assert.strictEqual(data.resultCode, 'tesSUCCESS');
|
||||
/* if successfully submitted fire off validation workflow */
|
||||
const options = {
|
||||
minLedgerVersion: lastClosedLedgerVersion,
|
||||
maxLedgerVersion: prepared.instructions.maxLedgerVersion
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => verifyTransaction(signedData.id, options)
|
||||
.then(resolve, reject), INTERVAL);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
api.connect().then(() => {
|
||||
console.log('Connected');
|
||||
return api.prepareOrder(my_addr, my_order, my_instructions);
|
||||
}).then(prepared => {
|
||||
console.log('Order Prepared');
|
||||
return api.getLedger().then(ledger => {
|
||||
console.log('Current Ledger', ledger.ledgerVersion);
|
||||
return submitTransaction(ledger.ledgerVersion, prepared, my_secret);
|
||||
});
|
||||
}).then(() => {
|
||||
api.disconnect().then(() => {
|
||||
console.log('api disconnected');
|
||||
process.exit();
|
||||
});
|
||||
}).catch(console.error);
|
||||
|
||||
Reference in New Issue
Block a user