RPC tool updates

This commit is contained in:
mDuo13
2021-03-09 17:59:24 -08:00
parent 33f6fbf7b2
commit 9424290672
7 changed files with 224 additions and 1545 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,40 +1,33 @@
jQuery(function ($) {
var reTxId = /^[0-9A-Fa-f]{64}$/,
reLedgerSeq = /^[0-9]+$/;
const FULL_HISTORY_SERVER = "wss://s2.ripple.com"
const reTxId = /^[0-9A-Fa-f]{64}$/
const reLedgerSeq = /^[0-9]+$/
let currentTarget = null
let previousMarkers = []
let currentMarker
let nextMarker
var txOffset = 0,
txCount = 0,
currentTarget = null;
const api = new ripple.RippleAPI({server: FULL_HISTORY_SERVER})
var remote = ripple.Remote.from_config({
"trace" : true,
"websocket_ip" : "s2.ripple.com",
"websocket_port" : 443,
"websocket_ssl" : true
});
remote.connect();
remote.once('connected', function () {
var target = location.hash.slice(1);
if (ripple.UInt160.from_json(target).is_valid() ||
api.on('connected', () => {
const target = location.hash.slice(1);
if (api.isValidAddress(target) ||
reTxId.exec(target) ||
reLedgerSeq.exec(target)) {
$('#target').val(target);
fetchTarget(target);
}
});
})
api.connect();
$('#account-entry').submit(function (e) {
e.preventDefault();
e.preventDefault()
fetchTarget( $('#target').val() )
})
var target = $('#target').val();
fetchTarget(target);
});
function fetchTarget(target)
async function fetchTarget(target)
{
if (!remote.state === "online") return;
if (!api.isConnected()) return;
// Reset
$("#links").show();
@@ -43,114 +36,100 @@ jQuery(function ($) {
$("#error").hide();
$("#progress").show();
$(".json").html("");
$("#datalink").parent().removeClass("disabled");
$(".account-tx-more").parent().hide();
$(".account-tx-back").parent().hide();
txOffset = 0;
currentTarget = target;
var locationWithoutHash = location.protocol+'//'+location.hostname+(location.port?":"+location.port:"")+location.pathname+(location.search?location.search:"");
let locationWithoutHash = location.protocol+'//'+location.hostname+(location.port?":"+location.port:"")+location.pathname+(location.search?location.search:"");
$("#permalink").attr("href", locationWithoutHash + "#" + target);
$("#graphlink").attr("href", "https://www.ripplecharts.com/#/graph/" + target);
$("#explorerlink").attr("href", ""); // Reset
if (ripple.UInt160.from_json(target).is_valid()) {
// Account
var account = target;
if (api.isValidAddress(target)) { // Account -------------------------------
let account = target;
previousMarkers = []
nextMarker = undefined
currentMarker = undefined
$("#explorerlink").attr("href", `https://livenet.xrpl.org/accounts/${account}`)
$("#result > .group-account").show();
$("#progress .progress-bar").css("width", "10%");
$("#datalink").attr("href", null).parent().addClass("disabled");
async.waterfall([
function (callback) {
remote.request_account_info({account:account})
.on('success', function (result) {
$("#progress .progress-bar").css("width", "20%");
console.log('account_info', result);
format(result, $("#account_info"));
callback();
})
.on('error', callback)
.request();
},
function (callback) {
remote.request_account_lines({account:account})
.on('success', function (result) {
$("#progress .progress-bar").css("width", "40%");
console.log('account_lines', result);
format(result, $("#account_lines"));
callback();
})
.on('error', callback)
.request();
},
function (callback) {
requestTx(account, function (err) {
if (err) return callback(err);
$("#progress .progress-bar").css("width", "60%");
callback();
});
},
function (callback) {
remote.request_account_offers({account:account})
.on('success', function (result) {
$("#progress .progress-bar").css("width", "80%");
console.log('account_offers', result);
format(result, $("#account_offers"));
callback();
})
.on('error', callback)
.request();
}
], function (err) {
if (err) handleError(err);
try {
let result = await api.request("account_info", {account})
$("#progress .progress-bar").css("width", "20%");
console.log('account_info', result);
format(result, $("#account_info"));
result = await api.request("account_lines", {account})
$("#progress .progress-bar").css("width", "40%");
console.log('account_lines', result);
format(result, $("#account_lines"));
result = await pagedAccountTx(account);
$("#progress .progress-bar").css("width", "60%");
result = await api.request("account_objects", {account})
$("#progress .progress-bar").css("width", "80%");
console.log('account_objects', result);
format(result, $("#account_objects"));
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
});
} else if (reLedgerSeq.exec(target)) {
} catch(err) {
handleError(err)
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
}
} else if (reLedgerSeq.exec(target)) { // Ledger ---------------------------
$("#result > .group-ledger").show();
$("#explorerlink").attr("href", `https://livenet.xrpl.org/ledgers/${target}`)
// Ledger
$("#progress .progress-bar").css("width", "10%");
remote.request_ledger(undefined, { transactions: true, expand: true })
.ledger_index(+target)
.on('success', function (result) {
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
console.log('ledger', result.ledger);
format(result.ledger, $("#ledger_info"));
try {
let result = await api.request("ledger", {
ledger_index: target,
transactions: true,
expand: true
})
.on('error', function (err) {
console.log(err);
handleError(err);
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
})
.request();
} else if (reTxId.exec(target)) {
console.log('ledger', result.ledger);
format(result.ledger, $("#ledger_info"));
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
} catch(err) {
handleErr(err)
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
}
} else if (reTxId.exec(target)) { // Transaction ---------------------------
$("#result > .group-tx").show();
$("#explorerlink").attr("href", `https://livenet.xrpl.org/transactions/${target}`)
$("#datalink").attr("href", "https://ripple.com/client/#/tx/?id=" + target);
try {
$("#progress .progress-bar").css("width", "10%");
let result = await api.request("tx", {
transaction: target,
binary: false
})
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
console.log('tx', result);
format(result, $("#tx_info"));
// Transaction
$("#progress .progress-bar").css("width", "10%");
remote.requestTransaction({"hash": target, "binary": false})
.on('success', function (result) {
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
console.log('tx', result);
format(result, $("#tx_info"));
})
.on('error', function (err) {
handleError(err);
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
})
.request();
} else {
// Unknown/Invalid
} catch (err) {
handleError(err);
$("#progress .progress-bar").css("width", "100%");
$("#progress").fadeOut();
}
} else { // Unknown/Invalid ------------------------------------------------
$("#links").hide();
$("#progress").hide();
handleError("Input is not a valid address or transaction hash");
@@ -190,27 +169,23 @@ jQuery(function ($) {
});
$('.account-tx-more').click(function () {
$(".account-tx-back").parent().show();
txOffset += 20;
$("#account_tx").text("... loading ...");
requestTx(currentTarget, function (err) {});
updateTxOffsetNav();
pagedAccountTx(currentTarget, "next");
});
$('.account-tx-back').click(function () {
txOffset -= 20;
$("#account_tx").text("... loading ...");
requestTx(currentTarget, function (err) {});
updateTxOffsetNav();
let previous_markers = $(".account-tx-back").data("marker")
pagedAccountTx(currentTarget, "prev");
});
$('.account-offers-expand').click(function () {
$("#account_offers .expanded").removeClass("expanded");
$("#account_offers").find("ul > li").addClass("expanded");
$('.account-objects-expand').click(function () {
$("#account_objects .expanded").removeClass("expanded");
$("#account_objects").find("ul > li").addClass("expanded");
});
$('.account-offers-collapse').click(function () {
$("#account_offers .expanded").removeClass("expanded");
$('.account-objects-collapse').click(function () {
$("#account_objects .expanded").removeClass("expanded");
});
$('.ledger-expand-tx').click(function () {
@@ -228,7 +203,6 @@ jQuery(function ($) {
});
$('pre.json').delegate(".toggle", "click", function (evt) {
console.log(this);
$(this).parent().toggleClass("expanded");
});
@@ -240,6 +214,7 @@ jQuery(function ($) {
if (err.error === "remoteError" &&
"object" === typeof err.remote)
{
// TODO: is this "remoteError" thing still valid with ripple-lib 1.x+?
err = err.remote;
}
@@ -253,37 +228,49 @@ jQuery(function ($) {
}
}
function requestTx(account, callback) {
remote.request_account_tx({
'account': account,
'ledger_index_min': -1,
'descending': true,
'limit': 20,
'offset' : txOffset,
'count': true,
'binary': false
})
.on('success', function (result) {
txCount = result.count;
console.log('account_tx', result);
format(result, $("#account_tx").empty());
callback();
updateTxOffsetNav();
})
.on('error', callback)
.request();
async function pagedAccountTx(account, page) {
let opts = {
"account": account,
"ledger_index_min": -1,
"ledger_index_max": -1,
"binary": false,
"limit": 20,
"forward": false
}
if (page === "prev") {
let prev_marker = previousMarkers.pop()
if (prev_marker) {
opts["marker"] = prev_marker
} // omit to ask for page 1
} else if (page === "next") {
opts["marker"] = nextMarker
if (currentMarker) {
previousMarkers.push(currentMarker)
}
currentMarker = opts["marker"]
}
let result = await api.request("account_tx", opts)
console.log('account_tx', result)
format(result, $("#account_tx").empty())
updateTxMarkerNav(result)
}
function updateTxOffsetNav()
{
$(".account-tx-back").parent().hide();
$(".account-tx-more").parent().hide();
function updateTxMarkerNav(result) {
if (previousMarkers.length) {
$(".account-tx-back").parent().show()
} else {
$(".account-tx-back").parent().hide()
}
if (txOffset > 0)
$(".account-tx-back").parent().show();
if (txCount > (txOffset + 20))
$(".account-tx-more").parent().show();
if (result.marker) {
nextMarker = result.marker
$(".account-tx-more").parent().show()
} else {
$(".account-tx-more").parent().hide()
}
}
String.prototype.repeat = function(times) {
@@ -295,15 +282,15 @@ jQuery(function ($) {
switch (typeof v) {
case "object":
var el, sub = null, count;
let el = null
let sub = null
if (Array.isArray(v)) {
ct.append("[");
count = v.length;
for (var i = 0; i < count; i++) {
for (var i = 0; i < v.length; i++) {
if (!sub) {
$('<a class="toggle"></a>').appendTo(ct);
$('<span class="ellipsis"></span>')
.text(getEllipText(count)).appendTo(ct);
.text(getEllipText(v.length)).appendTo(ct);
el = $("<ul></ul>");
} else sub.append(",");
sub = $("<li></li>").addClass("type-" + typeof v[i]);
@@ -318,12 +305,11 @@ jQuery(function ($) {
ct.append("]");
} else {
ct.append("{");
count = Object.keys(v).length;
for (var i in v) {
if (!sub) {
$('<a class="toggle"></a>').appendTo(ct);
$('<span class="ellipsis"></span>')
.text(getEllipText(Object.keys(v))).appendTo(ct);
.text(getEllipText(v)).appendTo(ct);
el = $("<ul></ul>");
} else sub.append(",");
sub = $("<li></li>").addClass("type-" + typeof v[i]);
@@ -351,18 +337,45 @@ jQuery(function ($) {
break;
}
}
function getEllipText(count) {
const TYPE_IDENTIFYING_KEYS = [
"TransactionType",
"LedgerEntryType"
]
function getEllipText(contents) {
var label = "...";
if (Array.isArray(count)) {
if ("number" === typeof contents) {
// Array - just list how many items
label = "" + contents + " items";
} else {
// Object - list keys intelligently
label = "";
while (label.length < 15) {
if (!count.length) break;
if (label.length) label += ", ";
label += count.shift();
let i = 0
// Look for type-identifying keys first:
for (const key of TYPE_IDENTIFYING_KEYS) {
if (key in contents) {
label += contents[key]+": "
i++
break; // Only one type-identifying key per object
}
}
// Now list other keys as space permits
for (k in contents) {
if (label.length >= 19) {
break
}
if (TYPE_IDENTIFYING_KEYS.includes(k)) {
// Skip type-identifying keys already printed
continue
}
label += k + ", "
i++
}
if (i < Object.keys(contents).length) {
label += "..."
} else {
label = label.slice(0,-2) // Remove the last ", "
}
if (count.length) label += ", ...";
} else if ("number" === typeof count) {
label = "" + count + " items";
}
return "\u00A0/* "+label+" */\u00A0";
}

File diff suppressed because one or more lines are too long

View File

@@ -57,7 +57,6 @@
var URL_BASE = '{{ currentpage.rest_host }}';
var DOC_BASE = '{{ currentpage.doc_page }}';
</script>
<script type='text/javascript' src='assets/js/es5-shim.js'></script>
<script type='text/javascript' src='assets/vendor/codemirror-js-json-lint.min.js'></script>
<script type='text/javascript' src='assets/vendor/cm-javascript.min.js'></script>
<script type='text/javascript' src='assets/js/jquery.autosize.input.min.js'></script>

View File

@@ -182,7 +182,6 @@
</div><!--/.modal-->
<script type="text/javascript" src="assets/vendor/jsonlint.js"></script>
<!-- <link rel="stylesheet" type="text/css" href="assets/vendor/codemirror.css"/> -->
<script type="text/javascript" src="assets/vendor/codemirror-js-json-lint.min.js"></script>
<script type="text/javascript" src="assets/js/apitool-websocket.js"></script>
<script type="text/javascript" src="assets/js/apitool-methods-ws.js"></script>

View File

@@ -7,92 +7,89 @@
<h1>RPC Tool</h1>
<div class="content">
<p>This is a debug tool for printing raw information about an account, a transaction (by hash) or a ledger (by sequence number).</p>
<p>This is a debug tool for printing raw information about an account (by classic address), a transaction (by hash) or a ledger (by sequence number).</p>
<form id="account-entry">
<fieldset><input id="target" class="form-control" required="" type="text" placeholder="XRP Ledger classic address or transaction ID" />
<span class="help-block"><small>Try an account like <em>r9kiSEUEw6iSCNksDVKf9k3AyxjW3r1qPf</em>.</small></span>
<button class="btn btn-primary">Get info</button></fieldset>
<span class="help-block"><small>{% trans %}Try an account like <em>rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn</em>.{% endtrans %}</small></span>
<button class="btn btn-primary">{% trans %}Get info{% endtrans %}</button></fieldset>
</form>
<div id="result">
<h2>Result</h2>
<h2>{% trans %}Result{% endtrans %}</h2>
<div id="progress" class="progress">
<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar"></div>
</div>
<div id="error" class="devportal-callout warning"></div>
<ul id="links" class="nav nav-pills">
<li><a id="permalink" href="#" target="_blank" rel="noopener">Permalink</a></li>
<li><a id="graphlink" href="#" target="_blank" rel="noopener">Graph</a></li>
<li><a id="permalink" href="#" target="_blank" rel="noopener">{% trans %}Permalink{% endtrans %}</a></li>
<li><a id="explorerlink" href="#" target="_blank" rel="noopener">{% trans %}Explorer{% endtrans %}</a></li>
</ul>
<div class="devportal-callout tip"><strong>Tip:</strong> This page features intelligent copy/paste. Any
nodes you expand will be copied, any that you don't expand will show up
as a little <code>/* */</code> comment in your copy/pasted text.</div>
<div class="group group-tx">
<h3>tx</h3>
<h3><a href="tx.html">tx</a></h3>
<ul class="tools nav nav-pills">
<li><a class="tx-expand">expand all</a></li>
<li><a class="tx-collapse">collapse all</a></li>
<li><a class="tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<pre id="tx_info" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="tx-expand">expand all</a></li>
<li><a class="tx-collapse">collapse all</a></li>
<li><a class="tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
</div>
<div class="group group-account">
<h3>account_info</h3>
<h3><a href="account_info.html">account_info</a></h3>
<pre id="account_info" class="json"></pre>
<h3>account_lines</h3>
<h3><a href="account_lines.html">account_lines</a></h3>
<ul class="tools nav nav-pills">
<li><a class="account-lines-expand">expand all</a></li>
<li><a class="account-lines-collapse">collapse all</a></li>
<li><a class="account-lines-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-lines-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<pre id="account_lines" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="account-lines-expand">expand all</a></li>
<li><a class="account-lines-collapse">collapse all</a></li>
<li><a class="account-lines-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-lines-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<h3>account_tx (last 20)</h3>
<h3><a href="account_tx.html">account_tx</a> (last 20)</h3>
<ul class="tools nav nav-pills">
<li><a class="account-tx-expand-tx">expand tx</a></li>
<li><a class="account-tx-expand">expand all</a></li>
<li><a class="account-tx-collapse">collapse all</a></li>
<li><a class="account-tx-more">next 20</a></li>
<li><a class="account-tx-back">prev 20</a></li>
<li><a class="account-tx-expand-tx">{% trans %}expand tx{% endtrans %}</a></li>
<li><a class="account-tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
<li><a class="account-tx-more">{% trans %}next 20{% endtrans %}</a></li>
<li><a class="account-tx-back">{% trans %}prev 20{% endtrans %}</a></li>
</ul>
<pre id="account_tx" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="account-tx-expand-tx">expand tx</a></li>
<li><a class="account-tx-expand">expand all</a></li>
<li><a class="account-tx-collapse">collapse all</a></li>
<li><a class="account-tx-more">next 20</a></li>
<li><a class="account-tx-back">prev 20</a></li>
<li><a class="account-tx-expand-tx">{% trans %}expand tx{% endtrans %}</a></li>
<li><a class="account-tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
<li><a class="account-tx-more">{% trans %}next 20{% endtrans %}</a></li>
<li><a class="account-tx-back">{% trans %}prev 20{% endtrans %}</a></li>
</ul>
<h3>account_offers</h3>
<h3><a href="account_objects.html">account_objects</a></h3>
<ul class="tools nav nav-pills">
<li><a class="account-offers-expand">expand all</a></li>
<li><a class="account-offers-collapse">collapse all</a></li>
<li><a class="account-objects-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-objects-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<pre id="account_offers" class="json"></pre>
<pre id="account_objects" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="account-offers-expand">expand all</a></li>
<li><a class="account-offers-collapse">collapse all</a></li>
<li><a class="account-objects-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="account-objects-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
</div>
<div class="group group-ledger">
<h3>ledger</h3>
<h3><a href="ledger.html">ledger</a></h3>
<ul class="tools nav nav-pills">
<li><a class="ledger-expand-tx">expand tx</a></li>
<li><a class="ledger-tx-expand">expand all</a></li>
<li><a class="ledger-tx-collapse">collapse all</a></li>
<li><a class="ledger-expand-tx">{% trans %}expand tx{% endtrans %}</a></li>
<li><a class="ledger-tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="ledger-tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
<pre id="ledger_info" class="json"></pre>
<ul class="tools nav nav-pills">
<li><a class="ledger-tx-expand-tx">expand tx</a></li>
<li><a class="ledger-tx-expand">expand all</a></li>
<li><a class="ledger-tx-collapse">collapse all</a></li>
<li><a class="ledger-tx-expand-tx">{% trans %}expand tx{% endtrans %}</a></li>
<li><a class="ledger-tx-expand">{% trans %}expand all{% endtrans %}</a></li>
<li><a class="ledger-tx-collapse">{% trans %}collapse all{% endtrans %}</a></li>
</ul>
</div>
@@ -102,10 +99,8 @@
{% endblock %}
{% block endbody %}
<script type='text/javascript' src='assets/js/es5-shim.js'></script>
<script type='text/javascript' src='assets/js/ripple-0.11.0-min.js'></script>
<script type='text/javascript' src='assets/vendor/async.min.js'></script>
<script type='text/javascript' src='assets/vendor/cm-javascript.min.js'></script>
{{currentpage.lodash_tag}}
{{currentpage.ripple_lib_tag}}
<script type='text/javascript' src='assets/js/rpc-tool.js'></script>
<script type="application/javascript">