Skip to content

Instantly share code, notes, and snippets.

Avatar
🔷

Santiago Palladino spalladino

🔷
View GitHub Profile
@spalladino
spalladino / mysql-docker.sh
Created Dec 22, 2015
Backup and restore a mysql database from a running Docker mysql container
View mysql-docker.sh
# Backup
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql
# Restore
cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE
@spalladino
spalladino / Loans.sol
Created Mar 20, 2021
Strawman for flashloans for flashbots
View Loans.sol
pragma solidity ^0.7.0;
// Each mining pool that intends to provide flash loans deploys a Loaner contract and transfers ETH to it
// When testing each bundle, the diff in balance in this contract is taking into account for calculating effective gas price
// The contract loans funds only on blocks mined by the miner and on zero-gasprice txs
contract Loaner {
address immutable owner;
constructor(address _owner) {
owner = _owner;
@spalladino
spalladino / falsehoods-that-ethereum-programmers-believe.md
Last active Nov 3, 2021
Falsehoods that Ethereum programmers believe
View falsehoods-that-ethereum-programmers-believe.md

Falsehoods that Ethereum programmers believe

I recently stumbled upon Falsehoods programmers believe about time zones, which got a good laugh out of me. It reminded me of other great lists of falsehoods, such as about names or time, and made me look for an equivalent for Ethereum. Having found none, here is my humble contribution to this set.

About Gas

Calling estimateGas will return the gas required by my transaction

Calling estimateGas will return the gas that your transaction would require if it were mined now. The current state of the chain may be very different to the state in which your tx will get mined. So when your tx i

@spalladino
spalladino / monitor.js
Created Oct 15, 2017
Configure ngrok with nodemon for local development
View monitor.js
#!/usr/bin/env node
if (process.env.NODE_ENV === 'production') {
throw new Error("Do not use nodemon in production, run bin/www.js directly instead");
}
const nodemon = require('nodemon');
const ngrok = require('ngrok');
// We start an ngrok tunnel to ensure it stays the same for the entire process
@spalladino
spalladino / README.md
Created May 15, 2021
How to bypass BitGo's error when using a Ledger wallet
View README.md

How to bypass BitGo's error when using a Ledger wallet

BitGo recently updated the version of its bitcoinjs-lib dependency, but failed to update the code that interacted with legacy wallets that relied on Ledger hardware wallets. This triggered a r.bufferutils.varIntSize is not a function error whenever trying to use the funds in the wallet. Following is a workaround you can use to manually patch the error, and get your funds out of BitGo.

Disclaimer: I set up this workaround to help a friend rescue their funds. I have no idea if it works for every instance of this error, and it may lead to loss of funds. I strongly suggest that you try it out with a small amount before you attempt to remove all your bitcoin from BitGo.

The problem

The problem seems to happen when interacting with a legacy wallet managed by a Ledger hardware wallet. You have a legacy wallet if BitGo displays the following notice when you open your wallet (fun fact: the link to the instructions to mi

@spalladino
spalladino / can_destroy.rb
Created Jan 31, 2012
How to check if object can be destroyed if it has dependent restrict associations
View can_destroy.rb
class ActiveRecord::Base
def can_destroy?
self.class.reflect_on_all_associations.all? do |assoc|
assoc.options[:dependent] != :restrict || (assoc.macro == :has_one && self.send(assoc.name).nil?) || (assoc.macro == :has_many && self.send(assoc.name).empty?)
end
end
end
@spalladino
spalladino / stats.py
Created Jan 5, 2014
Count number of lines of code per language per week in git repository using cloc
View stats.py
import csv
import os
import sys
from os.path import isfile
from datetime import date, timedelta
from subprocess import call, check_output
# Script expects that each project is in a folder with the same name in the working directory
PROJECTS = ['my-project', 'another-project']
@spalladino
spalladino / setup-relayer.md
Last active Nov 18, 2020
Manual script for setting up a GSNv1 relayer
View setup-relayer.md

Manual setup for a GSN relayer

⚠️ This setup is only good for GSNv1. Head over to https://docs.opengsn.org for the latest setup for GSNv2.

Install nginx and certbot

sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install nginx software-properties-common certbot python-certbot-nginx
@spalladino
spalladino / revert.ts
Created Sep 11, 2020
Get the revert reason before sending an Ethereum transaction if the transaction would fail
View revert.ts
export async function tryGetRevertReason(to: string, from: string, data: string): Promise<string | undefined> {
const provider = ethers.getDefaultProvider();
const tx = { to, from, data };
try {
await provider.estimateGas(tx);
} catch {
const value = await provider.call(tx);
return hexDataLength(value) % 32 === 4 && hexDataSlice(value, 0, 4) === '0x08c379a0'
? defaultAbiCoder.decode(['string'], hexDataSlice(value, 4))
: undefined;
@spalladino
spalladino / deploy-function.js
Created Sep 27, 2020
Deploy a subset of AWS SAM functions bypassing CloudFormation for a faster development cycle
View deploy-function.js
#! /usr/bin/env node
const TEMPLATE_FILENAME = 'template.yaml';
const WEBPACK_CONFIG = './api/webpack.config.js';
const WEBPACK_CONTEXT = './api';
const STACKNAME = process.env.STACKNAME;
const { Lambda, CloudFormation } = require('aws-sdk');
const { yamlParse } = require('yaml-cfn');
const { readFileSync } = require('fs');