oxen-observer/templates/tx.html

29 KiB

{% extends "_basic.html" %} {% block content %}

{{tx.tx_hash}}

{# FIXME {%if config.enable_mixins_details%}

{{tx.tx_prefix_hash}}

{%endif%} #}

{{tx.extra.pubkey}}

{%-for pk in tx.extra.additional_pubkeys%} {%-if not loop.first%}; {%endif-%} {{pk}} {%-endfor-%} {%if tx.extra.payment_id%}

{{tx.extra.payment_id}}

{%endif%} {# FIXME - what is this? {%if have_prev_hash%}

Previous TX: {{prev_hash}}

{%endif%} {%if have_next_hash%}

Next TX: {{next_hash}}

{%endif%} #}

Metadata

{%if 'block_height' in tx%} {{tx.block_height}} {%else%} {{tx.received_timestamp | from_timestamp | format_datetime('short')}} UTC ({{tx.received_timestamp | from_timestamp | ago}} ago) {%endif%} {% import 'include/tx_type_symbol.html' as sym %} {{tx.info.version}}/{{sym.display(tx, text=true)}} {%if not have_raw_tx%} {%if 'block_timestamp' in tx%} {{tx.block_timestamp | from_timestamp | format_datetime('short')}} UTC ({{tx.block_timestamp | from_timestamp | ago}} ago) {%endif%} {%endif%} {# FIXME - if in mempool then link to mempool page instead #} {%if tx.coinbase or 'rct_signatures' not in tx.info%} N/A {%else%} {% import 'include/tx_fee.html' as fee %} {{fee.display(tx)}} ({{(tx.info.rct_signatures.txnFee * 1000 / tx.size) | oxen(tag=false, decimals=6)}}) {%endif%} {{tx.size|si}}B {%if 'block_height' in tx%}{{info.height - tx.block_height}}{%else%}None (in mempool){%endif%} {%if tx.info.version >= 2 and 'rct_signatures' in tx.info and not tx.coinbase%}Yes/{{tx.info.rct_signatures.type}}{%else%}No{%endif%} {%if tx.coinbase and tx.extra.sn_winner%} {%if tx.extra.sn_winner == "0000000000000000000000000000000000000000000000000000000000000000"%} None {%else%} {{tx.extra.sn_winner}} {%endif%} {%endif%}

{{tx.info.extra}}
{% if tx.info.version >= 4 -%} {% if tx.info.type == 1 and 'sn_state_change' in tx.extra %}

{%- if tx.extra.sn_state_change.type == 'decom' -%} 👎 Service Node Decommission Metadata {% elif tx.extra.sn_state_change.type == 'recom' -%} 👍 Service Node Recommission Metadata {% elif tx.extra.sn_state_change.type == 'dereg' -%} 🚫 Service Node Deregistration Metadata {% elif tx.extra.sn_state_change.type == 'ip' -%} 📋 Service Node IP Change Metadata {% else -%} Unknown State Change Metadata {% endif -%}

{%set sn_index = tx.extra.sn_state_change.index%} {%if testing_quorum%}

Service Node Public Key: {{testing_quorum.workers[sn_index]}}

Testing quorum {{tx.extra.sn_state_change.height}}

{%set voters = tx.extra.sn_state_change.voters%}
{%for v in testing_quorum.validators%} {{v}} {%endfor%}
{%for w in testing_quorum.workers%} {{w}} {%endfor%}
{%else%}

Service Node Index: {{sn_index}}

Testing quorum: {{tx.extra.sn_state_change.height}}

{%endif%} {% elif tx.info.type == 2 %}

🔓 Service Node Unlock

{{tx.extra.sn_pubkey}}

{{unlock_key_image}}

{# FIXME #}

{{unlock_signature}}

{# FIXME #} {% elif tx.info.type == 4 and 'lns' in tx.extra %} {% if 'buy' in tx.extra.lns %}

🎫 Oxen Name Service Registration

{% elif 'update' in tx.extra.lns %}

💾 Oxen Name Service Update

{% endif %} {#FIXME - show some metadata?#} {% elif 'sn_registration' in tx.extra %}

🏁 Service Node Register Metadata

{{tx.extra.sn_pubkey}}

{%if tx.extra.sn_registration.fee == 1000000%}N/A (solo registration) {%else%}{{(tx.extra.sn_registration.fee / 10000) | chop0}}% {%endif%}

{{tx.stake_amount | loki}}

{{tx.extra.sn_registration.expiry | from_timestamp | format_datetime}} ({{tx.extra.sn_registration.expiry}}), or {{(tx.extra.sn_registration.expiry|from_timestamp - server.datetime) | reltime}}

Service Node Registration Address(es)

{%for c in tx.extra.sn_registration.contributors%} {%endfor%}
Address Portions
{{c.wallet}} {{(c.portion / 10000) | chop0}}%
{% elif 'sn_contributor' in tx.extra %}

⚑ Service Node Contribution

{{tx.extra.sn_pubkey}}

{{tx.extra.sn_contributor}}

{{tx.stake_amount | loki}}

{% endif %} {% endif %} {%if tx.info.vout%}

Outputs

{{tx.info.vout|length}} output(s) for total of {{tx.info.vout | sum(attribute='amount') | oxen(zero='???') | safe}}

{%for out in tx.info.vout%} {%endfor%}
Stealth Address Amount Output Index
{{out.target.key}} {{out.amount | oxen(zero='?')}} {%if 'output_indices' in tx%}{{tx.output_indices[loop.index0]}}{# FIXME: of {{num_outputs}}#}{%endif%}
{%endif%} {#FIXME {%if not have_raw_tx%}

Check which outputs belong to given Loki address/subaddress and viewkey

For RingCT transactions, outputs' amounts are also decoded
{%if enable_js%} Note: Address/Subaddress and viewkey are NOT sent to the server, as the calculations are done on the client side {%else%} Note: address/Subaddress and viewkey are sent to the server, as the calculations are done on the server side {%endif%}




{%if enable_js%} Decode outputs {%else%} {%endif%}

Prove to someone that you have sent them Loki in this transaction

TX private key can be obtained using get_tx_key command in oxen-wallet-cli command line tool
{%if enable_js%} Note: Address/Subaddress and TX private key are NOT sent to the server, as the calculations are done on the client side {%else%} Note: Address/Subaddress and TX private key are sent to the server, as the calculations are done on the server side {%endif%}




{%if enable_js%} Prove sending {%else%} {%endif%}
{%endif%} #} {#FIXME {%if enable_js%}
{%endif%} #} {%if not tx.coinbase and tx.info.vin|length > 0 %}

Inputs

{{tx.info.vin|length}} input(s) for total of {{tx.info.vin | sum(attribute='key.amount') | oxen(zero='???') | safe}}

{#FIXME#} {%if enable_mixins_details%}

Inputs' ring size time scale (from {{min_mix_time}} till {{max_mix_time}}; resolution: {{timescales_scale}} days{%if have_raw_tx%}; R - real ring member {%endif%})

    {%if timescales%}
  • |{{timescale}}|
  • {%endif%}
{%endif%}
{%for inp in tx.info.vin if 'key' in inp%} {%if config.enable_mixins_details%} {%if have_raw_tx%} {%endif%} {%for kindex in inp.key.key_indices%} {%if inp.key.amount in kindex_info and kindex in kindex_info[inp.key.amount]%} {%set oinfo = kindex_info[inp.key.amount][kindex]%} {%set binfo = block_info[oinfo.height]%} {%if have_raw_tx%} {%if mix_is_it_real%} {%else%} {%endif%} {%endif%} {%else%} {%endif%} {%endfor%} {%endif%} {%endfor%}
{{inp.key.k_image}} {#FIXME:#} {%if have_raw_tx%} Already spent: {%if already_spent%} True {%else%} False {%endif%} {%endif%} Amount: {{inp.key.amount | oxen(zero='?')}}
Ring MembersIs It Real?Block Timestamp (UTC)
{{oinfo.key}}{{mix_is_it_real}}{{mix_is_it_real}}{{binfo.height}} {{binfo.timestamp | from_timestamp | format_datetime('short')}} ({{(binfo.timestamp|from_timestamp - server.datetime) | reltime}})
Unknown output ({%if inp.key.amount != 0%}amount {{inp.key.amount}}, {%endif%}index {{kindex}})
{%endif%} {%if details_html%}
{{details_html | safe}} {%else%}
Show raw details
{%endif%} {%if not have_raw_tx%}
{%if with_ring_signatures%}
{{tx_json}}


Less Details

{%elif show_more_details_link%}
More Details {%if enable_as_hex%} | TX As Hex | TX Ring Members As Hex {%endif%}
{%endif%} {%endif%} {%if show_cache_times%}
{%if construction_time%}

TX details construction time: {{construction_time}} s {%if from_cache%}
TX read from the TX cache {%endif%}

{%endif%}
{%endif%}
{%if has_error%}

Attempt failed

{%if error_tx_not_found%}

Tx {{tx_hash}} not found.

If this is newly made tx, it can take some time (up to minute) for it to get propagated to all nodes' txpools.

Please refresh in 10-20 seconds to check if its here then.

{%endif%} {%elif txs%} {{tx_details}} {%endif%}
{% endblock %}