commit
e4a7a49692
@ -0,0 +1,70 @@ |
|||||||
|
import $ from 'jquery' |
||||||
|
|
||||||
|
function composeCurlCommand (data) { |
||||||
|
return `curl -H "content-type: application/json" -X POST --data '${JSON.stringify(data)}'` |
||||||
|
} |
||||||
|
|
||||||
|
function handleResponse (data, xhr, clickedButton) { |
||||||
|
const module = clickedButton.attr('data-module') |
||||||
|
const action = clickedButton.attr('data-action') |
||||||
|
const curl = $(`[data-selector="${module}-${action}-curl"]`)[0] |
||||||
|
const code = $(`[data-selector="${module}-${action}-server-response-code"]`)[0] |
||||||
|
const body = $(`[data-selector="${module}-${action}-server-response-body"]`)[0] |
||||||
|
|
||||||
|
curl.innerHTML = composeCurlCommand(data) |
||||||
|
code.innerHTML = xhr.status |
||||||
|
body.innerHTML = JSON.stringify(xhr.responseJSON, undefined, 2) |
||||||
|
$(`[data-selector="${module}-${action}-try-api-ui-result"]`).show() |
||||||
|
$(`[data-selector="${module}-${action}-btn-try-api-clear"]`).show() |
||||||
|
clickedButton.html(clickedButton.data('original-text')) |
||||||
|
clickedButton.prop('disabled', false) |
||||||
|
} |
||||||
|
|
||||||
|
function wrapJsonRpc (method, params) { |
||||||
|
return { |
||||||
|
id: 0, |
||||||
|
jsonrpc: '2.0', |
||||||
|
method: method, |
||||||
|
params: params |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function parseInput (input) { |
||||||
|
const type = $(input).attr('data-parameter-type') |
||||||
|
const value = $(input).val() |
||||||
|
|
||||||
|
switch (type) { |
||||||
|
case 'string': |
||||||
|
return value |
||||||
|
case 'json': |
||||||
|
return JSON.parse(value) |
||||||
|
default: |
||||||
|
return value |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$('button[data-try-eth-api-ui-button-type="execute"]').click(event => { |
||||||
|
const clickedButton = $(event.target) |
||||||
|
const module = clickedButton.attr('data-module') |
||||||
|
const action = clickedButton.attr('data-action') |
||||||
|
const inputs = $(`input[data-selector="${module}-${action}-try-api-ui"]`) |
||||||
|
const params = $.map(inputs, parseInput) |
||||||
|
const formData = wrapJsonRpc(action, params) |
||||||
|
console.log(formData) |
||||||
|
const loadingText = '<span class="loading-spinner-small mr-2"><span class="loading-spinner-block-1"></span><span class="loading-spinner-block-2"></span></span> Loading...' |
||||||
|
|
||||||
|
clickedButton.prop('disabled', true) |
||||||
|
clickedButton.data('original-text', clickedButton.html()) |
||||||
|
|
||||||
|
if (clickedButton.html() !== loadingText) { |
||||||
|
clickedButton.html(loadingText) |
||||||
|
} |
||||||
|
|
||||||
|
$.ajax({ |
||||||
|
url: '/api/eth_rpc', |
||||||
|
type: 'POST', |
||||||
|
data: JSON.stringify(formData), |
||||||
|
dataType: 'json', |
||||||
|
contentType: 'application/json; charset=utf-8' |
||||||
|
}).then((_data, _status, xhr) => handleResponse(formData, xhr, clickedButton)) |
||||||
|
}) |
@ -0,0 +1,182 @@ |
|||||||
|
<div class="api-doc-list-item" > |
||||||
|
<div class="api-doc-list-item-contents" href="#<%= @action %>"> |
||||||
|
<div class="api-doc-list-item-description"> |
||||||
|
<h3 class="api-doc-list-item-title"><%= @action %></h3> |
||||||
|
<p class="api-doc-list-item-contents"><%= raw @info.notes %></p> |
||||||
|
<span class="api-doc-list-item-query api-text-monospace api-text-monospace-background btn" |
||||||
|
data-clipboard-text="curl -X POST --data '{"id":0,"jsonrpc":"2.0","method": "<%= @action %>", params: []}'" |
||||||
|
> |
||||||
|
curl -X POST --data '{"id":0,"jsonrpc":"2.0","method": "<%= @action %>", params: []}' |
||||||
|
</span> |
||||||
|
<p class="api-doc-list-item-text"> |
||||||
|
<div class="tile tile-muted p-1"> |
||||||
|
<pre |
||||||
|
class="m-2" |
||||||
|
data-json='<%= @info.example %>' |
||||||
|
></pre> |
||||||
|
</div> |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="api-doc-list-item-controls" |
||||||
|
aria-controls="<%= @action %>" |
||||||
|
aria-expanded="false" |
||||||
|
data-toggle="collapse" |
||||||
|
href="#<%= @action %>"> |
||||||
|
<div class="api-doc-list-item-controls-badges"> |
||||||
|
<span class="badge badge-neutral api-badge"><%= gettext "POST" %></span> |
||||||
|
</div> |
||||||
|
<span class="api-doc-list-item-controls-view-more"> |
||||||
|
<span class="api-doc-list-item-controls-view-more-open">More Details <span class="fa fa-chevron-down"></span></span> |
||||||
|
<span class="api-doc-list-item-controls-view-more-close">Hide Details <span class="fa fa-chevron-up"></span></span> |
||||||
|
</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<!-- Parameters --> |
||||||
|
<div |
||||||
|
class="collapse multi-collapse api-doc-parameters-container" |
||||||
|
id="<%= @action %>" |
||||||
|
> |
||||||
|
<h3 class="card-title margin-bottom-md"> |
||||||
|
<%= gettext "Parameters" %> |
||||||
|
<button |
||||||
|
class="btn-full-primary float-right" |
||||||
|
data-action="<%= @action %>" |
||||||
|
data-module="eth" |
||||||
|
data-selector='<%= "eth-#{@action}-btn-try-api" %>' |
||||||
|
role="button" |
||||||
|
><%= gettext "Try it out" %></button> |
||||||
|
<button |
||||||
|
class="collapse btn-line float-right" |
||||||
|
data-action="<%= @action %>" |
||||||
|
data-module="eth" |
||||||
|
data-selector='<%= "eth-#{@action}-btn-try-api-cancel" %>' |
||||||
|
role="button" |
||||||
|
><%= gettext "Cancel" %></button> |
||||||
|
</h3> |
||||||
|
<!-- Parameters description list --> |
||||||
|
<div class="api-doc-parameters-list"> |
||||||
|
<div class="row d-none d-md-flex"> |
||||||
|
<h4 class="col-2 api-doc-parameters-list-title"><%= gettext "Name" %></h4> |
||||||
|
<h3 class="col-10 api-doc-parameters-list-title"><%= gettext "Description" %></h3> |
||||||
|
</div> |
||||||
|
<!-- Params --> |
||||||
|
<%= for param <- @info.params do %> |
||||||
|
<div class="row api-doc-parameters-list-item"> |
||||||
|
<div class="col-sm-4 col-md-2"> |
||||||
|
<h5 class="api-doc-parameters-list-item-title"> |
||||||
|
<%= param.name %> |
||||||
|
<%= if param.required do %> |
||||||
|
<span class="align-text-bottom text-danger"> |
||||||
|
*<small><%= gettext "required" %></small> |
||||||
|
</span> |
||||||
|
<% end %> |
||||||
|
</h5> |
||||||
|
</div> |
||||||
|
<div class="col-sm-8 col-md-10"> |
||||||
|
<p class="api-doc-parameters-list-item-description"><%= param.description %></p> |
||||||
|
<input |
||||||
|
class="collapse form-control border-rounded <%= if param.required && !param.default, do: "form-control-danger is-invalid" %>" |
||||||
|
data-parameter-type='<%= param.type %>' |
||||||
|
data-required='<%= if param.required, do: "true", else: "false" %>' |
||||||
|
data-selector='<%= "eth-#{@action}-try-api-ui" %>' |
||||||
|
type="text", |
||||||
|
value='<%= param.default %>' |
||||||
|
/> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<% end %> |
||||||
|
|
||||||
|
<!-- Buttons for Other / Extra --> |
||||||
|
<div class="row"> |
||||||
|
<div class="offset-sm-4 offset-md-2 col-10"> |
||||||
|
<button |
||||||
|
class="collapse button button-primary" |
||||||
|
data-action="<%= @action %>" |
||||||
|
data-module="eth" |
||||||
|
data-selector='<%= "eth-#{@action}-try-api-ui" %>' |
||||||
|
data-try-eth-api-ui-button-type="execute" |
||||||
|
role="button" |
||||||
|
><%= gettext "Execute" %></button> |
||||||
|
<button |
||||||
|
class="collapse button button-secondary" |
||||||
|
data-action="<%= @action %>" |
||||||
|
data-module="eth" |
||||||
|
data-selector='<%= "eth-#{@action}-btn-try-api-clear" %>' |
||||||
|
role="button" |
||||||
|
><%= gettext "Clear" %></button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<!-- CURL / Request URL / Server Response --> |
||||||
|
<div |
||||||
|
class="tile text-dark mt-5 collapse" |
||||||
|
data-selector='<%= "eth-#{@action}-try-api-ui-result" %>' |
||||||
|
> |
||||||
|
<div class="mb-3"> |
||||||
|
<h5 class="api-doc-parameters-list-item-title"><%= gettext "Curl" %></h5> |
||||||
|
<div class="tile tile-muted p-1"> |
||||||
|
<pre |
||||||
|
class="m-2" |
||||||
|
data-selector='<%= "eth-#{@action}-curl" %>' |
||||||
|
></pre> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<h5 class="api-doc-parameters-list-item-title"><%= gettext "Server Response" %></h5> |
||||||
|
<div class="row"> |
||||||
|
<h4 class="col-2 api-doc-parameters-list-title"><%= gettext "Code" %></h4> |
||||||
|
<h4 class="col-10 api-doc-parameters-list-title"><%= gettext "Details" %></h4> |
||||||
|
</div> |
||||||
|
<div class="row"> |
||||||
|
<div |
||||||
|
class="col-2 pr-0 pr-md-2 col-md-2" |
||||||
|
><strong data-selector='<%= "eth-#{@action}-server-response-code" %>'></strong></div> |
||||||
|
<div class="col-10 col-md-10"> |
||||||
|
<p class="api-doc-parameters-list-item-description"><%= gettext "Response Body" %></p> |
||||||
|
<div class="tile tile-muted p-1 card-server-response-body"> |
||||||
|
<pre |
||||||
|
class="m-2" |
||||||
|
data-selector='<%= "eth-#{@action}-server-response-body" %>' |
||||||
|
></pre> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<!-- Responses --> |
||||||
|
<h3 class="card-title margin-bottom-md"><%= gettext "Responses" %></h3> |
||||||
|
<div class="row api-doc-parameters-list-item mb-0"> |
||||||
|
<h4 class="col-2 api-doc-parameters-list-title"><%= gettext "Code" %></h4> |
||||||
|
<h5 class="col-10 api-doc-parameters-list-title"><%= gettext "Description" %></h5> |
||||||
|
</div> |
||||||
|
<div class="row api-doc-parameters-list-item"> |
||||||
|
<div class="col-2 pr-0 pr-md-2"><strong>200</strong></div> |
||||||
|
<div class="col-10"> |
||||||
|
<div class="tile tile-muted p-1 mb-3"> |
||||||
|
<pre class="m-2"><strong>successful operation</strong></pre> |
||||||
|
</div> |
||||||
|
<!-- Tabs --> |
||||||
|
<ul |
||||||
|
class="nav nav-pills mb-3" |
||||||
|
role="tablist" |
||||||
|
> |
||||||
|
<li class="nav-item"> |
||||||
|
<a class="nav-link api-doc-tab active"><%= gettext "Example Value" %></a> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
<!-- Tab Content --> |
||||||
|
<div class="tab-content"> |
||||||
|
<!-- Example Value Tab --> |
||||||
|
<div class="tab-pane fade show active"> |
||||||
|
<div class="tile tile-muted p-1"> |
||||||
|
<pre |
||||||
|
class="m-2" |
||||||
|
data-json='<%= @info.result %>' |
||||||
|
></pre> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
@ -0,0 +1,17 @@ |
|||||||
|
defmodule Explorer.Repo.Migrations.RemoveDuplicateIndexes do |
||||||
|
use Ecto.Migration |
||||||
|
|
||||||
|
def change do |
||||||
|
drop_if_exists( |
||||||
|
index(:decompiled_smart_contracts, [:address_hash], name: "decompiled_smart_contracts_address_hash_index") |
||||||
|
) |
||||||
|
|
||||||
|
drop_if_exists( |
||||||
|
index(:staking_pools_delegators, [:delegator_address_hash], |
||||||
|
name: "staking_pools_delegators_delegator_address_hash_index" |
||||||
|
) |
||||||
|
) |
||||||
|
|
||||||
|
drop_if_exists(index(:transactions, [:to_address_hash], name: "transactions_to_address_hash_index")) |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue