Etherscan Contract Downloader

batch download etherscan verified contract

As of 2023-05-18. See the latest version.

  1. // ==UserScript==
  2. // @name Etherscan Contract Downloader
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.8
  5. // @description batch download etherscan verified contract
  6. // @author jason@trillion.fi
  7. // @match https://*.etherscan.io/address/*
  8. // @match https://ftmscan.com/address/*
  9. // @match https://bscscan.com/address/*
  10. // @match https://snowtrace.io/address/*
  11. // @match https://polygonscan.com/address/*
  12. // @match https://hecoinfo.com/address/*
  13. // @match https://optimistic.etherscan.io/address/*
  14. // @match https://arbiscan.io/address/*
  15. // @match https://aurorascan.dev/address/*
  16. // @match https://cronoscan.com/address/*
  17. // @icon https://etherscan.io/images/brandassets/etherscan-logo-circle.png
  18. // @grant unsafeWindow
  19. // @license MIT
  20. // ==/UserScript==
  21. (function() {
  22. 'use strict';
  23.  
  24. // Your code here...
  25. let editorIds = $("[id^=editor]")
  26. let spans = $("span[class=text-secondary]").toArray();
  27. spans.shift();
  28.  
  29. console.log(`found ${editorIds.length-1} editors`);
  30.  
  31.  
  32. function getAddr() {
  33. const regex = /0x[0-9A-Fa-f]{40}/g;
  34. const found = window.location.href.match(regex);
  35. return found[0]
  36. }
  37.  
  38. function getDethUrl() {
  39. let host = window.location.host;
  40. let newHost = host.split(".")[0] + ".deth.net"
  41. let url = window.location.href;
  42. return url.replace(host, newHost);
  43. }
  44.  
  45. function getByteGraphUrl() {
  46. var url = window.location.href;
  47. var modifiedUrl = url.replace(/^https:\/\/etherscan\.io\/address\/(.+?)(?:#.*)?$/, 'https://bytegraph.xyz/address/$1');
  48. return modifiedUrl;
  49. }
  50.  
  51. function downloadEditor(index) {
  52. let addr = getAddr()
  53. let editor = ace.edit(editorIds[index])
  54. let filename;
  55. try {
  56. filename = `${addr}-${spans[index].innerText.split(":")[1].trim()}`
  57. } catch {
  58. filename = `${addr}.sol`
  59. }
  60. console.log(filename)
  61. let HTMLhiddenElement = document.createElement("a");
  62. HTMLhiddenElement.href = 'data:attachment/text,' + encodeURIComponent(editor.getValue());
  63. HTMLhiddenElement.target = '_blank';
  64. HTMLhiddenElement.download = filename;
  65. HTMLhiddenElement.click();
  66. }
  67.  
  68. function downloadAll() {
  69. if (editorIds.length == 1) {
  70. downloadEditor(0)
  71. return
  72. }
  73. for (let i = 0; i < editorIds.length - 1; i++) {
  74. downloadEditor(i)
  75. }
  76. }
  77.  
  78. if (!unsafeWindow.downloadAll) {
  79. unsafeWindow.downloadAll = downloadAll;
  80. }
  81.  
  82. $("#nav_subtabs").append('<li class="nav-item"><a class="nav-link show" href="#download" data-toggle="tab" onclick="javascript:downloadAll();"><span>Download</span></a></li>');
  83. $("#nav_subtabs").append(`<li class="nav-item"><a class="nav-link show" href="#vscode" onclick="window.open('${getDethUrl()}','_blank')" data-toggle="tab""><span>Deth.net</span></a></li>`);
  84. $("#nav_subtabs").append(`<li class="nav-item"><a class="nav-link show" href="#bytegraph" onclick="window.open('${getByteGraphUrl()}','_blank')" data-toggle="tab""><span>Bytegraph.xyz</span></a></li>`);
  85.  
  86. $('.table th:contains("Age")').css("width", "14%");
  87.  
  88. $('.table span:contains(" ago")').each(function() {
  89. var relTime = $(this).text();
  90. var absTime = $(this).attr('title');
  91. if (!absTime) absTime = $(this).attr('data-original-title');
  92. // absTime = moment(absTime, "MMM-DD-YYYY hh:mm:ss A", "en").add(1, 'h').format("YYYY-MM-DD HH:mm:ss");
  93. absTime = moment(absTime).add(8, 'h').format("YYYY-MM-DD HH:mm:ss");
  94. $(this).attr('title', relTime);
  95. $(this).attr('data-original-title', relTime);
  96. $(this).text(absTime);
  97. });
  98.  
  99. //
  100. })();