KC358287

Untitled

Apr 17th, 2021 (edited)
234
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {% macro address_link(address, label, badge="") %}
  2.     {%- if address and address != '0x0000000000000000000000000000000000000000' -%}
  3.         <a href="https://etherscan.io/address/{{ address }}" target="_blank">
  4.            {%- if badge -%}
  5.               <span class="badge badge-info">[{{ badge }}] </span>
  6.            {%- endif -%}
  7.               {{- label -}}
  8.         </a>
  9.     {%- else -%}
  10.         {{- label -}}
  11.     {%- endif -%}
  12. {% endmacro %}
  13.  
  14. {% macro nft_link(address, label) %}
  15.     {%- if address and address != '0x0000000000000000000000000000000000000000' -%}
  16.         <a href="https://etherscan.io/token/{{ address }}" target="_blank">
  17.             {{- label -}}
  18.         </a>
  19.     {%- else -%}
  20.         {{- label -}}
  21.     {%- endif -%}
  22. {% endmacro %}
  23.  
  24. {% macro print_event_arguments(arguments) %}
  25.     {% for argument in arguments %}
  26.         {% if argument.type != "ignore" %}
  27.             {% if loop.index > 1 %}, {% endif %}
  28.             {%- if argument.name == "[no ABI]" -%}
  29.                 <span class="badge badge-danger">no_ABI</span>
  30.             {%- else -%}
  31.                 {%- if argument.name -%}
  32.                     <span style='color: darkred'>{{ argument.name }}=</span>
  33.                 {%- endif -%}
  34.                 {%- if argument.type == "tuple" -%}
  35.                     ({{- print_event_arguments(argument.value) -}})
  36.                 {%- elif argument.type == "tuple[]" -%}
  37.                     [
  38.                     {%- for sub_arg in argument.value -%}
  39.                         {{- print_event_arguments(sub_arg) -}}
  40.                     {%- endfor -%}
  41.                     ]
  42.                 {%- elif argument.type == "address" -%}
  43.                     {{- address_link(argument.value.address, argument.value.name, argument.value.badge) -}}
  44.                 {%- elif argument.type == "nft" -%}
  45.                         {{- nft_link(argument.value.address, argument.value.name) -}}
  46.                 {%- elif argument.type == "call" -%}
  47.                     {{- address_link(argument.value.address, argument.value.name, argument.value.badge) -}}.
  48.                     {{- argument.value.function_name -}}({{ print_event_arguments(argument.value.arguments) }})
  49.                 {%- else -%}
  50.                     {{- argument.value -}}
  51.                 {%- endif -%}
  52.             {% endif %}
  53.         {% endif %}
  54.     {% endfor %}
  55. {% endmacro %}
  56.  
  57. {% macro print_call_arguments(arguments) %}
  58.     {% if arguments is not none %}
  59.         {%- for argument in arguments -%}
  60.             {% if argument.type != "ignore" %}
  61.                 {%- if loop.index > 1 -%}, {% endif %}
  62.                     {%- if argument.name == "[no ABI]" -%}
  63.                         <span class="badge badge-danger">no_ABI</span>
  64.                     {%- else -%}
  65.                     {%- if argument.name %}<span style='color: darkred'>{{- argument.name -}}=</span>{%- endif -%}
  66.                     {%- if argument.type == "tuple" -%}
  67.                         ({{- print_call_arguments(argument.value) -}})
  68.                     {%- elif argument.type == "tuple[]" -%}
  69.                         [
  70.                         {%- for sub_arg in argument.value -%}
  71.                             {%- if loop.index > 1 -%}, {% endif %}
  72.                             ({{- print_call_arguments(sub_arg) -}})
  73.                         {%- endfor -%}
  74.                         ]
  75.                     {%- elif argument.type == "address" -%}
  76.                         {{- address_link(argument.value.address, argument.value.name, argument.value.badge) -}}
  77.                     {%- elif argument.type == "nft" -%}
  78.                         {{- nft_link(argument.value.address, argument.value.name) -}}
  79.                     {% elif argument.type == "call" %}
  80.                         {{- address_link(argument.value.address, argument.value.name, argument.value.badge) -}}.<span style="color: darkgreen">{{- argument.value.function_name -}}</span>({{- print_event_arguments(argument.value.arguments) -}})
  81.                     {%- else -%}
  82.                         {{- argument.value -}}
  83.                     {%- endif -%}
  84.                 {%- endif -%}
  85.             {%- endif -%}
  86.         {%- endfor -%}
  87.     {% endif %}
  88. {% endmacro %}
  89.  
  90.  
  91. {%- macro print_call_line(call) -%}
  92.     <span style="color: slategray">[{{- call.gas_used if call.gas_used != None else "N/A" -}}]: </span>
  93.     {% if call.error %}
  94.         <span style='color: red'>({{ call.error }})</span>
  95.     {% endif %}
  96.     {% if call.call_type == "delegatecall" %}
  97.         <span style='color: darkorange'>(delegate)</span>
  98.     {% endif %}
  99.     {% if call.value and call.call_type != "selfdestruct" %}
  100.         <span style='color: blue'>ETH {{ call.value -}}</span>
  101.     {% endif %}
  102.     {%- if call.call_type == "selfdestruct" -%}
  103.         {{-address_link(call.from_address.address, call.from_address.name, call.from_address.badge) -}}<span style='color: darkgreen'>.{{ call.call_type }}({% if call.value > 0 %}<span style='color: blue'>ETH {{ call.value }}</span> => {{ address_link(call.to_address.address, call.to_address.name, call.to_address.badge) -}}{% endif %})</span>
  104.     {%- elif call.call_type == "create" -%}
  105.         {{- address_link(call.address, call.name, call.badge) -}}.<span style='color: darkgreen'>New()</span>
  106.     {%- else -%}
  107.  
  108.         {%- if call.call_type == "delegatecall" -%}
  109.             {{- address_link(call.from_address.address, call.from_address.name, call.from_address.badge) -}}
  110.         {%- else -%}
  111.             {{- address_link(call.to_address.address, call.to_address.name, call.to_address.badge) -}}
  112.         {%- endif -%}
  113.  
  114.         {%- if call.call_type == "delegatecall" -%}
  115.             <span style='color: darkgreen'>[<span class='delegate'>{{- address_link(call.to_address.address, call.to_address.name, call.to_address.badge) -}}</span>
  116.         {%- endif -%}
  117.         {%- if call.function_name != "0x" -%}
  118.             <span style='color: darkgreen'>.{{- call.function_name -}}</span>
  119.         {%- else -%}
  120.             <span style='color: darkgreen'>.fallback</span>
  121.         {%- endif -%}
  122.         {%- if call.call_type == "delegatecall" -%}
  123.             ]
  124.         {%- endif -%}
  125.  
  126.         <span>({{- print_call_arguments(call.arguments) -}}) => ({{- print_call_arguments(call.outputs) -}})</span>
  127.     {%- endif -%}
  128. {%- endmacro -%}
  129.  
  130. <!doctype html>
  131. <html lang="en">
  132.  
  133.     <head>
  134.         <meta charset="utf-8">
  135.         <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  136.         <title>Ethtx.info Analysis {{ transaction.tx_hash }}</title>
  137.  
  138.         <link href="//cdn.jsdelivr.net/npm/jquery.fancytree@2.27/dist/skin-win8/ui.fancytree.min.css" rel="stylesheet">
  139.         <script src="/static/jquery.min.js"></script>
  140.         <script src="/static/jquery.fancytree-all-deps.min.js"></script>
  141.         <link href="/static/ethtx.new.css" rel="stylesheet">
  142.     </head>
  143.  
  144.     <body>
  145.  
  146.         <div class="analysis">
  147.  
  148.             <h3>Analysis for: <span class="transaction-hash">{{ transaction.tx_hash }} / {{ transaction.chain_id }}</span></h3>
  149.  
  150.             <div class="transaction-info">
  151.                 <div>
  152.                     Block number: <span style='color: darkred'>{{ transaction.block_number }}</span>
  153.                     {% if transaction.timestamp %}
  154.                         at <span style='color: darkred'>{{ transaction.timestamp }}</span> UTC
  155.                     {% endif %}
  156.                 </div>
  157.                 <div>
  158.                     Tx cost: <span style='color: darkred'>{{ (transaction.gas_used * transaction.gas_price / 10 ** 18) }}</span> ETH {% if transaction.eth_price %}/ <span style='color: darkred'>{{ "{:,.2f}".format(transaction.gas_used * transaction.gas_price * transaction.eth_price / 10 ** 18) }}{% endif %}</span> USD
  159.                 </div>
  160.                 <div>
  161.                     Gas used: <span style='color: darkred'>{{ "{:,}".format(transaction.gas_used) }}</span> / <span style='color: darkred'>{{ "{:,.2f}".format(transaction.gas_price / 10 ** 9) }}</span> Gwei
  162.                 </div>
  163.             </div>
  164.  
  165.             {% if events %}
  166.                 <div class="events">
  167.                     <h3>Emitted events:</h3>
  168.                     <table class="table table-striped">
  169.                         {% for event in events %}
  170.                             <tr>
  171.                                 <td>
  172.                                     <span style="color: slategray">[{{- event.index -}}] </span>{{ address_link(event.contract.address, event.contract.name, event.contract.badge) }}.<span style='color: darkgreen'>{{ event.event_name }}</span>({{ print_event_arguments(event.parameters) }})
  173.                                 </td>
  174.                             </tr>
  175.                         {% endfor %}
  176.                     </table>
  177.                 </div>
  178.             {% endif %}
  179.  
  180.             {% if balances %}
  181.                 <div class="account-balances">
  182.                     <h3>Account balances:</h3>
  183.                     <table class="table table-sm">
  184.                         <thead>
  185.                             <tr>
  186.                                 <th scope="col">Address</th>
  187.                                 <th scope="col">Token</th>
  188.                                 <th scope="col">Balance</th>
  189.                             </tr>
  190.                         </thead>
  191.                         <tbody>
  192.                             {% for balance in balances %}
  193.                                 <tr>
  194.                                     <td rowspan="{{- balance.tokens|length -}}">
  195.                                         {{- address_link(balance.holder.address, balance.holder.name, balance.holder.badge) -}}
  196.                                     </td>
  197.                                     {% for token in balance.tokens %}
  198.                                         {% if loop.index > 1 %}<tr>{% endif %}
  199.                                             {% if token.token_standard == 'ERC721' %}
  200.                                                 <td class="">{{- nft_link(token.token_address, token.token_symbol) -}}</td>
  201.                                             {% else %}
  202.                                                 <td class="">{{- address_link(token.token_address, token.token_symbol) -}}</td>
  203.                                             {% endif %}
  204.                                             <td style="text-align: right">
  205.                                                 {% if token.balance[0] == '-' %}
  206.                                                     <span style="color: darkred">{{- token.balance -}}</span>
  207.                                                 {% else %}
  208.                                                     {{- token.balance -}}
  209.                                                 {% endif %}
  210.                                             </td>
  211.                                         {% if loop.index > 1 %}</tr>{% endif %}
  212.                                     {% endfor %}
  213.                                 </tr>
  214.                             {% endfor %}
  215.                         </tbody>
  216.                     </table>
  217.                 </div>
  218.             {% endif %}
  219.  
  220.             {% if transfers %}
  221.                 <div class="transfers">
  222.                     <h3>Token transfers: </h3>
  223.                     <table class="table">
  224.                         <thead>
  225.                             <tr>
  226.                                 <th scope="col">Sender</th>
  227.                                 <th scope="col">Token</th>
  228.                                 <th scope="col">Amount</th>
  229.                                 <th scope="col">Receiver</th>
  230.                             </tr>
  231.                         </thead>
  232.                         <tbody>
  233.                             {% for transfer in transfers %}
  234.                                 <tr>
  235.                                     <td>{{- address_link(transfer.from_address.address, transfer.from_address.name, transfer.from_address.badge) -}}</td>
  236.                                     {% if transfer.token_standard == 'ERC721' %}
  237.                                         <td class="">{{- nft_link(transfer.token_address, transfer.token_symbol) -}}</td>
  238.                                     {% else %}
  239.                                         <td>{{- address_link(transfer.token_address, transfer.token_symbol) -}}</td>
  240.                                     {% endif %}
  241.                                     <td style="text-align: right">
  242.                                         {{- transfer.value -}}
  243.                                     </td>
  244.                                     <td>{{- address_link(transfer.to_address.address, transfer.to_address.name, transfer.to_address.badge) -}}</td>
  245.                                 </tr>
  246.                             {% endfor %}
  247.                         </tbody>
  248.                     </table>
  249.                 </div>
  250.             {% endif %}
  251.        
  252.         // -----------------------TUTAJ ZAGNIEZDZONA STRUKTURA-----------------------------
  253.         // teraz zamist listy calls, bedzie dict call, ktory ma sub_calls. A sub_calls to nci innego jak call, wiec struktura zagniezdzona w maks 1024 poziomach.
  254.             {% if calls %}
  255.                 <div class="calls">
  256.                     <h3>Execution trace:</h3>
  257.                     <div id="tree">
  258.                         {% set vars = {'prev_indent': -1} %}
  259.                         {% for call in calls %}
  260.                             {% if not call.indent %}
  261.                                 <ul class="tree">
  262.                                     <li>
  263.                                         <p>
  264.                                             <span style="color: slategray">[{{- transaction.gas_used -}}]: </span>
  265.                                             {{- address_link(call.from_address.address, call.from_address.name, call.from_address.badge) -}}
  266.                                         </p>
  267.                             {% endif %}
  268.                             {% if vars.prev_indent < call.indent %}
  269.                                <ul>
  270.                             {% elif vars.prev_indent > call.indent %}
  271.                                 {% for i in range(vars.prev_indent - call.indent) %}
  272.                                     </li></ul></li>
  273.                                 {% endfor %}
  274.                             {% else %}
  275.                                 </li>
  276.                             {% endif %}
  277.                             <li id="{{call.id}}" class="indent-{{call.indent}} {%if call.indent < 6 %}expanded{%endif%}">
  278.                             <p>
  279.                                 {{- print_call_line(call) -}}
  280.                             </p>
  281.                             {% if vars.update({'prev_indent': call.indent}) %} {% endif %}
  282.                             {% if loop.index  == calls|length %}
  283.                                 {% for i in range(call.indent) %}
  284.                                     </li></ul>
  285.                                 {% endfor %}
  286.                             {% endif %}
  287.                         {% endfor %}
  288.                     </div>
  289.                 </div>
  290.             {% else %}
  291.                 <h3>Trace decoding error...</h3>
  292.             {% endif %}
  293.        
  294.                 // -----------------------KONIEC-----------------------------
  295.  
  296.         </div>
  297.  
  298.         <script>
  299.             $(document).ready(() => {
  300.                 $("#tree").fancytree({
  301.                     minExpandLevel: 2,
  302.                     toggleEffect: false,
  303.                 });
  304.                 $("#tx_tree").fancytree({
  305.                     minExpandLevel: 2,
  306.                     toggleEffect: false,
  307.                 });
  308.             });
  309.         </script>
  310.  
  311.     </body>
  312.  
  313. </html>
  314.  
RAW Paste Data