Skip to content

Instantly share code, notes, and snippets.

@miguelmota
miguelmota / jsonDeterministicStringify.ts
Created August 23, 2024 02:04
JavaScript deterministic JSON stringify
import stringify from 'json-stable-stringify'
// Helper function to recursively sort arrays of objects
function sortNestedArrays(obj: any): any {
if (Array.isArray(obj)) {
return obj.map(sortNestedArrays).sort((a, b) => {
if (typeof a === 'object' && typeof b === 'object') {
return JSON.stringify(a).localeCompare(JSON.stringify(b))
}
return 0
@miguelmota
miguelmota / npm_downloads.js
Created June 25, 2024 18:22
Node.js get npm package downloads ranked for username
import fetch from 'node-fetch'
const username = 'UserNameGoesHere'; // Replace with the npm username
const npmAPI = `https://registry.npmjs.org/-/v1/search?text=maintainer:${username}&size=100`
async function getPackages() {
const response = await fetch(npmAPI)
const data = await response.json()
return data.objects.map(pkg => pkg.package.name)
}
@miguelmota
miguelmota / proxy_mitm_example.js
Last active May 3, 2024 03:56
Node.js proxy mitm log example
// run: mitmproxy -p 8080
// run: node proxy.js
async function setupProxy (proxyUrl) {
// require('global-agent/bootstrap')
// process.env.GLOBAL_AGENT_HTTP_PROXY = proxyUrl
// process.env.GLOBAL_AGENT_HTTPS_PROXY = proxyUrl
// console.log('Global proxy routing set up.')
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' // Ignore self-signed certs, use with caution
@miguelmota
miguelmota / README.md
Last active February 15, 2024 00:04
Fork Me on GitHub Button PNG

forkmebutton

PNG

https://gist.github.com/assets/168240/25dd56cb-861f-4442-a6fb-b79e8c4afae4
@miguelmota
miguelmota / instructions.txt
Created December 5, 2023 23:11
git difftool meld
git config --global diff.tool meld
git config --global difftool.prompt false
git difftool --diff-filter=M master..devel
@miguelmota
miguelmota / nginx.conf
Created October 15, 2023 17:51
Nginx deny .git folder access
location ~ /\.git.* {
deny all;
}
@miguelmota
miguelmota / getEtherscanLogs.ts
Created September 10, 2023 07:03
JavaScript get etherscan logs by topic for contract address
async function getEtherscanLogs (chain: string, fromBlock: number, toBlock: number, address: string, topic0: string, topic1?: string) {
const baseUrl = 'https://api-goerli.etherscan.io'
let url = `${baseUrl}/api?module=logs&action=getLogs&address=${address}&fromBlock=${fromBlock}&toBlock=${toBlock}&topic0=${topic0}&page=1&offset=0&apikey=YourApiKeyToken`
if (topic1) {
url += `&topic0_1_opr=and&topic1=${topic1}`
}
const res = await fetch(url)
const json = await res.json()
const logs = json.result
return logs
@miguelmota
miguelmota / getEtherscanTxs.ts
Created September 10, 2023 07:02
JavaScript get etherscan api transactions for account address
async function getEtherscanTxs(chain: string, accountAddress: string) {
const baseUrl = 'https://api-goerli.etherscan.io'
const url = `${baseUrl}/api?module=account&action=txlist&address=${accountAddress}&startblock=0&endblock=99999999&sort=asc&apikey=YourApiKeyToken`
const res = await fetch(url)
const json = await res.json()
const txs = json.result
const txHashes = txs.map((tx: any) => tx.hash)
return txHashes
}
@miguelmota
miguelmota / batchFetch.ts
Created September 10, 2023 07:01
ethers filters events logs with batching
async function batchFetch (contract: Contract, filter: any, startBlockNumber: number, endBlockNumber: number, batchSize = 10000) {
const logs: any[] = []
let start = startBlockNumber
let end = Math.min(start + batchSize, endBlockNumber)
while (end <= endBlockNumber) {
const _logs = await contract.queryFilter(
filter,
start,
end
)
@miguelmota
miguelmota / instructions.sh
Created September 8, 2023 07:48
Arch linux command line csv viewer
pacman -S csview