Skip to content

Instantly share code, notes, and snippets.

ef000101000402000100110400200000000003365f5f37365fd10000f93d5f5f3e5f3df3
@frangio
frangio / EIP7702Account.sol
Last active October 19, 2024 18:39
A simple ERC-4337 account for use as an EIP-7702 template. UNAUDITED
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
struct PackedUserOperation {
address sender;
uint256 nonce;
bytes initCode;
bytes callData;
bytes32 accountGasLimits;
uint256 preVerificationGas;
@frangio
frangio / Swap.t.sol
Created April 5, 2024 18:03
Testing potential gas savings for Uniswap v4 Swap events
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import {Test} from "forge-std/Test.sol";
contract SwapTest is Test {
event Gasused(uint);
event Swap(
bytes32 indexed id,
@frangio
frangio / Fib.lean
Last active February 28, 2024 17:20
import Std.Data.Nat.Lemmas
import Std.Tactic.Omega
import Std.Tactic.Simpa
def fib (n : Nat) :=
match n with
| 0 | 1 => n
| n' + 2 => fib (n' + 1) + fib n'
def fastfib (n : Nat) := loop n 1 0
"use strict";
const defaultOptions = {
reverse: true,
python: false
}
function merge(sequences) {
let result = [];
sequences = sequences.map(s => s.slice());
@frangio
frangio / ascii.sol
Last active October 19, 2024 06:41
Solidity function to check if a string contains only printable ASCII characters and is at most 32 characters long. Branch-free "vectorized" implementation.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
function isAsciiPrintableShortString(string memory str) pure returns (bool) {
unchecked {
uint256 b = uint256(bytes32(hex"0101010101010101010101010101010101010101010101010101010101010101"));
bytes32 chars = bytes32(bytes(str));
uint256 len = bytes(str).length;
@frangio
frangio / utf8-length.js
Last active January 14, 2023 20:38
Fastest way I found to compute the UTF-8 length of a UTF-16 string.
// larger buffer => faster
const BUFFER_SIZE = 1024;
let buffer;
/**
* @param {string} text
* @returns {number}
*/
function utf8Length(text) {
@frangio
frangio / npm-deprecated.sh
Created January 7, 2023 02:54
Print a tree of deprecated npm dependencies
npm ls $(jq -r '.packages | to_entries[] | select(.value.deprecated != null) | .key | split("node_modules/")[-1]' package-lock.json)
@frangio
frangio / Pausable.sol
Last active February 2, 2023 19:06
Lightweight explicit state machines in Solidity.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import "./StateMachines.sol";
contract Pausable is StateMachines {
StateMachine m = initial("unpaused");
event Paused(bool paused);
export async function* chain<T, U>(g: AsyncGenerator<T, void>, f: (x: T) => AsyncGenerator<U, void>): AsyncGenerator<U, void> {
type R<I> = IteratorResult<I extends number ? U : T, void>;
type IR<I> = [I, R<I>];
const k = <I>(i: I) => (res: R<I>): IR<I> => [i, res];
const running = new Set<AsyncGenerator<unknown, void>>([g]);
let p = g.next().then(k(null));
const ps: Promise<IR<number>>[] = [];
const gs: AsyncGenerator<U, void>[] = [];
const queue = new Set<Promise<IR<null> | IR<number>>>([p]);
try {