eth-compress 0.2.2 → 0.3.1

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/README.md CHANGED
@@ -1,16 +1,16 @@
1
1
  ## eth-compress
2
2
 
3
- Compact client-side module for compressing Ethereum JSON-RPC requests, targeting **lower latency** and gas-efficient **read-only calls** with large calldata.
3
+ A compact client-side module for compressing Ethereum JSON-RPC requests, targeting **lower latency** and gas-efficient **read-only calls** with large calldata.
4
4
 
5
- It combines [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#section-12.5.3)-compliant negotiation for client-to-server compression, with optional JIT-compiled calldata compression for `eth_call`s.
5
+ It combines [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#section-12.5.3)-compliant negotiation for client-to-server compression, with optional JIT-compiled calldata compression.
6
6
 
7
- _Plug'n Play with viem & with a simple API_
7
+ _Plug 'n' play with viem and a simple API_
8
8
 
9
9
  ### Scope
10
- - **Only read-only `eth_call`'s are considered**
11
- - Compression is only attempted above a size threshold (currently 1150 bytes of JSON body for HTTP compression, and similarly gated for JIT calldata compression), and only applied if it strictly reduces total request size.
12
- - The HTTP path uses standard `Content-Encoding` (e.g. gzip/deflate) negotiation; the EVM path rewrites eligible `eth_call`s through a transient decompressor contract and forwards calldata to the original `to` address via state overrides.
13
- - For reference: Large `eth_call`s >70kb that compress to about **40% smaller payload size** (i.e. ~60% of the original bytes on the wire) can see roughly 30–40% latency reduction. (Precise benefits depend on many factors; this is a reasonable average-case projection.)
10
+ - **Read-only** `eth_call`s.
11
+ - Min. input threshold: > 1150 bytes.
12
+ - HTTP: Uses RFC 9110-compliant `Content-Encoding` negotiation (gzip/deflate).
13
+ - EVM/JIT: Routes `eth_call`s through a transient decompressor contract.
14
14
 
15
15
  ### Installation
16
16
 
@@ -18,9 +18,9 @@ _Plug'n Play with viem & with a simple API_
18
18
  npm i eth-compress
19
19
  ```
20
20
  ---
21
- ### HTTP request compression (transport-level)
21
+ ### HTTP request compression
22
22
 
23
- `eth-compress` exposes a `fetch`-compatible function that transparently compresses JSON-RPC request bodies using the CompressionStreams API, when the target RPC endpoint supports it and the payload is large enough to benefit.
23
+ Transparently compresses request bodies using the [CompressionStream API](https://developer.mozilla.org/en-US/docs/Web/API/CompressionStream).
24
24
 
25
25
  ```ts
26
26
  import { compressModule } from 'eth-compress';
@@ -36,56 +36,68 @@ const response = await compressModule('https://rpc.example.org', {
36
36
  });
37
37
  ```
38
38
 
39
- ### How it works
39
+ ### Compression modes
40
40
 
41
- - On the first request to a given RPC URL, inspects the `Accept-Encoding` response header to discover supported encodings, then compresses subsequent request bodies via
42
- [`CompressionStreams API`](https://developer.mozilla.org/en-US/docs/Web/API/Compression_Streams_API)
43
- (browser) or a [Node.js polyfill](https://github.com/tadpole-labs/eth-compress/blob/main/src/index.node.ts).
44
- - Designed as the client-side piece for future client-to-server compression support in RPC nodes;
45
- - Falls back to plain `fetch` & EVM-based compression if not supported by the RPC (see below).
41
+ | Mode | Behavior |
42
+ |------|----------|
43
+ | `'passive'` | Discover support from response `Accept-Encoding` header |
44
+ | `'proactive'` | Send gzip; discover alternative / lacking support via `Accept-Encoding` response header, error or success |
45
+ | `'gzip'` / `'deflate'` | Use specified encoding directly |
46
+ | `(payload) => ...` | Custom transform; server expected to understand |
46
47
 
47
48
  <br>
48
49
 
49
50
  ----
50
51
  ### viem integration
51
52
 
52
- `compressModule` and `compressModuleWithJIT` can be used as drop-in `fetchFn` modules for viem's `http` transport.
53
-
53
+ Passive (default):
54
54
  ```ts
55
55
  import { createPublicClient, http } from 'viem';
56
- import { base } from 'viem/chains';
57
- import { compressModule, compressModuleWithJIT } from 'eth-compress';
56
+ import { compressModule } from 'eth-compress';
57
+
58
+ const client = createPublicClient({
59
+ chain: base,
60
+ transport: http(rpcUrl, { fetchFn: compressModule }),
61
+ });
62
+ ```
63
+
64
+ Known gzip support:
65
+ ```ts
66
+ import { compressModule } from 'eth-compress';
58
67
 
59
- // HTTP compression only (transport-level)
60
- const httpCompressedClient = createPublicClient({
68
+ const client = createPublicClient({
61
69
  chain: base,
62
70
  transport: http(rpcUrl, {
63
- fetchFn: compressModule,
71
+ fetchFn: (url, init) => compressModule(url, init, 'gzip'),
64
72
  }),
65
73
  });
74
+ ```
75
+
76
+ JIT calldata compression:
77
+ ```ts
78
+ import { compressModule } from 'eth-compress';
79
+ import { compress_call } from 'eth-compress/compressor';
66
80
 
67
- // HTTP compression + optional eth_call JIT calldata compression (application-level)
68
- const jitCompressedClient = createPublicClient({
81
+ const client = createPublicClient({
69
82
  chain: base,
70
83
  transport: http(rpcUrl, {
71
- fetchFn: compressModuleWithJIT,
84
+ fetchFn: (url, init) => compressModule(url, init, compress_call),
72
85
  }),
73
86
  });
74
87
  ```
75
- #### thats it.
76
88
  ----
77
89
  ### Compatibility
78
- - Preserves viem semantics: responses and error handling are unchanged; only the request path is compressed.
79
- - Works in Node and modern browsers that support the `CompressionStreams API` (Chrome/Edge ≥ 80, Firefox ≥ 113, Safari/iOS ≥ 16.4).
90
+ - Preserves viem semantics: responses and error handling are unchanged; only the request body is compressed.
91
+ - Works in Node and modern browsers that support the CompressionStream API.
92
+ <br><a href="https://caniuse.com/mdn-api_compressionstream">Chrome/Edge ≥ 80; Firefox ≥ 113; Safari/iOS ≥ 16.4</a>
80
93
 
81
94
  <br>
82
95
 
83
96
  ----
84
97
 
85
- ### eth_call JIT calldata compression (application-level)
98
+ ### JIT calldata compression for `eth_call`
86
99
 
87
- For backwards compatibility and immediate benefit, calldata compression is implemented purely at the application layer: requests are rewritten client-side and executed as usual by existing nodes, using a just-in-time compiled decompressor contract that is injected via `stateOverride`/`stateDiff`.
88
- The goal here is the same: **reduce request size -> latency** for large `eth_call` payloads, and secondarily to **stay under eth_call gas/memory limits** by reducing calldata size and gas footprint.
100
+ Eligible `eth_call`s are compiled into a transient decompressor contract (passed via `stateDiff`).
89
101
 
90
102
  ```ts
91
103
  import { compress_call } from 'eth-compress/compressor';
@@ -95,56 +107,53 @@ const payload = {
95
107
  params: [
96
108
  {
97
109
  to: '0x…',
98
- data: '0x…', // potentially large calldata
110
+ data: '0x…',
99
111
  },
100
112
  'latest',
101
113
  ],
102
114
  };
103
115
 
104
- const compressedPayload = compress_call(payload); // safe to send instead of `payload`
116
+ const compressedPayload = compress_call(payload);
105
117
  ```
106
118
 
107
- `compress_call` can be used directly or via `compressModuleWithJIT` (which feeds it into `compressModule` as a payload transform when HTTP content-encoding is not available for the target URL).
108
- For eligible `eth_call`s it chooses between:
119
+ `compress_call` can be passed directly to `compressModule` as a custom transform. For eligible `eth_call`s, it chooses between:
109
120
 
110
121
  - **JIT**: Compiles just-in-time, a one-off decompressor contract that reconstructs calldata to forward the call.
111
- - **FLZ / CD**: Uses `LibZip.flzCompress` and `LibZip.cdCompress` from `solady` for fast LZ and calldata RLE compression.
112
-
113
- Selection logic (subject to change, but current behaviour):
122
+ - **FLZ / CD**: Uses `LibZip.flzCompress` and `LibZip.cdCompress` from `solady` for FastLZ / RLE compression.
114
123
 
115
124
  - **Size gating (JIT / EVM path)**:
116
125
  - `< 1150 bytes (effective payload)`: no EVM-level compression.
117
126
  - `≥ 1150 bytes`: compression considered.
118
127
  - `size ≤ ~3000 bytes or > ~8000 bytes`: JIT is preferred.
119
- - `~3000 ≤ size ≤ ~8000 bytes`: FastLZ or RLE.
128
+ - `~3000 ≤ size ≤ ~8000 bytes`: Best-of-3.
120
129
 
121
130
  - **Algorithm choice**:
122
131
  - For mid-sized payloads, FLZ and CD are tried and the smaller output is chosen.
123
- - For larger payloads, JIT is used directly, focusing on gas-efficient decompression.
124
- - The thresholds are chosen with consideration for request header overhead & latency,
132
+ - For larger ones, JIT is used directly, prioritizing gas efficiency.
133
+ - The thresholds are chosen with request header overhead and latency in mind,
125
134
  aiming to keep the total request size within the [Ethernet MTU](https://en.wikipedia.org/wiki/Maximum_transmission_unit).
126
135
 
127
-
128
-
129
136
  ### Important considerations
130
137
 
131
- The JIT calldata compressor is **experimental** and targets efficient compression of **read-only `eth_call`s for auxiliary dApp data loaded in bulk** (e.g. dashboards, analytics, non-critical views). It is **not recommended** for on-chain deployment or for critical paths in dApp flows that directly influence user operations. For separation of concerns, it is recommended to initialize **one client for auxiliary data** (with JIT compression enabled) and **another client for user operations**, and perform a separate requests for user‑facing operations.
138
+ The JIT calldata compressor is **experimental** and intended for auxiliary/bulk dApp read-only `eth_call`s. Use two viem clients to separate concerns.
139
+
140
+ ### Compression Ratio & Gas
141
+ | Tx Size Range | # Txns | Avg. Tx Size| JIT Ratio | FLZ Ratio | CD Ratio | JIT Gas | FLZ Gas | CD Gas |
142
+ |------------------------|--------|-------------------|:-------------------------:|:----------------:|:----------------:|:---------------:|:---------------:|:---------------:|
143
+ | **> 8 KB** | 129 | 14.90 kb | 2.99x | **3.62x** | 3.21x | **8.02k** | 323k | 242k |
144
+ | **3–8 KB** | 260 | 4.82 kb | 2.77x | 2.59x | **2.81x** | **4.45k** | 138k | 88.9k |
145
+ | **1.15–3 KB** | 599 | 2.02 kb | **2.89x** | 1.91x | 2.58x | **3.35k** | 68.4k | 35.8k |
132
146
 
147
+ <sub>Excludes txns not compressible to &lt;70% of original size.</sub>
133
148
 
134
- ### Implementation notes & compression flavours
135
- - **JIT calldata compiler (`compress_call` JIT mode)**: Views the calldata as a zero‑initialized memory image and synthesises bytecode that rebuilds it word-by-word in-place.
149
+ ### Compression flavors
150
+ - **JIT calldata compiler (`compress_call` JIT mode)**: Views calldata as a zero‑initialized memory image and synthesizes bytecode that rebuilds it word-by-word in-place.
136
151
 
137
- In the first pass it walks the data in 32-byte slices, detects non-zero segments per word, and for each word chooses the cheapest of three strategies: store a literal tail, assemble segments using SHL/OR, or reuse an earlier word via MLOAD/MSTORE, under a rough opcode-count cost model.
138
-
139
- In the second pass it materialises this plan into concrete PUSH/MSTORE/SHL/OR/DUP opcodes, pre-seeds the stack with frequently used constants, and appends a small CALL/RETURNDATA stub that forwards the reconstructed calldata to the original `to` address.
140
-
141
- The execution is realized through a `stateDiff` passed together with the `eth_call`. The 4‑byte selector is right‑aligned in the first 32‑byte slot so that the rest of the calldata can be reconstructed on mostly word‑aligned boundaries, with the decompressor stateDiff being placed at `0x00000000000000000000000000000000000000e0` such that `0xe0` can be obtained from `ADDRESS` with a single opcode instead of an explicit literal.
142
-
143
- Achieves higher compression ratios compared to both FastLZ & Run-Length-Encoding (around 10–15% **smaller payloads**) for smaller calldata <3kb, and on par above 8kb (except in cases with deeply nested calls and types, minimally worse), at a fraction of the gas footprint (<5%).
152
+ In the first pass it walks the data in 32-byte slices, detects non-zero segments per word, and for each word chooses the cheapest of three strategies: store a literal tail, assemble segments using SHL/OR, or reuse an earlier word via MLOAD/MSTORE.
144
153
 
145
- - **FastLZ path (`LibZip.flzCompress` / `flzDecompress`)**: Implements a minimal LZ77-style compressor over raw bytes with a 3-byte rolling window. Each 24-bit chunk is hashed into a tiny table; repeated substrings within a bounded look-back distance are emitted as (length, distance) match tokens, and everything else is emitted as literal runs. Decompression is a simple loop over this stream that copies literals and then copies `length` bytes from `distance` bytes back in the already-produced output.
154
+ In the second pass it materializes this plan into concrete PUSH/MSTORE/SHL/OR/DUP opcodes, pre-seeds the stack with frequently used constants, and appends a small CALL/RETURNDATA stub that forwards the reconstructed calldata to the original `to` address.
146
155
 
147
- - **Calldata RLE path (`LibZip.cdCompress` / `cdDecompress`)**: Targets the two most common runs in calldata—long stretches of `0x00` and shorter stretches of `0xff`—and turns them into compact `[marker][control]` pairs, where the control byte encodes which value and how many repetitions to emit. Bytes that are not part of such runs are left verbatim, so the decoder can just scan the stream and either expand a run or forward a single byte.
156
+ The 4‑byte selector is right‑aligned in the first 32‑byte slot so that the rest of the calldata can be reconstructed on mostly word‑aligned boundaries, with the decompressor stateDiff being placed at `0xe0` to obtain this common offset from `ADDRESS` with a single opcode instead of PUSH1 + literal.
148
157
 
149
- Both the FastLZ and calldata-RLE forwarders are minimally adopted from Solady's [`LibZip.sol`](https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol) and inlined as raw bytecode. To avoid Solidity's wrapper overhead the code is compiled from pure yul.
158
+ Both the FastLZ and calldata-RLE forwarders are minimally adapted from Solady's [`LibZip.sol`](https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol) and inlined as raw bytecode. To avoid Solidity's wrapper overhead the code is compiled from pure yul.
150
159
 
package/_cjs/index.cjs CHANGED
@@ -1,3 +1,2 @@
1
- var G=Object.defineProperty;var Ot=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames;var qt=Object.prototype.hasOwnProperty;var dt=(s,n)=>()=>(s&&(n=s(s=0)),n);var ht=(s,n)=>{for(var f in n)G(s,f,{get:n[f],enumerable:!0})},zt=(s,n,f,l)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Pt(n))!qt.call(s,o)&&o!==f&&G(s,o,{get:()=>n[o],enumerable:!(l=Ot(n,o))||l.enumerable});return s};var Et=s=>zt(G({},"__esModule",{value:!0}),s);var St={};ht(St,{compress_call:()=>Ht});var tt,Dt,w,D,Tt,pt,Q,Ft,Lt,Kt,xt,yt,wt,Bt,jt,Vt,Zt,It,Ht,Ct=dt(()=>{tt=require("solady"),Dt=(1n<<128n)-1n,w=(1n<<256n)-1n,D=s=>s.replace(/^0x/,"").toLowerCase(),Tt=s=>{let n=D(s),f=n.length,l=new Uint8Array(f/2);for(let o=0;o<f;o+=2)l[o/2]=Number.parseInt(n.slice(o,o+2),16);return l},pt=s=>{let n="";for(let f=0;f<s.length;f++)n+=s[f].toString(16).padStart(2,"0");return n},Q=s=>~s&w,Ft=(s,n)=>s&n&w,Lt=(s,n)=>(s|n)&w,Kt=(s,n)=>(s^n)&w,xt=(s,n)=>n<<s&w,yt=(s,n)=>n>>s&w,wt=(s,n)=>s-n&w,Bt=(s,n)=>{let f=Number(s)+1,l=(1n<<BigInt(f*8))-1n,o=1n<<BigInt(f*8-1),d=n&l;return(d&o?d|~l&w:d)&w};jt=s=>`0x365f73${D(s)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;Vt=s=>`0x5f5f5b368110602d575f8083813473${D(s)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`,Zt=function(s){let n=D(s),f=Tt(n),l=28,o=new Uint8Array(l+f.length);o.set(f,l);let d=o.length,h=[],g=[],a=[],M=0,B=new Map,k=!0,R=t=>{let i=a.lastIndexOf(t);return i=i===-1?-1:a.length-1-i,i>15?-1:i},T=new Map,nt=new Map,et=new Map,H=new Map,J=new Map,kt=t=>t+31&-32,st=0,Y=new Map,I=()=>[a.pop(),a.pop()],it=(t,i,e)=>t.set(i,(t.get(i)||0)+e),rt=(t,i)=>it(t,i,1),A=(t,i)=>{h.push(t),rt(T,t);let e=i??null;g.push(e),rt(nt,e)},b=(t,i=1)=>{a.push(t),it(et,t,i),++st,Y.set(t,st)},ot=(t,i)=>{M=kt(t+i)},P=(t,i)=>{if(t===54)b(32n,0);else if(t===89)b(BigInt(M),0);else if(t===11){let[e,c]=I();b(Bt(e,c),1)}else if(t===25){let e=a.pop();b(Q(e),0)}else if(t===24){let[e,c]=I();b(Kt(e,c),1)}else if(t===22){let[e,c]=I();b(Ft(e,c),1)}else if(t===3){let[e,c]=I();b(wt(e,c),1)}else if(t===27){let[e,c]=I();b(xt(e,c),1)}else if(t===28){let[e,c]=I();b(yt(e,c),1)}else if(t===23){let[e,c]=I();b(Lt(e,c),1)}else if(t>=96&&t<=127||t===95){let e=0n;for(let y of i||[])e=e<<8n|BigInt(y);if(e==224n){b(e,0),A(48);return}if(e==32n){b(e,0),A(54);return}if(e===BigInt(M)){b(e,0),A(89);return}let c=R(e);if(c!==-1&&t!=95){b(e,k?1:-1),A(128+c);return}if(e==w){b(e),A(95),A(25);return}b(e)}else if(t===81){let e=Number(a.pop());b(B.has(e)?B.get(e):0n)}else if(t===82){let[e,c]=I(),y=Number(e);B.set(y,c&w),ot(y,32)}else if(t===83){let[e,c]=I();ot(Number(e),1)}else t===243&&I();A(t,i||null)},j=t=>P(t),U=t=>{if(t>0&&t===M)return P(89);if(t==32n)return P(54);if(!t)return P(95,void 0);let i=BigInt(t),e=[];for(;i;)e.unshift(Number(i&0xffn)),i>>=8n;return P(95+e.length,e)},ct=t=>P(95+t.length,Array.from(t)),At=(t,i)=>(t.match(new RegExp(i,"g"))||[]).length,Ut=t=>{let i=0,e=!0;for(let{s:c,e:y}of t)i+=1+y-c+1,31-y>0&&(i+=3),e||(i+=1),e=!1;return i},V=[],m=t=>(V.push({t:"num",v:t}),U(t)),Z=t=>(V.push({t:"bytes",b:t}),ct(t)),p=t=>(V.push({t:"op",o:t}),j(t));U(1n);let W=[1n,32n,224n];for(let t=0;t<d;t+=32){let i=new Uint8Array(32);i.set(o.slice(t,Math.min(t+32,d)),0);let e=[];for(let r=0;r<32;){for(;r<32&&i[r]===0;)++r;if(r>=32)break;let x=r;for(;r<32&&i[r]!==0;)++r;e.push({s:x,e:r-1})}if(!e.length)continue;let c=i.slice(e[0].s),y=1+c.length,S=0n;for(let r of c)S=S<<8n|BigInt(r);let ft=Math.ceil(Math.log2(t+1)/8),N=pt(i),lt=Ut(e),ut=W.includes(S);if(ut){Z(c),m(t),p(82);continue}if(y>8){if(H.has(N)){if(y>J.get(N)+ft){m(H.get(N)),p(81),m(t),p(82);continue}}else if(J.get(N)!=-1){let r=ft+3,x=At(n,N);J.set(N,x*32>x*r?r:-1),H.set(N,t)}}let Nt=e.every(({s:r,e:x})=>r===x),at=e.length*3;if(ut)Z(c);else{let r=y,x=()=>{Z(c)};S==w&&(r=2,x=()=>{m($),p(25)});let $=Q(S),q=0,F=$;for(;F>0n;)++q,F>>=8n;q=1+q;let bt=q+1;bt<r&&(r=bt,x=()=>{m($),p(25)});let v=wt(0n,S),L=0;for(F=v;F>0n;)++L,F>>=8n;L===0&&(L=1),W.includes(v)&&(L=1);let gt=1+(1+L)+1;gt<r&&(r=gt,x=()=>{m(0),m(v),p(3)});for(let u=1;u<c.length;u++){let z=(1n<<BigInt(u*8))-1n,C=S&z,E=Bt(BigInt(u-1),C);if(E===S&&(C&1n<<BigInt(u*8-1))!==0n){let O=1+u;W.includes(BigInt(E))&&(O=1);let K=O+2+1;K<r&&(r=K,x=()=>{m(C),m(u-1),p(11)});break}}for(let u=8;u<=248;u+=8){let z=yt(BigInt(u),S);if(z===0n)break;let C=Q(z);if(xt(BigInt(u),C)===S){let O=0,K=C;for(;K>0n;)++O,K>>=8n;O===0&&(O=1);let mt=1+O+2+1+1;mt<r&&(r=mt,x=()=>{m(C),m(u),p(27),p(25)})}}if(Nt&&at<r&&at<=lt){for(let{s:u}of e)m(i[u]),m(t+u),p(83);continue}else if(lt<r){let u=!0;for(let{s:z,e:C}of e){let E=31-C;Z(i.slice(z,C+1)),E>0&&(m(E*8),p(27)),u||p(23),u=!1}}else x()}m(t),p(82)}h=[],g=[],a=[],M=0,B=new Map,Array.from(et.entries()).filter(([t,i])=>i>1&&t>1n&&t!==32n&&t!==224n).sort((t,i)=>Y.get(i[0])-Y.get(t[0])).filter(([t,i])=>typeof t=="number"?BigInt(t):t<=Dt).slice(0,15).forEach(([t,i])=>{U(t)}),U(1n);for(let t of V)t.t==="num"?U(t.v):t.t==="bytes"?ct(t.b):t.t==="op"&&j(t.o);j(95),j(95),U(f.length),U(l);let X=[];for(let t=0;t<h.length;++t)X.push(h[t]),h[t]>=96&&h[t]<=127&&g[t]&&X.push(...g[t]);return"0x"+pt(new Uint8Array(X))+"345f355af13d5f5f3e3d5ff3"},It="0x00000000000000000000000000000000000000e0";Ht=function(s,n){let{method:f,params:l}=s;if(f&&f!=="eth_call")return s;let o=l?.[0]||s,d=l?.[1],h=l?.[2];if(d&&d!=="latest"||h&&Object.keys(h).length>0||!o?.to||!o?.data||Object.keys(o).some(R=>!["to","data","from"].includes(R)))return s;let g=o.data.length;if(g<1150)return s;let a="0x"+D(o.data),M=o.to,B,k;if(n==="jit"||!n&&(g<3e3||g>=8e3))B=Zt(a),k="0x"+D(M).padStart(64,"0");else{let R=n==="flz"||!n?tt.LibZip.flzCompress(a):null,T=n==="cd"||!n&&R?tt.LibZip.cdCompress(a):null;n==="flz"||!n&&R&&(!T||R.length<T.length)?(k=R,B=jt(M)):(k=T,B=Vt(M))}return B.length+k.length>=g?s:{...s,params:[{...o,to:It,data:k},d||"latest",{...h,[It]:{code:B}}]}}});var Wt={};ht(Wt,{MIN_BODY_SIZE:()=>Mt,compressModule:()=>Rt,compressModuleWithJIT:()=>Yt});module.exports=Et(Wt);async function Rt(s,n,f){let l=typeof s=="string"?s:s instanceof URL?s.toString():s.url,o=_t.get(l);if(_=_===-1||o===-1?-1:o?.[0]??null,f&&n?.body&&typeof n.body=="string"&&(_===-1||_===null))try{let g=JSON.parse(n.body),a=f(g);a!==void 0&&(n={...n,body:JSON.stringify(a)})}catch{}let d=typeof n?.body=="string"?n.body:null;if(_&&_!==-1&&d&&d.length>=1150){let g=await new Response(new Blob([d]).stream().pipeThrough(new CompressionStream(_))).blob();n={...n,body:g,headers:{...n&&n.headers,"Content-Encoding":_}}}let h=await fetch(l,n);if(_===null){let g=h.headers.get("Accept-Encoding")?.split(",").filter(a=>Jt.includes(a));_t.set(l,g?.length?g:-1)}return h}var Mt,_t,Jt,_,Yt,Xt=dt(()=>{Mt=1150,_t=new Map,Jt=["deflate-raw","deflate","gzip"],_=typeof CompressionStream>"u"?-1:null;Yt=(s,n)=>Promise.resolve().then(()=>(Ct(),St)).then(({compress_call:f})=>Rt(s,n,f))});Xt();0&&(module.exports={MIN_BODY_SIZE,compressModule,compressModuleWithJIT});
2
- //! @__PURE__
1
+ var u=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var R=(n,e)=>{for(var o in e)u(n,o,{get:e[o],enumerable:!0})},C=(n,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of b(e))!w.call(n,t)&&t!==o&&u(n,t,{get:()=>e[t],enumerable:!(s=m(e,t))||s.enumerable});return n};var E=n=>C(u({},"__esModule",{value:!0}),n);var v={};R(v,{MIN_BODY_SIZE:()=>_,compressModule:()=>M});module.exports=E(v);var _=1150,q=typeof CompressionStream<"u",S=new Map,I=["gzip","deflate"];async function M(n,e,o){let s=n instanceof Request?n:null,t=typeof n=="string"?n:n instanceof Request?n.url:n.toString(),r=typeof e?.body=="string"?e.body:null;if(typeof o=="function"){if(s&&!e)return fetch(s);let f=e?.body;if(r)try{let a=o(JSON.parse(r));a!==void 0&&(f=JSON.stringify(a))}catch{}return fetch(s??t,{...e,body:f})}let c=S.get(t),g=o==="gzip"||o==="deflate",i=q?g?o:o==="proactive"?c===-1?null:c??"gzip":typeof c=="string"?c:null:null,y=!!i&&!!r&&r.length>=1150,p={...e,priority:"high"},h=new Headers(p.headers);y&&(p.body=await new Response(new Blob([r]).stream().pipeThrough(new CompressionStream(i))).blob(),h.set("Content-Encoding",i)),p.headers=h;let d=await fetch(s??t,p);if(!g&&c===void 0){let a=d.headers.get("Accept-Encoding")?.split(",").map(l=>l.trim()).find(l=>I.includes(l))??-1;S.set(t,o==="proactive"&&y&&d.ok?i:a)}return d}0&&(module.exports={MIN_BODY_SIZE,compressModule});
3
2
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/jit-compressor.ts", "../../src/index.ts"],
4
- "sourcesContent": ["import { LibZip } from 'solady';\nimport { MIN_BODY_SIZE } from './index';\n\nconst MAX_128_BIT = (1n << 128n) - 1n;\nconst MAX_256_BIT = (1n << 256n) - 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\nconst not = (a: bigint): bigint => ~a & MAX_256_BIT;\nconst and = (a: bigint, b: bigint): bigint => a & b & MAX_256_BIT;\nconst or = (a: bigint, b: bigint): bigint => (a | b) & MAX_256_BIT;\nconst xor = (a: bigint, b: bigint): bigint => (a ^ b) & MAX_256_BIT;\nconst shl = (shift: bigint, value: bigint): bigint => (value << shift) & MAX_256_BIT;\nconst shr = (shift: bigint, value: bigint): bigint => (value >> shift) & MAX_256_BIT;\nconst sub = (a: bigint, b: bigint): bigint => (a - b) & MAX_256_BIT;\nconst sigext = (byteSize: bigint, value: bigint): bigint => {\n const numBytes = Number(byteSize) + 1;\n const mask = (1n << BigInt(numBytes * 8)) - 1n;\n const signBit = 1n << BigInt(numBytes * 8 - 1);\n const maskedVal = value & mask;\n const extended = maskedVal & signBit ? maskedVal | (~mask & MAX_256_BIT) : maskedVal;\n return extended & MAX_256_BIT;\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__\nconst 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__\nconst rleFwdBytecode = (address: string): string =>\n `0x5f5f5b368110602d575f8083813473${_normHex(address)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;\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 trackedMemSize = 0;\n let mem = new Map<number, bigint>();\n let firstPass = true;\n const getStackIdx = (val: bigint): number => {\n let idx = stack.lastIndexOf(val);\n idx = idx === -1 ? -1 : stack.length - 1 - idx;\n return idx > 15 ? -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 const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n const ctr = <K>(m: Map<K, number>, k: K, delta: number) => m.set(k, (m.get(k) || 0) + delta);\n const inc = <K>(m: Map<K, number>, k: K) => ctr(m, k, 1);\n const pushOp = (op: number, d?: number[] | null) => {\n ops.push(op);\n inc(opFreq, op);\n const imm = d ?? null;\n data.push(imm);\n inc(dataFreq, imm);\n };\n const pushS = (v: bigint, freq: number = 1) => {\n stack.push(v);\n ctr(stackFreq, v, freq);\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 === 0x36) {\n pushS(32n, 0);\n } else if (op === 0x59) {\n pushS(BigInt(trackedMemSize), 0);\n } else if (op === 0x0b) {\n // SIGNEXTEND\n const [byteSize, val] = pop2();\n pushS(sigext(byteSize, val), 1);\n } else if (op === 0x19) {\n // NOT\n const val = stack.pop()!;\n pushS(not(val), 0);\n } else if (op === 0x18) {\n // XOR\n const [a, b] = pop2();\n pushS(xor(a, b), 1);\n } else if (op === 0x16) {\n // AND\n const [a, b] = pop2();\n pushS(and(a, b), 1);\n } else if (op === 0x03) {\n // SUB\n const [a, b] = pop2();\n pushS(sub(a, b), 1);\n } else if (op === 0x1b) {\n // SHL\n let [shift, val] = pop2();\n pushS(shl(shift, val), 1);\n } else if (op === 0x1c) {\n // SHR\n let [shift, val] = pop2();\n pushS(shr(shift, val), 1);\n } else if (op === 0x17) {\n // OR\n let [a, b] = pop2();\n pushS(or(a, b), 1);\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 if (v == 224n) {\n pushS(v, 0);\n pushOp(0x30); // ADDRESS\n return;\n }\n if (v == 32n) {\n pushS(v, 0);\n pushOp(0x36); // ADDRESS\n return;\n }\n if (v === BigInt(trackedMemSize)) {\n pushS(v, 0);\n pushOp(0x59); // MemSize\n return;\n }\n const idx = getStackIdx(v);\n if (idx !== -1 && op != 0x5f) {\n let pushCtr = firstPass ? 1 : -1;\n pushS(v, pushCtr);\n pushOp(128 + idx);\n return;\n }\n if (v == MAX_256_BIT) {\n pushS(v);\n pushOp(0x5f); // 0\n pushOp(0x19); // NOT\n return;\n }\n pushS(v);\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 & MAX_256_BIT);\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, imm || null);\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 == 32n) return addOp(0x36);\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 pushN(1n);\n // First pass: decide how to build each 32-byte word without emitting bytecode\n const _stack = [1n, 32n, 224n];\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 // 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 let literalVal = 0n;\n for (const b of literal) literalVal = (literalVal << 8n) | BigInt(b);\n const baseBytes = Math.ceil(Math.log2(base + 1) / 8);\n const wordHex = _uint8ArrayToHex(word);\n const shlCost = estShlCost(seg);\n\n const inStack = _stack.includes(literalVal);\n if (inStack) {\n emitPushB(literal);\n emitPushN(base);\n emitOp(0x52); // MSTORE\n continue;\n }\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 const byte8s = seg.every(({ s, e }) => s === e);\n const byte8sCost = seg.length * 3; // each: PUSH1 (value), PUSH1 (offset), MSTORE8\n if (inStack) {\n emitPushB(literal);\n } else {\n // Aggregate all costs\n let bestCost = literalCost;\n let bestEmit: (() => void) | null = () => {\n emitPushB(literal);\n };\n if (literalVal == MAX_256_BIT) {\n bestCost = 2;\n bestEmit = () => {\n emitPushN(notVal);\n emitOp(0x19);\n };\n }\n // Try NOT: PUSH<n> ~val, NOT\n const notVal = not(literalVal);\n let notBytes = 0;\n let tmp = notVal;\n while (tmp > 0n) {\n ++notBytes;\n tmp >>= 8n;\n }\n notBytes = 1 + notBytes;\n if (notBytes === 0) notBytes;\n const notCost = notBytes + 1; // PUSH<n> + NOT\n if (notCost < bestCost) {\n bestCost = notCost;\n bestEmit = () => {\n emitPushN(notVal);\n emitOp(0x19);\n };\n }\n\n // Try SUB: PUSH1 0, PUSH<n> val, SUB\n const subVal = sub(0n, literalVal);\n let subBytes = 0;\n tmp = subVal;\n while (tmp > 0n) {\n ++subBytes;\n tmp >>= 8n;\n }\n if (subBytes === 0) subBytes = 1;\n if (_stack.includes(subVal)) subBytes = 1;\n const subCost = 1 + (1 + subBytes) + 1; // PUSH0 + PUSH<n> + SUB\n if (subCost < bestCost) {\n bestCost = subCost;\n bestEmit = () => {\n emitPushN(0);\n emitPushN(subVal);\n emitOp(0x03);\n };\n }\n\n // Try SIGNEXTEND: PUSH<n> truncated, PUSH1 byteSize, SIGNEXTEND\n for (let numBytes = 1; numBytes < literal.length; numBytes++) {\n const mask = (1n << BigInt(numBytes * 8)) - 1n;\n const truncated = literalVal & mask;\n const extended = sigext(BigInt(numBytes - 1), truncated);\n if (extended === literalVal && (truncated & (1n << BigInt(numBytes * 8 - 1))) !== 0n) {\n let trueByteCost = 1 + numBytes;\n if (_stack.includes(BigInt(extended))) trueByteCost = 1;\n let signCost = trueByteCost + (1 + 1) + 1; // PUSH<n> + PUSH1 + SIGNEXTEND\n if (signCost < bestCost) {\n bestCost = signCost;\n bestEmit = () => {\n emitPushN(truncated);\n emitPushN(numBytes - 1);\n emitOp(0x0b);\n };\n }\n break;\n }\n }\n\n // Try SHIFT+NOT: PUSH<n> val, PUSH1 shift, SHL, NOT\n for (let shiftBits = 8; shiftBits <= 248; shiftBits += 8) {\n const shifted = shr(BigInt(shiftBits), literalVal);\n if (shifted === 0n) break;\n\n const notShifted = not(shifted);\n const reconstructed = shl(BigInt(shiftBits), notShifted);\n\n if (reconstructed === literalVal) {\n let shiftedBytes = 0;\n let tmpShifted = notShifted;\n while (tmpShifted > 0n) {\n ++shiftedBytes;\n tmpShifted >>= 8n;\n }\n if (shiftedBytes === 0) shiftedBytes = 1;\n const shiftNotCost = 1 + shiftedBytes + 2 + 1 + 1; // PUSH<n> + PUSH1 + SHL + NOT\n if (shiftNotCost < bestCost) {\n bestCost = shiftNotCost;\n bestEmit = () => {\n emitPushN(notShifted);\n emitPushN(shiftBits);\n emitOp(0x1b); // SHL\n emitOp(0x19); // NOT\n };\n }\n }\n }\n\n if (byte8s && byte8sCost < bestCost && byte8sCost <= shlCost) {\n for (const { s } of seg) {\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n continue; // Skip the single MSTORE at the end\n } else if (shlCost < bestCost) {\n // Use SHL/OR\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 } else {\n bestEmit!();\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 // Pre 2nd pass. Push most frequent literals into stack.\n Array.from(stackFreq.entries())\n .filter(([val, freq]) => freq > 1 && val > 1n && val !== 32n && val !== 224n)\n .sort((a, b) => stackCnt.get(b[0])! - stackCnt.get(a[0])!)\n .filter(([val, _]) => {\n return typeof val === 'number' ? BigInt(val) : val <= MAX_128_BIT;\n })\n .slice(0, 15)\n .forEach(([val, _]) => {\n pushN(val);\n });\n pushN(1n);\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 //\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)) + '345f355af13d5f5f3e3d5ff3';\n};\n\nconst DECOMPRESSOR_ADDRESS = '0x00000000000000000000000000000000000000e0';\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 *\n * Only applies compression to calls that:\n * - target the latest block ID\n * - have no state overrides\n * - have a target address and calldata\n * - have no other properties (nonce, gas, etc.)\n *\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 { method, params } = payload;\n if (method && method !== 'eth_call') return payload;\n const txObj = params?.[0] || payload;\n const blockParam = params?.[1];\n const overrides = params?.[2];\n\n // Validation\n if (\n (blockParam && blockParam !== 'latest') ||\n (overrides && Object.keys(overrides).length > 0) ||\n !txObj?.to ||\n !txObj?.data ||\n Object.keys(txObj).some((k) => !['to', 'data', 'from'].includes(k))\n ) {\n return payload;\n }\n\n const originalSize = txObj.data.length;\n if (originalSize < MIN_BODY_SIZE) return payload;\n\n const inputData = '0x' + _normHex(txObj.data);\n const to = txObj.to;\n\n // Determine compression method and generate bytecode/calldata\n let bytecode: string;\n let calldata: string;\n\n if (alg === 'jit' || (!alg && (originalSize < 3000 || originalSize >= 8000))) {\n bytecode = _jitDecompressor(inputData);\n calldata = '0x' + _normHex(to).padStart(64, '0');\n } else {\n // Need FLZ and/or CD compression\n const flzData = alg === 'flz' || !alg ? LibZip.flzCompress(inputData) : null;\n const cdData = alg === 'cd' || (!alg && flzData) ? LibZip.cdCompress(inputData) : null;\n\n // Pick the best or requested one\n const useFlz =\n alg === 'flz' || (!alg && flzData && (!cdData || flzData.length < cdData.length));\n\n if (useFlz) {\n calldata = flzData!;\n bytecode = flzFwdBytecode(to);\n } else {\n calldata = cdData!;\n bytecode = rleFwdBytecode(to);\n }\n }\n\n // Skip if not beneficial\n if (bytecode.length + calldata.length >= originalSize) return payload;\n\n return {\n ...payload,\n params: [\n { ...txObj, to: DECOMPRESSOR_ADDRESS, data: calldata },\n blockParam || 'latest',\n { ...overrides, [DECOMPRESSOR_ADDRESS]: { code: bytecode } },\n ],\n };\n};\n", "export const MIN_BODY_SIZE = 1150;\n\nconst _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 const bodyStr = typeof init?.body === 'string' ? (init.body as string) : null;\n\n if (supported && supported !== -1 && bodyStr && bodyStr.length >= MIN_BODY_SIZE) {\n const compressed = await new Response(\n new Blob([bodyStr])\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", "import_solady", "MAX_128_BIT", "MAX_256_BIT", "_normHex", "_hexToUint8Array", "_uint8ArrayToHex", "not", "and", "or", "xor", "shl", "shr", "sub", "sigext", "flzFwdBytecode", "rleFwdBytecode", "_jitDecompressor", "DECOMPRESSOR_ADDRESS", "init_jit_compressor", "__esmMin", "hex", "normalized", "len", "bytes", "i", "a", "b", "shift", "value", "byteSize", "numBytes", "mask", "signBit", "maskedVal", "address", "calldata", "originalBuf", "padding", "buf", "n", "ops", "data", "stack", "trackedMemSize", "mem", "firstPass", "getStackIdx", "val", "idx", "opFreq", "dataFreq", "stackFreq", "wordCache", "wordCacheCost", "roundUp32", "x", "pushCounter", "stackCnt", "pop2", "ctr", "m", "k", "delta", "inc", "pushOp", "op", "d", "imm", "pushS", "v", "freq", "trackMem", "offset", "size", "addOp", "_", "opcode", "pushN", "pushB", "cntWords", "wordHex", "estShlCost", "seg", "cost", "first", "s", "e", "plan", "emitPushN", "emitPushB", "emitOp", "o", "_stack", "base", "word", "literal", "literalCost", "literalVal", "baseBytes", "shlCost", "inStack", "reuseCost", "byte8s", "byte8sCost", "bestCost", "bestEmit", "notVal", "notBytes", "tmp", "notCost", "subVal", "subBytes", "subCost", "truncated", "extended", "trueByteCost", "signCost", "shiftBits", "shifted", "notShifted", "shiftedBytes", "tmpShifted", "shiftNotCost", "suffix0s", "step", "out", "payload", "alg", "method", "params", "txObj", "blockParam", "overrides", "originalSize", "inputData", "to", "bytecode", "flzData", "cdData", "index_exports", "__export", "MIN_BODY_SIZE", "compressModule", "compressModuleWithJIT", "__toCommonJS", "input", "init", "transformPayload", "url", "cached", "_sup_enc", "supported", "parsed", "next", "bodyStr", "compressed", "response", "encodings", "e", "_enc", "init_index", "__esmMin", "compress_call"]
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": ["export const MIN_BODY_SIZE = 1150;\n\nconst _hasCS = typeof CompressionStream !== 'undefined';\nconst _cache = new Map<string, string | -1>();\nconst _enc = ['gzip', 'deflate'] as const;\ntype SupportedEncoding = (typeof _enc)[number];\n\nexport type PayloadTransform = (payload: unknown) => unknown;\nexport type CompressionMode = 'passive' | 'proactive' | 'gzip' | 'deflate' | PayloadTransform;\n\n/**\n * @param input - URL or Request\n * @param init - Request options\n * @param mode - Compression mode:\n * - 'passive' (default): discover support via Accept-Encoding header first\n * - 'proactive': compress with gzip first, adjust if server rejects\n * - 'gzip' | 'deflate': use specified encoding directly (known support)\n * - PayloadTransform function: transform payload, skip HTTP compression\n */\nexport async function compressModule(\n input: string | URL | Request,\n init?: RequestInit,\n mode?: CompressionMode,\n): Promise<Response> {\n const req = input instanceof Request ? input : null;\n const url =\n typeof input === 'string' ? input : input instanceof Request ? input.url : input.toString();\n const bodyStr = typeof init?.body === 'string' ? init.body : null;\n\n // Custom transform: apply and skip HTTP compression\n if (typeof mode === 'function') {\n if (req && !init) return fetch(req);\n let body = init?.body;\n if (bodyStr)\n try {\n const next = mode(JSON.parse(bodyStr));\n if (next !== undefined) body = JSON.stringify(next);\n } catch {}\n return fetch(req ?? url, { ...init, body });\n }\n\n const cached = _cache.get(url);\n const known = mode === 'gzip' || mode === 'deflate';\n const encoding = !_hasCS\n ? null\n : known\n ? (mode as SupportedEncoding)\n : mode === 'proactive'\n ? cached === -1\n ? null\n : (cached ?? 'gzip')\n : typeof cached === 'string'\n ? cached\n : null;\n\n const shouldCompress = !!encoding && !!bodyStr && bodyStr.length >= MIN_BODY_SIZE;\n const opts: RequestInit = { ...init, priority: 'high' as RequestPriority };\n const headers = new Headers(opts.headers);\n if (shouldCompress) {\n opts.body = await new Response(\n new Blob([bodyStr!])\n .stream()\n .pipeThrough(new CompressionStream(encoding as CompressionFormat)),\n ).blob();\n headers.set('Content-Encoding', encoding);\n }\n opts.headers = headers;\n\n const response = await fetch(req ?? url, opts);\n\n // Cache discovery for passive/proactive (not known modes)\n if (!known && cached === undefined) {\n const header = response.headers.get('Accept-Encoding');\n const discovered =\n header\n ?.split(',')\n .map((e) => e.trim())\n .find((e): e is SupportedEncoding => _enc.includes(e as SupportedEncoding)) ?? -1;\n _cache.set(\n url,\n mode === 'proactive' && shouldCompress ? (response.ok ? encoding! : discovered) : discovered,\n );\n }\n\n return response;\n}\n"],
5
+ "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,EAAA,mBAAAC,IAAA,eAAAC,EAAAJ,GAAO,IAAME,EAAgB,KAEvBG,EAAS,OAAO,kBAAsB,IACtCC,EAAS,IAAI,IACbC,EAAO,CAAC,OAAQ,SAAS,EAe/B,eAAsBJ,EACpBK,EACAC,EACAC,EACmB,CACnB,IAAMC,EAAMH,aAAiB,QAAUA,EAAQ,KACzCI,EACJ,OAAOJ,GAAU,SAAWA,EAAQA,aAAiB,QAAUA,EAAM,IAAMA,EAAM,SAAS,EACtFK,EAAU,OAAOJ,GAAM,MAAS,SAAWA,EAAK,KAAO,KAG7D,GAAI,OAAOC,GAAS,WAAY,CAC9B,GAAIC,GAAO,CAACF,EAAM,OAAO,MAAME,CAAG,EAClC,IAAIG,EAAOL,GAAM,KACjB,GAAII,EACF,GAAI,CACF,IAAME,EAAOL,EAAK,KAAK,MAAMG,CAAO,CAAC,EACjCE,IAAS,SAAWD,EAAO,KAAK,UAAUC,CAAI,EACpD,MAAQ,CAAC,CACX,OAAO,MAAMJ,GAAOC,EAAK,CAAE,GAAGH,EAAM,KAAAK,CAAK,CAAC,CAC5C,CAEA,IAAME,EAASV,EAAO,IAAIM,CAAG,EACvBK,EAAQP,IAAS,QAAUA,IAAS,UACpCQ,EAAYb,EAEdY,EACGP,EACDA,IAAS,YACPM,IAAW,GACT,KACCA,GAAU,OACb,OAAOA,GAAW,SAChBA,EACA,KATN,KAWEG,EAAiB,CAAC,CAACD,GAAY,CAAC,CAACL,GAAWA,EAAQ,QAAU,KAC9DO,EAAoB,CAAE,GAAGX,EAAM,SAAU,MAA0B,EACnEY,EAAU,IAAI,QAAQD,EAAK,OAAO,EACpCD,IACFC,EAAK,KAAO,MAAM,IAAI,SACpB,IAAI,KAAK,CAACP,CAAQ,CAAC,EAChB,OAAO,EACP,YAAY,IAAI,kBAAkBK,CAA6B,CAAC,CACrE,EAAE,KAAK,EACPG,EAAQ,IAAI,mBAAoBH,CAAQ,GAE1CE,EAAK,QAAUC,EAEf,IAAMC,EAAW,MAAM,MAAMX,GAAOC,EAAKQ,CAAI,EAG7C,GAAI,CAACH,GAASD,IAAW,OAAW,CAElC,IAAMO,EADSD,EAAS,QAAQ,IAAI,iBAAiB,GAG/C,MAAM,GAAG,EACV,IAAKE,GAAMA,EAAE,KAAK,CAAC,EACnB,KAAMA,GAA8BjB,EAAK,SAASiB,CAAsB,CAAC,GAAK,GACnFlB,EAAO,IACLM,EACAF,IAAS,aAAeS,GAAkBG,EAAS,GAAKJ,EAA0BK,CACpF,CACF,CAEA,OAAOD,CACT",
6
+ "names": ["index_exports", "__export", "MIN_BODY_SIZE", "compressModule", "__toCommonJS", "_hasCS", "_cache", "_enc", "input", "init", "mode", "req", "url", "bodyStr", "body", "next", "cached", "known", "encoding", "shouldCompress", "opts", "headers", "response", "discovered", "e"]
7
7
  }
@@ -1,3 +1,2 @@
1
- var Nt=Object.create;var H=Object.defineProperty;var qt=Object.getOwnPropertyDescriptor;var Tt=Object.getOwnPropertyNames;var Et=Object.getPrototypeOf,Ft=Object.prototype.hasOwnProperty;var pt=(n,e)=>()=>(n&&(e=n(n=0)),e);var ht=(n,e)=>{for(var r in e)H(n,r,{get:e[r],enumerable:!0})},xt=(n,e,r,f)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of Tt(e))!Ft.call(n,c)&&c!==r&&H(n,c,{get:()=>e[c],enumerable:!(f=qt(e,c))||f.enumerable});return n};var Lt=(n,e,r)=>(r=n!=null?Nt(Et(n)):{},xt(e||!n||!n.__esModule?H(r,"default",{value:n,enumerable:!0}):r,n)),jt=n=>xt(H({},"__esModule",{value:!0}),n);var Mt={};ht(Mt,{compress_call:()=>Gt});var et,Kt,w,E,Vt,yt,tt,Zt,vt,Ht,wt,Bt,St,It,Jt,Wt,Yt,Ct,Gt,Rt=pt(()=>{et=require("solady"),Kt=(1n<<128n)-1n,w=(1n<<256n)-1n,E=n=>n.replace(/^0x/,"").toLowerCase(),Vt=n=>{let e=E(n),r=e.length,f=new Uint8Array(r/2);for(let c=0;c<r;c+=2)f[c/2]=Number.parseInt(e.slice(c,c+2),16);return f},yt=n=>{let e="";for(let r=0;r<n.length;r++)e+=n[r].toString(16).padStart(2,"0");return e},tt=n=>~n&w,Zt=(n,e)=>n&e&w,vt=(n,e)=>(n|e)&w,Ht=(n,e)=>(n^e)&w,wt=(n,e)=>e<<n&w,Bt=(n,e)=>e>>n&w,St=(n,e)=>n-e&w,It=(n,e)=>{let r=Number(n)+1,f=(1n<<BigInt(r*8))-1n,c=1n<<BigInt(r*8-1),d=e&f;return(d&c?d|~f&w:d)&w};Jt=n=>`0x365f73${E(n)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;Wt=n=>`0x5f5f5b368110602d575f8083813473${E(n)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`,Yt=function(n){let e=E(n),r=Vt(e),f=28,c=new Uint8Array(f+r.length);c.set(r,f);let d=c.length,p=[],g=[],u=[],M=0,B=new Map,A=!0,k=t=>{let i=u.lastIndexOf(t);return i=i===-1?-1:u.length-1-i,i>15?-1:i},F=new Map,nt=new Map,st=new Map,J=new Map,W=new Map,Dt=t=>t+31&-32,rt=0,Y=new Map,S=()=>[u.pop(),u.pop()],it=(t,i,s)=>t.set(i,(t.get(i)||0)+s),ot=(t,i)=>it(t,i,1),z=(t,i)=>{p.push(t),ot(F,t);let s=i??null;g.push(s),ot(nt,s)},b=(t,i=1)=>{u.push(t),it(st,t,i),++rt,Y.set(t,rt)},ct=(t,i)=>{M=Dt(t+i)},O=(t,i)=>{if(t===54)b(32n,0);else if(t===89)b(BigInt(M),0);else if(t===11){let[s,l]=S();b(It(s,l),1)}else if(t===25){let s=u.pop();b(tt(s),0)}else if(t===24){let[s,l]=S();b(Ht(s,l),1)}else if(t===22){let[s,l]=S();b(Zt(s,l),1)}else if(t===3){let[s,l]=S();b(St(s,l),1)}else if(t===27){let[s,l]=S();b(wt(s,l),1)}else if(t===28){let[s,l]=S();b(Bt(s,l),1)}else if(t===23){let[s,l]=S();b(vt(s,l),1)}else if(t>=96&&t<=127||t===95){let s=0n;for(let y of i||[])s=s<<8n|BigInt(y);if(s==224n){b(s,0),z(48);return}if(s==32n){b(s,0),z(54);return}if(s===BigInt(M)){b(s,0),z(89);return}let l=k(s);if(l!==-1&&t!=95){b(s,A?1:-1),z(128+l);return}if(s==w){b(s),z(95),z(25);return}b(s)}else if(t===81){let s=Number(u.pop());b(B.has(s)?B.get(s):0n)}else if(t===82){let[s,l]=S(),y=Number(s);B.set(y,l&w),ct(y,32)}else if(t===83){let[s,l]=S();ct(Number(s),1)}else t===243&&S();z(t,i||null)},V=t=>O(t),D=t=>{if(t>0&&t===M)return O(89);if(t==32n)return O(54);if(!t)return O(95,void 0);let i=BigInt(t),s=[];for(;i;)s.unshift(Number(i&0xffn)),i>>=8n;return O(95+s.length,s)},lt=t=>O(95+t.length,Array.from(t)),Pt=(t,i)=>(t.match(new RegExp(i,"g"))||[]).length,Ut=t=>{let i=0,s=!0;for(let{s:l,e:y}of t)i+=1+y-l+1,31-y>0&&(i+=3),s||(i+=1),s=!1;return i},Z=[],m=t=>(Z.push({t:"num",v:t}),D(t)),v=t=>(Z.push({t:"bytes",b:t}),lt(t)),h=t=>(Z.push({t:"op",o:t}),V(t));D(1n);let G=[1n,32n,224n];for(let t=0;t<d;t+=32){let i=new Uint8Array(32);i.set(c.slice(t,Math.min(t+32,d)),0);let s=[];for(let o=0;o<32;){for(;o<32&&i[o]===0;)++o;if(o>=32)break;let x=o;for(;o<32&&i[o]!==0;)++o;s.push({s:x,e:o-1})}if(!s.length)continue;let l=i.slice(s[0].s),y=1+l.length,I=0n;for(let o of l)I=I<<8n|BigInt(o);let ft=Math.ceil(Math.log2(t+1)/8),P=yt(i),at=Ut(s),ut=G.includes(I);if(ut){v(l),m(t),h(82);continue}if(y>8){if(J.has(P)){if(y>W.get(P)+ft){m(J.get(P)),h(81),m(t),h(82);continue}}else if(W.get(P)!=-1){let o=ft+3,x=Pt(e,P);W.set(P,x*32>x*o?o:-1),J.set(P,t)}}let Ot=s.every(({s:o,e:x})=>o===x),bt=s.length*3;if(ut)v(l);else{let o=y,x=()=>{v(l)};I==w&&(o=2,x=()=>{m($),h(25)});let $=tt(I),N=0,L=$;for(;L>0n;)++N,L>>=8n;N=1+N;let gt=N+1;gt<o&&(o=gt,x=()=>{m($),h(25)});let Q=St(0n,I),j=0;for(L=Q;L>0n;)++j,L>>=8n;j===0&&(j=1),G.includes(Q)&&(j=1);let mt=1+(1+j)+1;mt<o&&(o=mt,x=()=>{m(0),m(Q),h(3)});for(let a=1;a<l.length;a++){let q=(1n<<BigInt(a*8))-1n,C=I&q,T=It(BigInt(a-1),C);if(T===I&&(C&1n<<BigInt(a*8-1))!==0n){let U=1+a;G.includes(BigInt(T))&&(U=1);let K=U+2+1;K<o&&(o=K,x=()=>{m(C),m(a-1),h(11)});break}}for(let a=8;a<=248;a+=8){let q=Bt(BigInt(a),I);if(q===0n)break;let C=tt(q);if(wt(BigInt(a),C)===I){let U=0,K=C;for(;K>0n;)++U,K>>=8n;U===0&&(U=1);let dt=1+U+2+1+1;dt<o&&(o=dt,x=()=>{m(C),m(a),h(27),h(25)})}}if(Ot&&bt<o&&bt<=at){for(let{s:a}of s)m(i[a]),m(t+a),h(83);continue}else if(at<o){let a=!0;for(let{s:q,e:C}of s){let T=31-C;v(i.slice(q,C+1)),T>0&&(m(T*8),h(27)),a||h(23),a=!1}}else x()}m(t),h(82)}p=[],g=[],u=[],M=0,B=new Map,Array.from(st.entries()).filter(([t,i])=>i>1&&t>1n&&t!==32n&&t!==224n).sort((t,i)=>Y.get(i[0])-Y.get(t[0])).filter(([t,i])=>typeof t=="number"?BigInt(t):t<=Kt).slice(0,15).forEach(([t,i])=>{D(t)}),D(1n);for(let t of Z)t.t==="num"?D(t.v):t.t==="bytes"?lt(t.b):t.t==="op"&&V(t.o);V(95),V(95),D(r.length),D(f);let X=[];for(let t=0;t<p.length;++t)X.push(p[t]),p[t]>=96&&p[t]<=127&&g[t]&&X.push(...g[t]);return"0x"+yt(new Uint8Array(X))+"345f355af13d5f5f3e3d5ff3"},Ct="0x00000000000000000000000000000000000000e0";Gt=function(n,e){let{method:r,params:f}=n;if(r&&r!=="eth_call")return n;let c=f?.[0]||n,d=f?.[1],p=f?.[2];if(d&&d!=="latest"||p&&Object.keys(p).length>0||!c?.to||!c?.data||Object.keys(c).some(k=>!["to","data","from"].includes(k)))return n;let g=c.data.length;if(g<1150)return n;let u="0x"+E(c.data),M=c.to,B,A;if(e==="jit"||!e&&(g<3e3||g>=8e3))B=Yt(u),A="0x"+E(M).padStart(64,"0");else{let k=e==="flz"||!e?et.LibZip.flzCompress(u):null,F=e==="cd"||!e&&k?et.LibZip.cdCompress(u):null;e==="flz"||!e&&k&&(!F||k.length<F.length)?(A=k,B=Jt(M)):(A=F,B=Wt(M))}return B.length+A.length>=g?n:{...n,params:[{...c,to:Ct,data:A},d||"latest",{...p,[Ct]:{code:B}}]}}});async function kt(n,e,r){let f=typeof n=="string"?n:n instanceof URL?n.toString():n.url,c=_t.get(f);if(R=R===-1||c===-1?-1:c?.[0]??null,r&&e?.body&&typeof e.body=="string"&&(R===-1||R===null))try{let g=JSON.parse(e.body),u=r(g);u!==void 0&&(e={...e,body:JSON.stringify(u)})}catch{}let d=typeof e?.body=="string"?e.body:null;if(R&&R!==-1&&d&&d.length>=1150){let g=await new Response(new Blob([d]).stream().pipeThrough(new CompressionStream(R))).blob();e={...e,body:g,headers:{...e&&e.headers,"Content-Encoding":R}}}let p=await fetch(f,e);if(R===null){let g=p.headers.get("Accept-Encoding")?.split(",").filter(u=>$t.includes(u));_t.set(f,g?.length?g:-1)}return p}var Xt,_t,$t,R,Qt,At=pt(()=>{Xt=1150,_t=new Map,$t=["deflate-raw","deflate","gzip"],R=typeof CompressionStream>"u"?-1:null;Qt=(n,e)=>Promise.resolve().then(()=>(Rt(),Mt)).then(({compress_call:r})=>kt(n,e,r))});var te={};ht(te,{MIN_BODY_SIZE:()=>Xt,compressModule:()=>kt,compressModuleWithJIT:()=>Qt});module.exports=jt(te);var _=Lt(require("node:zlib"),1);At();var zt=(n,e)=>Object.assign(n,{writable:new WritableStream({write(r){return e.write(r),Promise.resolve()},close(){return e.end(),Promise.resolve()}}),readable:new ReadableStream({type:"bytes",start(r){e.on("data",f=>r.enqueue(f)),e.once("end",()=>r.close())}})});globalThis.CompressionStream||(globalThis.CompressionStream=class{constructor(e){let r;e==="deflate"?r=_.default.createDeflate():e==="gzip"?r=_.default.createGzip():e==="br"?r=_.default.createBrotliCompress():r=_.default.createDeflateRaw(),zt(this,r)}});globalThis.DecompressionStream||(globalThis.DecompressionStream=class{constructor(e){let r;e==="deflate"?r=_.default.createInflate():e==="gzip"?r=_.default.createGunzip():e==="br"?r=_.default.createBrotliDecompress():r=_.default.createInflateRaw(),zt(this,r)}});0&&(module.exports={MIN_BODY_SIZE,compressModule,compressModuleWithJIT});
2
- //! @__PURE__
1
+ var C=Object.create;var d=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var E=(t,s)=>{for(var e in s)d(t,e,{get:s[e],enumerable:!0})},b=(t,s,e,n)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of z(s))!D.call(t,o)&&o!==e&&d(t,o,{get:()=>s[o],enumerable:!(n=R(s,o))||n.enumerable});return t};var I=(t,s,e)=>(e=t!=null?C(q(t)):{},b(s||!t||!t.__esModule?d(e,"default",{value:t,enumerable:!0}):e,t)),_=t=>b(d({},"__esModule",{value:!0}),t);var M={};E(M,{MIN_BODY_SIZE:()=>k,compressModule:()=>x});module.exports=_(M);var r=I(require("node:zlib"),1);var k=1150,v=typeof CompressionStream<"u",S=new Map,T=["gzip","deflate"];async function x(t,s,e){let n=t instanceof Request?t:null,o=typeof t=="string"?t:t instanceof Request?t.url:t.toString(),a=typeof s?.body=="string"?s.body:null;if(typeof e=="function"){if(n&&!s)return fetch(n);let g=s?.body;if(a)try{let c=e(JSON.parse(a));c!==void 0&&(g=JSON.stringify(c))}catch{}return fetch(n??o,{...s,body:g})}let i=S.get(o),y=e==="gzip"||e==="deflate",l=v?y?e:e==="proactive"?i===-1?null:i??"gzip":typeof i=="string"?i:null:null,m=!!l&&!!a&&a.length>=1150,p={...s,priority:"high"},h=new Headers(p.headers);m&&(p.body=await new Response(new Blob([a]).stream().pipeThrough(new CompressionStream(l))).blob(),h.set("Content-Encoding",l)),p.headers=h;let f=await fetch(n??o,p);if(!y&&i===void 0){let c=f.headers.get("Accept-Encoding")?.split(",").map(u=>u.trim()).find(u=>T.includes(u))??-1;S.set(o,e==="proactive"&&m&&f.ok?l:c)}return f}var w=(t,s)=>Object.assign(t,{writable:new WritableStream({write(e){return s.write(e),Promise.resolve()},close(){return s.end(),Promise.resolve()}}),readable:new ReadableStream({type:"bytes",start(e){s.on("data",n=>e.enqueue(n)),s.once("end",()=>e.close())}})});globalThis.CompressionStream||(globalThis.CompressionStream=class{constructor(s){let e;s==="deflate"?e=r.default.createDeflate():s==="gzip"?e=r.default.createGzip():s==="br"?e=r.default.createBrotliCompress():e=r.default.createDeflateRaw(),w(this,e)}});globalThis.DecompressionStream||(globalThis.DecompressionStream=class{constructor(s){let e;s==="deflate"?e=r.default.createInflate():s==="gzip"?e=r.default.createGunzip():s==="br"?e=r.default.createBrotliDecompress():e=r.default.createInflateRaw(),w(this,e)}});0&&(module.exports={MIN_BODY_SIZE,compressModule});
3
2
  //# sourceMappingURL=index.node.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/jit-compressor.ts", "../../src/index.ts", "../../src/index.node.ts"],
4
- "sourcesContent": ["import { LibZip } from 'solady';\nimport { MIN_BODY_SIZE } from './index';\n\nconst MAX_128_BIT = (1n << 128n) - 1n;\nconst MAX_256_BIT = (1n << 256n) - 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\nconst not = (a: bigint): bigint => ~a & MAX_256_BIT;\nconst and = (a: bigint, b: bigint): bigint => a & b & MAX_256_BIT;\nconst or = (a: bigint, b: bigint): bigint => (a | b) & MAX_256_BIT;\nconst xor = (a: bigint, b: bigint): bigint => (a ^ b) & MAX_256_BIT;\nconst shl = (shift: bigint, value: bigint): bigint => (value << shift) & MAX_256_BIT;\nconst shr = (shift: bigint, value: bigint): bigint => (value >> shift) & MAX_256_BIT;\nconst sub = (a: bigint, b: bigint): bigint => (a - b) & MAX_256_BIT;\nconst sigext = (byteSize: bigint, value: bigint): bigint => {\n const numBytes = Number(byteSize) + 1;\n const mask = (1n << BigInt(numBytes * 8)) - 1n;\n const signBit = 1n << BigInt(numBytes * 8 - 1);\n const maskedVal = value & mask;\n const extended = maskedVal & signBit ? maskedVal | (~mask & MAX_256_BIT) : maskedVal;\n return extended & MAX_256_BIT;\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__\nconst 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__\nconst rleFwdBytecode = (address: string): string =>\n `0x5f5f5b368110602d575f8083813473${_normHex(address)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;\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 trackedMemSize = 0;\n let mem = new Map<number, bigint>();\n let firstPass = true;\n const getStackIdx = (val: bigint): number => {\n let idx = stack.lastIndexOf(val);\n idx = idx === -1 ? -1 : stack.length - 1 - idx;\n return idx > 15 ? -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 const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n const ctr = <K>(m: Map<K, number>, k: K, delta: number) => m.set(k, (m.get(k) || 0) + delta);\n const inc = <K>(m: Map<K, number>, k: K) => ctr(m, k, 1);\n const pushOp = (op: number, d?: number[] | null) => {\n ops.push(op);\n inc(opFreq, op);\n const imm = d ?? null;\n data.push(imm);\n inc(dataFreq, imm);\n };\n const pushS = (v: bigint, freq: number = 1) => {\n stack.push(v);\n ctr(stackFreq, v, freq);\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 === 0x36) {\n pushS(32n, 0);\n } else if (op === 0x59) {\n pushS(BigInt(trackedMemSize), 0);\n } else if (op === 0x0b) {\n // SIGNEXTEND\n const [byteSize, val] = pop2();\n pushS(sigext(byteSize, val), 1);\n } else if (op === 0x19) {\n // NOT\n const val = stack.pop()!;\n pushS(not(val), 0);\n } else if (op === 0x18) {\n // XOR\n const [a, b] = pop2();\n pushS(xor(a, b), 1);\n } else if (op === 0x16) {\n // AND\n const [a, b] = pop2();\n pushS(and(a, b), 1);\n } else if (op === 0x03) {\n // SUB\n const [a, b] = pop2();\n pushS(sub(a, b), 1);\n } else if (op === 0x1b) {\n // SHL\n let [shift, val] = pop2();\n pushS(shl(shift, val), 1);\n } else if (op === 0x1c) {\n // SHR\n let [shift, val] = pop2();\n pushS(shr(shift, val), 1);\n } else if (op === 0x17) {\n // OR\n let [a, b] = pop2();\n pushS(or(a, b), 1);\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 if (v == 224n) {\n pushS(v, 0);\n pushOp(0x30); // ADDRESS\n return;\n }\n if (v == 32n) {\n pushS(v, 0);\n pushOp(0x36); // ADDRESS\n return;\n }\n if (v === BigInt(trackedMemSize)) {\n pushS(v, 0);\n pushOp(0x59); // MemSize\n return;\n }\n const idx = getStackIdx(v);\n if (idx !== -1 && op != 0x5f) {\n let pushCtr = firstPass ? 1 : -1;\n pushS(v, pushCtr);\n pushOp(128 + idx);\n return;\n }\n if (v == MAX_256_BIT) {\n pushS(v);\n pushOp(0x5f); // 0\n pushOp(0x19); // NOT\n return;\n }\n pushS(v);\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 & MAX_256_BIT);\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, imm || null);\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 == 32n) return addOp(0x36);\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 pushN(1n);\n // First pass: decide how to build each 32-byte word without emitting bytecode\n const _stack = [1n, 32n, 224n];\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 // 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 let literalVal = 0n;\n for (const b of literal) literalVal = (literalVal << 8n) | BigInt(b);\n const baseBytes = Math.ceil(Math.log2(base + 1) / 8);\n const wordHex = _uint8ArrayToHex(word);\n const shlCost = estShlCost(seg);\n\n const inStack = _stack.includes(literalVal);\n if (inStack) {\n emitPushB(literal);\n emitPushN(base);\n emitOp(0x52); // MSTORE\n continue;\n }\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 const byte8s = seg.every(({ s, e }) => s === e);\n const byte8sCost = seg.length * 3; // each: PUSH1 (value), PUSH1 (offset), MSTORE8\n if (inStack) {\n emitPushB(literal);\n } else {\n // Aggregate all costs\n let bestCost = literalCost;\n let bestEmit: (() => void) | null = () => {\n emitPushB(literal);\n };\n if (literalVal == MAX_256_BIT) {\n bestCost = 2;\n bestEmit = () => {\n emitPushN(notVal);\n emitOp(0x19);\n };\n }\n // Try NOT: PUSH<n> ~val, NOT\n const notVal = not(literalVal);\n let notBytes = 0;\n let tmp = notVal;\n while (tmp > 0n) {\n ++notBytes;\n tmp >>= 8n;\n }\n notBytes = 1 + notBytes;\n if (notBytes === 0) notBytes;\n const notCost = notBytes + 1; // PUSH<n> + NOT\n if (notCost < bestCost) {\n bestCost = notCost;\n bestEmit = () => {\n emitPushN(notVal);\n emitOp(0x19);\n };\n }\n\n // Try SUB: PUSH1 0, PUSH<n> val, SUB\n const subVal = sub(0n, literalVal);\n let subBytes = 0;\n tmp = subVal;\n while (tmp > 0n) {\n ++subBytes;\n tmp >>= 8n;\n }\n if (subBytes === 0) subBytes = 1;\n if (_stack.includes(subVal)) subBytes = 1;\n const subCost = 1 + (1 + subBytes) + 1; // PUSH0 + PUSH<n> + SUB\n if (subCost < bestCost) {\n bestCost = subCost;\n bestEmit = () => {\n emitPushN(0);\n emitPushN(subVal);\n emitOp(0x03);\n };\n }\n\n // Try SIGNEXTEND: PUSH<n> truncated, PUSH1 byteSize, SIGNEXTEND\n for (let numBytes = 1; numBytes < literal.length; numBytes++) {\n const mask = (1n << BigInt(numBytes * 8)) - 1n;\n const truncated = literalVal & mask;\n const extended = sigext(BigInt(numBytes - 1), truncated);\n if (extended === literalVal && (truncated & (1n << BigInt(numBytes * 8 - 1))) !== 0n) {\n let trueByteCost = 1 + numBytes;\n if (_stack.includes(BigInt(extended))) trueByteCost = 1;\n let signCost = trueByteCost + (1 + 1) + 1; // PUSH<n> + PUSH1 + SIGNEXTEND\n if (signCost < bestCost) {\n bestCost = signCost;\n bestEmit = () => {\n emitPushN(truncated);\n emitPushN(numBytes - 1);\n emitOp(0x0b);\n };\n }\n break;\n }\n }\n\n // Try SHIFT+NOT: PUSH<n> val, PUSH1 shift, SHL, NOT\n for (let shiftBits = 8; shiftBits <= 248; shiftBits += 8) {\n const shifted = shr(BigInt(shiftBits), literalVal);\n if (shifted === 0n) break;\n\n const notShifted = not(shifted);\n const reconstructed = shl(BigInt(shiftBits), notShifted);\n\n if (reconstructed === literalVal) {\n let shiftedBytes = 0;\n let tmpShifted = notShifted;\n while (tmpShifted > 0n) {\n ++shiftedBytes;\n tmpShifted >>= 8n;\n }\n if (shiftedBytes === 0) shiftedBytes = 1;\n const shiftNotCost = 1 + shiftedBytes + 2 + 1 + 1; // PUSH<n> + PUSH1 + SHL + NOT\n if (shiftNotCost < bestCost) {\n bestCost = shiftNotCost;\n bestEmit = () => {\n emitPushN(notShifted);\n emitPushN(shiftBits);\n emitOp(0x1b); // SHL\n emitOp(0x19); // NOT\n };\n }\n }\n }\n\n if (byte8s && byte8sCost < bestCost && byte8sCost <= shlCost) {\n for (const { s } of seg) {\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n continue; // Skip the single MSTORE at the end\n } else if (shlCost < bestCost) {\n // Use SHL/OR\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 } else {\n bestEmit!();\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 // Pre 2nd pass. Push most frequent literals into stack.\n Array.from(stackFreq.entries())\n .filter(([val, freq]) => freq > 1 && val > 1n && val !== 32n && val !== 224n)\n .sort((a, b) => stackCnt.get(b[0])! - stackCnt.get(a[0])!)\n .filter(([val, _]) => {\n return typeof val === 'number' ? BigInt(val) : val <= MAX_128_BIT;\n })\n .slice(0, 15)\n .forEach(([val, _]) => {\n pushN(val);\n });\n pushN(1n);\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 //\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)) + '345f355af13d5f5f3e3d5ff3';\n};\n\nconst DECOMPRESSOR_ADDRESS = '0x00000000000000000000000000000000000000e0';\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 *\n * Only applies compression to calls that:\n * - target the latest block ID\n * - have no state overrides\n * - have a target address and calldata\n * - have no other properties (nonce, gas, etc.)\n *\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 { method, params } = payload;\n if (method && method !== 'eth_call') return payload;\n const txObj = params?.[0] || payload;\n const blockParam = params?.[1];\n const overrides = params?.[2];\n\n // Validation\n if (\n (blockParam && blockParam !== 'latest') ||\n (overrides && Object.keys(overrides).length > 0) ||\n !txObj?.to ||\n !txObj?.data ||\n Object.keys(txObj).some((k) => !['to', 'data', 'from'].includes(k))\n ) {\n return payload;\n }\n\n const originalSize = txObj.data.length;\n if (originalSize < MIN_BODY_SIZE) return payload;\n\n const inputData = '0x' + _normHex(txObj.data);\n const to = txObj.to;\n\n // Determine compression method and generate bytecode/calldata\n let bytecode: string;\n let calldata: string;\n\n if (alg === 'jit' || (!alg && (originalSize < 3000 || originalSize >= 8000))) {\n bytecode = _jitDecompressor(inputData);\n calldata = '0x' + _normHex(to).padStart(64, '0');\n } else {\n // Need FLZ and/or CD compression\n const flzData = alg === 'flz' || !alg ? LibZip.flzCompress(inputData) : null;\n const cdData = alg === 'cd' || (!alg && flzData) ? LibZip.cdCompress(inputData) : null;\n\n // Pick the best or requested one\n const useFlz =\n alg === 'flz' || (!alg && flzData && (!cdData || flzData.length < cdData.length));\n\n if (useFlz) {\n calldata = flzData!;\n bytecode = flzFwdBytecode(to);\n } else {\n calldata = cdData!;\n bytecode = rleFwdBytecode(to);\n }\n }\n\n // Skip if not beneficial\n if (bytecode.length + calldata.length >= originalSize) return payload;\n\n return {\n ...payload,\n params: [\n { ...txObj, to: DECOMPRESSOR_ADDRESS, data: calldata },\n blockParam || 'latest',\n { ...overrides, [DECOMPRESSOR_ADDRESS]: { code: bytecode } },\n ],\n };\n};\n", "export const MIN_BODY_SIZE = 1150;\n\nconst _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 const bodyStr = typeof init?.body === 'string' ? (init.body as string) : null;\n\n if (supported && supported !== -1 && bodyStr && bodyStr.length >= MIN_BODY_SIZE) {\n const compressed = await new Response(\n new Blob([bodyStr])\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", "import zlib from 'node:zlib';\n\n// Polyfill for CompressionStream/DecompressionStream in older versions of Node.js & Bun\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"],
5
- "mappings": "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",
6
- "names": ["jit_compressor_exports", "__export", "compress_call", "import_solady", "MAX_128_BIT", "MAX_256_BIT", "_normHex", "_hexToUint8Array", "_uint8ArrayToHex", "not", "and", "or", "xor", "shl", "shr", "sub", "sigext", "flzFwdBytecode", "rleFwdBytecode", "_jitDecompressor", "DECOMPRESSOR_ADDRESS", "init_jit_compressor", "__esmMin", "hex", "normalized", "len", "bytes", "i", "a", "b", "shift", "value", "byteSize", "numBytes", "mask", "signBit", "maskedVal", "address", "calldata", "originalBuf", "padding", "buf", "n", "ops", "data", "stack", "trackedMemSize", "mem", "firstPass", "getStackIdx", "val", "idx", "opFreq", "dataFreq", "stackFreq", "wordCache", "wordCacheCost", "roundUp32", "x", "pushCounter", "stackCnt", "pop2", "ctr", "m", "k", "delta", "inc", "pushOp", "op", "d", "imm", "pushS", "v", "freq", "trackMem", "offset", "size", "addOp", "_", "opcode", "pushN", "pushB", "cntWords", "wordHex", "estShlCost", "seg", "cost", "first", "s", "e", "plan", "emitPushN", "emitPushB", "emitOp", "o", "_stack", "base", "word", "literal", "literalCost", "literalVal", "baseBytes", "shlCost", "inStack", "reuseCost", "byte8s", "byte8sCost", "bestCost", "bestEmit", "notVal", "notBytes", "tmp", "notCost", "subVal", "subBytes", "subCost", "truncated", "extended", "trueByteCost", "signCost", "shiftBits", "shifted", "notShifted", "shiftedBytes", "tmpShifted", "shiftNotCost", "suffix0s", "step", "out", "payload", "alg", "method", "params", "txObj", "blockParam", "overrides", "originalSize", "inputData", "to", "bytecode", "flzData", "cdData", "compressModule", "input", "init", "transformPayload", "url", "cached", "_sup_enc", "supported", "parsed", "next", "bodyStr", "compressed", "response", "encodings", "e", "_enc", "MIN_BODY_SIZE", "compressModuleWithJIT", "init_index", "__esmMin", "compress_call", "index_node_exports", "__export", "MIN_BODY_SIZE", "compressModule", "compressModuleWithJIT", "__toCommonJS", "import_node_zlib", "init_index", "make", "ctx", "handle", "chunk", "ctrl", "format", "zlib"]
3
+ "sources": ["../../src/index.node.ts", "../../src/index.ts"],
4
+ "sourcesContent": ["import zlib from 'node:zlib';\n\n// Polyfill for CompressionStream/DecompressionStream in older versions of Node.js & Bun\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", "export const MIN_BODY_SIZE = 1150;\n\nconst _hasCS = typeof CompressionStream !== 'undefined';\nconst _cache = new Map<string, string | -1>();\nconst _enc = ['gzip', 'deflate'] as const;\ntype SupportedEncoding = (typeof _enc)[number];\n\nexport type PayloadTransform = (payload: unknown) => unknown;\nexport type CompressionMode = 'passive' | 'proactive' | 'gzip' | 'deflate' | PayloadTransform;\n\n/**\n * @param input - URL or Request\n * @param init - Request options\n * @param mode - Compression mode:\n * - 'passive' (default): discover support via Accept-Encoding header first\n * - 'proactive': compress with gzip first, adjust if server rejects\n * - 'gzip' | 'deflate': use specified encoding directly (known support)\n * - PayloadTransform function: transform payload, skip HTTP compression\n */\nexport async function compressModule(\n input: string | URL | Request,\n init?: RequestInit,\n mode?: CompressionMode,\n): Promise<Response> {\n const req = input instanceof Request ? input : null;\n const url =\n typeof input === 'string' ? input : input instanceof Request ? input.url : input.toString();\n const bodyStr = typeof init?.body === 'string' ? init.body : null;\n\n // Custom transform: apply and skip HTTP compression\n if (typeof mode === 'function') {\n if (req && !init) return fetch(req);\n let body = init?.body;\n if (bodyStr)\n try {\n const next = mode(JSON.parse(bodyStr));\n if (next !== undefined) body = JSON.stringify(next);\n } catch {}\n return fetch(req ?? url, { ...init, body });\n }\n\n const cached = _cache.get(url);\n const known = mode === 'gzip' || mode === 'deflate';\n const encoding = !_hasCS\n ? null\n : known\n ? (mode as SupportedEncoding)\n : mode === 'proactive'\n ? cached === -1\n ? null\n : (cached ?? 'gzip')\n : typeof cached === 'string'\n ? cached\n : null;\n\n const shouldCompress = !!encoding && !!bodyStr && bodyStr.length >= MIN_BODY_SIZE;\n const opts: RequestInit = { ...init, priority: 'high' as RequestPriority };\n const headers = new Headers(opts.headers);\n if (shouldCompress) {\n opts.body = await new Response(\n new Blob([bodyStr!])\n .stream()\n .pipeThrough(new CompressionStream(encoding as CompressionFormat)),\n ).blob();\n headers.set('Content-Encoding', encoding);\n }\n opts.headers = headers;\n\n const response = await fetch(req ?? url, opts);\n\n // Cache discovery for passive/proactive (not known modes)\n if (!known && cached === undefined) {\n const header = response.headers.get('Accept-Encoding');\n const discovered =\n header\n ?.split(',')\n .map((e) => e.trim())\n .find((e): e is SupportedEncoding => _enc.includes(e as SupportedEncoding)) ?? -1;\n _cache.set(\n url,\n mode === 'proactive' && shouldCompress ? (response.ok ? encoding! : discovered) : discovered,\n );\n }\n\n return response;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["index_node_exports", "__export", "MIN_BODY_SIZE", "compressModule", "__toCommonJS", "import_node_zlib", "MIN_BODY_SIZE", "_hasCS", "_cache", "_enc", "compressModule", "input", "init", "mode", "req", "url", "bodyStr", "body", "next", "cached", "known", "encoding", "shouldCompress", "opts", "headers", "response", "discovered", "e", "make", "ctx", "handle", "chunk", "ctrl", "format", "zlib"]
7
7
  }