Etherscan Contract Downloader

batch download etherscan verified contract

As of 2022-09-05. See the latest version.

  1. // ==UserScript==
  2. // @name Etherscan Contract Downloader
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.6
  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. // @icon https://etherscan.io/images/brandassets/etherscan-logo-circle.png
  17. // @grant unsafeWindow
  18. // @license MIT
  19. // ==/UserScript==
  20.  
  21.  
  22.  
  23. (function() {
  24. 'use strict';
  25.  
  26. // Your code here...
  27. let editorIds = $("[id^=editor]")
  28. let spans = $("span[class=text-secondary]").toArray();
  29. spans.shift();
  30.  
  31. console.log(`found ${editorIds.length-1} editors`);
  32.  
  33.  
  34. function getAddr() {
  35. const regex = /0x[0-9A-Fa-f]{40}/g;
  36. const found = window.location.href.match(regex);
  37. return found[0]
  38. }
  39.  
  40. function getDethUrl() {
  41. let host = window.location.host;
  42. let newHost = host.split(".")[0]+".deth.net"
  43. let url = window.location.href;
  44. return url.replace(host, newHost);
  45. }
  46.  
  47. function downloadEditor(index) {
  48. let addr = getAddr()
  49. let editor = ace.edit(editorIds[index])
  50. let filename;
  51. try {
  52. filename = `${addr}-${spans[index].innerText.split(":")[1].trim()}`
  53. } catch {
  54. filename = `${addr}.sol`
  55. }
  56. console.log(filename)
  57. let HTMLhiddenElement = document.createElement("a");
  58. HTMLhiddenElement.href = 'data:attachment/text,' + encodeURIComponent(editor.getValue());
  59. HTMLhiddenElement.target = '_blank';
  60. HTMLhiddenElement.download = filename;
  61. HTMLhiddenElement.click();
  62. }
  63.  
  64. function downloadAll() {
  65. if (editorIds.length == 1) {
  66. downloadEditor(0)
  67. return
  68. }
  69. for (let i=0;i<editorIds.length-1;i++) {
  70. downloadEditor(i)
  71. }
  72. }
  73.  
  74. if(!unsafeWindow.downloadAll)
  75. {
  76. unsafeWindow.downloadAll = downloadAll;
  77. }
  78.  
  79. $("#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>');
  80. $("#nav_subtabs").append(`<li class="nav-item"><a class="nav-link show" href="#vscode" onclick="window.open('${getDethUrl()}','_blank')" data-toggle="tab""><span>Edit on Deth.net</span></a></li>`);
  81. //
  82. })();