mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-07 21:35:49 +00:00
freeze doc - mv js code samples to includes
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
/node_modules/
|
/node_modules/
|
||||||
*~
|
*~
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
content/code_samples/*/node_modules/
|
||||||
|
|||||||
23
content/code_samples/freeze/check-global-freeze-no-freeze.js
Normal file
23
content/code_samples/freeze/check-global-freeze-no-freeze.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
|
const api = new RippleAPI({
|
||||||
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
|
});
|
||||||
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
|
});
|
||||||
|
|
||||||
|
const my_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||||
|
|
||||||
|
api.connect().then(() => {
|
||||||
|
// Look up settings object
|
||||||
|
return api.getSettings(my_address);
|
||||||
|
}).then(settings => {
|
||||||
|
console.log('Got settings for address', my_address);
|
||||||
|
console.log('Global Freeze enabled?',
|
||||||
|
(settings.globalFreeze === true));
|
||||||
|
console.log('No Freeze enabled?', (settings.noFreeze === true));
|
||||||
|
|
||||||
|
}).then(() => {
|
||||||
|
return api.disconnect();
|
||||||
|
}).catch(console.error);
|
||||||
37
content/code_samples/freeze/check-individual-freeze.js
Normal file
37
content/code_samples/freeze/check-individual-freeze.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
|
const api = new RippleAPI({
|
||||||
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
|
});
|
||||||
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
|
});
|
||||||
|
|
||||||
|
const my_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||||
|
const counterparty_address = 'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
|
||||||
|
const frozen_currency = 'USD';
|
||||||
|
|
||||||
|
api.connect().then(() => {
|
||||||
|
|
||||||
|
// Look up current state of trust line
|
||||||
|
const options = {counterparty: counterparty_address,
|
||||||
|
currency: frozen_currency};
|
||||||
|
console.log('looking up', frozen_currency, 'trust line from',
|
||||||
|
my_address, 'to', counterparty_address);
|
||||||
|
return api.getTrustlines(my_address, options);
|
||||||
|
|
||||||
|
}).then(data => {
|
||||||
|
|
||||||
|
if (data.length !== 1) {
|
||||||
|
throw 'should only be 1 trust line per counterparty+currency pair';
|
||||||
|
}
|
||||||
|
|
||||||
|
const trustline = data[0];
|
||||||
|
console.log('Trust line frozen from our side?',
|
||||||
|
trustline.specification.frozen === true);
|
||||||
|
console.log('Trust line frozen from counterparty\'s side?',
|
||||||
|
trustline.counterparty.frozen === true);
|
||||||
|
|
||||||
|
}).then(() => {
|
||||||
|
return api.disconnect();
|
||||||
|
}).catch(console.error);
|
||||||
181
content/code_samples/freeze/eslintrc
Normal file
181
content/code_samples/freeze/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
|
||||||
17
content/code_samples/freeze/package.json
Normal file
17
content/code_samples/freeze/package.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "freeze-examples",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"license": "UNLICENSED",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"ripple-lib": "*",
|
||||||
|
"babel-cli": "^6.0.0",
|
||||||
|
"babel-preset-es2015": "*"
|
||||||
|
},
|
||||||
|
"babel": {
|
||||||
|
"presets": ["es2015"]
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "*"
|
||||||
|
}
|
||||||
|
}
|
||||||
37
content/code_samples/freeze/set-global-freeze.js
Normal file
37
content/code_samples/freeze/set-global-freeze.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
|
const api = new RippleAPI({
|
||||||
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
|
});
|
||||||
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
|
});
|
||||||
|
|
||||||
|
const issuing_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||||
|
const issuing_secret = 's████████████████████████████';
|
||||||
|
// Best practice: get your secret from an encrypted
|
||||||
|
// config file instead
|
||||||
|
|
||||||
|
api.connect().then(() => {
|
||||||
|
|
||||||
|
// Prepare a settings transaction to enable global freeze
|
||||||
|
const settings = {
|
||||||
|
'globalFreeze': true
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('preparing settings transaction for account:',
|
||||||
|
issuing_address);
|
||||||
|
return api.prepareSettings(issuing_address, settings);
|
||||||
|
|
||||||
|
}).then(prepared_tx => {
|
||||||
|
|
||||||
|
// Sign and submit the settings transaction
|
||||||
|
console.log('signing tx:', prepared_tx.txJSON);
|
||||||
|
const signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
||||||
|
console.log('submitting tx:', signed1.id);
|
||||||
|
|
||||||
|
return api.submit(signed1.signedTransaction);
|
||||||
|
|
||||||
|
}).then(() => {
|
||||||
|
return api.disconnect();
|
||||||
|
}).catch(console.error);
|
||||||
57
content/code_samples/freeze/set-individual-freeze.js
Normal file
57
content/code_samples/freeze/set-individual-freeze.js
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
|
const api = new RippleAPI({
|
||||||
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
|
});
|
||||||
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
|
});
|
||||||
|
|
||||||
|
const issuing_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||||
|
const issuing_secret = 's████████████████████████████';
|
||||||
|
// Best practice: get your secret from an encrypted
|
||||||
|
// config file instead
|
||||||
|
const address_to_freeze = 'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
|
||||||
|
const currency_to_freeze = 'USD';
|
||||||
|
|
||||||
|
api.connect().then(() => {
|
||||||
|
|
||||||
|
// Look up current state of trust line
|
||||||
|
const options = {counterparty: address_to_freeze,
|
||||||
|
currency: currency_to_freeze};
|
||||||
|
console.log('looking up', currency_to_freeze, 'trust line from',
|
||||||
|
issuing_address, 'to', address_to_freeze);
|
||||||
|
return api.getTrustlines(issuing_address, options);
|
||||||
|
|
||||||
|
}).then(data => {
|
||||||
|
|
||||||
|
// Prepare a trustline transaction to enable freeze
|
||||||
|
let trustline = {};
|
||||||
|
if (data.length !== 1) {
|
||||||
|
console.log('trustline not found, making a default one');
|
||||||
|
trustline = {
|
||||||
|
currency: currency_to_freeze,
|
||||||
|
counterparty: address_to_freeze,
|
||||||
|
limit: 0
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
trustline = data[0].specification;
|
||||||
|
console.log('trustline found. previous state:', trustline);
|
||||||
|
}
|
||||||
|
|
||||||
|
trustline.frozen = true;
|
||||||
|
|
||||||
|
console.log('preparing trustline transaction for line:', trustline);
|
||||||
|
return api.prepareTrustline(issuing_address, trustline);
|
||||||
|
|
||||||
|
}).then(prepared_tx => {
|
||||||
|
|
||||||
|
// Sign and submit the trustline transaction
|
||||||
|
console.log('signing tx:', prepared_tx.txJSON);
|
||||||
|
const signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
||||||
|
console.log('submitting tx:', signed1.id);
|
||||||
|
|
||||||
|
return api.submit(signed1.signedTransaction);
|
||||||
|
}).then(() => {
|
||||||
|
return api.disconnect();
|
||||||
|
}).catch(console.error);
|
||||||
36
content/code_samples/freeze/set-no-freeze.js
Normal file
36
content/code_samples/freeze/set-no-freeze.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
|
const api = new RippleAPI({
|
||||||
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
|
});
|
||||||
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
|
});
|
||||||
|
|
||||||
|
const issuing_address = 'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
|
||||||
|
const issuing_secret = 'snnDVkSW3aV6jvMJTPdCiE2Qxv1RW';
|
||||||
|
// Best practice: get your secret from an encrypted
|
||||||
|
// config file instead
|
||||||
|
|
||||||
|
api.connect().then(() => {
|
||||||
|
|
||||||
|
// Prepare a settings transaction to enable no freeze
|
||||||
|
const settings = {
|
||||||
|
'noFreeze': true
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('preparing settings transaction for account:',
|
||||||
|
issuing_address);
|
||||||
|
return api.prepareSettings(issuing_address, settings);
|
||||||
|
|
||||||
|
}).then(prepared_tx => {
|
||||||
|
|
||||||
|
// Sign and submit the settings transaction
|
||||||
|
console.log('signing tx:', prepared_tx.txJSON);
|
||||||
|
const signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
||||||
|
console.log('submitting tx:', signed1.id);
|
||||||
|
|
||||||
|
return api.submit(signed1.signedTransaction);
|
||||||
|
}).then(() => {
|
||||||
|
return api.disconnect();
|
||||||
|
}).catch(console.error);
|
||||||
@@ -128,57 +128,7 @@ The rest of the [transaction flow](rippleapi.html#transaction-flow) is the same
|
|||||||
Example JavaScript (ECMAScript 6) code to enable Individual Freeze on a trust line:
|
Example JavaScript (ECMAScript 6) code to enable Individual Freeze on a trust line:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const {RippleAPI} = require('ripple-lib');
|
{% include 'code_samples/freeze/set-individual-freeze.js' %}
|
||||||
|
|
||||||
const api = new RippleAPI({
|
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
|
||||||
});
|
|
||||||
|
|
||||||
const issuing_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
|
||||||
const issuing_secret = "s████████████████████████████";
|
|
||||||
//Best practice: get your secret from an encrypted config file instead
|
|
||||||
const address_to_freeze = "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v";
|
|
||||||
const currency_to_freeze = "USD";
|
|
||||||
|
|
||||||
api.connect().then(() => {
|
|
||||||
|
|
||||||
// Look up current state of trust line
|
|
||||||
var options = {counterparty: address_to_freeze, currency: currency_to_freeze};
|
|
||||||
console.log("looking up", currency_to_freeze, "trust line from",
|
|
||||||
issuing_address, "to", address_to_freeze);
|
|
||||||
return api.getTrustlines(issuing_address, options);
|
|
||||||
|
|
||||||
}).then(data => {
|
|
||||||
|
|
||||||
//Prepare a trustline transaction to enable freeze
|
|
||||||
if (data.length != 1) {
|
|
||||||
console.log("trustline not found, making a default one");
|
|
||||||
var trustline = {
|
|
||||||
currency: currency_to_freeze,
|
|
||||||
counterparty: address_to_freeze,
|
|
||||||
limit: 0
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
var trustline = data[0].specification;
|
|
||||||
console.log("trustline found. previous state:", trustline);
|
|
||||||
}
|
|
||||||
|
|
||||||
trustline.frozen = true;
|
|
||||||
|
|
||||||
console.log("preparing trustline transaction for line:",trustline);
|
|
||||||
return api.prepareTrustline(issuing_address, trustline);
|
|
||||||
|
|
||||||
}).then(prepared_tx => {
|
|
||||||
|
|
||||||
//Sign and submit the trustline transaction
|
|
||||||
console.log("signing tx:",prepared_tx.txJSON);
|
|
||||||
var signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
|
||||||
console.log("submitting tx:", signed1.id);
|
|
||||||
|
|
||||||
return api.submit(signed1.signedTransaction)
|
|
||||||
}).then(() => {
|
|
||||||
return api.disconnect();
|
|
||||||
}).catch(console.error);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -222,43 +172,10 @@ To enable or disable Global Freeze on an account, prepare a **Settings** transac
|
|||||||
|
|
||||||
The rest of the [transaction flow](rippleapi.html#transaction-flow) is the same as any other transaction.
|
The rest of the [transaction flow](rippleapi.html#transaction-flow) is the same as any other transaction.
|
||||||
|
|
||||||
Example code to enable Global Freeze on an account:
|
Example JavaScript (ECMAScript 6) code to enable Global Freeze on an account:
|
||||||
|
|
||||||
```
|
```js
|
||||||
const {RippleAPI} = require('ripple-lib');
|
{% include 'code_samples/freeze/set-global-freeze.js' %}
|
||||||
|
|
||||||
const api = new RippleAPI({
|
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
|
||||||
});
|
|
||||||
api.on('error', (errorCode, errorMessage) => {
|
|
||||||
console.log(errorCode + ': ' + errorMessage);
|
|
||||||
});
|
|
||||||
|
|
||||||
const issuing_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
|
||||||
const issuing_secret = "s████████████████████████████";
|
|
||||||
//Best practice: get your secret from an encrypted config file instead
|
|
||||||
|
|
||||||
api.connect().then(() => {
|
|
||||||
|
|
||||||
//Prepare a settings transaction to enable global freeze
|
|
||||||
var settings = {
|
|
||||||
"globalFreeze": true
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("preparing settings transaction for account:",issuing_address);
|
|
||||||
return api.prepareSettings(issuing_address, settings);
|
|
||||||
|
|
||||||
}).then(prepared_tx => {
|
|
||||||
|
|
||||||
//Sign and submit the trustline transaction
|
|
||||||
console.log("signing tx:",prepared_tx.txJSON);
|
|
||||||
var signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
|
||||||
console.log("submitting tx:", signed1.id);
|
|
||||||
|
|
||||||
return api.submit(signed1.signedTransaction)
|
|
||||||
}).then(() => {
|
|
||||||
return api.disconnect();
|
|
||||||
}).catch(console.error);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -304,43 +221,10 @@ To enable No Freeze on an account, prepare a **Settings** transaction using the
|
|||||||
|
|
||||||
You must [sign](rippleapi.html#sign) this transaction using the master key. The rest of the [transaction flow](rippleapi.html#transaction-flow) is the same as any other transaction.
|
You must [sign](rippleapi.html#sign) this transaction using the master key. The rest of the [transaction flow](rippleapi.html#transaction-flow) is the same as any other transaction.
|
||||||
|
|
||||||
Example code to enable No Freeze on an account:
|
Example JavaScript (ECMAScript 6) code to enable No Freeze on an account:
|
||||||
|
|
||||||
```
|
```js
|
||||||
const {RippleAPI} = require('ripple-lib');
|
{% include 'code_samples/freeze/set-no-freeze.js' %}
|
||||||
|
|
||||||
const api = new RippleAPI({
|
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
|
||||||
});
|
|
||||||
api.on('error', (errorCode, errorMessage) => {
|
|
||||||
console.log(errorCode + ': ' + errorMessage);
|
|
||||||
});
|
|
||||||
|
|
||||||
const issuing_address = "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v";
|
|
||||||
const issuing_secret = "s████████████████████████████";
|
|
||||||
//Best practice: get your secret from an encrypted config file instead
|
|
||||||
|
|
||||||
api.connect().then(() => {
|
|
||||||
|
|
||||||
//Prepare a settings transaction to enable no freeze
|
|
||||||
var settings = {
|
|
||||||
"noFreeze": true
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("preparing settings transaction for account:",issuing_address);
|
|
||||||
return api.prepareSettings(issuing_address, settings);
|
|
||||||
|
|
||||||
}).then(prepared_tx => {
|
|
||||||
|
|
||||||
//Sign and submit the trustline transaction
|
|
||||||
console.log("signing tx:",prepared_tx.txJSON);
|
|
||||||
var signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
|
||||||
console.log("submitting tx:", signed1.id);
|
|
||||||
|
|
||||||
return api.submit(signed1.signedTransaction)
|
|
||||||
}).then(() => {
|
|
||||||
return api.disconnect();
|
|
||||||
}).catch(console.error);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -422,43 +306,8 @@ The response contains an array of trust lines, for each currency in which the is
|
|||||||
|
|
||||||
Example JavaScript (ECMAScript 6) code to check whether a trust line is frozen:
|
Example JavaScript (ECMAScript 6) code to check whether a trust line is frozen:
|
||||||
|
|
||||||
```
|
```js
|
||||||
const {RippleAPI} = require('ripple-lib');
|
{% include 'code_samples/freeze/check-individual-freeze.js' %}
|
||||||
|
|
||||||
const api = new RippleAPI({
|
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
|
||||||
});
|
|
||||||
|
|
||||||
const my_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
|
||||||
const counterparty_address = "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v";
|
|
||||||
const frozen_currency = "USD";
|
|
||||||
|
|
||||||
api.connect().then(() => {
|
|
||||||
|
|
||||||
// Look up current state of trust line
|
|
||||||
var options = {counterparty: counterparty_address, currency: frozen_currency};
|
|
||||||
console.log("looking up", frozen_currency, "trust line from",
|
|
||||||
my_address, "to", counterparty_address);
|
|
||||||
return api.getTrustlines(my_address, options);
|
|
||||||
|
|
||||||
}).then(data => {
|
|
||||||
|
|
||||||
if ( data.length > 1)
|
|
||||||
throw "should only be 1 trust line per counterparty+currency pair";
|
|
||||||
|
|
||||||
if ( data.length === 0 ) {
|
|
||||||
console.log("No trust line found");
|
|
||||||
} else {
|
|
||||||
var trustline = data[0];
|
|
||||||
console.log("Trust line frozen from our side?",
|
|
||||||
trustline.specification.frozen === true);
|
|
||||||
console.log("Trust line frozen from counterparty's side?",
|
|
||||||
trustline.counterparty.frozen === true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}).then(() => {
|
|
||||||
return api.disconnect();
|
|
||||||
}).catch(console.error);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -551,28 +400,10 @@ Look for the following values in the response object:
|
|||||||
| noFreeze | Boolean | (May be omitted) `true` if No Freeze is enabled. |
|
| noFreeze | Boolean | (May be omitted) `true` if No Freeze is enabled. |
|
||||||
| globalFreeze | Boolean | (May be omitted) `true` if Global Freeze is enabled. |
|
| globalFreeze | Boolean | (May be omitted) `true` if Global Freeze is enabled. |
|
||||||
|
|
||||||
Example code:
|
Example JavaScript (ECMAScript 6) code to check whether an account has Global Freeze or No Freeze enabled:
|
||||||
|
|
||||||
```
|
```js
|
||||||
const {RippleAPI} = require('ripple-lib');
|
{% include 'code_samples/freeze/check-global-freeze-no-freeze.js' %}
|
||||||
|
|
||||||
const api = new RippleAPI({
|
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
|
||||||
});
|
|
||||||
|
|
||||||
const my_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
|
||||||
|
|
||||||
api.connect().then(() => {
|
|
||||||
//Look up settings object
|
|
||||||
return api.getSettings(my_address);
|
|
||||||
}).then(settings => {
|
|
||||||
console.log("Got settings for address",my_address);
|
|
||||||
console.log("Global Freeze enabled?", (settings.globalFreeze === true) );
|
|
||||||
console.log("No Freeze enabled?", (settings.noFreeze === true) );
|
|
||||||
|
|
||||||
}).then(() => {
|
|
||||||
return api.disconnect();
|
|
||||||
}).catch(console.error);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
# See Also #
|
# See Also #
|
||||||
|
|||||||
176
freeze.html
176
freeze.html
@@ -292,51 +292,57 @@
|
|||||||
<pre><code class="js">const {RippleAPI} = require('ripple-lib');
|
<pre><code class="js">const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
const api = new RippleAPI({
|
const api = new RippleAPI({
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
|
});
|
||||||
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
});
|
});
|
||||||
|
|
||||||
const issuing_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
const issuing_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||||
const issuing_secret = "s████████████████████████████";
|
const issuing_secret = 's████████████████████████████';
|
||||||
//Best practice: get your secret from an encrypted config file instead
|
// Best practice: get your secret from an encrypted
|
||||||
const address_to_freeze = "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v";
|
// config file instead
|
||||||
const currency_to_freeze = "USD";
|
const address_to_freeze = 'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
|
||||||
|
const currency_to_freeze = 'USD';
|
||||||
|
|
||||||
api.connect().then(() => {
|
api.connect().then(() => {
|
||||||
|
|
||||||
// Look up current state of trust line
|
// Look up current state of trust line
|
||||||
var options = {counterparty: address_to_freeze, currency: currency_to_freeze};
|
const options = {counterparty: address_to_freeze,
|
||||||
console.log("looking up", currency_to_freeze, "trust line from",
|
currency: currency_to_freeze};
|
||||||
issuing_address, "to", address_to_freeze);
|
console.log('looking up', currency_to_freeze, 'trust line from',
|
||||||
|
issuing_address, 'to', address_to_freeze);
|
||||||
return api.getTrustlines(issuing_address, options);
|
return api.getTrustlines(issuing_address, options);
|
||||||
|
|
||||||
}).then(data => {
|
}).then(data => {
|
||||||
|
|
||||||
//Prepare a trustline transaction to enable freeze
|
// Prepare a trustline transaction to enable freeze
|
||||||
if (data.length != 1) {
|
let trustline = {};
|
||||||
console.log("trustline not found, making a default one");
|
if (data.length !== 1) {
|
||||||
var trustline = {
|
console.log('trustline not found, making a default one');
|
||||||
|
trustline = {
|
||||||
currency: currency_to_freeze,
|
currency: currency_to_freeze,
|
||||||
counterparty: address_to_freeze,
|
counterparty: address_to_freeze,
|
||||||
limit: 0
|
limit: 0
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
var trustline = data[0].specification;
|
trustline = data[0].specification;
|
||||||
console.log("trustline found. previous state:", trustline);
|
console.log('trustline found. previous state:', trustline);
|
||||||
}
|
}
|
||||||
|
|
||||||
trustline.frozen = true;
|
trustline.frozen = true;
|
||||||
|
|
||||||
console.log("preparing trustline transaction for line:",trustline);
|
console.log('preparing trustline transaction for line:', trustline);
|
||||||
return api.prepareTrustline(issuing_address, trustline);
|
return api.prepareTrustline(issuing_address, trustline);
|
||||||
|
|
||||||
}).then(prepared_tx => {
|
}).then(prepared_tx => {
|
||||||
|
|
||||||
//Sign and submit the trustline transaction
|
// Sign and submit the trustline transaction
|
||||||
console.log("signing tx:",prepared_tx.txJSON);
|
console.log('signing tx:', prepared_tx.txJSON);
|
||||||
var signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
const signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
||||||
console.log("submitting tx:", signed1.id);
|
console.log('submitting tx:', signed1.id);
|
||||||
|
|
||||||
return api.submit(signed1.signedTransaction)
|
return api.submit(signed1.signedTransaction);
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return api.disconnect();
|
return api.disconnect();
|
||||||
}).catch(console.error);
|
}).catch(console.error);
|
||||||
@@ -382,38 +388,41 @@ api.connect().then(() => {
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p>The rest of the <a href="rippleapi.html#transaction-flow">transaction flow</a> is the same as any other transaction.</p>
|
<p>The rest of the <a href="rippleapi.html#transaction-flow">transaction flow</a> is the same as any other transaction.</p>
|
||||||
<p>Example code to enable Global Freeze on an account:</p>
|
<p>Example JavaScript (ECMAScript 6) code to enable Global Freeze on an account:</p>
|
||||||
<pre><code>const {RippleAPI} = require('ripple-lib');
|
<pre><code class="js">const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
const api = new RippleAPI({
|
const api = new RippleAPI({
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
});
|
});
|
||||||
api.on('error', (errorCode, errorMessage) => {
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
console.log(errorCode + ': ' + errorMessage);
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
});
|
});
|
||||||
|
|
||||||
const issuing_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
const issuing_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||||
const issuing_secret = "s████████████████████████████";
|
const issuing_secret = 's████████████████████████████';
|
||||||
//Best practice: get your secret from an encrypted config file instead
|
// Best practice: get your secret from an encrypted
|
||||||
|
// config file instead
|
||||||
|
|
||||||
api.connect().then(() => {
|
api.connect().then(() => {
|
||||||
|
|
||||||
//Prepare a settings transaction to enable global freeze
|
// Prepare a settings transaction to enable global freeze
|
||||||
var settings = {
|
const settings = {
|
||||||
"globalFreeze": true
|
'globalFreeze': true
|
||||||
}
|
};
|
||||||
|
|
||||||
console.log("preparing settings transaction for account:",issuing_address);
|
console.log('preparing settings transaction for account:',
|
||||||
|
issuing_address);
|
||||||
return api.prepareSettings(issuing_address, settings);
|
return api.prepareSettings(issuing_address, settings);
|
||||||
|
|
||||||
}).then(prepared_tx => {
|
}).then(prepared_tx => {
|
||||||
|
|
||||||
//Sign and submit the trustline transaction
|
// Sign and submit the settings transaction
|
||||||
console.log("signing tx:",prepared_tx.txJSON);
|
console.log('signing tx:', prepared_tx.txJSON);
|
||||||
var signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
const signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
||||||
console.log("submitting tx:", signed1.id);
|
console.log('submitting tx:', signed1.id);
|
||||||
|
|
||||||
|
return api.submit(signed1.signedTransaction);
|
||||||
|
|
||||||
return api.submit(signed1.signedTransaction)
|
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return api.disconnect();
|
return api.disconnect();
|
||||||
}).catch(console.error);
|
}).catch(console.error);
|
||||||
@@ -460,38 +469,40 @@ api.connect().then(() => {
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p>You must <a href="rippleapi.html#sign">sign</a> this transaction using the master key. The rest of the <a href="rippleapi.html#transaction-flow">transaction flow</a> is the same as any other transaction.</p>
|
<p>You must <a href="rippleapi.html#sign">sign</a> this transaction using the master key. The rest of the <a href="rippleapi.html#transaction-flow">transaction flow</a> is the same as any other transaction.</p>
|
||||||
<p>Example code to enable No Freeze on an account:</p>
|
<p>Example JavaScript (ECMAScript 6) code to enable No Freeze on an account:</p>
|
||||||
<pre><code>const {RippleAPI} = require('ripple-lib');
|
<pre><code class="js">const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
const api = new RippleAPI({
|
const api = new RippleAPI({
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
});
|
});
|
||||||
api.on('error', (errorCode, errorMessage) => {
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
console.log(errorCode + ': ' + errorMessage);
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
});
|
});
|
||||||
|
|
||||||
const issuing_address = "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v";
|
const issuing_address = 'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
|
||||||
const issuing_secret = "s████████████████████████████";
|
const issuing_secret = 'snnDVkSW3aV6jvMJTPdCiE2Qxv1RW';
|
||||||
//Best practice: get your secret from an encrypted config file instead
|
// Best practice: get your secret from an encrypted
|
||||||
|
// config file instead
|
||||||
|
|
||||||
api.connect().then(() => {
|
api.connect().then(() => {
|
||||||
|
|
||||||
//Prepare a settings transaction to enable no freeze
|
// Prepare a settings transaction to enable no freeze
|
||||||
var settings = {
|
const settings = {
|
||||||
"noFreeze": true
|
'noFreeze': true
|
||||||
}
|
};
|
||||||
|
|
||||||
console.log("preparing settings transaction for account:",issuing_address);
|
console.log('preparing settings transaction for account:',
|
||||||
|
issuing_address);
|
||||||
return api.prepareSettings(issuing_address, settings);
|
return api.prepareSettings(issuing_address, settings);
|
||||||
|
|
||||||
}).then(prepared_tx => {
|
}).then(prepared_tx => {
|
||||||
|
|
||||||
//Sign and submit the trustline transaction
|
// Sign and submit the settings transaction
|
||||||
console.log("signing tx:",prepared_tx.txJSON);
|
console.log('signing tx:', prepared_tx.txJSON);
|
||||||
var signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
const signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
|
||||||
console.log("submitting tx:", signed1.id);
|
console.log('submitting tx:', signed1.id);
|
||||||
|
|
||||||
return api.submit(signed1.signedTransaction)
|
return api.submit(signed1.signedTransaction);
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return api.disconnect();
|
return api.disconnect();
|
||||||
}).catch(console.error);
|
}).catch(console.error);
|
||||||
@@ -626,39 +637,40 @@ api.connect().then(() => {
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p>Example JavaScript (ECMAScript 6) code to check whether a trust line is frozen:</p>
|
<p>Example JavaScript (ECMAScript 6) code to check whether a trust line is frozen:</p>
|
||||||
<pre><code>const {RippleAPI} = require('ripple-lib');
|
<pre><code class="js">const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
const api = new RippleAPI({
|
const api = new RippleAPI({
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
|
});
|
||||||
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
});
|
});
|
||||||
|
|
||||||
const my_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
const my_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||||
const counterparty_address = "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v";
|
const counterparty_address = 'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
|
||||||
const frozen_currency = "USD";
|
const frozen_currency = 'USD';
|
||||||
|
|
||||||
api.connect().then(() => {
|
api.connect().then(() => {
|
||||||
|
|
||||||
// Look up current state of trust line
|
// Look up current state of trust line
|
||||||
var options = {counterparty: counterparty_address, currency: frozen_currency};
|
const options = {counterparty: counterparty_address,
|
||||||
console.log("looking up", frozen_currency, "trust line from",
|
currency: frozen_currency};
|
||||||
my_address, "to", counterparty_address);
|
console.log('looking up', frozen_currency, 'trust line from',
|
||||||
|
my_address, 'to', counterparty_address);
|
||||||
return api.getTrustlines(my_address, options);
|
return api.getTrustlines(my_address, options);
|
||||||
|
|
||||||
}).then(data => {
|
}).then(data => {
|
||||||
|
|
||||||
if ( data.length > 1)
|
if (data.length !== 1) {
|
||||||
throw "should only be 1 trust line per counterparty+currency pair";
|
throw 'should only be 1 trust line per counterparty+currency pair';
|
||||||
|
|
||||||
if ( data.length === 0 ) {
|
|
||||||
console.log("No trust line found");
|
|
||||||
} else {
|
|
||||||
var trustline = data[0];
|
|
||||||
console.log("Trust line frozen from our side?",
|
|
||||||
trustline.specification.frozen === true);
|
|
||||||
console.log("Trust line frozen from counterparty's side?",
|
|
||||||
trustline.counterparty.frozen === true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const trustline = data[0];
|
||||||
|
console.log('Trust line frozen from our side?',
|
||||||
|
trustline.specification.frozen === true);
|
||||||
|
console.log('Trust line frozen from counterparty\'s side?',
|
||||||
|
trustline.counterparty.frozen === true);
|
||||||
|
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return api.disconnect();
|
return api.disconnect();
|
||||||
}).catch(console.error);
|
}).catch(console.error);
|
||||||
@@ -781,22 +793,26 @@ console.log(currentFlags & lsfNoFreeze); //0
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p>Example code:</p>
|
<p>Example JavaScript (ECMAScript 6) code to check whether an account has Global Freeze or No Freeze enabled:</p>
|
||||||
<pre><code>const {RippleAPI} = require('ripple-lib');
|
<pre><code class="js">const {RippleAPI} = require('ripple-lib');
|
||||||
|
|
||||||
const api = new RippleAPI({
|
const api = new RippleAPI({
|
||||||
server: 'wss://s1.ripple.com' // Public rippled server hosted by Ripple, Inc.
|
server: 'wss://s1.ripple.com' // Public rippled server
|
||||||
|
});
|
||||||
|
api.on('error', (errorCode, errorMessage) => {
|
||||||
|
console.log(errorCode + ': ' + errorMessage);
|
||||||
});
|
});
|
||||||
|
|
||||||
const my_address = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
const my_address = 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
|
||||||
|
|
||||||
api.connect().then(() => {
|
api.connect().then(() => {
|
||||||
//Look up settings object
|
// Look up settings object
|
||||||
return api.getSettings(my_address);
|
return api.getSettings(my_address);
|
||||||
}).then(settings => {
|
}).then(settings => {
|
||||||
console.log("Got settings for address",my_address);
|
console.log('Got settings for address', my_address);
|
||||||
console.log("Global Freeze enabled?", (settings.globalFreeze === true) );
|
console.log('Global Freeze enabled?',
|
||||||
console.log("No Freeze enabled?", (settings.noFreeze === true) );
|
(settings.globalFreeze === true));
|
||||||
|
console.log('No Freeze enabled?', (settings.noFreeze === true));
|
||||||
|
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return api.disconnect();
|
return api.disconnect();
|
||||||
|
|||||||
Reference in New Issue
Block a user