solady
Version:
Optimized Solidity snippets.
256 lines (219 loc) • 9.05 kB
JavaScript
/**
* Accompanying JavaScript library for Solady.
*
* To install:
*
* ```
* npm install solady
* ```
*
* Module exports:
*
* - `LibZip`
* - `flzCompress(data)`: Compresses hex encoded data with FastLZ.
* - `flzDecompress(data)`: Decompresses hex encoded data with FastLZ.
* - `cdCompress(data)`: Compresses hex encoded calldata.
* - `cdDecompress(data)`: Decompresses hex encoded calldata.
*
* - `ERC1967Factory`
* - `address`: Canonical address of Solady's ERC1967Factory.
* - `abi`: ABI of Solady's ERC1967Factory.
*
* @module solady
*/
(function(global, factory) {
"use strict";
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = factory(global, 1);
if (typeof exports === "object") {
exports.LibZip = module.exports.LibZip;
exports.ERC1967Factory = module.exports.ERC1967Factory;
}
} else {
factory(global);
}
})(typeof window !== "undefined" ? window : this, function(window, noGlobal) {
"use strict";
var solady = {};
/*============================================================*/
/* LibZip Operations */
/*============================================================*/
// See: https://github.com/vectorized/solady/blob/main/src/utils/LibZip.sol
/**
* FastLZ and calldata compression / decompression functions.
* @namespace
* @alias module:solady.LibZip
*/
var LibZip = {};
solady.LibZip = LibZip;
function hexString(data) {
if (typeof data === "string" || data instanceof String) {
if (data = data.match(/^[\s\uFEFF\xA0]*(0[Xx])?([0-9A-Fa-f]*)[\s\uFEFF\xA0]*$/)) {
if (data[2].length % 2) {
throw new Error("Hex string length must be a multiple of 2.");
}
return data[2];
}
}
throw new Error("Data must be a hex string.");
}
function byteToString(b) {
return (b | 0x100).toString(16).slice(1);
}
function parseByte(data, i) {
return parseInt(data.substr(i, 2), 16);
}
function hexToBytes(data) {
var a = [], i = 0;
for (; i < data.length; i += 2) a.push(parseByte(data, i));
return a;
}
function bytesToHex(a) {
var o = "0x", i = 0;
for (; i < a.length; o += byteToString(a[i++])) ;
return o;
}
/**
* Compresses hex encoded data with the FastLZ LZ77 algorithm.
* @param {string} data A hex encoded string representing the original data.
* @returns {string} The compressed result as a hex encoded string.
*/
LibZip.flzCompress = function(data) {
var ib = hexToBytes(hexString(data)), b = ib.length - 4;
var ht = [], ob = [], a = 0, i = 2, o = 0, j, s, h, d, c, l, r, p, q, e;
function u24(i) {
return ib[i] | (ib[++i] << 8) | (ib[++i] << 16);
}
function hash(x) {
return ((2654435769 * x) >> 19) & 8191;
}
function literals(r, s) {
while (r >= 32) for (ob[o++] = 31, j = 32; j--; r--) ob[o++] = ib[s++];
if (r) for (ob[o++] = r - 1; r--; ) ob[o++] = ib[s++];
}
while (i < b - 9) {
do {
r = ht[h = hash(s = u24(i))] || 0;
c = (d = (ht[h] = i) - r) < 8192 ? u24(r) : 0x1000000;
} while (i < b - 9 && i++ && s != c);
if (i >= b - 9) break;
if (--i > a) literals(i - a, a);
for (l = 0, p = r + 3, q = i + 3, e = b - q; l < e; l++) e *= ib[p + l] === ib[q + l];
i += l;
for (--d; l > 262; l -= 262) ob[o++] = 224 + (d >> 8), ob[o++] = 253, ob[o++] = d & 255;
if (l < 7) ob[o++] = (l << 5) + (d >> 8), ob[o++] = d & 255;
else ob[o++] = 224 + (d >> 8), ob[o++] = l - 7, ob[o++] = d & 255;
ht[hash(u24(i))] = i++, ht[hash(u24(i))] = i++, a = i;
}
literals(b + 4 - a, a);
return bytesToHex(ob);
}
/**
* Decompresses hex encoded data with the FastLZ LZ77 algorithm.
* @param {string} data A hex encoded string representing the compressed data.
* @returns {string} The decompressed result as a hex encoded string.
*/
LibZip.flzDecompress = function(data) {
var ib = hexToBytes(hexString(data)), i = 0, o = 0, l, f, t, r, h, ob = [];
while (i < ib.length) {
if (!(t = ib[i] >> 5)) {
for (l = 1 + ib[i++]; l--;) ob[o++] = ib[i++];
} else {
f = 256 * (ib[i] & 31) + ib[i + 2 - (t = t < 7)];
l = t ? 2 + (ib[i] >> 5) : 9 + ib[i + 1];
i = i + 3 - t;
r = o - f - 1;
while (l--) ob[o++] = ob[r++];
}
}
return bytesToHex(ob);
}
/**
* Compresses hex encoded calldata.
* @param {string} data A hex encoded string representing the original data.
* @returns {string} The compressed result as a hex encoded string.
*/
LibZip.cdCompress = function(data) {
data = hexString(data);
var o = "0x", z = 0, y = 0, i = 0, c;
function pushByte(b) {
o += byteToString(((o.length < 4 * 2 + 2) * 0xff) ^ b);
}
function rle(v, d) {
pushByte(0x00);
pushByte(d - 1 + v * 0x80);
}
for (; i < data.length; i += 2) {
c = parseByte(data, i);
if (!c) {
if (y) rle(1, y), y = 0;
if (++z === 0x80) rle(0, 0x80), z = 0;
continue;
}
if (c === 0xff) {
if (z) rle(0, z), z = 0;
if (++y === 0x20) rle(1, 0x20), y = 0;
continue;
}
if (y) rle(1, y), y = 0;
if (z) rle(0, z), z = 0;
pushByte(c);
}
if (y) rle(1, y), y = 0;
if (z) rle(0, z), z = 0;
return o;
}
/**
* Decompresses hex encoded calldata.
* @param {string} data A hex encoded string representing the compressed data.
* @returns {string} The decompressed result as a hex encoded string.
*/
LibZip.cdDecompress = function(data) {
data = hexString(data);
var o = "0x", i = 0, j, c, s;
while (i < data.length) {
c = ((i < 4 * 2) * 0xff) ^ parseByte(data, i);
i += 2;
if (!c) {
c = ((i < 4 * 2) * 0xff) ^ parseByte(data, i);
s = (c & 0x7f) + 1;
i += 2;
for (j = 0; j < s; ++j) o += byteToString((c >> 7 && j < 32) * 0xff);
continue;
}
o += byteToString(c);
}
return o;
}
/*============================================================*/
/* ERC1967Factory */
/*============================================================*/
// See: https://github.com/vectorized/solady/blob/main/src/utils/ERC1967Factory.sol
/**
* ERC1967Factory canonical address and ABI.
* @namespace
* @alias module:solady.ERC1967Factory
*/
var ERC1967Factory = {};
solady.ERC1967Factory = ERC1967Factory;
/**
* Canonical address of Solady's ERC1967Factory.
* @type {string}
*/
ERC1967Factory.address = "0x0000000000006396FF2a80c067f99B3d2Ab4Df24";
/**
* ABI of Solady's ERC1967Factory.
* @type {Object}
*/
ERC1967Factory.abi = JSON.parse('[{0:[],1:"DeploymentFailed"96"SaltDoesNotStartWithCaller"96"Unauthorized"96"UpgradeFailed",2:3959790,9791],1:"AdminChanged",2:10959790,9792,9791],1:"Deployed",2:10959790,9792],1:"Upgraded",2:10},{0:[{90],1:"adminOf",12:[{9199{0:[{90,{91],1:"changeAdmin",12:[],13:"nonpayable",2:15},{0:[{92,{91],1:"deploy",12:[{9098,{0:[{92,{91,{94],1:"deployAndCall",12:[{9098,{0:[{92,{91,{93],1:"deployDeterministic",12:[{9098,{0:[{92,{91,{93,{94],1:"deployDeterministicAndCall",12:[{9098,{0:[],1:"initCodeHash",12:[{6:19,1:"result",2:19}99{0:[{93],1:"predictDeterministicAddress",12:[{6:7,1:"predicted",2:7}99{0:[{90,{92],1:"upgrade",12:[98,{0:[{90,{92,{94],1:"upgradeAndCall",12:[98]'.replace(/9\d/g, function (m) { return ["6:7,1:8,2:7}","6:7,1:9,2:7}","6:7,1:11,2:7}","6:19,1:20,2:19}","6:17,1:18,2:17}","},{4:false,0:[",",2:3},{0:[],1:","{5:true,","],13:16,2:15}","],13:14,2:15},"][m-90] }).replace(/\d+/g, function (m) { return '"' + ("inputs,name,type,error,anonymous,indexed,internalType,address,proxy,admin,event,implementation,outputs,stateMutability,view,function,payable,bytes,data,bytes32,salt".split(",")[m]) + '"' }));
/*--------------------------- END ----------------------------*/
if (typeof define === "function" && define.amd) {
define("solady", [], function() {
return solady
});
}
if (!noGlobal) {
window.solady = solady;
}
return solady;
});