eth-compress 0.0.0-security → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/_esm/index.js ADDED
@@ -0,0 +1,3 @@
1
+ var ae=Object.defineProperty;var be=(t,n)=>()=>(t&&(n=t(t=0)),n);var ge=(t,n)=>{for(var o in n)ae(t,o,{get:n[o],enumerable:!0})};var oe={};ge(oe,{compress_call:()=>xe,flzFwdBytecode:()=>ne,jitBytecode:()=>de,rleFwdBytecode:()=>se});import{LibZip as V}from"solady";var me,w,pe,Y,ne,se,de,re,he,v,ee,K,te,xe,ce=be(()=>{me=(1n<<160n)-1n,w=t=>t.replace(/^0x/,"").toLowerCase(),pe=t=>{let n=w(t),o=n.length,a=new Uint8Array(o/2);for(let i=0;i<o;i+=2)a[i/2]=Number.parseInt(n.slice(i,i+2),16);return a},Y=t=>{let n="";for(let o=0;o<t.length;o++)n+=t[o].toString(16).padStart(2,"0");return n};ne=t=>`0x365f73${w(t)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;se=t=>`0x5f5f5b368110602d575f8083813473${w(t)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;de=function(t){return re("0x"+w(t))},re=function(t){let n=w(t),o=pe(n),a=28,i=new Uint8Array(a+o.length);i.set(o,a);let m=i.length,l=[],f=[],u=[],M=new Map,x=0,p=new Map,S=e=>{let s=u.lastIndexOf(e);return s===-1?-1:u.length-1-s},H=new Map,z=new Map,R=new Map,_=new Map,O=new Map,fe=e=>e+31&-32,J=0,E=new Map,I=()=>[u.pop(),u.pop()],F=(1n<<256n)-1n,B=(e,s)=>e.set(s,(e.get(s)||0)+1),T=e=>{l.push(e),B(H,e)},D=e=>{f.push(e||null),B(z,e||null)},U=e=>{u.push(e),B(R,e),B(M,e),++J,E.set(e,J)},W=(e,s)=>{x=fe(e+s)},q=(e,s)=>{if(e===89)U(BigInt(x));else if(e===27){let[r,b]=I();U(b<<r&F)}else if(e===23){let[r,b]=I();U((r|b)&F)}else if(e>=96&&e<=127||e===95){let r=0n;for(let g of s||[])r=r<<8n|BigInt(g);let b=S(r);if(U(r),b!==-1&&e!=95){M.get(r)*2<R.get(r)&&(T(128+b),D(null));return}if(r==224n){T(48),D(null);return}}else if(e===81){let r=Number(u.pop());U(p.has(r)?p.get(r):0n)}else if(e===82){let[r,b]=I(),g=Number(r);p.set(g,b&F),W(g,32)}else if(e===83){let[r,b]=I();W(Number(r),1)}else e===243&&I();T(e),D(s||null)},N=e=>q(e),P=e=>{if(e>0&&e===x)return q(89);if(!e)return q(95,void 0);let s=BigInt(e),r=[];for(;s;)r.unshift(Number(s&0xffn)),s>>=8n;return q(95+r.length,r)},Z=e=>q(95+e.length,Array.from(e)),ue=(e,s)=>(e.match(new RegExp(s,"g"))||[]).length,le=e=>{let s=0,r=!0;for(let{s:b,e:g}of e)s+=1+g-b+1,31-g>0&&(s+=3),r||(s+=1),r=!1;return s},k=[],A=e=>(k.push({t:"num",v:e}),P(e)),$=e=>(k.push({t:"bytes",b:e}),Z(e)),C=e=>(k.push({t:"op",o:e}),N(e));for(let e=0;e<m;e+=32){let s=new Uint8Array(32);s.set(i.slice(e,Math.min(e+32,m)),0);let r=[];for(let c=0;c<32;){for(;c<32&&s[c]===0;)++c;if(c>=32)break;let h=c;for(;c<32&&s[c]!==0;)++c;r.push({s:h,e:c-1})}if(!r.length)continue;if(r.every(({s:c,e:h})=>c===h)){for(let{s:c}of r)A(s[c]),A(e+c),C(83);continue}let g=s.slice(r[0].s),j=1+g.length,X=Math.ceil(Math.log2(e+1)/8),y=Y(s);if(j>8){if(_.has(y)){if(j>O.get(y)+X){A(_.get(y)),C(81),A(e),C(82);continue}}else if(O.get(y)!=-1){let c=X+3,h=ue(n,y);O.set(y,h*32>h*c?c:-1),_.set(y,e)}}if(j<=le(r))$(g);else{let c=!0;for(let{s:h,e:G}of r){let Q=31-G;$(s.slice(h,G+1)),Q>0&&(A(Q*8),C(27)),c||C(23),c=!1}}A(e),C(82)}l=[],f=[],u=[],x=0,p=new Map,Array.from(R.entries()).filter(([e,s])=>s>1&&e!==0n&&e!==224n).filter(([e,s])=>typeof e=="number"?e:Number(e)<=me).sort((e,s)=>E.get(s[0])-E.get(e[0])).slice(0,14).forEach(([e,s])=>{P(e)}),M=new Map;for(let e of k)e.t==="num"?P(e.v):e.t==="bytes"?Z(e.b):e.t==="op"&&N(e.o);N(95),N(95),P(o.length),P(a);let L=[];for(let e=0;e<l.length;++e)L.push(l[e]),l[e]>=96&&l[e]<=127&&f[e]&&L.push(...f[e]);return"0x"+Y(new Uint8Array(L))+"345f355af1503d5f5f3e3d5ff3"},he=800,v="0x00000000000000000000000000000000000000e0",ee="jit",K="flz",te="cd";xe=function(t,n){var z,R;let o=((R=(z=t.params)==null?void 0:z[0])==null?void 0:R.method)||t.method;if(o&&o!=="eth_call")return t;let a=w(t.data||"0x"),i=(t.data||"0x").length;if(i<he)return t;let m=t.to||"",l="0x"+a,f=!n&&i<1150,u=n===K||f?V.flzCompress(l):null,M=n===te||f?V.cdCompress(l):null,x=n||(i>=1150?ee:u.length<M.length?K:te),p,S;if(x===ee)p=re(l),S="0x"+w(m).padStart(64,"0");else{let _=x===K;S=_?u:M,p=_?ne(m):se(m)}return p.length+S.length>=i?t:{...t,to:v,data:S,stateDiff:{...t.stateDiff||{},[v]:{code:p}}}}});var ie=new Map,ye=["deflate-raw","deflate","gzip"],d=typeof CompressionStream>"u"?-1:null;async function we(t,n,o){var l;let a=typeof t=="string"?t:t instanceof URL?t.toString():t.url,i=ie.get(a);if(d=d===-1||i===-1?-1:(i==null?void 0:i[0])??null,o&&(n!=null&&n.body)&&typeof n.body=="string"&&(d===-1||d===null))try{let f=JSON.parse(n.body),u=o(f);u!==void 0&&(n={...n,body:JSON.stringify(u)})}catch{}if(d&&d!==-1&&(n!=null&&n.body)){let f=await new Response(new Blob([n.body]).stream().pipeThrough(new CompressionStream(d))).blob();n={...n,body:f,headers:{...n&&n.headers,"Content-Encoding":d}}}let m=await fetch(a,n);if(d===null){let f=(l=m.headers.get("Accept-Encoding"))==null?void 0:l.split(",").filter(u=>ye.includes(u));ie.set(a,f!=null&&f.length?f:-1)}return m}var Re=(t,n)=>Promise.resolve().then(()=>(ce(),oe)).then(({compress_call:o})=>we(t,n,o));export{we as compressModule,Re as compressModuleWithJIT};
2
+ //! @__PURE__
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jit-compressor.ts", "../../src/index.ts"],
4
+ "sourcesContent": ["import { LibZip } from 'solady';\n\nconst MAX_160_BIT = (1n << 160n) - 1n;\n\nconst _normHex = (hex: string): string => hex.replace(/^0x/, '').toLowerCase();\n\nconst _hexToUint8Array = (hex: string): Uint8Array => {\n const normalized = _normHex(hex);\n const len = normalized.length;\n const bytes = new Uint8Array(len / 2);\n for (let i = 0; i < len; i += 2) {\n bytes[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16);\n }\n return bytes;\n};\n\nconst _uint8ArrayToHex = (bytes: Uint8Array): string => {\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n};\n\n/**\n * Generates FastLZ (LZ77) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const flzFwdBytecode = (address: string): string =>\n `0x365f73${_normHex(address)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;\n\n/**\n * Generates RLE (run-length encoded) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const rleFwdBytecode = (address: string): string =>\n `0x5f5f5b368110602d575f8083813473${_normHex(address)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;\n\n/**\n * JIT Compiles decompressor bytecode\n * @param calldata - Calldata to compress\n * @pure\n */\n//! @__PURE__\nexport const jitBytecode = function (calldata: string): string {\n return _jitDecompressor('0x' + _normHex(calldata));\n};\n\nconst _jitDecompressor = function (calldata: string): string {\n const hex = _normHex(calldata);\n const originalBuf = _hexToUint8Array(hex);\n\n // Right\u2011align the 4\u2011byte selector in the first 32\u2011byte slot (offset 28),\n // so that everything after the selector is reconstructed on mostly\n // word\u2011aligned boundaries. This keeps the ABI words (and therefore most\n // calldata reconstruction) 32\u2011byte aligned in memory.\n // That way we avoid encoding offsets for writes (most of the time),\n const padding = 28;\n const buf = new Uint8Array(padding + originalBuf.length);\n buf.set(originalBuf, padding);\n\n const n = buf.length;\n\n let ops: number[] = [];\n let data: (number[] | null)[] = [];\n let stack: bigint[] = [];\n let stackFreq2 = new Map<bigint, number>();\n let trackedMemSize = 0;\n let mem = new Map<number, bigint>();\n const getStackIdx = (val: bigint): number => {\n const idx = stack.lastIndexOf(val);\n return idx === -1 ? -1 : stack.length - 1 - idx;\n };\n\n const opFreq = new Map<number, number>();\n const dataFreq = new Map<number[] | null, number>();\n const stackFreq = new Map<bigint, number>();\n const wordCache = new Map<string, number>();\n const wordCacheCost = new Map<string, number>();\n const roundUp32 = (x: number) => (x + 31) & ~31;\n\n let pushCounter = 0;\n const stackCnt = new Map<bigint, number>();\n\n const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n const MASK32 = (1n << 256n) - 1n;\n\n const bump = <K>(m: Map<K, number>, k: K) => m.set(k, (m.get(k) || 0) + 1);\n const pushOp = (op: number) => {\n ops.push(op);\n bump(opFreq, op);\n };\n const pushD = (d: number[] | null) => {\n data.push(d || null);\n bump(dataFreq, d || null);\n };\n const pushS = (v: bigint) => {\n stack.push(v);\n bump(stackFreq, v);\n bump(stackFreq2, v);\n ++pushCounter;\n stackCnt.set(v, pushCounter);\n };\n\n const trackMem = (offset: number, size: number) => {\n trackedMemSize = roundUp32(offset + size);\n };\n\n const addOp = (op: number, imm?: number[]) => {\n if (op === 0x59) {\n pushS(BigInt(trackedMemSize));\n } else if (op === 0x1b) {\n // SHL\n const [shift, val] = pop2();\n pushS((val << shift) & MASK32);\n } else if (op === 0x17) {\n // OR\n const [a, b] = pop2();\n pushS((a | b) & MASK32);\n } else if ((op >= 0x60 && op <= 0x7f) || op === 0x5f) {\n // PUSH\n let v = 0n;\n for (const b of imm || []) v = (v << 8n) | BigInt(b);\n const idx = getStackIdx(v);\n pushS(v);\n if (idx !== -1 && op != 0x5f) {\n if (stackFreq2.get(v)! * 2 < stackFreq.get(v)!) {\n pushOp(128 + idx);\n pushD(null);\n }\n return;\n }\n if (v == 224n) {\n // Special\u2011case the literal 0xe0 (224):\n // the decompressor is always deployed at 0x...00e0, so the final\n // byte of ADDRESS is exactly 0xe0. Since we must send our own\n // address with the eth_call anyway, we can synthesize this value \n // with a single opcode instead of encoding a literal, effectively\n // giving us one more hot constant slot on the stack.\n pushOp(0x30); // ADDRESS\n pushD(null);\n return;\n }\n } else if (op === 0x51) {\n // MLOAD\n const k = Number(stack.pop()!);\n pushS(mem.has(k) ? mem.get(k)! : 0n);\n } else if (op === 0x52) {\n // MSTORE\n const [offset, value] = pop2();\n const k = Number(offset);\n mem.set(k, value & MASK32);\n trackMem(k, 32);\n } else if (op === 0x53) {\n // MSTORE8\n const [offset, _] = pop2();\n trackMem(Number(offset), 1);\n } else if (op === 0xf3) {\n // RETURN\n pop2();\n }\n pushOp(op);\n pushD(imm || null);\n };\n\n const op = (opcode: number) => addOp(opcode);\n const pushN = (value: number | bigint) => {\n if (value > 0 && value === trackedMemSize) return addOp(0x59);\n if (!value) return addOp(0x5f, undefined); // PUSH0\n let v = BigInt(value);\n let bytes: number[] = [];\n while (v) {\n bytes.unshift(Number(v & 0xffn));\n v >>= 8n;\n }\n return addOp(0x5f + bytes.length, bytes);\n };\n const pushB = (buf: Uint8Array) => addOp(0x5f + buf.length, Array.from(buf));\n const cntWords = (hex: string, wordHex: string) =>\n (hex.match(new RegExp(wordHex, 'g')) || []).length;\n\n // Rough cost model\n const estShlCost = (seg: Array<{ s: number; e: number }>) => {\n let cost = 0;\n let first = true;\n for (const { s, e } of seg) {\n cost += 1 + e - s + 1; // PUSH segLen bytes\n if (31 - e > 0) cost += 1 /* PUSH1 */ + 1 /* shift byte */ + 1 /* SHL */;\n if (!first) cost += 1; // OR\n first = false;\n }\n return cost;\n };\n\n type PlanStep =\n | { t: 'num'; v: number | bigint }\n | { t: 'bytes'; b: Uint8Array }\n | { t: 'op'; o: number };\n\n const plan: PlanStep[] = [];\n const emitPushN = (v: number | bigint) => (plan.push({ t: 'num', v }), pushN(v));\n const emitPushB = (b: Uint8Array) => (plan.push({ t: 'bytes', b }), pushB(b));\n const emitOp = (o: number) => (plan.push({ t: 'op', o }), op(o));\n\n // First pass: decide how to build each 32-byte word without emitting bytecode\n for (let base = 0; base < n; base += 32) {\n const word = new Uint8Array(32);\n word.set(buf.slice(base, Math.min(base + 32, n)), 0);\n\n const seg: Array<{ s: number; e: number }> = [];\n for (let i = 0; i < 32; ) {\n while (i < 32 && word[i] === 0) ++i;\n if (i >= 32) break;\n const s = i;\n while (i < 32 && word[i] !== 0) ++i;\n seg.push({ s, e: i - 1 });\n }\n\n if (!seg.length) continue;\n\n const byte8s = seg.every(({ s, e }) => s === e);\n if (byte8s) {\n for (const { s } of seg) {\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n continue;\n }\n\n // Decide whether to build this word via SHL/OR or as a single literal word\n const literal = word.slice(seg[0].s);\n const literalCost = 1 + literal.length;\n\n const baseBytes = Math.ceil(Math.log2(base + 1) / 8);\n const wordHex = _uint8ArrayToHex(word);\n if (literalCost > 8) {\n if (wordCache.has(wordHex)) {\n if (literalCost > wordCacheCost.get(wordHex)! + baseBytes) {\n emitPushN(wordCache.get(wordHex)!);\n emitOp(0x51);\n emitPushN(base);\n emitOp(0x52); // MSTORE\n continue;\n }\n } else if (wordCacheCost.get(wordHex) != -1) {\n const reuseCost = baseBytes + 3;\n const freq = cntWords(hex, wordHex);\n wordCacheCost.set(wordHex, freq * 32 > freq * reuseCost ? reuseCost : -1);\n wordCache.set(wordHex, base);\n }\n }\n\n if (literalCost <= estShlCost(seg)) {\n emitPushB(literal);\n } else {\n let first = true;\n for (const { s, e } of seg) {\n const suffix0s = 31 - e;\n emitPushB(word.slice(s, e + 1));\n if (suffix0s > 0) {\n emitPushN(suffix0s * 8);\n emitOp(0x1b); // SHL\n }\n if (!first) emitOp(0x17); // OR\n first = false;\n }\n }\n emitPushN(base);\n emitOp(0x52); // MSTORE\n }\n\n ops = [];\n data = [];\n stack = [];\n trackedMemSize = 0;\n mem = new Map();\n\n // Pre 2nd pass. Push most frequent literals into stack.\n Array.from(stackFreq.entries())\n .filter(([val, freq]) => freq > 1 && val !== 0n && val !== 224n)\n .filter(([val, _]) => {\n return typeof val === 'number' ? val : Number(val) <= MAX_160_BIT;\n })\n .sort((a, b) => stackCnt.get(b[0])! - stackCnt.get(a[0])!)\n .slice(0, 14)\n .forEach(([val, _]) => {\n pushN(val);\n });\n\n stackFreq2 = new Map();\n // Second pass: emit ops and track mem/stack\n for (const step of plan) {\n if (step.t === 'num') pushN(step.v);\n else if (step.t === 'bytes') pushB(step.b);\n else if (step.t === 'op') op(step.o);\n }\n\n // CALL stack layout (top to bottom): gas, address, value, argsOffset, argsSize, retOffset, retSize\n //\n // Opcodes breakdown:\n // - 0x5f5f: PUSH0 PUSH0 (retSize=0, retOffset=0)\n // - pushN(originalBuf.length): argsSize = actual data length\n // - pushN(padding): argsOffset (skip leading alignment bytes)\n // - 0x34: CALLVALUE (value)\n // - 0x5f35: PUSH0 CALLDATALOAD (address from calldata[0])\n // - 0x5a: GAS (remaining gas)\n // - 0xf1: CALL\n // - 0x50: POP (discard success value)\n //\n // RETURNDATACOPY(destOffset=0, offset=0, length=RETURNDATASIZE):\n // - 0x3d5f5f3e: RETURNDATASIZE PUSH0 PUSH0 RETURNDATACOPY\n //\n // RETURN(offset=0, size=RETURNDATASIZE):\n // - 0x3d5ff3: RETURNDATASIZE PUSH0 RETURN\n\n op(0x5f); // PUSH0 (retSize)\n op(0x5f); // PUSH0 (retOffset)\n pushN(originalBuf.length); // argsSize = actual data length\n pushN(padding); // argsOffset = padding\n\n const out: number[] = [];\n for (let i = 0; i < ops.length; ++i) {\n out.push(ops[i]);\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) out.push(...data[i]!);\n }\n\n // - CALLVALUE, load target address from calldata[0], GAS, CALL\n // - RETURNDATACOPY(0, 0, RETURNDATASIZE)\n // - RETURN(0, RETURNDATASIZE)\n return '0x' + _uint8ArrayToHex(new Uint8Array(out)) + '345f355af1503d5f5f3e3d5ff3';\n};\n\nconst MIN_SIZE_FOR_COMPRESSION = 800;\nconst DECOMPRESSOR_ADDRESS = '0x00000000000000000000000000000000000000e0';\n\nconst _jit = 'jit';\nconst _flz = 'flz';\nconst _cd = 'cd';\n\n/**\n * Compresses eth_call payload using JIT, FastLZ (FLZ), or calldata RLE (CD) compression.\n * Auto-selects best algorithm if not specified. Only compresses if >800 bytes and beneficial.\n * @param payload - eth_call RPC payload\n * @param alg - 'jit' | 'flz' | 'cd' | undefined (auto)\n * @returns (un)compressed eth_call payload\n * @pure\n */\n//! @__PURE__\nexport const compress_call = function (payload: any, alg?: string): any {\n const rpcMethod = payload.params?.[0]?.method || payload.method;\n if (rpcMethod && rpcMethod !== 'eth_call') return payload;\n\n const hex = _normHex(payload.data || '0x');\n const originalSize = (payload.data || '0x').length;\n if (originalSize < MIN_SIZE_FOR_COMPRESSION) return payload;\n\n const targetAddress = payload.to || '';\n const data = '0x' + hex;\n\n const autoSelect = !alg && originalSize < 1150;\n const flz = alg === _flz || autoSelect ? LibZip.flzCompress(data) : null;\n const cd = alg === _cd || autoSelect ? LibZip.cdCompress(data) : null;\n\n const selectedMethod =\n alg || (originalSize >= 1150 ? _jit : flz!.length < cd!.length ? _flz : _cd);\n\n let bytecode: string;\n let calldata: string;\n\n if (selectedMethod === _jit) {\n bytecode = _jitDecompressor(data);\n calldata = '0x' + _normHex(targetAddress).padStart(64, '0');\n } else {\n const isFlz = selectedMethod === _flz;\n calldata = isFlz ? flz! : cd!;\n bytecode = isFlz ? flzFwdBytecode(targetAddress) : rleFwdBytecode(targetAddress);\n }\n\n const compressedSize = bytecode.length + calldata.length;\n if (compressedSize >= originalSize) return payload;\n\n return {\n ...payload,\n to: DECOMPRESSOR_ADDRESS,\n data: calldata,\n stateDiff: {\n ...(payload.stateDiff || {}),\n [DECOMPRESSOR_ADDRESS]: { code: bytecode },\n },\n };\n};\n", "const _sup_enc = new Map<string, string[] | -1>();\nconst _enc = ['deflate-raw', 'deflate', 'gzip'];\nlet supported: string | -1 | null = typeof CompressionStream === 'undefined' ? -1 : null;\n\nexport type PayloadTransform = (payload: unknown) => unknown;\n\n/**\n * Fetch-compatible function that applies HTTP compression (gzip/deflate) to requests.\n * Optionally transforms request payloads before sending.\n *\n * @param input - The resource URL, Request object, or URL string\n * @param init - Optional request initialization options\n * @param transformPayload - Optional function to transform the request payload\n * @returns A Promise that resolves to the Response\n */\n//! @__PURE__\nexport async function compressModule(\n input: string | URL | Request,\n init?: RequestInit,\n): Promise<Response>;\n\n//! @__PURE__\nexport async function compressModule(\n input: string | URL | Request,\n init: RequestInit | undefined,\n transformPayload?: PayloadTransform,\n): Promise<Response>;\n\n//! @__PURE__\nexport async function compressModule(\n input: string | URL | Request,\n init?: RequestInit,\n transformPayload?: PayloadTransform,\n): Promise<Response> {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n\n const cached = _sup_enc.get(url);\n supported = supported === -1 ? -1 : cached === -1 ? -1 : (cached?.[0] ?? null);\n\n // Only apply the optional payload transform\n // when native HTTP compression is not available for this URL.\n if (transformPayload && init?.body && typeof init.body === 'string') {\n if (supported === -1 || supported === null) {\n try {\n const parsed = JSON.parse(init.body as string);\n const next = transformPayload(parsed);\n if (next !== undefined) {\n init = {\n ...init,\n body: JSON.stringify(next),\n };\n }\n } catch {\n // Non-JSON bodies are left untouched.\n }\n }\n }\n\n if (supported && supported !== -1 && init?.body) {\n const compressed = await new Response(\n new Blob([init.body as string])\n .stream()\n .pipeThrough(new CompressionStream(supported as CompressionFormat)),\n ).blob();\n init = {\n ...init,\n body: compressed,\n headers: { ...(init && init.headers), 'Content-Encoding': supported },\n };\n }\n const response = await fetch(url, init);\n\n if (supported === null) {\n const encodings = response.headers\n .get('Accept-Encoding')\n ?.split(',')\n .filter((e) => _enc.includes(e));\n _sup_enc.set(url, encodings?.length ? encodings : -1);\n }\n\n return response;\n}\n\n/**\n * Combines HTTP compression with EVM JIT compression.\n * Just pass this as `fetchFn` to viem's http transport.\n *\n * @param input - The resource URL or Request object\n * @param init - Optional request initialization options\n * @returns A Promise that resolves to the Response\n *\n * @example\n * ```ts\n * const client = createPublicClient({\n * transport: http(rpcUrl, { fetchFn: compressModuleWithJIT })\n * })\n * ```\n *\n * If the target RPC endpoint and runtime support native HTTP compression,\n * this helper prefers that path and will not apply JIT calldata compression;\n * the JIT-based transform is used as a legacy/fallback path when HTTP\n * content-encoding is unavailable.\n * @pure\n */\n//! @__PURE__\nexport const compressModuleWithJIT = (\n input: RequestInfo | URL,\n init?: RequestInit,\n): Promise<Response> => {\n return import('./jit-compressor').then(({ compress_call }) =>\n compressModule(input, init, compress_call),\n );\n};\n"],
5
+ "mappings": "iIAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,mBAAAC,KAAA,OAAS,UAAAC,MAAc,SAAvB,IAEMC,GAEAC,EAEAC,GAUAC,EAeOP,GAUAE,GASAD,GAIPO,GA6RAC,GACAC,EAEAC,GACAC,EACAC,GAWOd,GAnWbe,GAAAC,GAAA,KAEMX,IAAe,IAAM,MAAQ,GAE7BC,EAAYW,GAAwBA,EAAI,QAAQ,MAAO,EAAE,EAAE,YAAY,EAEvEV,GAAoBU,GAA4B,CACpD,IAAMC,EAAaZ,EAASW,CAAG,EACzBE,EAAMD,EAAW,OACjBE,EAAQ,IAAI,WAAWD,EAAM,CAAC,EACpC,QAAS,EAAI,EAAG,EAAIA,EAAK,GAAK,EAC5BC,EAAM,EAAI,CAAC,EAAI,OAAO,SAASF,EAAW,MAAM,EAAG,EAAI,CAAC,EAAG,EAAE,EAE/D,OAAOE,CACT,EAEMZ,EAAoBY,GAA8B,CACtD,IAAIH,EAAM,GACV,QAASI,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAChCJ,GAAOG,EAAMC,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAE9C,OAAOJ,CACT,EASahB,GAAkBqB,GAC7B,WAAWhB,EAASgB,CAAO,CAAC,iYASjBnB,GAAkBmB,GAC7B,mCAAmChB,EAASgB,CAAO,CAAC,qLAQzCpB,GAAc,SAAUqB,EAA0B,CAC7D,OAAOd,GAAiB,KAAOH,EAASiB,CAAQ,CAAC,CACnD,EAEMd,GAAmB,SAAUc,EAA0B,CAC3D,IAAMN,EAAMX,EAASiB,CAAQ,EACvBC,EAAcjB,GAAiBU,CAAG,EAOlCQ,EAAU,GACVC,EAAM,IAAI,WAAWD,EAAUD,EAAY,MAAM,EACvDE,EAAI,IAAIF,EAAaC,CAAO,EAE5B,IAAME,EAAID,EAAI,OAEVE,EAAgB,CAAC,EACjBC,EAA4B,CAAC,EAC7BC,EAAkB,CAAC,EACnBC,EAAa,IAAI,IACjBC,EAAiB,EACjBC,EAAM,IAAI,IACRC,EAAeC,GAAwB,CAC3C,IAAMC,EAAMN,EAAM,YAAYK,CAAG,EACjC,OAAOC,IAAQ,GAAK,GAAKN,EAAM,OAAS,EAAIM,CAC9C,EAEMC,EAAS,IAAI,IACbC,EAAW,IAAI,IACfC,EAAY,IAAI,IAChBC,EAAY,IAAI,IAChBC,EAAgB,IAAI,IACpBC,GAAaC,GAAeA,EAAI,GAAM,IAExCC,EAAc,EACZC,EAAW,IAAI,IAEfC,EAAO,IAAwB,CAAChB,EAAM,IAAI,EAAIA,EAAM,IAAI,CAAE,EAC1DiB,GAAU,IAAM,MAAQ,GAExBC,EAAO,CAAIC,EAAmBC,IAASD,EAAE,IAAIC,GAAID,EAAE,IAAIC,CAAC,GAAK,GAAK,CAAC,EACnEC,EAAUC,GAAe,CAC7BxB,EAAI,KAAKwB,CAAE,EACXJ,EAAKX,EAAQe,CAAE,CACjB,EACMC,EAASC,GAAuB,CACpCzB,EAAK,KAAKyB,GAAK,IAAI,EACnBN,EAAKV,EAAUgB,GAAK,IAAI,CAC1B,EACMC,EAASC,GAAc,CAC3B1B,EAAM,KAAK0B,CAAC,EACZR,EAAKT,EAAWiB,CAAC,EACjBR,EAAKjB,EAAYyB,CAAC,EAClB,EAAEZ,EACFC,EAAS,IAAIW,EAAGZ,CAAW,CAC7B,EAEMa,EAAW,CAACC,EAAgBC,IAAiB,CACjD3B,EAAiBU,GAAUgB,EAASC,CAAI,CAC1C,EAEMC,EAAQ,CAACR,EAAYS,IAAmB,CAC5C,GAAIT,IAAO,GACTG,EAAM,OAAOvB,CAAc,CAAC,UACnBoB,IAAO,GAAM,CAEtB,GAAM,CAACU,EAAO3B,CAAG,EAAIW,EAAK,EAC1BS,EAAOpB,GAAO2B,EAASf,CAAM,CAC/B,SAAWK,IAAO,GAAM,CAEtB,GAAM,CAACW,EAAG,CAAC,EAAIjB,EAAK,EACpBS,GAAOQ,EAAI,GAAKhB,CAAM,CACxB,SAAYK,GAAM,IAAQA,GAAM,KAASA,IAAO,GAAM,CAEpD,IAAII,EAAI,GACR,QAAWQ,KAAKH,GAAO,CAAC,EAAGL,EAAKA,GAAK,GAAM,OAAOQ,CAAC,EACnD,IAAM5B,EAAMF,EAAYsB,CAAC,EAEzB,GADAD,EAAMC,CAAC,EACHpB,IAAQ,IAAMgB,GAAM,GAAM,CACxBrB,EAAW,IAAIyB,CAAC,EAAK,EAAIjB,EAAU,IAAIiB,CAAC,IAC1CL,EAAO,IAAMf,CAAG,EAChBiB,EAAM,IAAI,GAEZ,MACF,CACA,GAAIG,GAAK,KAAM,CAObL,EAAO,EAAI,EACXE,EAAM,IAAI,EACV,MACF,CACF,SAAWD,IAAO,GAAM,CAEtB,IAAMF,EAAI,OAAOpB,EAAM,IAAI,CAAE,EAC7ByB,EAAMtB,EAAI,IAAIiB,CAAC,EAAIjB,EAAI,IAAIiB,CAAC,EAAK,EAAE,CACrC,SAAWE,IAAO,GAAM,CAEtB,GAAM,CAACM,EAAQO,CAAK,EAAInB,EAAK,EACvBI,EAAI,OAAOQ,CAAM,EACvBzB,EAAI,IAAIiB,EAAGe,EAAQlB,CAAM,EACzBU,EAASP,EAAG,EAAE,CAChB,SAAWE,IAAO,GAAM,CAEtB,GAAM,CAACM,EAAQQ,CAAC,EAAIpB,EAAK,EACzBW,EAAS,OAAOC,CAAM,EAAG,CAAC,CAC5B,MAAWN,IAAO,KAEhBN,EAAK,EAEPK,EAAOC,CAAE,EACTC,EAAMQ,GAAO,IAAI,CACnB,EAEMT,EAAMe,GAAmBP,EAAMO,CAAM,EACrCC,EAASH,GAA2B,CACxC,GAAIA,EAAQ,GAAKA,IAAUjC,EAAgB,OAAO4B,EAAM,EAAI,EAC5D,GAAI,CAACK,EAAO,OAAOL,EAAM,GAAM,MAAS,EACxC,IAAIJ,EAAI,OAAOS,CAAK,EAChB7C,EAAkB,CAAC,EACvB,KAAOoC,GACLpC,EAAM,QAAQ,OAAOoC,EAAI,KAAK,CAAC,EAC/BA,IAAM,GAER,OAAOI,EAAM,GAAOxC,EAAM,OAAQA,CAAK,CACzC,EACMiD,EAAS3C,GAAoBkC,EAAM,GAAOlC,EAAI,OAAQ,MAAM,KAAKA,CAAG,CAAC,EACrE4C,GAAW,CAACrD,EAAasD,KAC5BtD,EAAI,MAAM,IAAI,OAAOsD,EAAS,GAAG,CAAC,GAAK,CAAC,GAAG,OAGxCC,GAAcC,GAAyC,CAC3D,IAAIC,EAAO,EACPC,EAAQ,GACZ,OAAW,CAAE,EAAAC,EAAG,EAAAC,CAAE,IAAKJ,EACrBC,GAAQ,EAAIG,EAAID,EAAI,EAChB,GAAKC,EAAI,IAAGH,GAAQ,GACnBC,IAAOD,GAAQ,GACpBC,EAAQ,GAEV,OAAOD,CACT,EAOMI,EAAmB,CAAC,EACpBC,EAAavB,IAAwBsB,EAAK,KAAK,CAAE,EAAG,MAAO,EAAAtB,CAAE,CAAC,EAAGY,EAAMZ,CAAC,GACxEwB,EAAahB,IAAmBc,EAAK,KAAK,CAAE,EAAG,QAAS,EAAAd,CAAE,CAAC,EAAGK,EAAML,CAAC,GACrEiB,EAAUC,IAAeJ,EAAK,KAAK,CAAE,EAAG,KAAM,EAAAI,CAAE,CAAC,EAAG9B,EAAG8B,CAAC,GAG9D,QAASC,EAAO,EAAGA,EAAOxD,EAAGwD,GAAQ,GAAI,CACvC,IAAMC,EAAO,IAAI,WAAW,EAAE,EAC9BA,EAAK,IAAI1D,EAAI,MAAMyD,EAAM,KAAK,IAAIA,EAAO,GAAIxD,CAAC,CAAC,EAAG,CAAC,EAEnD,IAAM8C,EAAuC,CAAC,EAC9C,QAASpD,EAAI,EAAGA,EAAI,IAAM,CACxB,KAAOA,EAAI,IAAM+D,EAAK/D,CAAC,IAAM,GAAG,EAAEA,EAClC,GAAIA,GAAK,GAAI,MACb,IAAMuD,EAAIvD,EACV,KAAOA,EAAI,IAAM+D,EAAK/D,CAAC,IAAM,GAAG,EAAEA,EAClCoD,EAAI,KAAK,CAAE,EAAAG,EAAG,EAAGvD,EAAI,CAAE,CAAC,CAC1B,CAEA,GAAI,CAACoD,EAAI,OAAQ,SAGjB,GADeA,EAAI,MAAM,CAAC,CAAE,EAAAG,EAAG,EAAAC,CAAE,IAAMD,IAAMC,CAAC,EAClC,CACV,OAAW,CAAE,EAAAD,CAAE,IAAKH,EAClBM,EAAUK,EAAKR,CAAC,CAAC,EACjBG,EAAUI,EAAOP,CAAC,EAClBK,EAAO,EAAI,EAEb,QACF,CAGA,IAAMI,EAAUD,EAAK,MAAMX,EAAI,CAAC,EAAE,CAAC,EAC7Ba,EAAc,EAAID,EAAQ,OAE1BE,EAAY,KAAK,KAAK,KAAK,KAAKJ,EAAO,CAAC,EAAI,CAAC,EAC7CZ,EAAU/D,EAAiB4E,CAAI,EACrC,GAAIE,EAAc,GAChB,GAAI9C,EAAU,IAAI+B,CAAO,GACvB,GAAIe,EAAc7C,EAAc,IAAI8B,CAAO,EAAKgB,EAAW,CACzDR,EAAUvC,EAAU,IAAI+B,CAAO,CAAE,EACjCU,EAAO,EAAI,EACXF,EAAUI,CAAI,EACdF,EAAO,EAAI,EACX,QACF,UACSxC,EAAc,IAAI8B,CAAO,GAAK,GAAI,CAC3C,IAAMiB,EAAYD,EAAY,EACxBE,EAAOnB,GAASrD,EAAKsD,CAAO,EAClC9B,EAAc,IAAI8B,EAASkB,EAAO,GAAKA,EAAOD,EAAYA,EAAY,EAAE,EACxEhD,EAAU,IAAI+B,EAASY,CAAI,CAC7B,EAGF,GAAIG,GAAed,GAAWC,CAAG,EAC/BO,EAAUK,CAAO,MACZ,CACL,IAAIV,EAAQ,GACZ,OAAW,CAAE,EAAAC,EAAG,EAAAC,CAAE,IAAKJ,EAAK,CAC1B,IAAMiB,EAAW,GAAKb,EACtBG,EAAUI,EAAK,MAAMR,EAAGC,EAAI,CAAC,CAAC,EAC1Ba,EAAW,IACbX,EAAUW,EAAW,CAAC,EACtBT,EAAO,EAAI,GAERN,GAAOM,EAAO,EAAI,EACvBN,EAAQ,EACV,CACF,CACAI,EAAUI,CAAI,EACdF,EAAO,EAAI,CACb,CAEArD,EAAM,CAAC,EACPC,EAAO,CAAC,EACRC,EAAQ,CAAC,EACTE,EAAiB,EACjBC,EAAM,IAAI,IAGV,MAAM,KAAKM,EAAU,QAAQ,CAAC,EAC3B,OAAO,CAAC,CAACJ,EAAKsD,CAAI,IAAMA,EAAO,GAAKtD,IAAQ,IAAMA,IAAQ,IAAI,EAC9D,OAAO,CAAC,CAACA,EAAK+B,CAAC,IACP,OAAO/B,GAAQ,SAAWA,EAAM,OAAOA,CAAG,GAAK9B,EACvD,EACA,KAAK,CAAC0D,EAAGC,IAAMnB,EAAS,IAAImB,EAAE,CAAC,CAAC,EAAKnB,EAAS,IAAIkB,EAAE,CAAC,CAAC,CAAE,EACxD,MAAM,EAAG,EAAE,EACX,QAAQ,CAAC,CAAC5B,EAAK+B,CAAC,IAAM,CACrBE,EAAMjC,CAAG,CACX,CAAC,EAEHJ,EAAa,IAAI,IAEjB,QAAW4D,KAAQb,EACba,EAAK,IAAM,MAAOvB,EAAMuB,EAAK,CAAC,EACzBA,EAAK,IAAM,QAAStB,EAAMsB,EAAK,CAAC,EAChCA,EAAK,IAAM,MAAMvC,EAAGuC,EAAK,CAAC,EAqBrCvC,EAAG,EAAI,EACPA,EAAG,EAAI,EACPgB,EAAM5C,EAAY,MAAM,EACxB4C,EAAM3C,CAAO,EAEb,IAAMmE,EAAgB,CAAC,EACvB,QAASvE,EAAI,EAAGA,EAAIO,EAAI,OAAQ,EAAEP,EAChCuE,EAAI,KAAKhE,EAAIP,CAAC,CAAC,EACXO,EAAIP,CAAC,GAAK,IAAQO,EAAIP,CAAC,GAAK,KAAQQ,EAAKR,CAAC,GAAGuE,EAAI,KAAK,GAAG/D,EAAKR,CAAC,CAAE,EAMvE,MAAO,KAAOb,EAAiB,IAAI,WAAWoF,CAAG,CAAC,EAAI,4BACxD,EAEMlF,GAA2B,IAC3BC,EAAuB,6CAEvBC,GAAO,MACPC,EAAO,MACPC,GAAM,KAWCd,GAAgB,SAAU6F,EAAcC,EAAmB,CAnWxE,IAAAC,EAAAC,EAoWE,IAAMC,IAAYD,GAAAD,EAAAF,EAAQ,SAAR,YAAAE,EAAiB,KAAjB,YAAAC,EAAqB,SAAUH,EAAQ,OACzD,GAAII,GAAaA,IAAc,WAAY,OAAOJ,EAElD,IAAM5E,EAAMX,EAASuF,EAAQ,MAAQ,IAAI,EACnCK,GAAgBL,EAAQ,MAAQ,MAAM,OAC5C,GAAIK,EAAexF,GAA0B,OAAOmF,EAEpD,IAAMM,EAAgBN,EAAQ,IAAM,GAC9BhE,EAAO,KAAOZ,EAEdmF,EAAa,CAACN,GAAOI,EAAe,KACpCG,EAAMP,IAAQjF,GAAQuF,EAAahG,EAAO,YAAYyB,CAAI,EAAI,KAC9DyE,EAAKR,IAAQhF,IAAOsF,EAAahG,EAAO,WAAWyB,CAAI,EAAI,KAE3D0E,EACJT,IAAQI,GAAgB,KAAOtF,GAAOyF,EAAK,OAASC,EAAI,OAASzF,EAAOC,IAEtE0F,EACAjF,EAEJ,GAAIgF,IAAmB3F,GACrB4F,EAAW/F,GAAiBoB,CAAI,EAChCN,EAAW,KAAOjB,EAAS6F,CAAa,EAAE,SAAS,GAAI,GAAG,MACrD,CACL,IAAMM,EAAQF,IAAmB1F,EACjCU,EAAWkF,EAAQJ,EAAOC,EAC1BE,EAAWC,EAAQxG,GAAekG,CAAa,EAAIhG,GAAegG,CAAa,CACjF,CAGA,OADuBK,EAAS,OAASjF,EAAS,QAC5B2E,EAAqBL,EAEpC,CACL,GAAGA,EACH,GAAIlF,EACJ,KAAMY,EACN,UAAW,CACT,GAAIsE,EAAQ,WAAa,CAAC,EAC1B,CAAClF,CAAoB,EAAG,CAAE,KAAM6F,CAAS,CAC3C,CACF,CACF,IC7YA,IAAME,GAAW,IAAI,IACfC,GAAO,CAAC,cAAe,UAAW,MAAM,EAC1CC,EAAgC,OAAO,kBAAsB,IAAc,GAAK,KA2BpF,eAAsBC,GACpBC,EACAC,EACAC,EACmB,CAjCrB,IAAAC,EAkCE,IAAMC,EACJ,OAAOJ,GAAU,SAAWA,EAAQA,aAAiB,IAAMA,EAAM,SAAS,EAAIA,EAAM,IAEhFK,EAAST,GAAS,IAAIQ,CAAG,EAK/B,GAJAN,EAAYA,IAAc,IAAUO,IAAW,GAAhB,IAA2BA,GAAA,YAAAA,EAAS,KAAM,KAIrEH,IAAoBD,GAAA,MAAAA,EAAM,OAAQ,OAAOA,EAAK,MAAS,WACrDH,IAAc,IAAMA,IAAc,MACpC,GAAI,CACF,IAAMQ,EAAS,KAAK,MAAML,EAAK,IAAc,EACvCM,EAAOL,EAAiBI,CAAM,EAChCC,IAAS,SACXN,EAAO,CACL,GAAGA,EACH,KAAM,KAAK,UAAUM,CAAI,CAC3B,EAEJ,MAAQ,CAER,CAIJ,GAAIT,GAAaA,IAAc,KAAMG,GAAA,MAAAA,EAAM,MAAM,CAC/C,IAAMO,EAAa,MAAM,IAAI,SAC3B,IAAI,KAAK,CAACP,EAAK,IAAc,CAAC,EAC3B,OAAO,EACP,YAAY,IAAI,kBAAkBH,CAA8B,CAAC,CACtE,EAAE,KAAK,EACPG,EAAO,CACL,GAAGA,EACH,KAAMO,EACN,QAAS,CAAE,GAAIP,GAAQA,EAAK,QAAU,mBAAoBH,CAAU,CACtE,CACF,CACA,IAAMW,EAAW,MAAM,MAAML,EAAKH,CAAI,EAEtC,GAAIH,IAAc,KAAM,CACtB,IAAMY,GAAYP,EAAAM,EAAS,QACxB,IAAI,iBAAiB,IADN,YAAAN,EAEd,MAAM,KACP,OAAQQ,GAAMd,GAAK,SAASc,CAAC,GAChCf,GAAS,IAAIQ,EAAKM,GAAA,MAAAA,EAAW,OAASA,EAAY,EAAE,CACtD,CAEA,OAAOD,CACT,CAwBO,IAAMG,GAAwB,CACnCZ,EACAC,IAEO,sCAA2B,KAAK,CAAC,CAAE,cAAAY,CAAc,IACtDd,GAAeC,EAAOC,EAAMY,CAAa,CAC3C",
6
+ "names": ["jit_compressor_exports", "__export", "compress_call", "flzFwdBytecode", "jitBytecode", "rleFwdBytecode", "LibZip", "MAX_160_BIT", "_normHex", "_hexToUint8Array", "_uint8ArrayToHex", "_jitDecompressor", "MIN_SIZE_FOR_COMPRESSION", "DECOMPRESSOR_ADDRESS", "_jit", "_flz", "_cd", "init_jit_compressor", "__esmMin", "hex", "normalized", "len", "bytes", "i", "address", "calldata", "originalBuf", "padding", "buf", "n", "ops", "data", "stack", "stackFreq2", "trackedMemSize", "mem", "getStackIdx", "val", "idx", "opFreq", "dataFreq", "stackFreq", "wordCache", "wordCacheCost", "roundUp32", "x", "pushCounter", "stackCnt", "pop2", "MASK32", "bump", "m", "k", "pushOp", "op", "pushD", "d", "pushS", "v", "trackMem", "offset", "size", "addOp", "imm", "shift", "a", "b", "value", "_", "opcode", "pushN", "pushB", "cntWords", "wordHex", "estShlCost", "seg", "cost", "first", "s", "e", "plan", "emitPushN", "emitPushB", "emitOp", "o", "base", "word", "literal", "literalCost", "baseBytes", "reuseCost", "freq", "suffix0s", "step", "out", "payload", "alg", "_a", "_b", "rpcMethod", "originalSize", "targetAddress", "autoSelect", "flz", "cd", "selectedMethod", "bytecode", "isFlz", "_sup_enc", "_enc", "supported", "compressModule", "input", "init", "transformPayload", "_a", "url", "cached", "parsed", "next", "compressed", "response", "encodings", "e", "compressModuleWithJIT", "compress_call"]
7
+ }
@@ -0,0 +1,3 @@
1
+ var me=Object.defineProperty;var pe=(n,t)=>()=>(n&&(t=n(n=0)),t);var ge=(n,t)=>{for(var s in t)me(n,s,{get:t[s],enumerable:!0})};var ie={};ge(ie,{compress_call:()=>we,flzFwdBytecode:()=>se,jitBytecode:()=>xe,rleFwdBytecode:()=>re});import{LibZip as Y}from"solady";var de,S,he,v,se,re,xe,oe,ye,ee,te,H,ne,we,ce=pe(()=>{de=(1n<<160n)-1n,S=n=>n.replace(/^0x/,"").toLowerCase(),he=n=>{let t=S(n),s=t.length,a=new Uint8Array(s/2);for(let c=0;c<s;c+=2)a[c/2]=Number.parseInt(t.slice(c,c+2),16);return a},v=n=>{let t="";for(let s=0;s<n.length;s++)t+=n[s].toString(16).padStart(2,"0");return t};se=n=>`0x365f73${S(n)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;re=n=>`0x5f5f5b368110602d575f8083813473${S(n)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;xe=function(n){return oe("0x"+S(n))},oe=function(n){let t=S(n),s=he(t),a=28,c=new Uint8Array(a+s.length);c.set(s,a);let p=c.length,f=[],l=[],b=[],M=new Map,y=0,g=new Map,R=e=>{let r=b.lastIndexOf(e);return r===-1?-1:b.length-1-r},J=new Map,P=new Map,k=new Map,N=new Map,O=new Map,le=e=>e+31&-32,W=0,T=new Map,A=()=>[b.pop(),b.pop()],E=(1n<<256n)-1n,q=(e,r)=>e.set(r,(e.get(r)||0)+1),F=e=>{f.push(e),q(J,e)},L=e=>{l.push(e||null),q(P,e||null)},I=e=>{b.push(e),q(k,e),q(M,e),++W,T.set(e,W)},G=(e,r)=>{y=le(e+r)},z=(e,r)=>{if(e===89)I(BigInt(y));else if(e===27){let[o,u]=A();I(u<<o&E)}else if(e===23){let[o,u]=A();I((o|u)&E)}else if(e>=96&&e<=127||e===95){let o=0n;for(let m of r||[])o=o<<8n|BigInt(m);let u=R(o);if(I(o),u!==-1&&e!=95){M.get(o)*2<k.get(o)&&(F(128+u),L(null));return}if(o==224n){F(48),L(null);return}}else if(e===81){let o=Number(b.pop());I(g.has(o)?g.get(o):0n)}else if(e===82){let[o,u]=A(),m=Number(o);g.set(m,u&E),G(m,32)}else if(e===83){let[o,u]=A();G(Number(o),1)}else e===243&&A();F(e),L(r||null)},B=e=>z(e),U=e=>{if(e>0&&e===y)return z(89);if(!e)return z(95,void 0);let r=BigInt(e),o=[];for(;r;)o.unshift(Number(r&0xffn)),r>>=8n;return z(95+o.length,o)},Z=e=>z(95+e.length,Array.from(e)),ue=(e,r)=>(e.match(new RegExp(r,"g"))||[]).length,be=e=>{let r=0,o=!0;for(let{s:u,e:m}of e)r+=1+m-u+1,31-m>0&&(r+=3),o||(r+=1),o=!1;return r},D=[],C=e=>(D.push({t:"num",v:e}),U(e)),$=e=>(D.push({t:"bytes",b:e}),Z(e)),_=e=>(D.push({t:"op",o:e}),B(e));for(let e=0;e<p;e+=32){let r=new Uint8Array(32);r.set(c.slice(e,Math.min(e+32,p)),0);let o=[];for(let i=0;i<32;){for(;i<32&&r[i]===0;)++i;if(i>=32)break;let h=i;for(;i<32&&r[i]!==0;)++i;o.push({s:h,e:i-1})}if(!o.length)continue;if(o.every(({s:i,e:h})=>i===h)){for(let{s:i}of o)C(r[i]),C(e+i),_(83);continue}let m=r.slice(o[0].s),K=1+m.length,X=Math.ceil(Math.log2(e+1)/8),w=v(r);if(K>8){if(N.has(w)){if(K>O.get(w)+X){C(N.get(w)),_(81),C(e),_(82);continue}}else if(O.get(w)!=-1){let i=X+3,h=ue(t,w);O.set(w,h*32>h*i?i:-1),N.set(w,e)}}if(K<=be(o))$(m);else{let i=!0;for(let{s:h,e:Q}of o){let V=31-Q;$(r.slice(h,Q+1)),V>0&&(C(V*8),_(27)),i||_(23),i=!1}}C(e),_(82)}f=[],l=[],b=[],y=0,g=new Map,Array.from(k.entries()).filter(([e,r])=>r>1&&e!==0n&&e!==224n).filter(([e,r])=>typeof e=="number"?e:Number(e)<=de).sort((e,r)=>T.get(r[0])-T.get(e[0])).slice(0,14).forEach(([e,r])=>{U(e)}),M=new Map;for(let e of D)e.t==="num"?U(e.v):e.t==="bytes"?Z(e.b):e.t==="op"&&B(e.o);B(95),B(95),U(s.length),U(a);let j=[];for(let e=0;e<f.length;++e)j.push(f[e]),f[e]>=96&&f[e]<=127&&l[e]&&j.push(...l[e]);return"0x"+v(new Uint8Array(j))+"345f355af1503d5f5f3e3d5ff3"},ye=800,ee="0x00000000000000000000000000000000000000e0",te="jit",H="flz",ne="cd";we=function(n,t){let s=n.params?.[0]?.method||n.method;if(s&&s!=="eth_call")return n;let a=S(n.data||"0x"),c=(n.data||"0x").length;if(c<ye)return n;let p=n.to||"",f="0x"+a,l=!t&&c<1150,b=t===H||l?Y.flzCompress(f):null,M=t===ne||l?Y.cdCompress(f):null,y=t||(c>=1150?te:b.length<M.length?H:ne),g,R;if(y===te)g=oe(f),R="0x"+S(p).padStart(64,"0");else{let P=y===H;R=P?b:M,g=P?se(p):re(p)}return g.length+R.length>=c?n:{...n,to:ee,data:R,stateDiff:{...n.stateDiff||{},[ee]:{code:g}}}}});import x from"node:zlib";var fe=new Map,Se=["deflate-raw","deflate","gzip"],d=typeof CompressionStream>"u"?-1:null;async function Me(n,t,s){let a=typeof n=="string"?n:n instanceof URL?n.toString():n.url,c=fe.get(a);if(d=d===-1||c===-1?-1:c?.[0]??null,s&&t?.body&&typeof t.body=="string"&&(d===-1||d===null))try{let f=JSON.parse(t.body),l=s(f);l!==void 0&&(t={...t,body:JSON.stringify(l)})}catch{}if(d&&d!==-1&&t?.body){let f=await new Response(new Blob([t.body]).stream().pipeThrough(new CompressionStream(d))).blob();t={...t,body:f,headers:{...t&&t.headers,"Content-Encoding":d}}}let p=await fetch(a,t);if(d===null){let f=p.headers.get("Accept-Encoding")?.split(",").filter(l=>Se.includes(l));fe.set(a,f?.length?f:-1)}return p}var _e=(n,t)=>Promise.resolve().then(()=>(ce(),ie)).then(({compress_call:s})=>Me(n,t,s));var ae=(n,t)=>Object.assign(n,{writable:new WritableStream({write(s){return t.write(s),Promise.resolve()},close(){return t.end(),Promise.resolve()}}),readable:new ReadableStream({type:"bytes",start(s){t.on("data",a=>s.enqueue(a)),t.once("end",()=>s.close())}})});globalThis.CompressionStream||(globalThis.CompressionStream=class{constructor(t){let s;t==="deflate"?s=x.createDeflate():t==="gzip"?s=x.createGzip():t==="br"?s=x.createBrotliCompress():s=x.createDeflateRaw(),ae(this,s)}});globalThis.DecompressionStream||(globalThis.DecompressionStream=class{constructor(t){let s;t==="deflate"?s=x.createInflate():t==="gzip"?s=x.createGunzip():t==="br"?s=x.createBrotliDecompress():s=x.createInflateRaw(),ae(this,s)}});export{Me as compressModule,_e as compressModuleWithJIT};
2
+ //! @__PURE__
3
+ //# sourceMappingURL=index.node.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jit-compressor.ts", "../../src/index.node.ts", "../../src/index.ts"],
4
+ "sourcesContent": ["import { LibZip } from 'solady';\n\nconst MAX_160_BIT = (1n << 160n) - 1n;\n\nconst _normHex = (hex: string): string => hex.replace(/^0x/, '').toLowerCase();\n\nconst _hexToUint8Array = (hex: string): Uint8Array => {\n const normalized = _normHex(hex);\n const len = normalized.length;\n const bytes = new Uint8Array(len / 2);\n for (let i = 0; i < len; i += 2) {\n bytes[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16);\n }\n return bytes;\n};\n\nconst _uint8ArrayToHex = (bytes: Uint8Array): string => {\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n};\n\n/**\n * Generates FastLZ (LZ77) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const flzFwdBytecode = (address: string): string =>\n `0x365f73${_normHex(address)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;\n\n/**\n * Generates RLE (run-length encoded) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const rleFwdBytecode = (address: string): string =>\n `0x5f5f5b368110602d575f8083813473${_normHex(address)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;\n\n/**\n * JIT Compiles decompressor bytecode\n * @param calldata - Calldata to compress\n * @pure\n */\n//! @__PURE__\nexport const jitBytecode = function (calldata: string): string {\n return _jitDecompressor('0x' + _normHex(calldata));\n};\n\nconst _jitDecompressor = function (calldata: string): string {\n const hex = _normHex(calldata);\n const originalBuf = _hexToUint8Array(hex);\n\n // Right\u2011align the 4\u2011byte selector in the first 32\u2011byte slot (offset 28),\n // so that everything after the selector is reconstructed on mostly\n // word\u2011aligned boundaries. This keeps the ABI words (and therefore most\n // calldata reconstruction) 32\u2011byte aligned in memory.\n // That way we avoid encoding offsets for writes (most of the time),\n const padding = 28;\n const buf = new Uint8Array(padding + originalBuf.length);\n buf.set(originalBuf, padding);\n\n const n = buf.length;\n\n let ops: number[] = [];\n let data: (number[] | null)[] = [];\n let stack: bigint[] = [];\n let stackFreq2 = new Map<bigint, number>();\n let trackedMemSize = 0;\n let mem = new Map<number, bigint>();\n const getStackIdx = (val: bigint): number => {\n const idx = stack.lastIndexOf(val);\n return idx === -1 ? -1 : stack.length - 1 - idx;\n };\n\n const opFreq = new Map<number, number>();\n const dataFreq = new Map<number[] | null, number>();\n const stackFreq = new Map<bigint, number>();\n const wordCache = new Map<string, number>();\n const wordCacheCost = new Map<string, number>();\n const roundUp32 = (x: number) => (x + 31) & ~31;\n\n let pushCounter = 0;\n const stackCnt = new Map<bigint, number>();\n\n const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n const MASK32 = (1n << 256n) - 1n;\n\n const bump = <K>(m: Map<K, number>, k: K) => m.set(k, (m.get(k) || 0) + 1);\n const pushOp = (op: number) => {\n ops.push(op);\n bump(opFreq, op);\n };\n const pushD = (d: number[] | null) => {\n data.push(d || null);\n bump(dataFreq, d || null);\n };\n const pushS = (v: bigint) => {\n stack.push(v);\n bump(stackFreq, v);\n bump(stackFreq2, v);\n ++pushCounter;\n stackCnt.set(v, pushCounter);\n };\n\n const trackMem = (offset: number, size: number) => {\n trackedMemSize = roundUp32(offset + size);\n };\n\n const addOp = (op: number, imm?: number[]) => {\n if (op === 0x59) {\n pushS(BigInt(trackedMemSize));\n } else if (op === 0x1b) {\n // SHL\n const [shift, val] = pop2();\n pushS((val << shift) & MASK32);\n } else if (op === 0x17) {\n // OR\n const [a, b] = pop2();\n pushS((a | b) & MASK32);\n } else if ((op >= 0x60 && op <= 0x7f) || op === 0x5f) {\n // PUSH\n let v = 0n;\n for (const b of imm || []) v = (v << 8n) | BigInt(b);\n const idx = getStackIdx(v);\n pushS(v);\n if (idx !== -1 && op != 0x5f) {\n if (stackFreq2.get(v)! * 2 < stackFreq.get(v)!) {\n pushOp(128 + idx);\n pushD(null);\n }\n return;\n }\n if (v == 224n) {\n // Special\u2011case the literal 0xe0 (224):\n // the decompressor is always deployed at 0x...00e0, so the final\n // byte of ADDRESS is exactly 0xe0. Since we must send our own\n // address with the eth_call anyway, we can synthesize this value \n // with a single opcode instead of encoding a literal, effectively\n // giving us one more hot constant slot on the stack.\n pushOp(0x30); // ADDRESS\n pushD(null);\n return;\n }\n } else if (op === 0x51) {\n // MLOAD\n const k = Number(stack.pop()!);\n pushS(mem.has(k) ? mem.get(k)! : 0n);\n } else if (op === 0x52) {\n // MSTORE\n const [offset, value] = pop2();\n const k = Number(offset);\n mem.set(k, value & MASK32);\n trackMem(k, 32);\n } else if (op === 0x53) {\n // MSTORE8\n const [offset, _] = pop2();\n trackMem(Number(offset), 1);\n } else if (op === 0xf3) {\n // RETURN\n pop2();\n }\n pushOp(op);\n pushD(imm || null);\n };\n\n const op = (opcode: number) => addOp(opcode);\n const pushN = (value: number | bigint) => {\n if (value > 0 && value === trackedMemSize) return addOp(0x59);\n if (!value) return addOp(0x5f, undefined); // PUSH0\n let v = BigInt(value);\n let bytes: number[] = [];\n while (v) {\n bytes.unshift(Number(v & 0xffn));\n v >>= 8n;\n }\n return addOp(0x5f + bytes.length, bytes);\n };\n const pushB = (buf: Uint8Array) => addOp(0x5f + buf.length, Array.from(buf));\n const cntWords = (hex: string, wordHex: string) =>\n (hex.match(new RegExp(wordHex, 'g')) || []).length;\n\n // Rough cost model\n const estShlCost = (seg: Array<{ s: number; e: number }>) => {\n let cost = 0;\n let first = true;\n for (const { s, e } of seg) {\n cost += 1 + e - s + 1; // PUSH segLen bytes\n if (31 - e > 0) cost += 1 /* PUSH1 */ + 1 /* shift byte */ + 1 /* SHL */;\n if (!first) cost += 1; // OR\n first = false;\n }\n return cost;\n };\n\n type PlanStep =\n | { t: 'num'; v: number | bigint }\n | { t: 'bytes'; b: Uint8Array }\n | { t: 'op'; o: number };\n\n const plan: PlanStep[] = [];\n const emitPushN = (v: number | bigint) => (plan.push({ t: 'num', v }), pushN(v));\n const emitPushB = (b: Uint8Array) => (plan.push({ t: 'bytes', b }), pushB(b));\n const emitOp = (o: number) => (plan.push({ t: 'op', o }), op(o));\n\n // First pass: decide how to build each 32-byte word without emitting bytecode\n for (let base = 0; base < n; base += 32) {\n const word = new Uint8Array(32);\n word.set(buf.slice(base, Math.min(base + 32, n)), 0);\n\n const seg: Array<{ s: number; e: number }> = [];\n for (let i = 0; i < 32; ) {\n while (i < 32 && word[i] === 0) ++i;\n if (i >= 32) break;\n const s = i;\n while (i < 32 && word[i] !== 0) ++i;\n seg.push({ s, e: i - 1 });\n }\n\n if (!seg.length) continue;\n\n const byte8s = seg.every(({ s, e }) => s === e);\n if (byte8s) {\n for (const { s } of seg) {\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n continue;\n }\n\n // Decide whether to build this word via SHL/OR or as a single literal word\n const literal = word.slice(seg[0].s);\n const literalCost = 1 + literal.length;\n\n const baseBytes = Math.ceil(Math.log2(base + 1) / 8);\n const wordHex = _uint8ArrayToHex(word);\n if (literalCost > 8) {\n if (wordCache.has(wordHex)) {\n if (literalCost > wordCacheCost.get(wordHex)! + baseBytes) {\n emitPushN(wordCache.get(wordHex)!);\n emitOp(0x51);\n emitPushN(base);\n emitOp(0x52); // MSTORE\n continue;\n }\n } else if (wordCacheCost.get(wordHex) != -1) {\n const reuseCost = baseBytes + 3;\n const freq = cntWords(hex, wordHex);\n wordCacheCost.set(wordHex, freq * 32 > freq * reuseCost ? reuseCost : -1);\n wordCache.set(wordHex, base);\n }\n }\n\n if (literalCost <= estShlCost(seg)) {\n emitPushB(literal);\n } else {\n let first = true;\n for (const { s, e } of seg) {\n const suffix0s = 31 - e;\n emitPushB(word.slice(s, e + 1));\n if (suffix0s > 0) {\n emitPushN(suffix0s * 8);\n emitOp(0x1b); // SHL\n }\n if (!first) emitOp(0x17); // OR\n first = false;\n }\n }\n emitPushN(base);\n emitOp(0x52); // MSTORE\n }\n\n ops = [];\n data = [];\n stack = [];\n trackedMemSize = 0;\n mem = new Map();\n\n // Pre 2nd pass. Push most frequent literals into stack.\n Array.from(stackFreq.entries())\n .filter(([val, freq]) => freq > 1 && val !== 0n && val !== 224n)\n .filter(([val, _]) => {\n return typeof val === 'number' ? val : Number(val) <= MAX_160_BIT;\n })\n .sort((a, b) => stackCnt.get(b[0])! - stackCnt.get(a[0])!)\n .slice(0, 14)\n .forEach(([val, _]) => {\n pushN(val);\n });\n\n stackFreq2 = new Map();\n // Second pass: emit ops and track mem/stack\n for (const step of plan) {\n if (step.t === 'num') pushN(step.v);\n else if (step.t === 'bytes') pushB(step.b);\n else if (step.t === 'op') op(step.o);\n }\n\n // CALL stack layout (top to bottom): gas, address, value, argsOffset, argsSize, retOffset, retSize\n //\n // Opcodes breakdown:\n // - 0x5f5f: PUSH0 PUSH0 (retSize=0, retOffset=0)\n // - pushN(originalBuf.length): argsSize = actual data length\n // - pushN(padding): argsOffset (skip leading alignment bytes)\n // - 0x34: CALLVALUE (value)\n // - 0x5f35: PUSH0 CALLDATALOAD (address from calldata[0])\n // - 0x5a: GAS (remaining gas)\n // - 0xf1: CALL\n // - 0x50: POP (discard success value)\n //\n // RETURNDATACOPY(destOffset=0, offset=0, length=RETURNDATASIZE):\n // - 0x3d5f5f3e: RETURNDATASIZE PUSH0 PUSH0 RETURNDATACOPY\n //\n // RETURN(offset=0, size=RETURNDATASIZE):\n // - 0x3d5ff3: RETURNDATASIZE PUSH0 RETURN\n\n op(0x5f); // PUSH0 (retSize)\n op(0x5f); // PUSH0 (retOffset)\n pushN(originalBuf.length); // argsSize = actual data length\n pushN(padding); // argsOffset = padding\n\n const out: number[] = [];\n for (let i = 0; i < ops.length; ++i) {\n out.push(ops[i]);\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) out.push(...data[i]!);\n }\n\n // - CALLVALUE, load target address from calldata[0], GAS, CALL\n // - RETURNDATACOPY(0, 0, RETURNDATASIZE)\n // - RETURN(0, RETURNDATASIZE)\n return '0x' + _uint8ArrayToHex(new Uint8Array(out)) + '345f355af1503d5f5f3e3d5ff3';\n};\n\nconst MIN_SIZE_FOR_COMPRESSION = 800;\nconst DECOMPRESSOR_ADDRESS = '0x00000000000000000000000000000000000000e0';\n\nconst _jit = 'jit';\nconst _flz = 'flz';\nconst _cd = 'cd';\n\n/**\n * Compresses eth_call payload using JIT, FastLZ (FLZ), or calldata RLE (CD) compression.\n * Auto-selects best algorithm if not specified. Only compresses if >800 bytes and beneficial.\n * @param payload - eth_call RPC payload\n * @param alg - 'jit' | 'flz' | 'cd' | undefined (auto)\n * @returns (un)compressed eth_call payload\n * @pure\n */\n//! @__PURE__\nexport const compress_call = function (payload: any, alg?: string): any {\n const rpcMethod = payload.params?.[0]?.method || payload.method;\n if (rpcMethod && rpcMethod !== 'eth_call') return payload;\n\n const hex = _normHex(payload.data || '0x');\n const originalSize = (payload.data || '0x').length;\n if (originalSize < MIN_SIZE_FOR_COMPRESSION) return payload;\n\n const targetAddress = payload.to || '';\n const data = '0x' + hex;\n\n const autoSelect = !alg && originalSize < 1150;\n const flz = alg === _flz || autoSelect ? LibZip.flzCompress(data) : null;\n const cd = alg === _cd || autoSelect ? LibZip.cdCompress(data) : null;\n\n const selectedMethod =\n alg || (originalSize >= 1150 ? _jit : flz!.length < cd!.length ? _flz : _cd);\n\n let bytecode: string;\n let calldata: string;\n\n if (selectedMethod === _jit) {\n bytecode = _jitDecompressor(data);\n calldata = '0x' + _normHex(targetAddress).padStart(64, '0');\n } else {\n const isFlz = selectedMethod === _flz;\n calldata = isFlz ? flz! : cd!;\n bytecode = isFlz ? flzFwdBytecode(targetAddress) : rleFwdBytecode(targetAddress);\n }\n\n const compressedSize = bytecode.length + calldata.length;\n if (compressedSize >= originalSize) return payload;\n\n return {\n ...payload,\n to: DECOMPRESSOR_ADDRESS,\n data: calldata,\n stateDiff: {\n ...(payload.stateDiff || {}),\n [DECOMPRESSOR_ADDRESS]: { code: bytecode },\n },\n };\n};\n", "import zlib from 'node:zlib';\n\n// Polyfill for CompressionStream/DecompressionStream in Node.js\nconst make = (ctx: any, handle: any) =>\n Object.assign(ctx, {\n writable: new WritableStream({\n write(chunk) {\n handle.write(chunk);\n return Promise.resolve();\n },\n close() {\n handle.end();\n return Promise.resolve();\n },\n }),\n readable: new ReadableStream({\n type: 'bytes',\n start(ctrl) {\n handle.on('data', (chunk: any) => ctrl.enqueue(chunk));\n handle.once('end', () => ctrl.close());\n },\n }),\n });\n\nif (!globalThis.CompressionStream) {\n globalThis.CompressionStream = class CompressionStream {\n constructor(format: string) {\n let handle;\n if (format === 'deflate') {\n handle = zlib.createDeflate();\n } else if (format === 'gzip') {\n handle = zlib.createGzip();\n } else if (format === 'br') {\n handle = zlib.createBrotliCompress();\n } else {\n handle = zlib.createDeflateRaw();\n }\n make(this, handle);\n }\n } as any;\n}\n\nif (!globalThis.DecompressionStream) {\n globalThis.DecompressionStream = class DecompressionStream {\n constructor(format: string) {\n let handle;\n if (format === 'deflate') {\n handle = zlib.createInflate();\n } else if (format === 'gzip') {\n handle = zlib.createGunzip();\n } else if (format === 'br') {\n handle = zlib.createBrotliDecompress();\n } else {\n handle = zlib.createInflateRaw();\n }\n make(this, handle);\n }\n } as any;\n}\n\nexport * from './index';\n", "const _sup_enc = new Map<string, string[] | -1>();\nconst _enc = ['deflate-raw', 'deflate', 'gzip'];\nlet supported: string | -1 | null = typeof CompressionStream === 'undefined' ? -1 : null;\n\nexport type PayloadTransform = (payload: unknown) => unknown;\n\n/**\n * Fetch-compatible function that applies HTTP compression (gzip/deflate) to requests.\n * Optionally transforms request payloads before sending.\n *\n * @param input - The resource URL, Request object, or URL string\n * @param init - Optional request initialization options\n * @param transformPayload - Optional function to transform the request payload\n * @returns A Promise that resolves to the Response\n */\n//! @__PURE__\nexport async function compressModule(\n input: string | URL | Request,\n init?: RequestInit,\n): Promise<Response>;\n\n//! @__PURE__\nexport async function compressModule(\n input: string | URL | Request,\n init: RequestInit | undefined,\n transformPayload?: PayloadTransform,\n): Promise<Response>;\n\n//! @__PURE__\nexport async function compressModule(\n input: string | URL | Request,\n init?: RequestInit,\n transformPayload?: PayloadTransform,\n): Promise<Response> {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n\n const cached = _sup_enc.get(url);\n supported = supported === -1 ? -1 : cached === -1 ? -1 : (cached?.[0] ?? null);\n\n // Only apply the optional payload transform\n // when native HTTP compression is not available for this URL.\n if (transformPayload && init?.body && typeof init.body === 'string') {\n if (supported === -1 || supported === null) {\n try {\n const parsed = JSON.parse(init.body as string);\n const next = transformPayload(parsed);\n if (next !== undefined) {\n init = {\n ...init,\n body: JSON.stringify(next),\n };\n }\n } catch {\n // Non-JSON bodies are left untouched.\n }\n }\n }\n\n if (supported && supported !== -1 && init?.body) {\n const compressed = await new Response(\n new Blob([init.body as string])\n .stream()\n .pipeThrough(new CompressionStream(supported as CompressionFormat)),\n ).blob();\n init = {\n ...init,\n body: compressed,\n headers: { ...(init && init.headers), 'Content-Encoding': supported },\n };\n }\n const response = await fetch(url, init);\n\n if (supported === null) {\n const encodings = response.headers\n .get('Accept-Encoding')\n ?.split(',')\n .filter((e) => _enc.includes(e));\n _sup_enc.set(url, encodings?.length ? encodings : -1);\n }\n\n return response;\n}\n\n/**\n * Combines HTTP compression with EVM JIT compression.\n * Just pass this as `fetchFn` to viem's http transport.\n *\n * @param input - The resource URL or Request object\n * @param init - Optional request initialization options\n * @returns A Promise that resolves to the Response\n *\n * @example\n * ```ts\n * const client = createPublicClient({\n * transport: http(rpcUrl, { fetchFn: compressModuleWithJIT })\n * })\n * ```\n *\n * If the target RPC endpoint and runtime support native HTTP compression,\n * this helper prefers that path and will not apply JIT calldata compression;\n * the JIT-based transform is used as a legacy/fallback path when HTTP\n * content-encoding is unavailable.\n * @pure\n */\n//! @__PURE__\nexport const compressModuleWithJIT = (\n input: RequestInfo | URL,\n init?: RequestInit,\n): Promise<Response> => {\n return import('./jit-compressor').then(({ compress_call }) =>\n compressModule(input, init, compress_call),\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["jit_compressor_exports", "__export", "compress_call", "flzFwdBytecode", "jitBytecode", "rleFwdBytecode", "LibZip", "MAX_160_BIT", "_normHex", "_hexToUint8Array", "_uint8ArrayToHex", "_jitDecompressor", "MIN_SIZE_FOR_COMPRESSION", "DECOMPRESSOR_ADDRESS", "_jit", "_flz", "_cd", "init_jit_compressor", "__esmMin", "hex", "normalized", "len", "bytes", "i", "address", "calldata", "originalBuf", "padding", "buf", "n", "ops", "data", "stack", "stackFreq2", "trackedMemSize", "mem", "getStackIdx", "val", "idx", "opFreq", "dataFreq", "stackFreq", "wordCache", "wordCacheCost", "roundUp32", "x", "pushCounter", "stackCnt", "pop2", "MASK32", "bump", "m", "k", "pushOp", "op", "pushD", "d", "pushS", "v", "trackMem", "offset", "size", "addOp", "imm", "shift", "a", "b", "value", "_", "opcode", "pushN", "pushB", "cntWords", "wordHex", "estShlCost", "seg", "cost", "first", "s", "e", "plan", "emitPushN", "emitPushB", "emitOp", "o", "base", "word", "literal", "literalCost", "baseBytes", "reuseCost", "freq", "suffix0s", "step", "out", "payload", "alg", "rpcMethod", "originalSize", "targetAddress", "autoSelect", "flz", "cd", "selectedMethod", "bytecode", "isFlz", "zlib", "_sup_enc", "_enc", "supported", "compressModule", "input", "init", "transformPayload", "url", "cached", "parsed", "next", "compressed", "response", "encodings", "e", "compressModuleWithJIT", "compress_call", "make", "ctx", "handle", "chunk", "ctrl", "format", "zlib"]
7
+ }
@@ -0,0 +1,6 @@
1
+ import{LibZip as Q}from"solady";const ot=(1n<<160n)-1n,d=s=>s.replace(/^0x/,"").toLowerCase(),it=s=>{const i=d(s),c=i.length,g=new Uint8Array(c/2);for(let o=0;o<c;o+=2)g[o/2]=Number.parseInt(i.slice(o,o+2),16);return g},V=s=>{let i="";for(let c=0;c<s.length;c++)i+=s[c].toString(16).padStart(2,"0");return i};//! @__PURE__
2
+ const ct=s=>`0x365f73${d(s)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;//! @__PURE__
3
+ const ft=s=>`0x5f5f5b368110602d575f8083813473${d(s)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;//! @__PURE__
4
+ const bt=function(s){return Y("0x"+d(s))},Y=function(s){const i=d(s),c=it(i),g=28,o=new Uint8Array(g+c.length);o.set(c,g);const w=o.length;let u=[],h=[],l=[],M=new Map,x=0,a=new Map;const y=t=>{const e=l.lastIndexOf(t);return e===-1?-1:l.length-1-e},T=new Map,U=new Map,O=new Map,F=new Map,D=new Map,nt=t=>t+31&-32;let L=0;const E=new Map,_=()=>[l.pop(),l.pop()],P=(1n<<256n)-1n,I=(t,e)=>t.set(e,(t.get(e)||0)+1),R=t=>{u.push(t),I(T,t)},q=t=>{h.push(t||null),I(U,t||null)},C=t=>{l.push(t),I(O,t),I(M,t),++L,E.set(t,L)},Z=(t,e)=>{x=nt(t+e)},z=(t,e)=>{if(t===89)C(BigInt(x));else if(t===27){const[n,f]=_();C(f<<n&P)}else if(t===23){const[n,f]=_();C((n|f)&P)}else if(t>=96&&t<=127||t===95){let n=0n;for(const b of e||[])n=n<<8n|BigInt(b);const f=y(n);if(C(n),f!==-1&&t!=95){M.get(n)*2<O.get(n)&&(R(128+f),q(null));return}if(n==224n){R(48),q(null);return}}else if(t===81){const n=Number(l.pop());C(a.has(n)?a.get(n):0n)}else if(t===82){const[n,f]=_(),b=Number(n);a.set(b,f&P),Z(b,32)}else if(t===83){const[n,f]=_();Z(Number(n),1)}else t===243&&_();R(t),q(e||null)},N=t=>z(t),B=t=>{if(t>0&&t===x)return z(89);if(!t)return z(95,void 0);let e=BigInt(t),n=[];for(;e;)n.unshift(Number(e&0xffn)),e>>=8n;return z(95+n.length,n)},$=t=>z(95+t.length,Array.from(t)),st=(t,e)=>(t.match(new RegExp(e,"g"))||[]).length,rt=t=>{let e=0,n=!0;for(const{s:f,e:b}of t)e+=1+b-f+1,31-b>0&&(e+=3),n||(e+=1),n=!1;return e},k=[],S=t=>(k.push({t:"num",v:t}),B(t)),W=t=>(k.push({t:"bytes",b:t}),$(t)),A=t=>(k.push({t:"op",o:t}),N(t));for(let t=0;t<w;t+=32){const e=new Uint8Array(32);e.set(o.slice(t,Math.min(t+32,w)),0);const n=[];for(let r=0;r<32;){for(;r<32&&e[r]===0;)++r;if(r>=32)break;const m=r;for(;r<32&&e[r]!==0;)++r;n.push({s:m,e:r-1})}if(!n.length)continue;if(n.every(({s:r,e:m})=>r===m)){for(const{s:r}of n)S(e[r]),S(t+r),A(83);continue}const b=e.slice(n[0].s),K=1+b.length,X=Math.ceil(Math.log2(t+1)/8),p=V(e);if(K>8){if(F.has(p)){if(K>D.get(p)+X){S(F.get(p)),A(81),S(t),A(82);continue}}else if(D.get(p)!=-1){const r=X+3,m=st(i,p);D.set(p,m*32>m*r?r:-1),F.set(p,t)}}if(K<=rt(n))W(b);else{let r=!0;for(const{s:m,e:G}of n){const J=31-G;W(e.slice(m,G+1)),J>0&&(S(J*8),A(27)),r||A(23),r=!1}}S(t),A(82)}u=[],h=[],l=[],x=0,a=new Map,Array.from(O.entries()).filter(([t,e])=>e>1&&t!==0n&&t!==224n).filter(([t,e])=>typeof t=="number"?t:Number(t)<=ot).sort((t,e)=>E.get(e[0])-E.get(t[0])).slice(0,14).forEach(([t,e])=>{B(t)}),M=new Map;for(const t of k)t.t==="num"?B(t.v):t.t==="bytes"?$(t.b):t.t==="op"&&N(t.o);N(95),N(95),B(c.length),B(g);const j=[];for(let t=0;t<u.length;++t)j.push(u[t]),u[t]>=96&&u[t]<=127&&h[t]&&j.push(...h[t]);return"0x"+V(new Uint8Array(j))+"345f355af1503d5f5f3e3d5ff3"},ut=800,v="0x00000000000000000000000000000000000000e0",tt="jit",H="flz",et="cd";//! @__PURE__
5
+ const at=function(s,i){const c=s.params?.[0]?.method||s.method;if(c&&c!=="eth_call")return s;const g=d(s.data||"0x"),o=(s.data||"0x").length;if(o<ut)return s;const w=s.to||"",u="0x"+g,h=!i&&o<1150,l=i===H||h?Q.flzCompress(u):null,M=i===et||h?Q.cdCompress(u):null,x=i||(o>=1150?tt:l.length<M.length?H:et);let a,y;if(x===tt)a=Y(u),y="0x"+d(w).padStart(64,"0");else{const U=x===H;y=U?l:M,a=U?ct(w):ft(w)}return a.length+y.length>=o?s:{...s,to:v,data:y,stateDiff:{...s.stateDiff||{},[v]:{code:a}}}};export{at as compress_call,ct as flzFwdBytecode,bt as jitBytecode,ft as rleFwdBytecode};
6
+ //# sourceMappingURL=jit-compressor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jit-compressor.ts"],
4
+ "sourcesContent": ["import { LibZip } from 'solady';\n\nconst MAX_160_BIT = (1n << 160n) - 1n;\n\nconst _normHex = (hex: string): string => hex.replace(/^0x/, '').toLowerCase();\n\nconst _hexToUint8Array = (hex: string): Uint8Array => {\n const normalized = _normHex(hex);\n const len = normalized.length;\n const bytes = new Uint8Array(len / 2);\n for (let i = 0; i < len; i += 2) {\n bytes[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16);\n }\n return bytes;\n};\n\nconst _uint8ArrayToHex = (bytes: Uint8Array): string => {\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n};\n\n/**\n * Generates FastLZ (LZ77) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const flzFwdBytecode = (address: string): string =>\n `0x365f73${_normHex(address)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;\n\n/**\n * Generates RLE (run-length encoded) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const rleFwdBytecode = (address: string): string =>\n `0x5f5f5b368110602d575f8083813473${_normHex(address)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;\n\n/**\n * JIT Compiles decompressor bytecode\n * @param calldata - Calldata to compress\n * @pure\n */\n//! @__PURE__\nexport const jitBytecode = function (calldata: string): string {\n return _jitDecompressor('0x' + _normHex(calldata));\n};\n\nconst _jitDecompressor = function (calldata: string): string {\n const hex = _normHex(calldata);\n const originalBuf = _hexToUint8Array(hex);\n\n // Right\u2011align the 4\u2011byte selector in the first 32\u2011byte slot (offset 28),\n // so that everything after the selector is reconstructed on mostly\n // word\u2011aligned boundaries. This keeps the ABI words (and therefore most\n // calldata reconstruction) 32\u2011byte aligned in memory.\n // That way we avoid encoding offsets for writes (most of the time),\n const padding = 28;\n const buf = new Uint8Array(padding + originalBuf.length);\n buf.set(originalBuf, padding);\n\n const n = buf.length;\n\n let ops: number[] = [];\n let data: (number[] | null)[] = [];\n let stack: bigint[] = [];\n let stackFreq2 = new Map<bigint, number>();\n let trackedMemSize = 0;\n let mem = new Map<number, bigint>();\n const getStackIdx = (val: bigint): number => {\n const idx = stack.lastIndexOf(val);\n return idx === -1 ? -1 : stack.length - 1 - idx;\n };\n\n const opFreq = new Map<number, number>();\n const dataFreq = new Map<number[] | null, number>();\n const stackFreq = new Map<bigint, number>();\n const wordCache = new Map<string, number>();\n const wordCacheCost = new Map<string, number>();\n const roundUp32 = (x: number) => (x + 31) & ~31;\n\n let pushCounter = 0;\n const stackCnt = new Map<bigint, number>();\n\n const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n const MASK32 = (1n << 256n) - 1n;\n\n const bump = <K>(m: Map<K, number>, k: K) => m.set(k, (m.get(k) || 0) + 1);\n const pushOp = (op: number) => {\n ops.push(op);\n bump(opFreq, op);\n };\n const pushD = (d: number[] | null) => {\n data.push(d || null);\n bump(dataFreq, d || null);\n };\n const pushS = (v: bigint) => {\n stack.push(v);\n bump(stackFreq, v);\n bump(stackFreq2, v);\n ++pushCounter;\n stackCnt.set(v, pushCounter);\n };\n\n const trackMem = (offset: number, size: number) => {\n trackedMemSize = roundUp32(offset + size);\n };\n\n const addOp = (op: number, imm?: number[]) => {\n if (op === 0x59) {\n pushS(BigInt(trackedMemSize));\n } else if (op === 0x1b) {\n // SHL\n const [shift, val] = pop2();\n pushS((val << shift) & MASK32);\n } else if (op === 0x17) {\n // OR\n const [a, b] = pop2();\n pushS((a | b) & MASK32);\n } else if ((op >= 0x60 && op <= 0x7f) || op === 0x5f) {\n // PUSH\n let v = 0n;\n for (const b of imm || []) v = (v << 8n) | BigInt(b);\n const idx = getStackIdx(v);\n pushS(v);\n if (idx !== -1 && op != 0x5f) {\n if (stackFreq2.get(v)! * 2 < stackFreq.get(v)!) {\n pushOp(128 + idx);\n pushD(null);\n }\n return;\n }\n if (v == 224n) {\n // Special\u2011case the literal 0xe0 (224):\n // the decompressor is always deployed at 0x...00e0, so the final\n // byte of ADDRESS is exactly 0xe0. Since we must send our own\n // address with the eth_call anyway, we can synthesize this value \n // with a single opcode instead of encoding a literal, effectively\n // giving us one more hot constant slot on the stack.\n pushOp(0x30); // ADDRESS\n pushD(null);\n return;\n }\n } else if (op === 0x51) {\n // MLOAD\n const k = Number(stack.pop()!);\n pushS(mem.has(k) ? mem.get(k)! : 0n);\n } else if (op === 0x52) {\n // MSTORE\n const [offset, value] = pop2();\n const k = Number(offset);\n mem.set(k, value & MASK32);\n trackMem(k, 32);\n } else if (op === 0x53) {\n // MSTORE8\n const [offset, _] = pop2();\n trackMem(Number(offset), 1);\n } else if (op === 0xf3) {\n // RETURN\n pop2();\n }\n pushOp(op);\n pushD(imm || null);\n };\n\n const op = (opcode: number) => addOp(opcode);\n const pushN = (value: number | bigint) => {\n if (value > 0 && value === trackedMemSize) return addOp(0x59);\n if (!value) return addOp(0x5f, undefined); // PUSH0\n let v = BigInt(value);\n let bytes: number[] = [];\n while (v) {\n bytes.unshift(Number(v & 0xffn));\n v >>= 8n;\n }\n return addOp(0x5f + bytes.length, bytes);\n };\n const pushB = (buf: Uint8Array) => addOp(0x5f + buf.length, Array.from(buf));\n const cntWords = (hex: string, wordHex: string) =>\n (hex.match(new RegExp(wordHex, 'g')) || []).length;\n\n // Rough cost model\n const estShlCost = (seg: Array<{ s: number; e: number }>) => {\n let cost = 0;\n let first = true;\n for (const { s, e } of seg) {\n cost += 1 + e - s + 1; // PUSH segLen bytes\n if (31 - e > 0) cost += 1 /* PUSH1 */ + 1 /* shift byte */ + 1 /* SHL */;\n if (!first) cost += 1; // OR\n first = false;\n }\n return cost;\n };\n\n type PlanStep =\n | { t: 'num'; v: number | bigint }\n | { t: 'bytes'; b: Uint8Array }\n | { t: 'op'; o: number };\n\n const plan: PlanStep[] = [];\n const emitPushN = (v: number | bigint) => (plan.push({ t: 'num', v }), pushN(v));\n const emitPushB = (b: Uint8Array) => (plan.push({ t: 'bytes', b }), pushB(b));\n const emitOp = (o: number) => (plan.push({ t: 'op', o }), op(o));\n\n // First pass: decide how to build each 32-byte word without emitting bytecode\n for (let base = 0; base < n; base += 32) {\n const word = new Uint8Array(32);\n word.set(buf.slice(base, Math.min(base + 32, n)), 0);\n\n const seg: Array<{ s: number; e: number }> = [];\n for (let i = 0; i < 32; ) {\n while (i < 32 && word[i] === 0) ++i;\n if (i >= 32) break;\n const s = i;\n while (i < 32 && word[i] !== 0) ++i;\n seg.push({ s, e: i - 1 });\n }\n\n if (!seg.length) continue;\n\n const byte8s = seg.every(({ s, e }) => s === e);\n if (byte8s) {\n for (const { s } of seg) {\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n continue;\n }\n\n // Decide whether to build this word via SHL/OR or as a single literal word\n const literal = word.slice(seg[0].s);\n const literalCost = 1 + literal.length;\n\n const baseBytes = Math.ceil(Math.log2(base + 1) / 8);\n const wordHex = _uint8ArrayToHex(word);\n if (literalCost > 8) {\n if (wordCache.has(wordHex)) {\n if (literalCost > wordCacheCost.get(wordHex)! + baseBytes) {\n emitPushN(wordCache.get(wordHex)!);\n emitOp(0x51);\n emitPushN(base);\n emitOp(0x52); // MSTORE\n continue;\n }\n } else if (wordCacheCost.get(wordHex) != -1) {\n const reuseCost = baseBytes + 3;\n const freq = cntWords(hex, wordHex);\n wordCacheCost.set(wordHex, freq * 32 > freq * reuseCost ? reuseCost : -1);\n wordCache.set(wordHex, base);\n }\n }\n\n if (literalCost <= estShlCost(seg)) {\n emitPushB(literal);\n } else {\n let first = true;\n for (const { s, e } of seg) {\n const suffix0s = 31 - e;\n emitPushB(word.slice(s, e + 1));\n if (suffix0s > 0) {\n emitPushN(suffix0s * 8);\n emitOp(0x1b); // SHL\n }\n if (!first) emitOp(0x17); // OR\n first = false;\n }\n }\n emitPushN(base);\n emitOp(0x52); // MSTORE\n }\n\n ops = [];\n data = [];\n stack = [];\n trackedMemSize = 0;\n mem = new Map();\n\n // Pre 2nd pass. Push most frequent literals into stack.\n Array.from(stackFreq.entries())\n .filter(([val, freq]) => freq > 1 && val !== 0n && val !== 224n)\n .filter(([val, _]) => {\n return typeof val === 'number' ? val : Number(val) <= MAX_160_BIT;\n })\n .sort((a, b) => stackCnt.get(b[0])! - stackCnt.get(a[0])!)\n .slice(0, 14)\n .forEach(([val, _]) => {\n pushN(val);\n });\n\n stackFreq2 = new Map();\n // Second pass: emit ops and track mem/stack\n for (const step of plan) {\n if (step.t === 'num') pushN(step.v);\n else if (step.t === 'bytes') pushB(step.b);\n else if (step.t === 'op') op(step.o);\n }\n\n // CALL stack layout (top to bottom): gas, address, value, argsOffset, argsSize, retOffset, retSize\n //\n // Opcodes breakdown:\n // - 0x5f5f: PUSH0 PUSH0 (retSize=0, retOffset=0)\n // - pushN(originalBuf.length): argsSize = actual data length\n // - pushN(padding): argsOffset (skip leading alignment bytes)\n // - 0x34: CALLVALUE (value)\n // - 0x5f35: PUSH0 CALLDATALOAD (address from calldata[0])\n // - 0x5a: GAS (remaining gas)\n // - 0xf1: CALL\n // - 0x50: POP (discard success value)\n //\n // RETURNDATACOPY(destOffset=0, offset=0, length=RETURNDATASIZE):\n // - 0x3d5f5f3e: RETURNDATASIZE PUSH0 PUSH0 RETURNDATACOPY\n //\n // RETURN(offset=0, size=RETURNDATASIZE):\n // - 0x3d5ff3: RETURNDATASIZE PUSH0 RETURN\n\n op(0x5f); // PUSH0 (retSize)\n op(0x5f); // PUSH0 (retOffset)\n pushN(originalBuf.length); // argsSize = actual data length\n pushN(padding); // argsOffset = padding\n\n const out: number[] = [];\n for (let i = 0; i < ops.length; ++i) {\n out.push(ops[i]);\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) out.push(...data[i]!);\n }\n\n // - CALLVALUE, load target address from calldata[0], GAS, CALL\n // - RETURNDATACOPY(0, 0, RETURNDATASIZE)\n // - RETURN(0, RETURNDATASIZE)\n return '0x' + _uint8ArrayToHex(new Uint8Array(out)) + '345f355af1503d5f5f3e3d5ff3';\n};\n\nconst MIN_SIZE_FOR_COMPRESSION = 800;\nconst DECOMPRESSOR_ADDRESS = '0x00000000000000000000000000000000000000e0';\n\nconst _jit = 'jit';\nconst _flz = 'flz';\nconst _cd = 'cd';\n\n/**\n * Compresses eth_call payload using JIT, FastLZ (FLZ), or calldata RLE (CD) compression.\n * Auto-selects best algorithm if not specified. Only compresses if >800 bytes and beneficial.\n * @param payload - eth_call RPC payload\n * @param alg - 'jit' | 'flz' | 'cd' | undefined (auto)\n * @returns (un)compressed eth_call payload\n * @pure\n */\n//! @__PURE__\nexport const compress_call = function (payload: any, alg?: string): any {\n const rpcMethod = payload.params?.[0]?.method || payload.method;\n if (rpcMethod && rpcMethod !== 'eth_call') return payload;\n\n const hex = _normHex(payload.data || '0x');\n const originalSize = (payload.data || '0x').length;\n if (originalSize < MIN_SIZE_FOR_COMPRESSION) return payload;\n\n const targetAddress = payload.to || '';\n const data = '0x' + hex;\n\n const autoSelect = !alg && originalSize < 1150;\n const flz = alg === _flz || autoSelect ? LibZip.flzCompress(data) : null;\n const cd = alg === _cd || autoSelect ? LibZip.cdCompress(data) : null;\n\n const selectedMethod =\n alg || (originalSize >= 1150 ? _jit : flz!.length < cd!.length ? _flz : _cd);\n\n let bytecode: string;\n let calldata: string;\n\n if (selectedMethod === _jit) {\n bytecode = _jitDecompressor(data);\n calldata = '0x' + _normHex(targetAddress).padStart(64, '0');\n } else {\n const isFlz = selectedMethod === _flz;\n calldata = isFlz ? flz! : cd!;\n bytecode = isFlz ? flzFwdBytecode(targetAddress) : rleFwdBytecode(targetAddress);\n }\n\n const compressedSize = bytecode.length + calldata.length;\n if (compressedSize >= originalSize) return payload;\n\n return {\n ...payload,\n to: DECOMPRESSOR_ADDRESS,\n data: calldata,\n stateDiff: {\n ...(payload.stateDiff || {}),\n [DECOMPRESSOR_ADDRESS]: { code: bytecode },\n },\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["LibZip", "MAX_160_BIT", "_normHex", "hex", "_hexToUint8Array", "normalized", "len", "bytes", "i", "_uint8ArrayToHex", "flzFwdBytecode", "address", "rleFwdBytecode", "jitBytecode", "calldata", "_jitDecompressor", "originalBuf", "padding", "buf", "n", "ops", "data", "stack", "stackFreq2", "trackedMemSize", "mem", "getStackIdx", "val", "idx", "opFreq", "dataFreq", "stackFreq", "wordCache", "wordCacheCost", "roundUp32", "x", "pushCounter", "stackCnt", "pop2", "MASK32", "bump", "m", "k", "pushOp", "op", "pushD", "d", "pushS", "v", "trackMem", "offset", "size", "addOp", "imm", "shift", "a", "b", "value", "_", "opcode", "pushN", "pushB", "cntWords", "wordHex", "estShlCost", "seg", "cost", "first", "s", "e", "plan", "emitPushN", "emitPushB", "emitOp", "o", "base", "word", "literal", "literalCost", "baseBytes", "reuseCost", "freq", "suffix0s", "step", "out", "MIN_SIZE_FOR_COMPRESSION", "DECOMPRESSOR_ADDRESS", "_jit", "_flz", "_cd", "compress_call", "payload", "alg", "rpcMethod", "originalSize", "targetAddress", "autoSelect", "flz", "cd", "selectedMethod", "bytecode", "isFlz"]
7
+ }
@@ -0,0 +1,35 @@
1
+ export type PayloadTransform = (payload: unknown) => unknown;
2
+ /**
3
+ * Fetch-compatible function that applies HTTP compression (gzip/deflate) to requests.
4
+ * Optionally transforms request payloads before sending.
5
+ *
6
+ * @param input - The resource URL, Request object, or URL string
7
+ * @param init - Optional request initialization options
8
+ * @param transformPayload - Optional function to transform the request payload
9
+ * @returns A Promise that resolves to the Response
10
+ */
11
+ export declare function compressModule(input: string | URL | Request, init?: RequestInit): Promise<Response>;
12
+ export declare function compressModule(input: string | URL | Request, init: RequestInit | undefined, transformPayload?: PayloadTransform): Promise<Response>;
13
+ /**
14
+ * Combines HTTP compression with EVM JIT compression.
15
+ * Just pass this as `fetchFn` to viem's http transport.
16
+ *
17
+ * @param input - The resource URL or Request object
18
+ * @param init - Optional request initialization options
19
+ * @returns A Promise that resolves to the Response
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const client = createPublicClient({
24
+ * transport: http(rpcUrl, { fetchFn: compressModuleWithJIT })
25
+ * })
26
+ * ```
27
+ *
28
+ * If the target RPC endpoint and runtime support native HTTP compression,
29
+ * this helper prefers that path and will not apply JIT calldata compression;
30
+ * the JIT-based transform is used as a legacy/fallback path when HTTP
31
+ * content-encoding is unavailable.
32
+ * @pure
33
+ */
34
+ export declare const compressModuleWithJIT: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;AAE7D;;;;;;;;GAQG;AAEH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAGrB,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,QAAQ,CAAC,CAAC;AA0DrB;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,qBAAqB,GAChC,OAAO,WAAW,GAAG,GAAG,EACxB,OAAO,WAAW,KACjB,OAAO,CAAC,QAAQ,CAIlB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './index';
2
+ //# sourceMappingURL=index.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.node.d.ts","sourceRoot":"","sources":["../../src/index.node.ts"],"names":[],"mappings":"AA4DA,cAAc,SAAS,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Generates FastLZ (LZ77) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.
3
+ * @param address - Target contract address
4
+ * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}
5
+ * @pure
6
+ */
7
+ export declare const flzFwdBytecode: (address: string) => string;
8
+ /**
9
+ * Generates RLE (run-length encoded) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.
10
+ * @param address - Target contract address
11
+ * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}
12
+ * @pure
13
+ */
14
+ export declare const rleFwdBytecode: (address: string) => string;
15
+ /**
16
+ * JIT Compiles decompressor bytecode
17
+ * @param calldata - Calldata to compress
18
+ * @pure
19
+ */
20
+ export declare const jitBytecode: (calldata: string) => string;
21
+ /**
22
+ * Compresses eth_call payload using JIT, FastLZ (FLZ), or calldata RLE (CD) compression.
23
+ * Auto-selects best algorithm if not specified. Only compresses if >800 bytes and beneficial.
24
+ * @param payload - eth_call RPC payload
25
+ * @param alg - 'jit' | 'flz' | 'cd' | undefined (auto)
26
+ * @returns (un)compressed eth_call payload
27
+ * @pure
28
+ */
29
+ export declare const compress_call: (payload: any, alg?: string) => any;
30
+ //# sourceMappingURL=jit-compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jit-compressor.d.ts","sourceRoot":"","sources":["../../src/jit-compressor.ts"],"names":[],"mappings":"AAwBA;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAC6W,CAAC;AAE/Z;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MACyL,CAAC;AAE3O;;;;GAIG;AAEH,eAAO,MAAM,WAAW,GAAa,UAAU,MAAM,KAAG,MAEvD,CAAC;AAsSF;;;;;;;GAOG;AAEH,eAAO,MAAM,aAAa,GAAa,SAAS,GAAG,EAAE,MAAM,MAAM,KAAG,GA0CnE,CAAC"}
package/index.node.ts ADDED
@@ -0,0 +1,61 @@
1
+ import zlib from 'node:zlib';
2
+
3
+ // Polyfill for CompressionStream/DecompressionStream in Node.js
4
+ const make = (ctx: any, handle: any) =>
5
+ Object.assign(ctx, {
6
+ writable: new WritableStream({
7
+ write(chunk) {
8
+ handle.write(chunk);
9
+ return Promise.resolve();
10
+ },
11
+ close() {
12
+ handle.end();
13
+ return Promise.resolve();
14
+ },
15
+ }),
16
+ readable: new ReadableStream({
17
+ type: 'bytes',
18
+ start(ctrl) {
19
+ handle.on('data', (chunk: any) => ctrl.enqueue(chunk));
20
+ handle.once('end', () => ctrl.close());
21
+ },
22
+ }),
23
+ });
24
+
25
+ if (!globalThis.CompressionStream) {
26
+ globalThis.CompressionStream = class CompressionStream {
27
+ constructor(format: string) {
28
+ let handle;
29
+ if (format === 'deflate') {
30
+ handle = zlib.createDeflate();
31
+ } else if (format === 'gzip') {
32
+ handle = zlib.createGzip();
33
+ } else if (format === 'br') {
34
+ handle = zlib.createBrotliCompress();
35
+ } else {
36
+ handle = zlib.createDeflateRaw();
37
+ }
38
+ make(this, handle);
39
+ }
40
+ } as any;
41
+ }
42
+
43
+ if (!globalThis.DecompressionStream) {
44
+ globalThis.DecompressionStream = class DecompressionStream {
45
+ constructor(format: string) {
46
+ let handle;
47
+ if (format === 'deflate') {
48
+ handle = zlib.createInflate();
49
+ } else if (format === 'gzip') {
50
+ handle = zlib.createGunzip();
51
+ } else if (format === 'br') {
52
+ handle = zlib.createBrotliDecompress();
53
+ } else {
54
+ handle = zlib.createInflateRaw();
55
+ }
56
+ make(this, handle);
57
+ }
58
+ } as any;
59
+ }
60
+
61
+ export * from './index';
package/index.ts ADDED
@@ -0,0 +1,114 @@
1
+ const _sup_enc = new Map<string, string[] | -1>();
2
+ const _enc = ['deflate-raw', 'deflate', 'gzip'];
3
+ let supported: string | -1 | null = typeof CompressionStream === 'undefined' ? -1 : null;
4
+
5
+ export type PayloadTransform = (payload: unknown) => unknown;
6
+
7
+ /**
8
+ * Fetch-compatible function that applies HTTP compression (gzip/deflate) to requests.
9
+ * Optionally transforms request payloads before sending.
10
+ *
11
+ * @param input - The resource URL, Request object, or URL string
12
+ * @param init - Optional request initialization options
13
+ * @param transformPayload - Optional function to transform the request payload
14
+ * @returns A Promise that resolves to the Response
15
+ */
16
+ //! @__PURE__
17
+ export async function compressModule(
18
+ input: string | URL | Request,
19
+ init?: RequestInit,
20
+ ): Promise<Response>;
21
+
22
+ //! @__PURE__
23
+ export async function compressModule(
24
+ input: string | URL | Request,
25
+ init: RequestInit | undefined,
26
+ transformPayload?: PayloadTransform,
27
+ ): Promise<Response>;
28
+
29
+ //! @__PURE__
30
+ export async function compressModule(
31
+ input: string | URL | Request,
32
+ init?: RequestInit,
33
+ transformPayload?: PayloadTransform,
34
+ ): Promise<Response> {
35
+ const url =
36
+ typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
37
+
38
+ const cached = _sup_enc.get(url);
39
+ supported = supported === -1 ? -1 : cached === -1 ? -1 : (cached?.[0] ?? null);
40
+
41
+ // Only apply the optional payload transform
42
+ // when native HTTP compression is not available for this URL.
43
+ if (transformPayload && init?.body && typeof init.body === 'string') {
44
+ if (supported === -1 || supported === null) {
45
+ try {
46
+ const parsed = JSON.parse(init.body as string);
47
+ const next = transformPayload(parsed);
48
+ if (next !== undefined) {
49
+ init = {
50
+ ...init,
51
+ body: JSON.stringify(next),
52
+ };
53
+ }
54
+ } catch {
55
+ // Non-JSON bodies are left untouched.
56
+ }
57
+ }
58
+ }
59
+
60
+ if (supported && supported !== -1 && init?.body) {
61
+ const compressed = await new Response(
62
+ new Blob([init.body as string])
63
+ .stream()
64
+ .pipeThrough(new CompressionStream(supported as CompressionFormat)),
65
+ ).blob();
66
+ init = {
67
+ ...init,
68
+ body: compressed,
69
+ headers: { ...(init && init.headers), 'Content-Encoding': supported },
70
+ };
71
+ }
72
+ const response = await fetch(url, init);
73
+
74
+ if (supported === null) {
75
+ const encodings = response.headers
76
+ .get('Accept-Encoding')
77
+ ?.split(',')
78
+ .filter((e) => _enc.includes(e));
79
+ _sup_enc.set(url, encodings?.length ? encodings : -1);
80
+ }
81
+
82
+ return response;
83
+ }
84
+
85
+ /**
86
+ * Combines HTTP compression with EVM JIT compression.
87
+ * Just pass this as `fetchFn` to viem's http transport.
88
+ *
89
+ * @param input - The resource URL or Request object
90
+ * @param init - Optional request initialization options
91
+ * @returns A Promise that resolves to the Response
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * const client = createPublicClient({
96
+ * transport: http(rpcUrl, { fetchFn: compressModuleWithJIT })
97
+ * })
98
+ * ```
99
+ *
100
+ * If the target RPC endpoint and runtime support native HTTP compression,
101
+ * this helper prefers that path and will not apply JIT calldata compression;
102
+ * the JIT-based transform is used as a legacy/fallback path when HTTP
103
+ * content-encoding is unavailable.
104
+ * @pure
105
+ */
106
+ //! @__PURE__
107
+ export const compressModuleWithJIT = (
108
+ input: RequestInfo | URL,
109
+ init?: RequestInit,
110
+ ): Promise<Response> => {
111
+ return import('./jit-compressor').then(({ compress_call }) =>
112
+ compressModule(input, init, compress_call),
113
+ );
114
+ };