-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathetherscanSource.js
More file actions
29 lines (26 loc) · 1.04 KB
/
etherscanSource.js
File metadata and controls
29 lines (26 loc) · 1.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(async () => {
const fs = require('fs/promises')
const axios = require('axios')
const { JSDOM } = require('jsdom')
const all = process.argv.slice(2)
.map(a => '0x' + a.replace(/^0x/,''))
.map(async (addr) => {
const res = await axios.get(`https://etherscan.io/address/${addr}`)
const { document } = (new JSDOM(res.data)).window
const sol = Array.from(document.querySelectorAll('pre.js-sourcecopyarea.editor'))
.reverse()
.map(pre => pre.textContent)
.join('\n\n')
.replace(/^import.+;\n/gm, '')
.replace(/^pragma experimental ABIEncoderV2;\n/gm, '')
.replace(/^pragma abicoder.+;\n/gm, '')
.replace(/^\/\/ SPDX.+\n/gm, '')
.replace(/\n\n\n/gm, '\n\n')
.replace(/\n\n\n/gm, '\n\n')
const name = document
.querySelector('div.col-7.col-lg-8 > span.h6.font-weight-bold.mb-0')
?.textContent ?? ''
return fs.writeFile(`downloads/${name} ${addr}.sol`, sol)
})
await Promise.all(all)
})().catch(e => console.error('__ERR__', e))