eth-compress 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +76 -26
- package/_cjs/jit-compressor.cjs +1 -1
- package/_cjs/jit-compressor.cjs.map +3 -3
- package/_esm/jit-compressor.js +1 -1
- package/_esm/jit-compressor.js.map +3 -3
- package/_types/compiler/jit.d.ts +2 -1
- package/_types/compiler/jit.d.ts.map +1 -1
- package/_types/contracts.d.ts +5 -14
- package/_types/contracts.d.ts.map +1 -1
- package/_types/jit-compressor.d.ts +2 -1
- package/_types/jit-compressor.d.ts.map +1 -1
- package/jit-compressor.ts +21 -7
- package/package.json +16 -12
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -95,59 +95,109 @@ const client = createPublicClient({
|
|
|
95
95
|
|
|
96
96
|
----
|
|
97
97
|
|
|
98
|
-
###
|
|
98
|
+
### Calldata compression for `eth_call`
|
|
99
99
|
|
|
100
|
-
Eligible `eth_call`s are
|
|
100
|
+
Eligible `eth_call`s are routed through a transient decompressor contract (injected via `stateDiff`).
|
|
101
101
|
|
|
102
102
|
```ts
|
|
103
103
|
import { compress_call } from 'eth-compress/compressor';
|
|
104
104
|
|
|
105
105
|
const payload = {
|
|
106
106
|
method: 'eth_call',
|
|
107
|
-
params: [
|
|
108
|
-
{
|
|
109
|
-
to: '0x…',
|
|
110
|
-
data: '0x…',
|
|
111
|
-
},
|
|
112
|
-
'latest',
|
|
113
|
-
],
|
|
107
|
+
params: [{ to: '0x…', data: '0x…' }, 'latest'],
|
|
114
108
|
};
|
|
115
109
|
|
|
116
110
|
const compressedPayload = compress_call(payload);
|
|
117
111
|
```
|
|
118
112
|
|
|
113
|
+
#### Signature
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
compress_call(payload, alg?, forward?, revert?, clean_env?)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
| Param | Type | Default | Description |
|
|
120
|
+
|---|---|---|---|
|
|
121
|
+
| `payload` | `any` | — | JSON-RPC `eth_call` payload |
|
|
122
|
+
| `alg` | `'jit' \| 'flz' \| 'cd'` | auto | Force a specific compression algorithm |
|
|
123
|
+
| `forward` | `ForwardMode` | `'call'` | How the decompressor forwards to the target contract |
|
|
124
|
+
| `revert` | `boolean` | `false` | If `true`, output data is returned via `REVERT` instead of `RETURN` |
|
|
125
|
+
| `clean_env` | `boolean` | `false` | JIT-only: disable environment opcode substitutions (`SELFBALANCE`, `ADDRESS`, `CALLER`, `CALLDATASIZE`) |
|
|
126
|
+
|
|
127
|
+
#### Forward modes
|
|
128
|
+
|
|
129
|
+
`ForwardMode` controls what the generated decompressor bytecode does after decompression. All three algorithms (JIT, FLZ, CD) support the same forward modes.
|
|
130
|
+
|
|
131
|
+
| `forward` | `revert` | Behavior |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| `'call'` | `false` | `CALL` target contract, `RETURN` its returndata |
|
|
134
|
+
| `'call'` | `true` | `CALL` target contract, `REVERT` with its returndata |
|
|
135
|
+
| `'staticcall'` | `false` | `STATICCALL` target, `RETURN` its returndata |
|
|
136
|
+
| `'staticcall'` | `true` | `STATICCALL` target, `REVERT` with its returndata |
|
|
137
|
+
| `'delegatecall'` | `false` | `DELEGATECALL` target, `RETURN` its returndata |
|
|
138
|
+
| `'delegatecall'` | `true` | `DELEGATECALL` target, `REVERT` with its returndata |
|
|
139
|
+
| `'none'` | `false` | `RETURN` the decompressed data directly (no forwarding) |
|
|
140
|
+
| `'none'` | `true` | `REVERT` with the decompressed data directly (no forwarding) |
|
|
141
|
+
|
|
142
|
+
When `forward` is `'none'`, `clean_env` is forced on — environment opcode substitutions are disabled since there is no forwarded call context.
|
|
143
|
+
|
|
144
|
+
#### Examples
|
|
145
|
+
|
|
146
|
+
Default (CALL + RETURN):
|
|
147
|
+
```ts
|
|
148
|
+
compress_call(payload);
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
STATICCALL forwarding with FLZ:
|
|
152
|
+
```ts
|
|
153
|
+
compress_call(payload, 'flz', 'staticcall');
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
DELEGATECALL, revert with returndata:
|
|
157
|
+
```ts
|
|
158
|
+
compress_call(payload, undefined, 'delegatecall', true);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Get decompressed calldata back via REVERT (useful as initcode or for off-chain extraction):
|
|
162
|
+
```ts
|
|
163
|
+
compress_call(payload, 'jit', 'none', true);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
#### Algorithm selection
|
|
167
|
+
|
|
119
168
|
`compress_call` can be passed directly to `compressModule` as a custom transform. For eligible `eth_call`s, it chooses between:
|
|
120
169
|
|
|
121
|
-
- **JIT**: Compiles
|
|
122
|
-
- **FLZ
|
|
170
|
+
- **JIT**: Compiles a one-off decompressor contract that reconstructs calldata word-by-word.
|
|
171
|
+
- **FLZ**: Uses `LibZip.flzCompress` from `solady` for FastLZ (LZ77) compression.
|
|
172
|
+
- **CD**: Uses `LibZip.cdCompress` from `solady` for calldata run-length encoding.
|
|
123
173
|
|
|
124
|
-
- **Size gating
|
|
125
|
-
- `< 1150 bytes
|
|
174
|
+
- **Size gating**:
|
|
175
|
+
- `< 1150 bytes`: no compression.
|
|
126
176
|
- `≥ 1150 bytes`: compression considered.
|
|
127
|
-
-
|
|
128
|
-
- `~3000
|
|
177
|
+
- `< ~3000 or ≥ ~8000 bytes`: JIT preferred (best ratio at small and large sizes).
|
|
178
|
+
- `~3000 – ~8000 bytes`: best of JIT, FLZ, and CD is picked.
|
|
129
179
|
|
|
130
180
|
- **Algorithm choice**:
|
|
131
181
|
- For mid-sized payloads, FLZ and CD are tried and the smaller output is chosen.
|
|
132
182
|
- For larger ones, JIT is used directly, prioritizing gas efficiency.
|
|
133
|
-
- The thresholds are
|
|
134
|
-
aiming to keep the total request size within the [Ethernet MTU](https://en.wikipedia.org/wiki/Maximum_transmission_unit).
|
|
183
|
+
- The thresholds are tuned for total request size, aiming for the [Ethernet MTU](https://en.wikipedia.org/wiki/Maximum_transmission_unit).
|
|
135
184
|
|
|
136
185
|
### Important considerations
|
|
137
186
|
|
|
138
|
-
The
|
|
187
|
+
The calldata compressor is **experimental** and intended for auxiliary/bulk dApp read-only `eth_call`s. Use two viem clients to separate concerns.
|
|
139
188
|
|
|
140
189
|
### 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 |
|
|
146
190
|
|
|
147
|
-
|
|
191
|
+
| Tx Size Range | # Txns | Avg. Tx Size | JIT Ratio | FLZ Ratio | CD Ratio | JIT Gas | FLZ Gas | CD Gas |
|
|
192
|
+
|---|---|---|---|---|---|---|---|---|
|
|
193
|
+
| **> 8 KB** | 129 | 14.92 kb | **2.99x** | 3.63x | 2.90x | **8.02k** | 211.87k | 78.02k |
|
|
194
|
+
| **3–8 KB** | 260 | 4.82 kb | **2.79x** | 2.61x | 2.29x | **4.45k** | 89.41k | 29.40k |
|
|
195
|
+
| **1.15–3 KB** | 599 | 2.02 kb | **2.99x** | 1.99x | 1.80x | **3.38k** | 46.16k | 13.62k |
|
|
196
|
+
|
|
197
|
+
<sub>Excludes txns not compressible to <70% of its original size.</sub>
|
|
148
198
|
|
|
149
199
|
### Compression flavors
|
|
150
|
-
- **JIT calldata compiler
|
|
200
|
+
- **JIT calldata compiler**: Views calldata as a zero‑initialized memory image and synthesizes bytecode that rebuilds it word-by-word in-place.
|
|
151
201
|
|
|
152
202
|
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.
|
|
153
203
|
|
|
@@ -155,5 +205,5 @@ The JIT calldata compressor is **experimental** and intended for auxiliary/bulk
|
|
|
155
205
|
|
|
156
206
|
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.
|
|
157
207
|
|
|
158
|
-
|
|
208
|
+
- **FastLZ (FLZ)** and **calldata-RLE (CD)** 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 compiled from pure Yul. Both support all forwarding modes (`call`, `staticcall`, `delegatecall`) and the `revert` flag, with the target address patched into the bytecode at generation time.
|
|
159
209
|
|
package/_cjs/jit-compressor.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var it=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var Nt=Object.getOwnPropertyNames;var Ft=Object.prototype.hasOwnProperty;var Ot=(r,e)=>{for(var u in e)it(r,u,{get:e[u],enumerable:!0})},Tt=(r,e,u,y)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Nt(e))!Ft.call(r,a)&&a!==u&&it(r,a,{get:()=>e[a],enumerable:!(y=Lt(e,a))||y.enumerable});return r};var jt=r=>Tt(it({},"__esModule",{value:!0}),r);var $t={};Ot($t,{compress_call:()=>Zt});module.exports=jt($t);var mt=require("solady");var St=(1n<<128n)-1n,k=(1n<<256n)-1n;var et=r=>~r&k;var _t=(r,e)=>r&e&k,Bt=(r,e)=>(r|e)&k,It=(r,e)=>(r^e)&k,Mt=(r,e)=>r+e&k,ct=(r,e)=>r-e&k,ft=(r,e)=>e<<r&k,at=(r,e)=>e>>r&k,lt=(r,e)=>{if(r>=31n)return e&k;let u=Number((r+1n)*8n);return BigInt.asUintN(256,BigInt.asIntN(u,e))};var j=r=>(r.charCodeAt(0)===48&&(r.charCodeAt(1)|32)===120?r.slice(2):r).toLowerCase(),Vt=Array.from({length:256},(r,e)=>e.toString(16).padStart(2,"0")),Ct=(()=>{let r=new Int8Array(103).fill(-1);for(let e=0;e<10;e++)r[48+e]=e;for(let e=0;e<6;e++)r[97+e]=10+e;return r})(),vt=r=>{let e=j(r),u=e.length,y=new Uint8Array(u/2);for(let a=0,H=0;a<u;a+=2)y[H++]=Ct[e.charCodeAt(a)]<<4|Ct[e.charCodeAt(a+1)];return y},ut=r=>{let e="";for(let u=0;u<r.length;u++)e+=Vt[r[u]];return e},Et=new Uint8Array(32),Pt=[],Ut=(r,e)=>{let u=j(r),y=vt(u),a=new Uint8Array(e+y.length);a.set(y,e);let H=a.length,A=Math.ceil(H/32),L=A*32;if(H!==L){let i=new Uint8Array(L);i.set(a,0),a=i}let M=new Array(A),C=new Array(A),m=new Map,d=null,b=i=>{let f=i<<5;return a.subarray(f,f+32)};for(let i=0;i<A;i++){let f=i<<5,x=b(i),W=ut(x);C[i]=W;let V=m.get(W),rt=d===W;if(V)V[0]+=1,rt||(V[1]+=1),V[3]=i,V[5]=f;else{let _=[1,1,i,i,f,f,-1];m.set(W,_)}d=W;let Y=[];for(let _=0;_<32;){for(;_<32&&x[_]===0;)++_;if(_>=32)break;let ot=_;for(;_<32&&x[_]!==0;)++_;Y.push(ot<<8|_-1)}M[i]=Y}for(let i of m.values()){let x=(i[4]===0?0:32-Math.clz32(i[4])+7>>3)+3;i[6]=32>x?x:-1}let U=i=>i<0||i>=A?Et:b(i),N=i=>i<0||i>=A?Pt:M[i],F=(i,f)=>{if(f<=0)return new Uint8Array(0);let x=new Uint8Array(f);if(i<0||i>=H)return x;let W=Math.min(i+f,H);return x.set(a.subarray(i,W),0),x},S=i=>F(i,32);return{hex:u,buffer:a,roundedLength:L,padding:e,dataLength:y.length,wordCount:A,wordHexes:C,wordStats:m,getWord:U,getSegments:N,mload:S,slice:F}};var bt="0x00000000000000000000000000000000000000e0",R=r=>r.padStart(64,"0"),qt=R("0"),Xt=R("20"),Rt=R("e0"),Kt="345f355af13d5f5f3e3d5ff3",gt=function(r,e,u){let y=u?j(u):null,a=28,H=null,A=0,L=j(e).padStart(16,"0"),M=y?BigInt("0x"+y):96n,C=2n,m=[],d=[],b=[],U=0,N=[],F=!0,S=Ut(r,a),{wordCount:i}=S,f=224n,x=new Map,W=Rt,V=R(y??M.toString(16)),rt=R(L);for(let[t,o]of S.wordStats){let n=o[0];t===qt||t===Xt||t===W||t===V||t===rt||n>A&&(A=n,H=t)}H&&(C=BigInt("0x"+H));let Y=t=>t+31&-32,_=t=>{for(let o=b.length-1,n=0;n<16&&o>=0;--o,++n)if(b[o]===t)return n;return-1},ot=(t,o,n)=>t.set(o,(t.get(o)||0)+n),O=(t,o)=>{m.push(t),d.push(o??null)},l=(t,o=1)=>{b.push(t),o!==0&&ot(x,t,o)},T=()=>[b.pop(),b.pop()],dt=(t,o)=>{U=Y(t+o)},P=(t,o)=>{if(t===128&&l(b[b.length-1],F?0:1),t===80&&b.pop(),t===71&&l(C,0),t===48&&l(f,0),t===51&&l(M,0),t===54&&l(32n,0),t===89&&l(BigInt(U),0),t===11){let[n,s]=T();l(lt(n,s),1)}if(t===25&&l(et(b.pop()),0),t===24){let[n,s]=T();l(It(n,s),1)}if(t===22){let[n,s]=T();l(_t(n,s),1)}if(t===23){let[n,s]=T();l(Bt(n,s),1)}if(t===1){let[n,s]=T();l(Mt(n,s),1)}if(t===3){let[n,s]=T();l(ct(s,n),1)}if(t===27){let[n,s]=T();l(ft(n,s),1)}if(t===28){let[n,s]=T();l(at(n,s),1)}if(t>=96&&t<=127||t===95){let n=0n;for(let g of o||[])n=n<<8n|BigInt(g);if(n===C){l(n,0),O(71);return}if(n===f){l(n,0),O(48);return}if(n===M){l(n,0),O(51);return}if(n===32n){l(n,0),O(54);return}if(n===BigInt(U)&&n!=0n){l(n,0),O(89);return}let s=_(n);if(s!=-1&&t!=95){l(n,F?1:0),O(128+s);return}if(n===k){l(n,0),O(95),O(25);return}l(n,1),O(t,o||null);return}if(t===81&&l(N[Number(b.pop())>>>5]??0n,0),t===82){let[n,s]=T(),g=Number(n);N[g>>>5]=s&k,dt(g,32)}if(t===83){let[n,s]=T();dt(Number(n),1)}O(t,o||null)},G=t=>P(t),xt=t=>{if(t===0n)return 0;let o=0,n=t<0n?-t:t;for(;n>0n;)++o,n>>=8n;return o},q=t=>t===0n?1:1+xt(t),K=t=>{let o=typeof t=="bigint"?t:BigInt(t);if(o>0n&&o===BigInt(U))return P(89);if(o===32n)return P(54);if(o===0n)return P(95);let n=o,s=xt(n),g=new Uint8Array(s);for(let D=s-1;D>=0;--D)g[D]=Number(n&0xffn),n>>=8n;return P(95+s,g)},ht=t=>P(95+t.length,t),J=[],B=t=>{J.push({t:"num",v:t}),K(t)},yt=t=>{J.push({t:"bytes",b:t}),ht(t)},p=t=>{J.push({t:"op",o:t}),G(t)},kt=t=>{let o=0,n=!0;for(let s=0;s<t.length;s++){let g=t[s],D=g>>>8,w=g&255;o+=1+(w-D+1),31-w>0&&(o+=3),n||(o+=1),n=!1}return o},pt=(t,o)=>{let n=t.subarray(o[0]>>>8),s=0n;for(let c=0;c<n.length;c++)s=s<<8n|BigInt(n[c]);let g=n.length+1,D=kt(o),w=g,v=()=>yt(n),tt=et(s),nt=q(tt)+1;nt<w&&(w=nt,v=()=>{B(tt),p(25)});let Z=ct(0n,s),$=q(Z)+2;$<w&&(w=$,v=()=>{B(0),B(Z),p(3)});for(let c=1;c<n.length;c++){let h=(1n<<BigInt(c*8))-1n,I=s&h;if(lt(BigInt(c-1),I)===s&&(I&1n<<BigInt(c*8-1))!==0n){let E=q(I)+3;E<w&&(w=E,v=()=>{B(I),B(c-1),p(11)});break}}for(let c=8;c<=248;c+=8){let h=at(BigInt(c),s);if(h===0n)break;let I=et(h);if(ft(BigInt(c),I)===s){let E=q(I)+q(BigInt(c))+2;E<w&&(w=E,v=()=>{B(I),B(c),p(27),p(25)})}}return D<w&&(w=D,v=()=>{let c=!0;for(let h=0;h<o.length;h++){let I=o[h],X=I>>>8,E=I&255,At=31-E;yt(t.subarray(X,E+1)),At>0&&(B(At*8),p(27)),c||p(23),c=!1}}),{literal:n,literalVal:s,bestCost:w,bestEmit:v,literalCost:g,shlCost:D}},z=0;for(;z<i;){let t=z*32,o=S.getWord(z),n=S.getSegments(z);if(!n.length){++z;continue}let s=S.wordHexes[z],g=z+1;for(;g<i&&!(!S.getSegments(g).length||S.wordHexes[g]!==s);)++g;let D=g-z;if(D>=2){let c=g-1,{bestEmit:h}=pt(o,n);h(),p(128),B(t),p(82);for(let X=1;X<D;X++)p(128),p(89),p(82);let I=S.wordStats.get(s);I&&I[3]<=c&&p(80),z=g;continue}let{literalCost:w,shlCost:v,bestCost:tt,bestEmit:nt}=pt(o,n);if(w>8){let c=S.wordStats.get(s);if(c&&c[6]!==-1&&z>c[2]){let h=c[4]===0?0:32-Math.clz32(c[4])+7>>3;if(w>c[6]+h){B(c[4]),p(81),B(t),p(82),++z;continue}}}let Z=!0;for(let c=0;c<n.length;c++){let h=n[c];if(h>>>8!==(h&255)){Z=!1;break}}let $=n.length*3;if(Z&&$<tt&&$<=v){for(let c=0;c<n.length;c++){let h=n[c]>>>8;B(o[h]),B(t+h),p(83)}++z;continue}nt(),B(t),p(82),++z}m=[],d=[],b=[],U=0,N=[],F=!1;let Q=[];for(let[t,o]of x)if(o>1&&t!==0n&&t!==32n&&t!==C&&t!==f&&t!==M&&t<=St){let n=q(t),s=o*(n-1)-n;s>0&&Q.push({val:t,uses:o,net:s,p:n})}Q.sort((t,o)=>o.net-t.net||o.uses-t.uses||t.p-o.p);for(let t=0;t<15&&t<Q.length;++t)K(Q[t].val);for(let t of J)t.t==="num"?K(t.v):t.t==="bytes"?ht(t.b):t.t==="op"&&G(t.o);G(95),G(95),K(S.dataLength),K(a);let wt=m.length;for(let t=0;t<m.length;++t)m[t]>=96&&m[t]<=127&&d[t]&&(wt+=d[t].length);let st=new Uint8Array(wt);for(let t=0,o=0;t<m.length;++t)st[o++]=m[t],m[t]>=96&&m[t]<=127&&d[t]&&(st.set(d[t],o),o+=d[t].length);let Ht="0x"+ut(st)+Kt,Dt="0x"+R(L);return{bytecode:Ht,calldata:Dt,to:bt,from:M.toString(16).padStart(40,"0"),balance:C.toString(16)}};var Wt=r=>`0x365f73${j(r)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;var zt=r=>`0x5f5f5b368110602d575f8083813473${j(r)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;var Zt=function(r,e){let{method:u,params:y}=r;if(u&&u!=="eth_call")return r;let a=y?.[0]||r,H=y?.[1],A=y?.[2];if(!a?.to||!a?.data||(()=>{if(A)for(let f in A)return!0;for(let f in a)if(f!=="to"&&f!=="data"&&f!=="from")return!0;return!1})())return r;let L=a.data.length;if(L<1150)return r;let M=a.data,C=a.to,m=a.from,d,b,U,N,F;if(e==="jit"||!e&&(L<3e3||L>=8e3)){let f=gt(M,C,m);d=f.bytecode,b=f.calldata,U=f.to,N=f.from,F=f.balance}else{let f=e?null:gt(M,C,m),x=e==="flz"||!e?mt.LibZip.flzCompress(M):null,W=e==="cd"||!e&&x?mt.LibZip.cdCompress(M):null;e==="flz"||!e&&x&&(!W||x.length<W.length)?(b=x,d=Wt(C)):(b=W,d=zt(C)),U=bt,N=m?j(m).padStart(16,"0"):void 0,F="0",!e&&f&&f.bytecode.length+f.calldata.length<d.length+b.length&&(d=f.bytecode,b=f.calldata,U=f.to,N=f.from,F=f.balance)}if(d.length+b.length>=L)return r;let S={code:d,balance:"0x"+F},i={to:U,data:b};return N&&(i.from="0x"+N),{...r,params:[i,H,{...A,[U]:S}]}};
|
|
1
|
+
var ut=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Kt=Object.getOwnPropertyNames;var Zt=Object.prototype.hasOwnProperty;var Yt=(r,e)=>{for(var a in e)ut(r,a,{get:e[a],enumerable:!0})},vt=(r,e,a,b)=>{if(e&&typeof e=="object"||typeof e=="function")for(let l of Kt(e))!Zt.call(r,l)&&l!==a&&ut(r,l,{get:()=>e[l],enumerable:!(b=Rt(e,l))||b.enumerable});return r};var Gt=r=>vt(ut({},"__esModule",{value:!0}),r);var fn={};Yt(fn,{compress_call:()=>cn});module.exports=Gt(fn);var yt=require("solady");var Ct=(1n<<128n)-1n,W=(1n<<256n)-1n;var ft=r=>~r&W;var Ut=(r,e)=>r&e&W,Wt=(r,e)=>(r|e)&W,Ft=(r,e)=>(r^e)&W,zt=(r,e)=>r+e&W,bt=(r,e)=>r-e&W,dt=(r,e)=>e<<r&W,gt=(r,e)=>e>>r&W,xt=(r,e)=>{if(r>=31n)return e&W;let a=Number((r+1n)*8n);return BigInt.asUintN(256,BigInt.asIntN(a,e))};var P=r=>(r.charCodeAt(0)===48&&(r.charCodeAt(1)|32)===120?r.slice(2):r).toLowerCase(),Jt=Array.from({length:256},(r,e)=>e.toString(16).padStart(2,"0")),kt=(()=>{let r=new Int8Array(103).fill(-1);for(let e=0;e<10;e++)r[48+e]=e;for(let e=0;e<6;e++)r[97+e]=10+e;return r})(),Qt=r=>{let e=P(r),a=e.length,b=new Uint8Array(a/2);for(let l=0,f=0;l<a;l+=2)b[f++]=kt[e.charCodeAt(l)]<<4|kt[e.charCodeAt(l+1)];return b},mt=r=>{let e="";for(let a=0;a<r.length;a++)e+=Jt[r[a]];return e},$t=new Uint8Array(32),tn=[],Ht=(r,e)=>{let a=P(r),b=Qt(a),l=new Uint8Array(e+b.length);l.set(b,e);let f=l.length,u=Math.ceil(f/32),S=u*32;if(f!==S){let i=new Uint8Array(S);i.set(l,0),l=i}let k=new Array(u),T=new Array(u),H=new Map,j=null,F=i=>{let p=i<<5;return l.subarray(p,p+32)};for(let i=0;i<u;i++){let p=i<<5,y=F(i),h=mt(y);T[i]=h;let O=H.get(h),d=j===h;if(O)O[0]+=1,d||(O[1]+=1),O[3]=i,O[5]=p;else{let w=[1,1,i,i,p,p,-1];H.set(h,w)}j=h;let V=[];for(let w=0;w<32;){for(;w<32&&y[w]===0;)++w;if(w>=32)break;let nt=w;for(;w<32&&y[w]!==0;)++w;V.push(nt<<8|w-1)}k[i]=V}for(let i of H.values()){let y=(i[4]===0?0:32-Math.clz32(i[4])+7>>3)+3;i[6]=32>y?y:-1}let D=i=>i<0||i>=u?$t:F(i),I=i=>i<0||i>=u?tn:k[i],A=(i,p)=>{if(p<=0)return new Uint8Array(0);let y=new Uint8Array(p);if(i<0||i>=f)return y;let h=Math.min(i+p,f);return y.set(l.subarray(i,h),0),y},m=i=>A(i,32);return{hex:a,buffer:l,roundedLength:S,padding:e,dataLength:b.length,wordCount:u,wordHexes:T,wordStats:H,getWord:D,getSegments:I,mload:m,slice:A}};var pt="0x00000000000000000000000000000000000000e0",v=r=>r.padStart(64,"0"),nn=v("0"),en=v("20"),rn=v("e0"),on="3d5f5f3e3d5ff3",sn="3d5f5f3e3d5ffd",ht=function(r,e,a,b="call",l=!1,f=!1){let u=a?P(a):null,S=f||b==="none",k=28,T=null,H=0,j=P(e).padStart(16,"0"),F=u?BigInt("0x"+u):96n,D=2n,I=[],A=[],m=[],i=0,p=[],y=!0,h=Ht(r,k),{wordCount:O}=h,d=224n,V=new Map,w=rn,nt=v(u??F.toString(16)),et=v(j);for(let[t,o]of h.wordStats){let n=o[0];t===nn||t===en||t===w||t===nt||t===et||n>H&&(H=n,T=t)}T&&(D=BigInt("0x"+T));let rt=t=>t+31&-32,Z=t=>{for(let o=m.length-1,n=0;n<16&&o>=0;--o,++n)if(m[o]===t)return n;return-1},jt=(t,o,n)=>t.set(o,(t.get(o)||0)+n),N=(t,o)=>{I.push(t),A.push(o??null),at+=BigInt(1+(t>=96&&t<=127?t-95:0))},g=(t,o=1)=>{m.push(t),o!==0&&jt(V,t,o)},E=()=>[m.pop(),m.pop()],St=(t,o)=>{i=rt(t+o)},at=0n,G=(t,o)=>{if(t===128&&g(m[m.length-1],y?0:1),t===80&&m.pop(),t===71&&g(D,0),t===48&&g(d,0),t===51&&g(F,0),t===54&&g(32n,0),t===89&&g(BigInt(i),0),t===11){let[n,s]=E();g(xt(n,s),1)}if(t===25&&g(ft(m.pop()),0),t===24){let[n,s]=E();g(Ft(n,s),1)}if(t===22){let[n,s]=E();g(Ut(n,s),1)}if(t===23){let[n,s]=E();g(Wt(n,s),1)}if(t===1){let[n,s]=E();g(zt(n,s),1)}if(t===3){let[n,s]=E();g(bt(s,n),1)}if(t===27){let[n,s]=E();g(dt(n,s),1)}if(t===28){let[n,s]=E();g(gt(n,s),1)}if(t>=96&&t<=127||t===95){let n=0n;for(let x of o||[])n=n<<8n|BigInt(x);if(!S){if(n===D){g(n,0),N(71);return}if(n===d){g(n,0),N(48);return}if(n===F){g(n,0),N(51);return}if(n===32n){g(n,0),N(54);return}}if(n===BigInt(i)&&n!=0n){g(n,0),N(89);return}let s=Z(n);if(s!=-1&&t!=95){g(n,y?1:0),N(128+s);return}if(!y&&t!==95&&n===at){g(n,0),N(88);return}if(n===W){g(n,0),N(95),N(25);return}g(n,1),N(t,o||null);return}if(t===81&&g(p[Number(m.pop())>>>5]??0n,0),t===82){let[n,s]=E(),x=Number(n);p[x>>>5]=s&W,St(x,32)}if(t===83){let[n,s]=E();St(Number(n),1)}N(t,o||null)},J=t=>G(t),At=t=>{if(t===0n)return 0;let o=0,n=t<0n?-t:t;for(;n>0n;)++o,n>>=8n;return o},R=t=>t===0n||t===1n||t!==0n&&t===BigInt(i)?1:t===W?2:1+At(t),K=t=>{let o=typeof t=="bigint"?t:BigInt(t);if(o>0n&&o===BigInt(i))return G(89);if(o===0n)return G(95);let n=o,s=At(n),x=new Uint8Array(s);for(let L=s-1;L>=0;--L)x[L]=Number(n&0xffn),n>>=8n;return G(95+s,x)},wt=t=>G(95+t.length,t),ot=[],C=t=>{ot.push({t:"num",v:t}),K(t)},_t=t=>{ot.push({t:"bytes",b:t}),wt(t)},B=t=>{ot.push({t:"op",o:t}),J(t)},Vt=t=>{let o=0,n=!0;for(let s=0;s<t.length;s++){let x=t[s],L=x>>>8,M=x&255;o+=1+(M-L+1),31-M>0&&(o+=3),n||(o+=1),n=!1}return o},Bt=(t,o)=>{let n=t.subarray(o[0]>>>8),s=0n;for(let c=0;c<n.length;c++)s=s<<8n|BigInt(n[c]);let x=R(s),L=Vt(o),M=x,q=()=>_t(n),it=ft(s),ct=R(it)+1;ct<M&&(M=ct,q=()=>{C(it),B(25)});let $=bt(0n,s),tt=R($)+2;tt<M&&(M=tt,q=()=>{C(0),C($),B(3)});for(let c=1;c<n.length;c++){let _=(1n<<BigInt(c*8))-1n,U=s&_;if(xt(BigInt(c-1),U)===s&&(U&1n<<BigInt(c*8-1))!==0n){let X=R(U)+3;X<M&&(M=X,q=()=>{C(U),C(c-1),B(11)});break}}for(let c=8;c<=248;c+=8){let _=gt(BigInt(c),s);if(_===0n)break;let U=ft(_);if(dt(BigInt(c),U)===s){let X=R(U)+R(BigInt(c))+2;X<M&&(M=X,q=()=>{C(U),C(c),B(27),B(25)})}}return L<M&&(M=L,q=()=>{let c=!0;for(let _=0;_<o.length;_++){let U=o[_],Y=U>>>8,X=U&255,It=31-X;_t(t.subarray(Y,X+1)),It>0&&(C(It*8),B(27)),c||B(23),c=!1}}),{literal:n,literalVal:s,bestCost:M,bestEmit:q,literalCost:x,shlCost:L}},z=0;for(;z<O;){let t=z*32,o=h.getWord(z),n=h.getSegments(z);if(!n.length){++z;continue}let s=h.wordHexes[z],x=z+1;for(;x<O&&!(!h.getSegments(x).length||h.wordHexes[x]!==s);)++x;let L=x-z;if(L>=2){let c=x-1,{bestEmit:_}=Bt(o,n);_(),B(128),C(t),B(82);for(let Y=1;Y<L;Y++)B(128),B(89),B(82);let U=h.wordStats.get(s);U&&U[3]<=c&&B(80),z=x;continue}let{literalCost:M,shlCost:q,bestCost:it,bestEmit:ct}=Bt(o,n);if(M>8){let c=h.wordStats.get(s);if(c&&c[6]!==-1&&z>c[2]){let _=c[4]===0?0:32-Math.clz32(c[4])+7>>3;if(M>c[6]+_){C(c[4]),B(81),C(t),B(82),++z;continue}}}let $=!0;for(let c=0;c<n.length;c++){let _=n[c];if(_>>>8!==(_&255)){$=!1;break}}let tt=n.length*3;if($&&tt<it&&tt<=q){for(let c=0;c<n.length;c++){let _=n[c]>>>8;C(o[_]),C(t+_),B(83)}++z;continue}ct(),C(t),B(82),++z}I=[],A=[],m=[],i=0,p=[],y=!1,at=0n;let st=[];for(let[t,o]of V)if(o>1&&t!==0n&&t!==32n&&t!==D&&t!==d&&t!==F&&t<=Ct){let n=R(t),s=o*(n-1)-n;s>0&&st.push({val:t,uses:o,net:s,p:n})}st.sort((t,o)=>o.net-t.net||o.uses-t.uses||t.p-o.p);for(let t=0;t<15&&t<st.length;++t)K(st[t].val);for(let t of ot)t.t==="num"?K(t.v):t.t==="bytes"?wt(t.b):t.t==="op"&&J(t.o);let Q="";b==="none"?(K(h.dataLength),K(k),J(l?253:243)):(J(95),J(95),K(h.dataLength),K(k),b==="call"?Q="345f355af1":b==="delegatecall"?Q="5f355af4":Q="5f355afa",Q+=l?sn:on);let Mt=I.length;for(let t=0;t<I.length;++t)I[t]>=96&&I[t]<=127&&A[t]&&(Mt+=A[t].length);let lt=new Uint8Array(Mt);for(let t=0,o=0;t<I.length;++t)lt[o++]=I[t],I[t]>=96&&I[t]<=127&&A[t]&&(lt.set(A[t],o),o+=A[t].length);let Et="0x"+mt(lt)+Q,Pt="0x"+v(j),qt=S?u?u.padStart(40,"0"):void 0:F.toString(16).padStart(40,"0"),Xt=S?"0":D.toString(16);return{bytecode:Et,calldata:Pt,to:pt,from:qt,balance:Xt}};var Dt=(r,e,a,b,l)=>{let f=u=>u.toString(16).padStart(2,"0");return"5b803590815f1a918260051c908160"+f(r)+"575050906002818360018095013586520101920101906002565b600260078396949314958260011a87020194611f0082870193886001011a9160081b16019560018701968503930101945f198301518452808211602083111760"+f(e)+"575b50505001600201906002565b6020811860208211021891825b82811060"+f(a)+"575060"+f(b)+"565b8181015f19015185820152830160"+f(l)+"56"},Lt="578082527f"+"7f".repeat(32)+"8082168101909117171980157fc0c8c8d0c8e8d0d8c8e8e0e8d0d8e0f0c8d0e8d0e0e0d8f0d0d0e0d8f8f8f8f8601f6f8421084210842108cc6318c6db6d54be660204081020408185821060071b86811c6001600160401b031060061b1795861c0260181a1c161a90911860031c019081019101368110",Ot=(r,e)=>"5b50"+r+"565b90610006565b60029060011a920191608081600101111561"+e+"575f19825201607e1901368210610006575f91508190"+r+"565b5f825201600101368210610006575f91508190"+r+"56";var Nt=(r,e="call",a=!1)=>{let b=a?"fd":"f3";if(e==="none")return"0x5f5f5b368110600c57505f"+b+Dt(53,132,156,120,145);let l=P(r).padStart(40,"0"),f=e==="call"?1:0,u=k=>k.toString(16).padStart(2,"0"),S=e==="delegatecall"?"f4":e==="call"?"f1":"fa";return"0x5f5f5b36811060"+u(50+f)+"575f808381"+(f?"34":"")+"73"+l+"5a"+S+"3d5f803e60"+u(46+f)+"573d5ffd5b3d5f"+b+Dt(91+f,170+f,194+f,158+f,183+f)};var Tt=(r,e="call",a=!1)=>{let b=a?"fd":"f3";if(e==="none")return"0x365f80375f365b8151805f1a156100cf"+Lt+"6100c957368111156100c35736900390035b36900336"+b+Ot("6100bd","6100fb");let l=P(r).padStart(40,"0"),f=e==="call"?1:0,u=k=>k.toString(16).padStart(2,"0"),S=e==="delegatecall"?"f4":e==="call"?"f1":"fa";return"0x365f80375f365b8151805f1a156100"+u(248+f)+Lt+"6100"+u(242+f)+"575f918291368111156100"+u(236+f)+"5736900390035b36900336"+(f?"34":"")+"73"+l+"5a"+S+"3d5f803e6100"+u(232+f)+"573d5ffd5b3d5f"+b+Ot("6100c1","01"+u(39+f))};var cn=function(r,e,a="call",b=!1,l=!1){let{method:f,params:u}=r;if(f&&f!=="eth_call")return r;let S=u?.[0]||r,k=u?.[1],T=u?.[2];if(!S?.to||!S?.data||(()=>{if(T)for(let d in T)return!0;for(let d in S)if(d!=="to"&&d!=="data"&&d!=="from")return!0;return!1})())return r;let H=S.data.length;if(H<1150)return r;let j=S.data,F=S.to,D=S.from,I=a==="none",A,m,i,p,y;if(I||e==="jit"||!e&&(H<3e3||H>=8e3)){let d=ht(j,F,D,a,b,l);A=d.bytecode,m=d.calldata,i=d.to,p=d.from,y=d.balance}else{let d=e?null:ht(j,F,D,a,b,l),V=e==="flz"||!e?yt.LibZip.flzCompress(j):null,w=e==="cd"||!e&&V?yt.LibZip.cdCompress(j):null;if(e==="flz"||!e&&V&&(!w||V.length<w.length))m=V,A=Nt(F,a,b);else{let et=w.replace(/^0x/,""),rt="";for(let Z=0;Z<8;Z+=2)rt+=(parseInt(et.substring(Z,Z+2),16)^255).toString(16).padStart(2,"0");m="0x"+rt+et.substring(8),A=Tt(F,a,b)}i=pt,p=D?P(D).padStart(16,"0"):void 0,y="0",!e&&d&&d.bytecode.length+d.calldata.length<A.length+m.length&&(A=d.bytecode,m=d.calldata,i=d.to,p=d.from,y=d.balance)}if(A.length+m.length>=H)return r;let h={code:A,balance:"0x"+y},O={to:i,data:m};return p&&(O.from="0x"+p),{...r,params:[O,k,{...T,[i]:h}]}};
|
|
2
2
|
//! @__PURE__
|
|
3
3
|
//# sourceMappingURL=jit-compressor.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/jit-compressor.ts", "../../src/compiler/constants.ts", "../../src/compiler/opcodes.ts", "../../src/compiler/utils.ts", "../../src/compiler/jit.ts", "../../src/contracts.ts"],
|
|
4
|
-
"sourcesContent": ["import { LibZip } from 'solady';\nimport { _jitDecompressor, DEC_ADDR } from './compiler';\nimport { _normHex } from './compiler/utils';\nimport { flzFwdBytecode, rleFwdBytecode } from './contracts';\nimport { MIN_BODY_SIZE } from './index';\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 * - 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 !txObj?.to ||\n !txObj?.data ||\n (() => {\n if (overrides) for (const _ in overrides) return true;\n for (const k in txObj) if (k !== 'to' && k !== 'data' && k !== 'from') return true;\n return false;\n })()\n ) {\n return payload;\n }\n\n const originalSize = txObj.data.length;\n if (originalSize < MIN_BODY_SIZE) return payload;\n\n const inputData = txObj.data;\n const to = txObj.to;\n const from = txObj.from;\n\n let bytecode: string;\n let calldata: string;\n let decompressorAddress: string;\n let fromAddr: string | undefined;\n let balanceHex: string;\n\n if (alg === 'jit' || (!alg && (originalSize < 3000 || originalSize >= 8000))) {\n const result = _jitDecompressor(inputData, to, from);\n bytecode = result.bytecode;\n calldata = result.calldata;\n decompressorAddress = result.to;\n fromAddr = result.from;\n balanceHex = result.balance;\n } else {\n const jit = !alg ? _jitDecompressor(inputData, to, from) : null;\n const flzData = alg === 'flz' || !alg ? LibZip.flzCompress(inputData) : null;\n const cdData = alg === 'cd' || (!alg && flzData) ? LibZip.cdCompress(inputData) : null;\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 decompressorAddress = DEC_ADDR;\n fromAddr = from ? _normHex(from).padStart(16, '0') : undefined;\n balanceHex = '0';\n if (\n !alg &&\n jit &&\n jit.bytecode.length + jit.calldata.length < bytecode.length + calldata.length\n ) {\n bytecode = jit.bytecode;\n calldata = jit.calldata;\n decompressorAddress = jit.to;\n fromAddr = jit.from;\n balanceHex = jit.balance;\n }\n }\n\n // Skip if not beneficial\n if (bytecode.length + calldata.length >= originalSize) return payload;\n\n const stateOverride: any = {\n code: bytecode,\n balance: '0x' + balanceHex,\n };\n\n const compressedTxObj: any = { to: decompressorAddress, data: calldata };\n\n if (fromAddr) compressedTxObj.from = '0x' + fromAddr;\n\n return {\n ...payload,\n params: [compressedTxObj, blockParam, { ...overrides, [decompressorAddress]: stateOverride }],\n };\n};\n", "export const MAX_128_BIT = (1n << 128n) - 1n;\nexport const MAX_256_BIT = (1n << 256n) - 1n;\n", "import { MAX_256_BIT } from './constants';\n\nexport const not = (a: bigint): bigint => ~a & MAX_256_BIT;\nexport const eq = (a: bigint, b: bigint): bigint => (a === b ? 1n : 0n);\nexport const and = (a: bigint, b: bigint): bigint => a & b & MAX_256_BIT;\nexport const or = (a: bigint, b: bigint): bigint => (a | b) & MAX_256_BIT;\nexport const xor = (a: bigint, b: bigint): bigint => (a ^ b) & MAX_256_BIT;\n\nexport const add = (a: bigint, b: bigint): bigint => (a + b) & MAX_256_BIT;\nexport const sub = (a: bigint, b: bigint): bigint => (a - b) & MAX_256_BIT;\n\nexport const shl = (shift: bigint, value: bigint): bigint => (value << shift) & MAX_256_BIT;\nexport const shr = (shift: bigint, value: bigint): bigint => (value >> shift) & MAX_256_BIT;\n\nexport const sigext = (byteSize: bigint, value: bigint): bigint => {\n if (byteSize >= 31n) return value & MAX_256_BIT;\n const bits = Number((byteSize + 1n) * 8n);\n return BigInt.asUintN(256, BigInt.asIntN(bits, value));\n};\n\nexport const clz = (value: bigint): bigint => {\n if (value === 0n) return 256n;\n let count = 0n;\n let mask = 1n << 255n;\n while ((value & mask) === 0n && count < 256n) {\n count++;\n mask >>= 1n;\n }\n return count;\n};\n", "export const _normHex = (hex: string): string =>\n (hex.charCodeAt(0) === 48 && (hex.charCodeAt(1) | 32) === 120 ? hex.slice(2) : hex).toLowerCase();\n\nconst _hexes = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0')),\n _nibbles = (() => {\n const t = new Int8Array(103).fill(-1);\n for (let i = 0; i < 10; i++) t[48 + i] = i;\n for (let i = 0; i < 6; i++) t[97 + i] = 10 + i;\n return t;\n })();\n\nexport const _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, j = 0; i < len; i += 2) {\n bytes[j++] = (_nibbles[normalized.charCodeAt(i)] << 4) | _nibbles[normalized.charCodeAt(i + 1)];\n }\n return bytes;\n};\n\nexport const _uint8ArrayToHex = (bytes: Uint8Array): string => {\n let hex = '';\n for (let i = 0; i < bytes.length; i++) hex += _hexes[bytes[i]]!;\n return hex;\n};\n\nexport type MemorySegment = number; // (s << 8) | e, both in [0..31]\nconst _zeroWord = new Uint8Array(32);\nconst _emptySegments: MemorySegment[] = [];\n\nexport type WordStats = [\n freq: number,\n normFreq: number,\n firstWordIndex: number,\n lastWordIndex: number,\n firstOffset: number,\n lastOffset: number,\n reuseCost: number,\n];\n\nexport interface MemoryView {\n /** Normalized hex string (without 0x) of the original payload. */\n readonly hex: string;\n /** Backing buffer containing `padding` zero bytes followed by the payload. */\n readonly buffer: Uint8Array;\n /** Total length of the backing buffer (padding + payload length), rounded up to full words. */\n readonly roundedLength: number;\n /** Number of zero bytes prefixed before the payload. */\n readonly padding: number;\n /** Length of the original (unpadded) payload in bytes. */\n readonly dataLength: number;\n /** Number of 32-byte words in this view. */\n readonly wordCount: number;\n /** Hex string (without 0x) for each 32-byte word in the view. */\n readonly wordHexes: readonly string[];\n readonly wordStats: ReadonlyMap<string, WordStats>;\n /** Return the nth 32-byte word (zero-padded on the right if incomplete). */\n getWord(wordIndex: number): Uint8Array;\n /** Return all non-zero byte segments (packed as (s<<8)|e) within the nth 32-byte word. */\n getSegments(wordIndex: number): MemorySegment[];\n mload(offset: number): Uint8Array;\n /**\n * Read an arbitrary slice starting at `offset` for `size` bytes,\n * padding with zeros when reading past `length`.\n */\n slice(offset: number, size: number): Uint8Array;\n}\n\nexport const initMemoryView = (calldata: string, padding: number): MemoryView => {\n const hex = _normHex(calldata);\n const originalBuf = _hexToUint8Array(hex);\n let buffer = new Uint8Array(padding + originalBuf.length);\n buffer.set(originalBuf, padding);\n const rawLength = buffer.length;\n const wordCount = Math.ceil(rawLength / 32);\n const roundedLength = wordCount * 32;\n if (rawLength !== roundedLength) {\n const rounded = new Uint8Array(roundedLength);\n rounded.set(buffer, 0);\n buffer = rounded;\n }\n\n const segments: MemorySegment[][] = new Array(wordCount);\n const wordHexes: string[] = new Array(wordCount);\n const wordStats = new Map<string, WordStats>();\n\n let prevWordHex: string | null = null;\n const wordAt = (wordIndex: number) => {\n const base = wordIndex << 5;\n return buffer.subarray(base, base + 32);\n };\n\n for (let wordIndex = 0; wordIndex < wordCount; wordIndex++) {\n const base = wordIndex << 5;\n const word = wordAt(wordIndex);\n\n const wordHex = _uint8ArrayToHex(word);\n wordHexes[wordIndex] = wordHex;\n const existing = wordStats.get(wordHex);\n const isRunContinuation = prevWordHex === wordHex;\n if (!existing) {\n const stats: WordStats = [1, 1, wordIndex, wordIndex, base, base, -1];\n wordStats.set(wordHex, stats);\n } else {\n existing[0] += 1;\n if (!isRunContinuation) existing[1] += 1;\n existing[3] = wordIndex;\n existing[5] = base;\n }\n prevWordHex = wordHex;\n\n const seg: MemorySegment[] = [];\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 << 8) | (i - 1));\n }\n segments[wordIndex] = seg;\n }\n\n for (const stats of wordStats.values()) {\n const baseBytes = stats[4] === 0 ? 0 : (32 - Math.clz32(stats[4]) + 7) >> 3;\n const reuseCost = baseBytes + 3;\n stats[6] = 32 > reuseCost ? reuseCost : -1;\n }\n\n const getWord = (wordIndex: number): Uint8Array => {\n return wordIndex < 0 || wordIndex >= wordCount ? _zeroWord : wordAt(wordIndex);\n };\n\n const getSegments = (wordIndex: number): MemorySegment[] => {\n return wordIndex < 0 || wordIndex >= wordCount ? _emptySegments : segments[wordIndex];\n };\n\n const slice = (offset: number, size: number): Uint8Array => {\n if (size <= 0) return new Uint8Array(0);\n const out = new Uint8Array(size);\n if (offset < 0 || offset >= rawLength) return out;\n const end = Math.min(offset + size, rawLength);\n out.set(buffer.subarray(offset, end), 0);\n return out;\n };\n\n const mload = (offset: number): Uint8Array => slice(offset, 32);\n\n return {\n hex,\n buffer,\n roundedLength,\n padding,\n dataLength: originalBuf.length,\n wordCount,\n wordHexes,\n wordStats,\n getWord,\n getSegments,\n mload,\n slice,\n };\n};\n", "import { MAX_128_BIT, MAX_256_BIT } from './constants';\nimport { add, and, not, or, shl, shr, sigext, sub, xor } from './opcodes';\nimport { _normHex, _uint8ArrayToHex, initMemoryView, MemorySegment } from './utils';\nexport const DEC_ADDR = '0x00000000000000000000000000000000000000e0';\n\nconst _pad64 = (s: string) => s.padStart(64, '0'),\n _zeroW = _pad64('0'),\n _cdsizeW = _pad64('20'),\n _decW = _pad64('e0'),\n _retSuffix = '345f355af13d5f5f3e3d5ff3';\n\nexport const _jitDecompressor = function (\n calldata: string,\n to: string,\n from?: string,\n): { bytecode: string; calldata: string; to: string; from?: string; balance: string } {\n const fromHex = from ? _normHex(from) : null;\n\n let padding = 28,\n bestW: string | null = null,\n bestF = 0,\n originalTo = _normHex(to).padStart(16, '0'),\n fromAddr = fromHex ? BigInt('0x' + fromHex) : 96n,\n selfbalance = 2n,\n ops: number[] = [],\n data: (Uint8Array | null)[] = [],\n stack: bigint[] = [],\n trackedMemSize = 0,\n mem: bigint[] = [],\n firstPass = true;\n\n const view = initMemoryView(calldata, padding);\n const { wordCount } = view;\n\n const decAddr = 224n,\n stackFreq = new Map<bigint, number>(),\n decW = _decW,\n fromW = _pad64(fromHex ?? fromAddr.toString(16)),\n toW = _pad64(originalTo);\n\n for (const [w, st] of view.wordStats) {\n const f = st[0];\n if (w === _zeroW || w === _cdsizeW || w === decW || w === fromW || w === toW) continue;\n if (f > bestF) (bestF = f), (bestW = w);\n }\n if (bestW) selfbalance = BigInt('0x' + bestW);\n\n const roundUp32 = (x: number) => (x + 31) & ~31;\n\n const getStackIdx = (val: bigint): number => {\n for (let i = stack.length - 1, d = 0; d < 16 && i >= 0; --i, ++d) {\n if (stack[i] === val) return d;\n }\n return -1;\n };\n\n const ctr = <K>(m: Map<K, number>, k: K, delta: number) => m.set(k, (m.get(k) || 0) + delta);\n\n const pushOp = (op: number, d?: Uint8Array | null) => {\n ops.push(op);\n data.push(d ?? null);\n };\n\n const pushS = (v: bigint, freqDelta: number = 1) => {\n stack.push(v);\n if (freqDelta !== 0) ctr(stackFreq, v, freqDelta);\n };\n\n const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n\n const trackMem = (offset: number, size: number) => {\n trackedMemSize = roundUp32(offset + size);\n };\n\n const addOp = (op: number, imm?: Uint8Array) => {\n if (op === 0x80) {\n // DUP1\n pushS(stack[stack.length - 1]!, firstPass ? 0 : 1);\n }\n if (op === 0x50) stack.pop();\n if (op === 0x47) pushS(selfbalance, 0);\n if (op === 0x30) pushS(decAddr, 0);\n if (op === 0x33) pushS(fromAddr, 0);\n if (op === 0x36) pushS(32n, 0);\n if (op === 0x59) pushS(BigInt(trackedMemSize), 0);\n if (op === 0x0b) {\n // SIGNEXTEND\n const [byteSize, val] = pop2();\n pushS(sigext(byteSize, val), 1);\n }\n if (op === 0x19) {\n // NOT\n pushS(not(stack.pop()!), 0);\n }\n if (op === 0x18) {\n // XOR\n const [a, b] = pop2();\n pushS(xor(a, b), 1);\n }\n if (op === 0x16) {\n // AND\n const [a, b] = pop2();\n pushS(and(a, b), 1);\n }\n if (op === 0x17) {\n // OR\n const [a, b] = pop2();\n pushS(or(a, b), 1);\n }\n if (op === 0x01) {\n // ADD\n const [a, b] = pop2();\n pushS(add(a, b), 1);\n }\n if (op === 0x03) {\n // SUB\n const [a, b] = pop2();\n pushS(sub(b, a), 1);\n }\n if (op === 0x1b) {\n // SHL\n const [shift, val] = pop2();\n pushS(shl(shift, val), 1);\n }\n if (op === 0x1c) {\n // SHR\n const [shift, val] = pop2();\n pushS(shr(shift, val), 1);\n }\n if ((op >= 0x60 && op <= 0x7f) || op === 0x5f) {\n let v = 0n; // PUSH* and PUSH0\n for (const b of imm || []) v = (v << 8n) | BigInt(b);\n if (v === selfbalance) {\n pushS(v, 0);\n pushOp(0x47);\n return;\n }\n if (v === decAddr) {\n pushS(v, 0);\n pushOp(0x30);\n return;\n }\n if (v === fromAddr) {\n pushS(v, 0);\n pushOp(0x33); // FROM ADDRESS\n return;\n }\n if (v === 32n) {\n pushS(v, 0);\n pushOp(0x36); // CALLDATASIZE\n return;\n }\n if (v === BigInt(trackedMemSize) && v != 0n) {\n pushS(v, 0);\n pushOp(0x59);\n return;\n }\n const idx = getStackIdx(v);\n if (idx != -1 && op != 0x5f) {\n const freqDelta = firstPass ? 1 : 0;\n pushS(v, freqDelta);\n pushOp(0x80 + idx);\n return;\n }\n if (v === MAX_256_BIT) {\n pushS(v, 0);\n pushOp(0x5f); // PUSH0\n pushOp(0x19); // NOT\n return;\n }\n pushS(v, 1);\n pushOp(op, imm || null);\n return;\n }\n if (op === 0x51) {\n // MLOAD\n pushS(mem[Number(stack.pop()!) >>> 5] ?? 0n, 0);\n }\n if (op === 0x52) {\n // MSTORE\n const [offset, value] = pop2();\n const k = Number(offset);\n mem[k >>> 5] = value & MAX_256_BIT;\n trackMem(k, 32);\n }\n if (op === 0x53) {\n // MSTORE8\n const [offset, _] = pop2();\n trackMem(Number(offset), 1);\n }\n pushOp(op, imm || null);\n };\n\n const op = (opcode: number) => addOp(opcode);\n\n const bytesLen = (v: bigint): number => {\n if (v === 0n) return 0;\n let n = 0;\n let t = v < 0n ? -v : v;\n while (t > 0n) {\n ++n;\n t >>= 8n;\n }\n return n;\n };\n\n const pushCost = (v: bigint): number => (v === 0n ? 1 : 1 + bytesLen(v));\n\n const pushN = (value: number | bigint) => {\n const v = typeof value === 'bigint' ? value : BigInt(value);\n if (v > 0n && v === BigInt(trackedMemSize)) return addOp(0x59);\n if (v === 32n) return addOp(0x36);\n if (v === 0n) return addOp(0x5f);\n\n let tmp = v;\n const len = bytesLen(tmp);\n const bytes = new Uint8Array(len);\n for (let i = len - 1; i >= 0; --i) {\n bytes[i] = Number(tmp & 0xffn);\n tmp >>= 8n;\n }\n return addOp(0x5f + len, bytes);\n };\n\n const pushB = (buf: Uint8Array) => addOp(0x5f + buf.length, buf);\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\n const emitPushN = (v: number | bigint) => {\n plan.push({ t: 'num', v });\n pushN(v);\n };\n const emitPushB = (b: Uint8Array) => {\n plan.push({ t: 'bytes', b });\n pushB(b);\n };\n const emitOp = (o: number) => {\n plan.push({ t: 'op', o });\n op(o);\n };\n\n const estShlCost = (seg: MemorySegment[]) => {\n let cost = 0;\n let first = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n const s = se >>> 8,\n e = se & 0xff;\n cost += 1 + (e - s + 1); // PUSH<n> immediate bytes\n if (31 - e > 0) cost += 3; // PUSH1 shift + SHL\n if (!first) cost += 1; // OR\n first = false;\n }\n return cost;\n };\n\n const emitBestValueForWord = (word: Uint8Array, seg: MemorySegment[]) => {\n const literal = word.subarray(seg[0]! >>> 8);\n let literalVal = 0n;\n for (let i = 0; i < literal.length; i++) literalVal = (literalVal << 8n) | BigInt(literal[i]!);\n const literalCost = literal.length + 1;\n const shlCost = estShlCost(seg);\n let bestCost = literalCost;\n let bestEmit: () => void = () => emitPushB(literal);\n // Try NOT: PUSH(~x) NOT\n const notVal = not(literalVal);\n const notCost = pushCost(notVal) + 1;\n if (notCost < bestCost) {\n bestCost = notCost;\n bestEmit = () => {\n emitPushN(notVal);\n emitOp(0x19);\n };\n }\n\n // Try SUB: PUSH0, PUSH(x), SUB\n const subVal = sub(0n, literalVal);\n const subCost = pushCost(subVal) + 2;\n if (subCost < bestCost) {\n bestCost = subCost;\n bestEmit = () => {\n emitPushN(0);\n emitPushN(subVal);\n emitOp(0x03);\n };\n }\n\n // Try 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 (\n extended === literalVal &&\n (truncated & (1n << BigInt(numBytes * 8 - 1))) !== 0n // must be negative in that width\n ) {\n const signCost = pushCost(truncated) + 3; // PUSH + 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\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 if (reconstructed === literalVal) {\n const shiftNotCost = pushCost(notShifted) + pushCost(BigInt(shiftBits)) + 2; // PUSH + PUSH + SHL + NOT\n if (shiftNotCost < bestCost) {\n bestCost = shiftNotCost;\n bestEmit = () => {\n emitPushN(notShifted);\n emitPushN(shiftBits);\n emitOp(0x1b);\n emitOp(0x19);\n };\n }\n }\n }\n // Try SHL/OR\n if (shlCost < bestCost) {\n bestCost = shlCost;\n bestEmit = () => {\n let first = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n const s = se >>> 8,\n e = se & 0xff;\n const suffix0s = 31 - e;\n emitPushB(word.subarray(s, e + 1));\n if (suffix0s > 0) {\n emitPushN(suffix0s * 8);\n emitOp(0x1b); // SHL\n }\n if (!first) emitOp(0x17); // OR\n first = false;\n }\n };\n }\n return { literal, literalVal, bestCost, bestEmit, literalCost, shlCost };\n };\n\n let wordIndex = 0;\n while (wordIndex < wordCount) {\n const base = wordIndex * 32;\n const word = view.getWord(wordIndex);\n const seg = view.getSegments(wordIndex);\n if (!seg.length) {\n ++wordIndex;\n continue;\n }\n\n const wordHex = view.wordHexes[wordIndex]!;\n // Encode Run?\n let nextIndex = wordIndex + 1;\n while (nextIndex < wordCount) {\n const s2 = view.getSegments(nextIndex);\n if (!s2.length) break;\n if (view.wordHexes[nextIndex] !== wordHex) break;\n ++nextIndex;\n }\n const runLen = nextIndex - wordIndex;\n\n if (runLen >= 2) {\n const lastIndex = nextIndex - 1;\n const { bestEmit } = emitBestValueForWord(word, seg);\n // First store: keep word value on stack.\n bestEmit(); // push value\n emitOp(0x80); // DUP1 (keep value)\n emitPushN(base); // offset (MSIZE if aligned)\n emitOp(0x52); // MSTORE\n\n for (let j = 1; j < runLen; j++) {\n emitOp(0x80); // DUP1\n emitOp(0x59); // MSIZE\n emitOp(0x52); // MSTORE\n }\n const stats = view.wordStats.get(wordHex);\n if (stats && stats[3] <= lastIndex) {\n emitOp(0x50); // POP\n }\n wordIndex = nextIndex;\n continue;\n }\n\n const { literalCost, shlCost, bestCost, bestEmit } = emitBestValueForWord(word, seg);\n // Try MLOAD/MSTORE reuse\n if (literalCost > 8) {\n const stats = view.wordStats.get(wordHex);\n if (stats && stats[6] !== -1 && wordIndex > stats[2]) {\n const baseBytes = stats[4] === 0 ? 0 : (32 - Math.clz32(stats[4]) + 7) >> 3;\n if (literalCost > stats[6] + baseBytes) {\n emitPushN(stats[4]);\n emitOp(0x51); // MLOAD\n emitPushN(base);\n emitOp(0x52); // MSTORE\n ++wordIndex;\n continue;\n }\n }\n }\n let byte8s = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n if (se >>> 8 !== (se & 0xff)) {\n byte8s = false;\n break;\n }\n }\n const byte8sCost = seg.length * 3; // PUSH1(value), PUSH1(offset), MSTORE8\n if (byte8s && byte8sCost < bestCost && byte8sCost <= shlCost) {\n for (let i = 0; i < seg.length; i++) {\n const s = seg[i]! >>> 8;\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n ++wordIndex;\n continue;\n }\n // Default\n bestEmit();\n emitPushN(base);\n emitOp(0x52); // MSTORE\n ++wordIndex;\n }\n\n //2nd pass: preseed dictionary + emit final ops\n ops = [];\n data = [];\n stack = [];\n trackedMemSize = 0;\n mem = [];\n firstPass = false;\n\n const pre: { val: bigint; uses: number; net: number; p: number }[] = [];\n for (const [val, uses] of stackFreq) {\n if (\n uses > 1 &&\n val !== 0n &&\n val !== 32n &&\n val !== selfbalance &&\n val !== decAddr &&\n val !== fromAddr &&\n val <= MAX_128_BIT\n ) {\n const p = pushCost(val);\n const net = uses * (p - 1) - p;\n if (net > 0) pre.push({ val, uses, net, p });\n }\n }\n\n pre.sort((a, b) => b.net - a.net || b.uses - a.uses || a.p - b.p);\n for (let i = 0; i < 15 && i < pre.length; ++i) pushN(pre[i]!.val);\n\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 // - 0x5f5f: PUSH0 PUSH0 (retSize=0, retOffset=0)\n // - pushN(view.dataLength): argsSize\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(view.dataLength); // argsSize = actual data length\n pushN(padding); // argsOffset = padding\n\n // - CALLVALUE, load target address from calldata[0], GAS, CALL\n // - RETURNDATACOPY(0, 0, RETURNDATASIZE)\n // - RETURN(0, RETURNDATASIZE)\n let outLen = ops.length;\n\n for (let i = 0; i < ops.length; ++i)\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) outLen += data[i]!.length;\n\n const out = new Uint8Array(outLen);\n\n for (let i = 0, o = 0; i < ops.length; ++i) {\n out[o++] = ops[i]!;\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) out.set(data[i]!, o), (o += data[i]!.length);\n }\n\n const bytecode = '0x' + _uint8ArrayToHex(out) + _retSuffix;\n const calldataOut = '0x' + _pad64(originalTo);\n\n return {\n bytecode,\n calldata: calldataOut,\n to: DEC_ADDR,\n from: fromAddr.toString(16).padStart(40, '0'),\n balance: selfbalance.toString(16),\n };\n};\n", "import { _normHex } from './compiler/utils';\n\n/**\n * Generates FastLZ (LZ77) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const flzFwdBytecode = (address: string): string =>\n `0x365f73${_normHex(address)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;\n\n/**\n * Generates RLE (run-length encoded) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const rleFwdBytecode = (address: string): string =>\n `0x5f5f5b368110602d575f8083813473${_normHex(address)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["jit_compressor_exports", "__export", "compress_call", "__toCommonJS", "import_solady", "MAX_128_BIT", "MAX_256_BIT", "not", "a", "MAX_256_BIT", "and", "a", "b", "MAX_256_BIT", "or", "xor", "add", "sub", "shl", "shift", "value", "shr", "sigext", "byteSize", "bits", "_normHex", "hex", "_hexes", "_", "i", "_nibbles", "t", "_hexToUint8Array", "normalized", "len", "bytes", "j", "_uint8ArrayToHex", "_zeroWord", "_emptySegments", "initMemoryView", "calldata", "padding", "originalBuf", "buffer", "rawLength", "wordCount", "roundedLength", "rounded", "segments", "wordHexes", "wordStats", "prevWordHex", "wordAt", "wordIndex", "base", "word", "wordHex", "existing", "isRunContinuation", "stats", "seg", "s", "reuseCost", "getWord", "getSegments", "slice", "offset", "size", "out", "end", "mload", "DEC_ADDR", "_pad64", "s", "_zeroW", "_cdsizeW", "_decW", "
|
|
4
|
+
"sourcesContent": ["import { LibZip } from 'solady';\nimport { _jitDecompressor, DEC_ADDR } from './compiler';\nimport type { ForwardMode } from './compiler/jit';\nimport { _normHex } from './compiler/utils';\nimport { flzFwdBytecode, rleFwdBytecode } from './contracts';\nimport { MIN_BODY_SIZE } from './index';\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 * - 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 (\n payload: any,\n alg?: string,\n forward: ForwardMode = 'call',\n revert = false,\n clean_env = false,\n): 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 !txObj?.to ||\n !txObj?.data ||\n (() => {\n if (overrides) for (const _ in overrides) return true;\n for (const k in txObj) if (k !== 'to' && k !== 'data' && k !== 'from') return true;\n return false;\n })()\n ) {\n return payload;\n }\n\n const originalSize = txObj.data.length;\n if (originalSize < MIN_BODY_SIZE) return payload;\n\n const inputData = txObj.data;\n const to = txObj.to;\n const from = txObj.from;\n const noForward = forward === 'none';\n\n let bytecode: string;\n let calldata: string;\n let decompressorAddress: string;\n let fromAddr: string | undefined;\n let balanceHex: string;\n\n if (noForward || alg === 'jit' || (!alg && (originalSize < 3000 || originalSize >= 8000))) {\n const result = _jitDecompressor(inputData, to, from, forward, revert, clean_env);\n bytecode = result.bytecode;\n calldata = result.calldata;\n decompressorAddress = result.to;\n fromAddr = result.from;\n balanceHex = result.balance;\n } else {\n const jit = !alg ? _jitDecompressor(inputData, to, from, forward, revert, clean_env) : null;\n const flzData = alg === 'flz' || !alg ? LibZip.flzCompress(inputData) : null;\n const cdData = alg === 'cd' || (!alg && flzData) ? LibZip.cdCompress(inputData) : null;\n const useFlz =\n alg === 'flz' || (!alg && flzData && (!cdData || flzData.length < cdData.length));\n\n if (useFlz) {\n calldata = flzData!;\n bytecode = flzFwdBytecode(to, forward, revert);\n } else {\n // Solady cdCompress negates the first 4 bytes (selector dispatch); XOR it back\n const h = cdData!.replace(/^0x/, '');\n let sel = '';\n for (let i = 0; i < 8; i += 2)\n sel += (parseInt(h.substring(i, i + 2), 16) ^ 0xff).toString(16).padStart(2, '0');\n calldata = '0x' + sel + h.substring(8);\n bytecode = rleFwdBytecode(to, forward, revert);\n }\n\n decompressorAddress = DEC_ADDR;\n fromAddr = from ? _normHex(from).padStart(16, '0') : undefined;\n balanceHex = '0';\n if (\n !alg &&\n jit &&\n jit.bytecode.length + jit.calldata.length < bytecode.length + calldata.length\n ) {\n bytecode = jit.bytecode;\n calldata = jit.calldata;\n decompressorAddress = jit.to;\n fromAddr = jit.from;\n balanceHex = jit.balance;\n }\n }\n\n // Skip if not beneficial\n if (bytecode.length + calldata.length >= originalSize) return payload;\n\n const stateOverride: any = {\n code: bytecode,\n balance: '0x' + balanceHex,\n };\n\n const compressedTxObj: any = { to: decompressorAddress, data: calldata };\n\n if (fromAddr) compressedTxObj.from = '0x' + fromAddr;\n\n return {\n ...payload,\n params: [compressedTxObj, blockParam, { ...overrides, [decompressorAddress]: stateOverride }],\n };\n};\n", "export const MAX_128_BIT = (1n << 128n) - 1n;\nexport const MAX_256_BIT = (1n << 256n) - 1n;\n", "import { MAX_256_BIT } from './constants';\n\nexport const not = (a: bigint): bigint => ~a & MAX_256_BIT;\nexport const eq = (a: bigint, b: bigint): bigint => (a === b ? 1n : 0n);\nexport const and = (a: bigint, b: bigint): bigint => a & b & MAX_256_BIT;\nexport const or = (a: bigint, b: bigint): bigint => (a | b) & MAX_256_BIT;\nexport const xor = (a: bigint, b: bigint): bigint => (a ^ b) & MAX_256_BIT;\n\nexport const add = (a: bigint, b: bigint): bigint => (a + b) & MAX_256_BIT;\nexport const sub = (a: bigint, b: bigint): bigint => (a - b) & MAX_256_BIT;\n\nexport const shl = (shift: bigint, value: bigint): bigint => (value << shift) & MAX_256_BIT;\nexport const shr = (shift: bigint, value: bigint): bigint => (value >> shift) & MAX_256_BIT;\n\nexport const sigext = (byteSize: bigint, value: bigint): bigint => {\n if (byteSize >= 31n) return value & MAX_256_BIT;\n const bits = Number((byteSize + 1n) * 8n);\n return BigInt.asUintN(256, BigInt.asIntN(bits, value));\n};\n\nexport const clz = (value: bigint): bigint => {\n if (value === 0n) return 256n;\n let count = 0n;\n let mask = 1n << 255n;\n while ((value & mask) === 0n && count < 256n) {\n count++;\n mask >>= 1n;\n }\n return count;\n};\n", "export const _normHex = (hex: string): string =>\n (hex.charCodeAt(0) === 48 && (hex.charCodeAt(1) | 32) === 120 ? hex.slice(2) : hex).toLowerCase();\n\nconst _hexes = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0')),\n _nibbles = (() => {\n const t = new Int8Array(103).fill(-1);\n for (let i = 0; i < 10; i++) t[48 + i] = i;\n for (let i = 0; i < 6; i++) t[97 + i] = 10 + i;\n return t;\n })();\n\nexport const _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, j = 0; i < len; i += 2) {\n bytes[j++] = (_nibbles[normalized.charCodeAt(i)] << 4) | _nibbles[normalized.charCodeAt(i + 1)];\n }\n return bytes;\n};\n\nexport const _uint8ArrayToHex = (bytes: Uint8Array): string => {\n let hex = '';\n for (let i = 0; i < bytes.length; i++) hex += _hexes[bytes[i]]!;\n return hex;\n};\n\nexport type MemorySegment = number; // (s << 8) | e, both in [0..31]\nconst _zeroWord = new Uint8Array(32);\nconst _emptySegments: MemorySegment[] = [];\n\nexport type WordStats = [\n freq: number,\n normFreq: number,\n firstWordIndex: number,\n lastWordIndex: number,\n firstOffset: number,\n lastOffset: number,\n reuseCost: number,\n];\n\nexport interface MemoryView {\n /** Normalized hex string (without 0x) of the original payload. */\n readonly hex: string;\n /** Backing buffer containing `padding` zero bytes followed by the payload. */\n readonly buffer: Uint8Array;\n /** Total length of the backing buffer (padding + payload length), rounded up to full words. */\n readonly roundedLength: number;\n /** Number of zero bytes prefixed before the payload. */\n readonly padding: number;\n /** Length of the original (unpadded) payload in bytes. */\n readonly dataLength: number;\n /** Number of 32-byte words in this view. */\n readonly wordCount: number;\n /** Hex string (without 0x) for each 32-byte word in the view. */\n readonly wordHexes: readonly string[];\n readonly wordStats: ReadonlyMap<string, WordStats>;\n /** Return the nth 32-byte word (zero-padded on the right if incomplete). */\n getWord(wordIndex: number): Uint8Array;\n /** Return all non-zero byte segments (packed as (s<<8)|e) within the nth 32-byte word. */\n getSegments(wordIndex: number): MemorySegment[];\n mload(offset: number): Uint8Array;\n /**\n * Read an arbitrary slice starting at `offset` for `size` bytes,\n * padding with zeros when reading past `length`.\n */\n slice(offset: number, size: number): Uint8Array;\n}\n\nexport const initMemoryView = (calldata: string, padding: number): MemoryView => {\n const hex = _normHex(calldata);\n const originalBuf = _hexToUint8Array(hex);\n let buffer = new Uint8Array(padding + originalBuf.length);\n buffer.set(originalBuf, padding);\n const rawLength = buffer.length;\n const wordCount = Math.ceil(rawLength / 32);\n const roundedLength = wordCount * 32;\n if (rawLength !== roundedLength) {\n const rounded = new Uint8Array(roundedLength);\n rounded.set(buffer, 0);\n buffer = rounded;\n }\n\n const segments: MemorySegment[][] = new Array(wordCount);\n const wordHexes: string[] = new Array(wordCount);\n const wordStats = new Map<string, WordStats>();\n\n let prevWordHex: string | null = null;\n const wordAt = (wordIndex: number) => {\n const base = wordIndex << 5;\n return buffer.subarray(base, base + 32);\n };\n\n for (let wordIndex = 0; wordIndex < wordCount; wordIndex++) {\n const base = wordIndex << 5;\n const word = wordAt(wordIndex);\n\n const wordHex = _uint8ArrayToHex(word);\n wordHexes[wordIndex] = wordHex;\n const existing = wordStats.get(wordHex);\n const isRunContinuation = prevWordHex === wordHex;\n if (!existing) {\n const stats: WordStats = [1, 1, wordIndex, wordIndex, base, base, -1];\n wordStats.set(wordHex, stats);\n } else {\n existing[0] += 1;\n if (!isRunContinuation) existing[1] += 1;\n existing[3] = wordIndex;\n existing[5] = base;\n }\n prevWordHex = wordHex;\n\n const seg: MemorySegment[] = [];\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 << 8) | (i - 1));\n }\n segments[wordIndex] = seg;\n }\n\n for (const stats of wordStats.values()) {\n const baseBytes = stats[4] === 0 ? 0 : (32 - Math.clz32(stats[4]) + 7) >> 3;\n const reuseCost = baseBytes + 3;\n stats[6] = 32 > reuseCost ? reuseCost : -1;\n }\n\n const getWord = (wordIndex: number): Uint8Array => {\n return wordIndex < 0 || wordIndex >= wordCount ? _zeroWord : wordAt(wordIndex);\n };\n\n const getSegments = (wordIndex: number): MemorySegment[] => {\n return wordIndex < 0 || wordIndex >= wordCount ? _emptySegments : segments[wordIndex];\n };\n\n const slice = (offset: number, size: number): Uint8Array => {\n if (size <= 0) return new Uint8Array(0);\n const out = new Uint8Array(size);\n if (offset < 0 || offset >= rawLength) return out;\n const end = Math.min(offset + size, rawLength);\n out.set(buffer.subarray(offset, end), 0);\n return out;\n };\n\n const mload = (offset: number): Uint8Array => slice(offset, 32);\n\n return {\n hex,\n buffer,\n roundedLength,\n padding,\n dataLength: originalBuf.length,\n wordCount,\n wordHexes,\n wordStats,\n getWord,\n getSegments,\n mload,\n slice,\n };\n};\n", "import { MAX_128_BIT, MAX_256_BIT } from './constants';\nimport { add, and, not, or, shl, shr, sigext, sub, xor } from './opcodes';\nimport { _normHex, _uint8ArrayToHex, initMemoryView, MemorySegment } from './utils';\nexport const DEC_ADDR = '0x00000000000000000000000000000000000000e0';\n\nexport type ForwardMode = 'call' | 'delegatecall' | 'staticcall' | 'none';\n\nconst _pad64 = (s: string) => s.padStart(64, '0'),\n _zeroW = _pad64('0'),\n _cdsizeW = _pad64('20'),\n _decW = _pad64('e0'),\n _returnSuffix = '3d5f5f3e3d5ff3',\n _revertSuffix = '3d5f5f3e3d5ffd';\n\nexport const _jitDecompressor = function (\n calldata: string,\n to: string,\n from?: string,\n forward: ForwardMode = 'call',\n revert = false,\n clean_env = false,\n): { bytecode: string; calldata: string; to: string; from?: string; balance: string } {\n const fromHex = from ? _normHex(from) : null;\n const cleanEnv = clean_env || forward === 'none';\n\n let padding = 28,\n bestW: string | null = null,\n bestF = 0,\n originalTo = _normHex(to).padStart(16, '0'),\n fromAddr = fromHex ? BigInt('0x' + fromHex) : 96n,\n selfbalance = 2n,\n ops: number[] = [],\n data: (Uint8Array | null)[] = [],\n stack: bigint[] = [],\n trackedMemSize = 0,\n mem: bigint[] = [],\n firstPass = true;\n\n const view = initMemoryView(calldata, padding);\n const { wordCount } = view;\n\n const decAddr = 224n,\n stackFreq = new Map<bigint, number>(),\n decW = _decW,\n fromW = _pad64(fromHex ?? fromAddr.toString(16)),\n toW = _pad64(originalTo);\n\n for (const [w, st] of view.wordStats) {\n const f = st[0];\n if (w === _zeroW || w === _cdsizeW || w === decW || w === fromW || w === toW) continue;\n if (f > bestF) (bestF = f), (bestW = w);\n }\n if (bestW) selfbalance = BigInt('0x' + bestW);\n\n const roundUp32 = (x: number) => (x + 31) & ~31;\n\n const getStackIdx = (val: bigint): number => {\n for (let i = stack.length - 1, d = 0; d < 16 && i >= 0; --i, ++d) {\n if (stack[i] === val) return d;\n }\n return -1;\n };\n\n const ctr = <K>(m: Map<K, number>, k: K, delta: number) => m.set(k, (m.get(k) || 0) + delta);\n\n const pushOp = (op: number, d?: Uint8Array | null) => {\n ops.push(op);\n data.push(d ?? null);\n // Byte offset of next opcode in the final bytecode stream.\n // For PUSHn (0x60..0x7f), add the immediate length (n) as well.\n programCnt += BigInt(1 + (op >= 0x60 && op <= 0x7f ? op - 0x5f : 0));\n };\n\n const pushS = (v: bigint, freqDelta: number = 1) => {\n stack.push(v);\n if (freqDelta !== 0) ctr(stackFreq, v, freqDelta);\n };\n\n const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n\n const trackMem = (offset: number, size: number) => {\n trackedMemSize = roundUp32(offset + size);\n };\n\n let programCnt = 0n;\n\n const addOp = (op: number, imm?: Uint8Array) => {\n if (op === 0x80) {\n // DUP1\n pushS(stack[stack.length - 1]!, firstPass ? 0 : 1);\n }\n if (op === 0x50) stack.pop();\n if (op === 0x47) pushS(selfbalance, 0);\n if (op === 0x30) pushS(decAddr, 0);\n if (op === 0x33) pushS(fromAddr, 0);\n if (op === 0x36) pushS(32n, 0);\n if (op === 0x59) pushS(BigInt(trackedMemSize), 0);\n if (op === 0x0b) {\n // SIGNEXTEND\n const [byteSize, val] = pop2();\n pushS(sigext(byteSize, val), 1);\n }\n if (op === 0x19) {\n // NOT\n pushS(not(stack.pop()!), 0);\n }\n if (op === 0x18) {\n // XOR\n const [a, b] = pop2();\n pushS(xor(a, b), 1);\n }\n if (op === 0x16) {\n // AND\n const [a, b] = pop2();\n pushS(and(a, b), 1);\n }\n if (op === 0x17) {\n // OR\n const [a, b] = pop2();\n pushS(or(a, b), 1);\n }\n if (op === 0x01) {\n // ADD\n const [a, b] = pop2();\n pushS(add(a, b), 1);\n }\n if (op === 0x03) {\n // SUB\n const [a, b] = pop2();\n pushS(sub(b, a), 1);\n }\n if (op === 0x1b) {\n // SHL\n const [shift, val] = pop2();\n pushS(shl(shift, val), 1);\n }\n if (op === 0x1c) {\n // SHR\n const [shift, val] = pop2();\n pushS(shr(shift, val), 1);\n }\n if ((op >= 0x60 && op <= 0x7f) || op === 0x5f) {\n let v = 0n; // PUSH* and PUSH0\n for (const b of imm || []) v = (v << 8n) | BigInt(b);\n if (!cleanEnv) {\n if (v === selfbalance) {\n pushS(v, 0);\n pushOp(0x47);\n return;\n }\n if (v === decAddr) {\n pushS(v, 0);\n pushOp(0x30);\n return;\n }\n if (v === fromAddr) {\n pushS(v, 0);\n pushOp(0x33); // FROM ADDRESS\n return;\n }\n if (v === 32n) {\n pushS(v, 0);\n pushOp(0x36); // CALLDATASIZE\n return;\n }\n }\n if (v === BigInt(trackedMemSize) && v != 0n) {\n pushS(v, 0);\n pushOp(0x59);\n return;\n }\n const idx = getStackIdx(v);\n if (idx != -1 && op != 0x5f) {\n const freqDelta = firstPass ? 1 : 0;\n pushS(v, freqDelta);\n pushOp(0x80 + idx);\n return;\n }\n if (!firstPass && op !== 0x5f && v === programCnt) {\n pushS(v, 0);\n pushOp(0x58);\n return;\n }\n if (v === MAX_256_BIT) {\n pushS(v, 0);\n pushOp(0x5f); // PUSH0\n pushOp(0x19); // NOT\n return;\n }\n pushS(v, 1);\n pushOp(op, imm || null);\n return;\n }\n if (op === 0x51) {\n // MLOAD\n pushS(mem[Number(stack.pop()!) >>> 5] ?? 0n, 0);\n }\n if (op === 0x52) {\n // MSTORE\n const [offset, value] = pop2();\n const k = Number(offset);\n mem[k >>> 5] = value & MAX_256_BIT;\n trackMem(k, 32);\n }\n if (op === 0x53) {\n // MSTORE8\n const [offset, _] = pop2();\n trackMem(Number(offset), 1);\n }\n pushOp(op, imm || null);\n };\n\n const op = (opcode: number) => addOp(opcode);\n\n const bytesLen = (v: bigint): number => {\n if (v === 0n) return 0;\n let n = 0;\n let t = v < 0n ? -v : v;\n while (t > 0n) {\n ++n;\n t >>= 8n;\n }\n return n;\n };\n\n const pushCost = (v: bigint): number =>\n v === 0n || v === 1n || (v !== 0n && v === BigInt(trackedMemSize))\n ? 1\n : v === MAX_256_BIT\n ? 2\n : 1 + bytesLen(v);\n\n const pushN = (value: number | bigint) => {\n const v = typeof value === 'bigint' ? value : BigInt(value);\n if (v > 0n && v === BigInt(trackedMemSize)) return addOp(0x59);\n if (v === 0n) return addOp(0x5f);\n\n let tmp = v;\n const len = bytesLen(tmp);\n const bytes = new Uint8Array(len);\n for (let i = len - 1; i >= 0; --i) {\n bytes[i] = Number(tmp & 0xffn);\n tmp >>= 8n;\n }\n return addOp(0x5f + len, bytes);\n };\n\n const pushB = (buf: Uint8Array) => addOp(0x5f + buf.length, buf);\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\n const emitPushN = (v: number | bigint) => {\n plan.push({ t: 'num', v });\n pushN(v);\n };\n const emitPushB = (b: Uint8Array) => {\n plan.push({ t: 'bytes', b });\n pushB(b);\n };\n const emitOp = (o: number) => {\n plan.push({ t: 'op', o });\n op(o);\n };\n\n const estShlCost = (seg: MemorySegment[]) => {\n let cost = 0;\n let first = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n const s = se >>> 8,\n e = se & 0xff;\n cost += 1 + (e - s + 1); // PUSH<n> immediate bytes\n if (31 - e > 0) cost += 3; // PUSH1 shift + SHL\n if (!first) cost += 1; // OR\n first = false;\n }\n return cost;\n };\n\n const emitBestValueForWord = (word: Uint8Array, seg: MemorySegment[]) => {\n const literal = word.subarray(seg[0]! >>> 8);\n let literalVal = 0n;\n for (let i = 0; i < literal.length; i++) literalVal = (literalVal << 8n) | BigInt(literal[i]!);\n const literalCost = pushCost(literalVal);\n const shlCost = estShlCost(seg);\n let bestCost = literalCost;\n let bestEmit: () => void = () => emitPushB(literal);\n // Try NOT: PUSH(~x) NOT\n const notVal = not(literalVal);\n const notCost = pushCost(notVal) + 1;\n if (notCost < bestCost) {\n bestCost = notCost;\n bestEmit = () => {\n emitPushN(notVal);\n emitOp(0x19);\n };\n }\n\n // Try SUB: PUSH0, PUSH(x), SUB\n const subVal = sub(0n, literalVal);\n const subCost = pushCost(subVal) + 2;\n if (subCost < bestCost) {\n bestCost = subCost;\n bestEmit = () => {\n emitPushN(0);\n emitPushN(subVal);\n emitOp(0x03);\n };\n }\n\n // Try 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 (\n extended === literalVal &&\n (truncated & (1n << BigInt(numBytes * 8 - 1))) !== 0n // must be negative in that width\n ) {\n const signCost = pushCost(truncated) + 3; // PUSH + 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\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 if (reconstructed === literalVal) {\n const shiftNotCost = pushCost(notShifted) + pushCost(BigInt(shiftBits)) + 2; // PUSH + PUSH + SHL + NOT\n if (shiftNotCost < bestCost) {\n bestCost = shiftNotCost;\n bestEmit = () => {\n emitPushN(notShifted);\n emitPushN(shiftBits);\n emitOp(0x1b);\n emitOp(0x19);\n };\n }\n }\n }\n // Try SHL/OR\n if (shlCost < bestCost) {\n bestCost = shlCost;\n bestEmit = () => {\n let first = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n const s = se >>> 8,\n e = se & 0xff;\n const suffix0s = 31 - e;\n emitPushB(word.subarray(s, e + 1));\n if (suffix0s > 0) {\n emitPushN(suffix0s * 8);\n emitOp(0x1b); // SHL\n }\n if (!first) emitOp(0x17); // OR\n first = false;\n }\n };\n }\n return { literal, literalVal, bestCost, bestEmit, literalCost, shlCost };\n };\n\n let wordIndex = 0;\n while (wordIndex < wordCount) {\n const base = wordIndex * 32;\n const word = view.getWord(wordIndex);\n const seg = view.getSegments(wordIndex);\n if (!seg.length) {\n ++wordIndex;\n continue;\n }\n\n const wordHex = view.wordHexes[wordIndex]!;\n // Encode Run?\n let nextIndex = wordIndex + 1;\n while (nextIndex < wordCount) {\n const s2 = view.getSegments(nextIndex);\n if (!s2.length) break;\n if (view.wordHexes[nextIndex] !== wordHex) break;\n ++nextIndex;\n }\n const runLen = nextIndex - wordIndex;\n\n if (runLen >= 2) {\n const lastIndex = nextIndex - 1;\n const { bestEmit } = emitBestValueForWord(word, seg);\n // First store: keep word value on stack.\n bestEmit(); // push value\n emitOp(0x80); // DUP1 (keep value)\n emitPushN(base); // offset (MSIZE if aligned)\n emitOp(0x52); // MSTORE\n\n for (let j = 1; j < runLen; j++) {\n emitOp(0x80); // DUP1\n emitOp(0x59); // MSIZE\n emitOp(0x52); // MSTORE\n }\n const stats = view.wordStats.get(wordHex);\n if (stats && stats[3] <= lastIndex) {\n emitOp(0x50); // POP\n }\n wordIndex = nextIndex;\n continue;\n }\n\n const { literalCost, shlCost, bestCost, bestEmit } = emitBestValueForWord(word, seg);\n // Try MLOAD/MSTORE reuse\n if (literalCost > 8) {\n const stats = view.wordStats.get(wordHex);\n if (stats && stats[6] !== -1 && wordIndex > stats[2]) {\n const baseBytes = stats[4] === 0 ? 0 : (32 - Math.clz32(stats[4]) + 7) >> 3;\n if (literalCost > stats[6] + baseBytes) {\n emitPushN(stats[4]);\n emitOp(0x51); // MLOAD\n emitPushN(base);\n emitOp(0x52); // MSTORE\n ++wordIndex;\n continue;\n }\n }\n }\n let byte8s = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n if (se >>> 8 !== (se & 0xff)) {\n byte8s = false;\n break;\n }\n }\n const byte8sCost = seg.length * 3; // PUSH1(value), PUSH1(offset), MSTORE8\n if (byte8s && byte8sCost < bestCost && byte8sCost <= shlCost) {\n for (let i = 0; i < seg.length; i++) {\n const s = seg[i]! >>> 8;\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n ++wordIndex;\n continue;\n }\n // Default\n bestEmit();\n emitPushN(base);\n emitOp(0x52); // MSTORE\n ++wordIndex;\n }\n\n //2nd pass: preseed dictionary + emit final ops\n ops = [];\n data = [];\n stack = [];\n trackedMemSize = 0;\n mem = [];\n firstPass = false;\n programCnt = 0n;\n\n const pre: { val: bigint; uses: number; net: number; p: number }[] = [];\n for (const [val, uses] of stackFreq) {\n if (\n uses > 1 &&\n val !== 0n &&\n val !== 32n &&\n val !== selfbalance &&\n val !== decAddr &&\n val !== fromAddr &&\n val <= MAX_128_BIT\n ) {\n const p = pushCost(val);\n const net = uses * (p - 1) - p;\n if (net > 0) pre.push({ val, uses, net, p });\n }\n }\n\n pre.sort((a, b) => b.net - a.net || b.uses - a.uses || a.p - b.p);\n for (let i = 0; i < 15 && i < pre.length; ++i) pushN(pre[i]!.val);\n\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 let suffix = '';\n if (forward === 'none') {\n pushN(view.dataLength);\n pushN(padding);\n op(revert ? 0xfd : 0xf3); // REVERT or RETURN the decompressed memory\n } else {\n // Stack: retSize=0, retOffset=0, argsSize, argsOffset\n op(0x5f); // PUSH0 (retSize)\n op(0x5f); // PUSH0 (retOffset)\n pushN(view.dataLength); // argsSize\n pushN(padding); // argsOffset\n if (forward === 'call') {\n // CALLVALUE PUSH0 CALLDATALOAD GAS CALL\n suffix = '345f355af1';\n } else if (forward === 'delegatecall') {\n // PUSH0 CALLDATALOAD GAS DELEGATECALL (no value param)\n suffix = '5f355af4';\n } else {\n // PUSH0 CALLDATALOAD GAS STATICCALL (no value param)\n suffix = '5f355afa';\n }\n suffix += revert ? _revertSuffix : _returnSuffix;\n }\n\n let outLen = ops.length;\n\n for (let i = 0; i < ops.length; ++i)\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) outLen += data[i]!.length;\n\n const out = new Uint8Array(outLen);\n\n for (let i = 0, o = 0; i < ops.length; ++i) {\n out[o++] = ops[i]!;\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) out.set(data[i]!, o), (o += data[i]!.length);\n }\n\n const bytecode = '0x' + _uint8ArrayToHex(out) + suffix;\n const calldataOut = '0x' + _pad64(originalTo);\n const fromOut = cleanEnv\n ? fromHex\n ? fromHex.padStart(40, '0')\n : undefined\n : fromAddr.toString(16).padStart(40, '0');\n const balanceOut = cleanEnv ? '0' : selfbalance.toString(16);\n\n return {\n bytecode,\n calldata: calldataOut,\n to: DEC_ADDR,\n from: fromOut,\n balance: balanceOut,\n };\n};\n", "import type { ForwardMode } from './compiler/jit';\nimport { _normHex } from './compiler/utils';\n\nconst _flzLoop = (a: number, b: number, c: number, d: number, e: number) => {\n const h = (v: number) => v.toString(16).padStart(2, '0');\n return (\n '5b803590815f1a918260051c908160' +\n h(a) +\n '575050906002818360018095013586520101920101906002565b' +\n '600260078396949314958260011a87020194611f0082870193886001011a9160081b16019560018701968503930101945f198301518452808211602083111760' +\n h(b) +\n '575b' +\n '50505001600201906002565b6020811860208211021891825b82811060' +\n h(c) +\n '575060' +\n h(d) +\n '565b8181015f19015185820152830160' +\n h(e) +\n '56'\n );\n};\n\nconst _rleCore =\n '578082527f' +\n '7f'.repeat(32) +\n '8082168101909117171980157fc0c8c8d0c8e8d0d8c8e8e0e8d0d8e0f0c8d0e8d0e0e0d8f0d0d0e0d8f8f8f8f8' +\n '601f6f8421084210842108cc6318c6db6d54be660204081020408185821060071b' +\n '86811c6001600160401b031060061b1795861c0260181a1c161a90911860031c019081019101368110';\n\nconst _rleTail = (a: string, b: string) =>\n '5b50' +\n a +\n '565b90610006565b60029060011a920191608081600101111561' +\n b +\n '575f19825201607e1901368210610006575f91508190' +\n a +\n '565b5f825201600101368210610006575f91508190' +\n a +\n '56';\n\n/** Solady LibZip. FLZ*/\n//! @__PURE__\nexport const flzFwdBytecode = (\n address: string,\n forward: ForwardMode = 'call',\n revert = false,\n): string => {\n const ret = revert ? 'fd' : 'f3';\n if (forward === 'none')\n return '0x5f5f5b368110600c57505f' + ret + _flzLoop(0x35, 0x84, 0x9c, 0x78, 0x91);\n\n const addr = _normHex(address).padStart(40, '0');\n const d = forward === 'call' ? 1 : 0;\n const h = (v: number) => v.toString(16).padStart(2, '0');\n const op = forward === 'delegatecall' ? 'f4' : forward === 'call' ? 'f1' : 'fa';\n\n return (\n '0x5f5f5b36811060' +\n h(0x32 + d) +\n '575f808381' +\n (d ? '34' : '') +\n '73' +\n addr +\n '5a' +\n op +\n '3d5f803e60' +\n h(0x2e + d) +\n '573d5ffd5b3d5f' +\n ret +\n _flzLoop(0x5b + d, 0xaa + d, 0xc2 + d, 0x9e + d, 0xb7 + d)\n );\n};\n\n/** Solady LibZip. RLE.*/\n//! @__PURE__\nexport const rleFwdBytecode = (\n address: string,\n forward: ForwardMode = 'call',\n revert = false,\n): string => {\n const ret = revert ? 'fd' : 'f3';\n if (forward === 'none')\n return (\n '0x365f80375f365b8151805f1a156100cf' +\n _rleCore +\n '6100c957368111156100c35736900390035b36900336' +\n ret +\n _rleTail('6100bd', '6100fb')\n );\n\n const addr = _normHex(address).padStart(40, '0');\n const d = forward === 'call' ? 1 : 0;\n const h = (v: number) => v.toString(16).padStart(2, '0');\n const op = forward === 'delegatecall' ? 'f4' : forward === 'call' ? 'f1' : 'fa';\n\n return (\n '0x365f80375f365b8151805f1a156100' +\n h(0xf8 + d) +\n _rleCore +\n '6100' +\n h(0xf2 + d) +\n '575f918291368111156100' +\n h(0xec + d) +\n '5736900390035b36900336' +\n (d ? '34' : '') +\n '73' +\n addr +\n '5a' +\n op +\n '3d5f803e6100' +\n h(0xe8 + d) +\n '573d5ffd5b3d5f' +\n ret +\n _rleTail('6100c1', '01' + h(0x27 + d))\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["jit_compressor_exports", "__export", "compress_call", "__toCommonJS", "import_solady", "MAX_128_BIT", "MAX_256_BIT", "not", "a", "MAX_256_BIT", "and", "a", "b", "MAX_256_BIT", "or", "xor", "add", "sub", "shl", "shift", "value", "shr", "sigext", "byteSize", "bits", "_normHex", "hex", "_hexes", "_", "i", "_nibbles", "t", "_hexToUint8Array", "normalized", "len", "bytes", "j", "_uint8ArrayToHex", "_zeroWord", "_emptySegments", "initMemoryView", "calldata", "padding", "originalBuf", "buffer", "rawLength", "wordCount", "roundedLength", "rounded", "segments", "wordHexes", "wordStats", "prevWordHex", "wordAt", "wordIndex", "base", "word", "wordHex", "existing", "isRunContinuation", "stats", "seg", "s", "reuseCost", "getWord", "getSegments", "slice", "offset", "size", "out", "end", "mload", "DEC_ADDR", "_pad64", "s", "_zeroW", "_cdsizeW", "_decW", "_returnSuffix", "_revertSuffix", "_jitDecompressor", "calldata", "to", "from", "forward", "revert", "clean_env", "fromHex", "_normHex", "cleanEnv", "padding", "bestW", "bestF", "originalTo", "fromAddr", "selfbalance", "ops", "data", "stack", "trackedMemSize", "mem", "firstPass", "view", "initMemoryView", "wordCount", "decAddr", "stackFreq", "decW", "fromW", "toW", "w", "st", "f", "roundUp32", "x", "getStackIdx", "val", "i", "d", "ctr", "m", "k", "delta", "pushOp", "op", "programCnt", "pushS", "v", "freqDelta", "pop2", "trackMem", "offset", "size", "addOp", "imm", "byteSize", "sigext", "not", "a", "b", "xor", "and", "or", "add", "sub", "shift", "shl", "shr", "idx", "MAX_256_BIT", "value", "_", "opcode", "bytesLen", "n", "t", "pushCost", "pushN", "tmp", "len", "bytes", "pushB", "buf", "plan", "emitPushN", "emitPushB", "emitOp", "o", "estShlCost", "seg", "cost", "first", "se", "e", "emitBestValueForWord", "word", "literal", "literalVal", "literalCost", "shlCost", "bestCost", "bestEmit", "notVal", "notCost", "subVal", "subCost", "numBytes", "mask", "truncated", "signCost", "shiftBits", "shifted", "notShifted", "shiftNotCost", "suffix0s", "wordIndex", "base", "wordHex", "nextIndex", "runLen", "lastIndex", "j", "stats", "baseBytes", "byte8s", "byte8sCost", "pre", "uses", "MAX_128_BIT", "p", "net", "step", "suffix", "outLen", "out", "bytecode", "_uint8ArrayToHex", "calldataOut", "fromOut", "balanceOut", "_flzLoop", "a", "b", "c", "d", "e", "h", "v", "_rleCore", "_rleTail", "flzFwdBytecode", "address", "forward", "revert", "ret", "addr", "_normHex", "op", "rleFwdBytecode", "compress_call", "payload", "alg", "forward", "revert", "clean_env", "method", "params", "txObj", "blockParam", "overrides", "_", "k", "originalSize", "inputData", "to", "from", "noForward", "bytecode", "calldata", "decompressorAddress", "fromAddr", "balanceHex", "result", "_jitDecompressor", "jit", "flzData", "cdData", "flzFwdBytecode", "h", "sel", "i", "rleFwdBytecode", "DEC_ADDR", "_normHex", "stateOverride", "compressedTxObj"]
|
|
7
7
|
}
|
package/_esm/jit-compressor.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{LibZip as
|
|
1
|
+
import{LibZip as Nt}from"solady";var Mt=(1n<<128n)-1n,W=(1n<<256n)-1n;var ft=r=>~r&W;var It=(r,e)=>r&e&W,Ct=(r,e)=>(r|e)&W,Ut=(r,e)=>(r^e)&W,Wt=(r,e)=>r+e&W,ut=(r,e)=>r-e&W,bt=(r,e)=>e<<r&W,dt=(r,e)=>e>>r&W,gt=(r,e)=>{if(r>=31n)return e&W;let l=Number((r+1n)*8n);return BigInt.asUintN(256,BigInt.asIntN(l,e))};var P=r=>(r.charCodeAt(0)===48&&(r.charCodeAt(1)|32)===120?r.slice(2):r).toLowerCase(),Xt=Array.from({length:256},(r,e)=>e.toString(16).padStart(2,"0")),Ft=(()=>{let r=new Int8Array(103).fill(-1);for(let e=0;e<10;e++)r[48+e]=e;for(let e=0;e<6;e++)r[97+e]=10+e;return r})(),Rt=r=>{let e=P(r),l=e.length,d=new Uint8Array(l/2);for(let g=0,f=0;g<l;g+=2)d[f++]=Ft[e.charCodeAt(g)]<<4|Ft[e.charCodeAt(g+1)];return d},xt=r=>{let e="";for(let l=0;l<r.length;l++)e+=Xt[r[l]];return e},Kt=new Uint8Array(32),Zt=[],zt=(r,e)=>{let l=P(r),d=Rt(l),g=new Uint8Array(e+d.length);g.set(d,e);let f=g.length,a=Math.ceil(f/32),S=a*32;if(f!==S){let i=new Uint8Array(S);i.set(g,0),g=i}let k=new Array(a),T=new Array(a),H=new Map,j=null,F=i=>{let p=i<<5;return g.subarray(p,p+32)};for(let i=0;i<a;i++){let p=i<<5,y=F(i),h=xt(y);T[i]=h;let O=H.get(h),u=j===h;if(O)O[0]+=1,u||(O[1]+=1),O[3]=i,O[5]=p;else{let w=[1,1,i,i,p,p,-1];H.set(h,w)}j=h;let V=[];for(let w=0;w<32;){for(;w<32&&y[w]===0;)++w;if(w>=32)break;let nt=w;for(;w<32&&y[w]!==0;)++w;V.push(nt<<8|w-1)}k[i]=V}for(let i of H.values()){let y=(i[4]===0?0:32-Math.clz32(i[4])+7>>3)+3;i[6]=32>y?y:-1}let D=i=>i<0||i>=a?Kt:F(i),I=i=>i<0||i>=a?Zt:k[i],A=(i,p)=>{if(p<=0)return new Uint8Array(0);let y=new Uint8Array(p);if(i<0||i>=f)return y;let h=Math.min(i+p,f);return y.set(g.subarray(i,h),0),y},m=i=>A(i,32);return{hex:l,buffer:g,roundedLength:S,padding:e,dataLength:d.length,wordCount:a,wordHexes:T,wordStats:H,getWord:D,getSegments:I,mload:m,slice:A}};var mt="0x00000000000000000000000000000000000000e0",v=r=>r.padStart(64,"0"),Yt=v("0"),vt=v("20"),Gt=v("e0"),Jt="3d5f5f3e3d5ff3",Qt="3d5f5f3e3d5ffd",pt=function(r,e,l,d="call",g=!1,f=!1){let a=l?P(l):null,S=f||d==="none",k=28,T=null,H=0,j=P(e).padStart(16,"0"),F=a?BigInt("0x"+a):96n,D=2n,I=[],A=[],m=[],i=0,p=[],y=!0,h=zt(r,k),{wordCount:O}=h,u=224n,V=new Map,w=Gt,nt=v(a??F.toString(16)),et=v(j);for(let[t,o]of h.wordStats){let n=o[0];t===Yt||t===vt||t===w||t===nt||t===et||n>H&&(H=n,T=t)}T&&(D=BigInt("0x"+T));let rt=t=>t+31&-32,Z=t=>{for(let o=m.length-1,n=0;n<16&&o>=0;--o,++n)if(m[o]===t)return n;return-1},Tt=(t,o,n)=>t.set(o,(t.get(o)||0)+n),N=(t,o)=>{I.push(t),A.push(o??null),at+=BigInt(1+(t>=96&&t<=127?t-95:0))},b=(t,o=1)=>{m.push(t),o!==0&&Tt(V,t,o)},E=()=>[m.pop(),m.pop()],ht=(t,o)=>{i=rt(t+o)},at=0n,G=(t,o)=>{if(t===128&&b(m[m.length-1],y?0:1),t===80&&m.pop(),t===71&&b(D,0),t===48&&b(u,0),t===51&&b(F,0),t===54&&b(32n,0),t===89&&b(BigInt(i),0),t===11){let[n,s]=E();b(gt(n,s),1)}if(t===25&&b(ft(m.pop()),0),t===24){let[n,s]=E();b(Ut(n,s),1)}if(t===22){let[n,s]=E();b(It(n,s),1)}if(t===23){let[n,s]=E();b(Ct(n,s),1)}if(t===1){let[n,s]=E();b(Wt(n,s),1)}if(t===3){let[n,s]=E();b(ut(s,n),1)}if(t===27){let[n,s]=E();b(bt(n,s),1)}if(t===28){let[n,s]=E();b(dt(n,s),1)}if(t>=96&&t<=127||t===95){let n=0n;for(let x of o||[])n=n<<8n|BigInt(x);if(!S){if(n===D){b(n,0),N(71);return}if(n===u){b(n,0),N(48);return}if(n===F){b(n,0),N(51);return}if(n===32n){b(n,0),N(54);return}}if(n===BigInt(i)&&n!=0n){b(n,0),N(89);return}let s=Z(n);if(s!=-1&&t!=95){b(n,y?1:0),N(128+s);return}if(!y&&t!==95&&n===at){b(n,0),N(88);return}if(n===W){b(n,0),N(95),N(25);return}b(n,1),N(t,o||null);return}if(t===81&&b(p[Number(m.pop())>>>5]??0n,0),t===82){let[n,s]=E(),x=Number(n);p[x>>>5]=s&W,ht(x,32)}if(t===83){let[n,s]=E();ht(Number(n),1)}N(t,o||null)},J=t=>G(t),yt=t=>{if(t===0n)return 0;let o=0,n=t<0n?-t:t;for(;n>0n;)++o,n>>=8n;return o},R=t=>t===0n||t===1n||t!==0n&&t===BigInt(i)?1:t===W?2:1+yt(t),K=t=>{let o=typeof t=="bigint"?t:BigInt(t);if(o>0n&&o===BigInt(i))return G(89);if(o===0n)return G(95);let n=o,s=yt(n),x=new Uint8Array(s);for(let L=s-1;L>=0;--L)x[L]=Number(n&0xffn),n>>=8n;return G(95+s,x)},St=t=>G(95+t.length,t),ot=[],C=t=>{ot.push({t:"num",v:t}),K(t)},At=t=>{ot.push({t:"bytes",b:t}),St(t)},B=t=>{ot.push({t:"op",o:t}),J(t)},jt=t=>{let o=0,n=!0;for(let s=0;s<t.length;s++){let x=t[s],L=x>>>8,M=x&255;o+=1+(M-L+1),31-M>0&&(o+=3),n||(o+=1),n=!1}return o},wt=(t,o)=>{let n=t.subarray(o[0]>>>8),s=0n;for(let c=0;c<n.length;c++)s=s<<8n|BigInt(n[c]);let x=R(s),L=jt(o),M=x,q=()=>At(n),it=ft(s),ct=R(it)+1;ct<M&&(M=ct,q=()=>{C(it),B(25)});let $=ut(0n,s),tt=R($)+2;tt<M&&(M=tt,q=()=>{C(0),C($),B(3)});for(let c=1;c<n.length;c++){let _=(1n<<BigInt(c*8))-1n,U=s&_;if(gt(BigInt(c-1),U)===s&&(U&1n<<BigInt(c*8-1))!==0n){let X=R(U)+3;X<M&&(M=X,q=()=>{C(U),C(c-1),B(11)});break}}for(let c=8;c<=248;c+=8){let _=dt(BigInt(c),s);if(_===0n)break;let U=ft(_);if(bt(BigInt(c),U)===s){let X=R(U)+R(BigInt(c))+2;X<M&&(M=X,q=()=>{C(U),C(c),B(27),B(25)})}}return L<M&&(M=L,q=()=>{let c=!0;for(let _=0;_<o.length;_++){let U=o[_],Y=U>>>8,X=U&255,Bt=31-X;At(t.subarray(Y,X+1)),Bt>0&&(C(Bt*8),B(27)),c||B(23),c=!1}}),{literal:n,literalVal:s,bestCost:M,bestEmit:q,literalCost:x,shlCost:L}},z=0;for(;z<O;){let t=z*32,o=h.getWord(z),n=h.getSegments(z);if(!n.length){++z;continue}let s=h.wordHexes[z],x=z+1;for(;x<O&&!(!h.getSegments(x).length||h.wordHexes[x]!==s);)++x;let L=x-z;if(L>=2){let c=x-1,{bestEmit:_}=wt(o,n);_(),B(128),C(t),B(82);for(let Y=1;Y<L;Y++)B(128),B(89),B(82);let U=h.wordStats.get(s);U&&U[3]<=c&&B(80),z=x;continue}let{literalCost:M,shlCost:q,bestCost:it,bestEmit:ct}=wt(o,n);if(M>8){let c=h.wordStats.get(s);if(c&&c[6]!==-1&&z>c[2]){let _=c[4]===0?0:32-Math.clz32(c[4])+7>>3;if(M>c[6]+_){C(c[4]),B(81),C(t),B(82),++z;continue}}}let $=!0;for(let c=0;c<n.length;c++){let _=n[c];if(_>>>8!==(_&255)){$=!1;break}}let tt=n.length*3;if($&&tt<it&&tt<=q){for(let c=0;c<n.length;c++){let _=n[c]>>>8;C(o[_]),C(t+_),B(83)}++z;continue}ct(),C(t),B(82),++z}I=[],A=[],m=[],i=0,p=[],y=!1,at=0n;let st=[];for(let[t,o]of V)if(o>1&&t!==0n&&t!==32n&&t!==D&&t!==u&&t!==F&&t<=Mt){let n=R(t),s=o*(n-1)-n;s>0&&st.push({val:t,uses:o,net:s,p:n})}st.sort((t,o)=>o.net-t.net||o.uses-t.uses||t.p-o.p);for(let t=0;t<15&&t<st.length;++t)K(st[t].val);for(let t of ot)t.t==="num"?K(t.v):t.t==="bytes"?St(t.b):t.t==="op"&&J(t.o);let Q="";d==="none"?(K(h.dataLength),K(k),J(g?253:243)):(J(95),J(95),K(h.dataLength),K(k),d==="call"?Q="345f355af1":d==="delegatecall"?Q="5f355af4":Q="5f355afa",Q+=g?Qt:Jt);let _t=I.length;for(let t=0;t<I.length;++t)I[t]>=96&&I[t]<=127&&A[t]&&(_t+=A[t].length);let lt=new Uint8Array(_t);for(let t=0,o=0;t<I.length;++t)lt[o++]=I[t],I[t]>=96&&I[t]<=127&&A[t]&&(lt.set(A[t],o),o+=A[t].length);let Vt="0x"+xt(lt)+Q,Et="0x"+v(j),Pt=S?a?a.padStart(40,"0"):void 0:F.toString(16).padStart(40,"0"),qt=S?"0":D.toString(16);return{bytecode:Vt,calldata:Et,to:mt,from:Pt,balance:qt}};var kt=(r,e,l,d,g)=>{let f=a=>a.toString(16).padStart(2,"0");return"5b803590815f1a918260051c908160"+f(r)+"575050906002818360018095013586520101920101906002565b600260078396949314958260011a87020194611f0082870193886001011a9160081b16019560018701968503930101945f198301518452808211602083111760"+f(e)+"575b50505001600201906002565b6020811860208211021891825b82811060"+f(l)+"575060"+f(d)+"565b8181015f19015185820152830160"+f(g)+"56"},Ht="578082527f"+"7f".repeat(32)+"8082168101909117171980157fc0c8c8d0c8e8d0d8c8e8e0e8d0d8e0f0c8d0e8d0e0e0d8f0d0d0e0d8f8f8f8f8601f6f8421084210842108cc6318c6db6d54be660204081020408185821060071b86811c6001600160401b031060061b1795861c0260181a1c161a90911860031c019081019101368110",Dt=(r,e)=>"5b50"+r+"565b90610006565b60029060011a920191608081600101111561"+e+"575f19825201607e1901368210610006575f91508190"+r+"565b5f825201600101368210610006575f91508190"+r+"56";var Lt=(r,e="call",l=!1)=>{let d=l?"fd":"f3";if(e==="none")return"0x5f5f5b368110600c57505f"+d+kt(53,132,156,120,145);let g=P(r).padStart(40,"0"),f=e==="call"?1:0,a=k=>k.toString(16).padStart(2,"0"),S=e==="delegatecall"?"f4":e==="call"?"f1":"fa";return"0x5f5f5b36811060"+a(50+f)+"575f808381"+(f?"34":"")+"73"+g+"5a"+S+"3d5f803e60"+a(46+f)+"573d5ffd5b3d5f"+d+kt(91+f,170+f,194+f,158+f,183+f)};var Ot=(r,e="call",l=!1)=>{let d=l?"fd":"f3";if(e==="none")return"0x365f80375f365b8151805f1a156100cf"+Ht+"6100c957368111156100c35736900390035b36900336"+d+Dt("6100bd","6100fb");let g=P(r).padStart(40,"0"),f=e==="call"?1:0,a=k=>k.toString(16).padStart(2,"0"),S=e==="delegatecall"?"f4":e==="call"?"f1":"fa";return"0x365f80375f365b8151805f1a156100"+a(248+f)+Ht+"6100"+a(242+f)+"575f918291368111156100"+a(236+f)+"5736900390035b36900336"+(f?"34":"")+"73"+g+"5a"+S+"3d5f803e6100"+a(232+f)+"573d5ffd5b3d5f"+d+Dt("6100c1","01"+a(39+f))};var mn=function(r,e,l="call",d=!1,g=!1){let{method:f,params:a}=r;if(f&&f!=="eth_call")return r;let S=a?.[0]||r,k=a?.[1],T=a?.[2];if(!S?.to||!S?.data||(()=>{if(T)for(let u in T)return!0;for(let u in S)if(u!=="to"&&u!=="data"&&u!=="from")return!0;return!1})())return r;let H=S.data.length;if(H<1150)return r;let j=S.data,F=S.to,D=S.from,I=l==="none",A,m,i,p,y;if(I||e==="jit"||!e&&(H<3e3||H>=8e3)){let u=pt(j,F,D,l,d,g);A=u.bytecode,m=u.calldata,i=u.to,p=u.from,y=u.balance}else{let u=e?null:pt(j,F,D,l,d,g),V=e==="flz"||!e?Nt.flzCompress(j):null,w=e==="cd"||!e&&V?Nt.cdCompress(j):null;if(e==="flz"||!e&&V&&(!w||V.length<w.length))m=V,A=Lt(F,l,d);else{let et=w.replace(/^0x/,""),rt="";for(let Z=0;Z<8;Z+=2)rt+=(parseInt(et.substring(Z,Z+2),16)^255).toString(16).padStart(2,"0");m="0x"+rt+et.substring(8),A=Ot(F,l,d)}i=mt,p=D?P(D).padStart(16,"0"):void 0,y="0",!e&&u&&u.bytecode.length+u.calldata.length<A.length+m.length&&(A=u.bytecode,m=u.calldata,i=u.to,p=u.from,y=u.balance)}if(A.length+m.length>=H)return r;let h={code:A,balance:"0x"+y},O={to:i,data:m};return p&&(O.from="0x"+p),{...r,params:[O,k,{...T,[i]:h}]}};export{mn as compress_call};
|
|
2
2
|
//! @__PURE__
|
|
3
3
|
//# sourceMappingURL=jit-compressor.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/jit-compressor.ts", "../../src/compiler/constants.ts", "../../src/compiler/opcodes.ts", "../../src/compiler/utils.ts", "../../src/compiler/jit.ts", "../../src/contracts.ts"],
|
|
4
|
-
"sourcesContent": ["import { LibZip } from 'solady';\nimport { _jitDecompressor, DEC_ADDR } from './compiler';\nimport { _normHex } from './compiler/utils';\nimport { flzFwdBytecode, rleFwdBytecode } from './contracts';\nimport { MIN_BODY_SIZE } from './index';\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 * - 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 !txObj?.to ||\n !txObj?.data ||\n (() => {\n if (overrides) for (const _ in overrides) return true;\n for (const k in txObj) if (k !== 'to' && k !== 'data' && k !== 'from') return true;\n return false;\n })()\n ) {\n return payload;\n }\n\n const originalSize = txObj.data.length;\n if (originalSize < MIN_BODY_SIZE) return payload;\n\n const inputData = txObj.data;\n const to = txObj.to;\n const from = txObj.from;\n\n let bytecode: string;\n let calldata: string;\n let decompressorAddress: string;\n let fromAddr: string | undefined;\n let balanceHex: string;\n\n if (alg === 'jit' || (!alg && (originalSize < 3000 || originalSize >= 8000))) {\n const result = _jitDecompressor(inputData, to, from);\n bytecode = result.bytecode;\n calldata = result.calldata;\n decompressorAddress = result.to;\n fromAddr = result.from;\n balanceHex = result.balance;\n } else {\n const jit = !alg ? _jitDecompressor(inputData, to, from) : null;\n const flzData = alg === 'flz' || !alg ? LibZip.flzCompress(inputData) : null;\n const cdData = alg === 'cd' || (!alg && flzData) ? LibZip.cdCompress(inputData) : null;\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 decompressorAddress = DEC_ADDR;\n fromAddr = from ? _normHex(from).padStart(16, '0') : undefined;\n balanceHex = '0';\n if (\n !alg &&\n jit &&\n jit.bytecode.length + jit.calldata.length < bytecode.length + calldata.length\n ) {\n bytecode = jit.bytecode;\n calldata = jit.calldata;\n decompressorAddress = jit.to;\n fromAddr = jit.from;\n balanceHex = jit.balance;\n }\n }\n\n // Skip if not beneficial\n if (bytecode.length + calldata.length >= originalSize) return payload;\n\n const stateOverride: any = {\n code: bytecode,\n balance: '0x' + balanceHex,\n };\n\n const compressedTxObj: any = { to: decompressorAddress, data: calldata };\n\n if (fromAddr) compressedTxObj.from = '0x' + fromAddr;\n\n return {\n ...payload,\n params: [compressedTxObj, blockParam, { ...overrides, [decompressorAddress]: stateOverride }],\n };\n};\n", "export const MAX_128_BIT = (1n << 128n) - 1n;\nexport const MAX_256_BIT = (1n << 256n) - 1n;\n", "import { MAX_256_BIT } from './constants';\n\nexport const not = (a: bigint): bigint => ~a & MAX_256_BIT;\nexport const eq = (a: bigint, b: bigint): bigint => (a === b ? 1n : 0n);\nexport const and = (a: bigint, b: bigint): bigint => a & b & MAX_256_BIT;\nexport const or = (a: bigint, b: bigint): bigint => (a | b) & MAX_256_BIT;\nexport const xor = (a: bigint, b: bigint): bigint => (a ^ b) & MAX_256_BIT;\n\nexport const add = (a: bigint, b: bigint): bigint => (a + b) & MAX_256_BIT;\nexport const sub = (a: bigint, b: bigint): bigint => (a - b) & MAX_256_BIT;\n\nexport const shl = (shift: bigint, value: bigint): bigint => (value << shift) & MAX_256_BIT;\nexport const shr = (shift: bigint, value: bigint): bigint => (value >> shift) & MAX_256_BIT;\n\nexport const sigext = (byteSize: bigint, value: bigint): bigint => {\n if (byteSize >= 31n) return value & MAX_256_BIT;\n const bits = Number((byteSize + 1n) * 8n);\n return BigInt.asUintN(256, BigInt.asIntN(bits, value));\n};\n\nexport const clz = (value: bigint): bigint => {\n if (value === 0n) return 256n;\n let count = 0n;\n let mask = 1n << 255n;\n while ((value & mask) === 0n && count < 256n) {\n count++;\n mask >>= 1n;\n }\n return count;\n};\n", "export const _normHex = (hex: string): string =>\n (hex.charCodeAt(0) === 48 && (hex.charCodeAt(1) | 32) === 120 ? hex.slice(2) : hex).toLowerCase();\n\nconst _hexes = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0')),\n _nibbles = (() => {\n const t = new Int8Array(103).fill(-1);\n for (let i = 0; i < 10; i++) t[48 + i] = i;\n for (let i = 0; i < 6; i++) t[97 + i] = 10 + i;\n return t;\n })();\n\nexport const _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, j = 0; i < len; i += 2) {\n bytes[j++] = (_nibbles[normalized.charCodeAt(i)] << 4) | _nibbles[normalized.charCodeAt(i + 1)];\n }\n return bytes;\n};\n\nexport const _uint8ArrayToHex = (bytes: Uint8Array): string => {\n let hex = '';\n for (let i = 0; i < bytes.length; i++) hex += _hexes[bytes[i]]!;\n return hex;\n};\n\nexport type MemorySegment = number; // (s << 8) | e, both in [0..31]\nconst _zeroWord = new Uint8Array(32);\nconst _emptySegments: MemorySegment[] = [];\n\nexport type WordStats = [\n freq: number,\n normFreq: number,\n firstWordIndex: number,\n lastWordIndex: number,\n firstOffset: number,\n lastOffset: number,\n reuseCost: number,\n];\n\nexport interface MemoryView {\n /** Normalized hex string (without 0x) of the original payload. */\n readonly hex: string;\n /** Backing buffer containing `padding` zero bytes followed by the payload. */\n readonly buffer: Uint8Array;\n /** Total length of the backing buffer (padding + payload length), rounded up to full words. */\n readonly roundedLength: number;\n /** Number of zero bytes prefixed before the payload. */\n readonly padding: number;\n /** Length of the original (unpadded) payload in bytes. */\n readonly dataLength: number;\n /** Number of 32-byte words in this view. */\n readonly wordCount: number;\n /** Hex string (without 0x) for each 32-byte word in the view. */\n readonly wordHexes: readonly string[];\n readonly wordStats: ReadonlyMap<string, WordStats>;\n /** Return the nth 32-byte word (zero-padded on the right if incomplete). */\n getWord(wordIndex: number): Uint8Array;\n /** Return all non-zero byte segments (packed as (s<<8)|e) within the nth 32-byte word. */\n getSegments(wordIndex: number): MemorySegment[];\n mload(offset: number): Uint8Array;\n /**\n * Read an arbitrary slice starting at `offset` for `size` bytes,\n * padding with zeros when reading past `length`.\n */\n slice(offset: number, size: number): Uint8Array;\n}\n\nexport const initMemoryView = (calldata: string, padding: number): MemoryView => {\n const hex = _normHex(calldata);\n const originalBuf = _hexToUint8Array(hex);\n let buffer = new Uint8Array(padding + originalBuf.length);\n buffer.set(originalBuf, padding);\n const rawLength = buffer.length;\n const wordCount = Math.ceil(rawLength / 32);\n const roundedLength = wordCount * 32;\n if (rawLength !== roundedLength) {\n const rounded = new Uint8Array(roundedLength);\n rounded.set(buffer, 0);\n buffer = rounded;\n }\n\n const segments: MemorySegment[][] = new Array(wordCount);\n const wordHexes: string[] = new Array(wordCount);\n const wordStats = new Map<string, WordStats>();\n\n let prevWordHex: string | null = null;\n const wordAt = (wordIndex: number) => {\n const base = wordIndex << 5;\n return buffer.subarray(base, base + 32);\n };\n\n for (let wordIndex = 0; wordIndex < wordCount; wordIndex++) {\n const base = wordIndex << 5;\n const word = wordAt(wordIndex);\n\n const wordHex = _uint8ArrayToHex(word);\n wordHexes[wordIndex] = wordHex;\n const existing = wordStats.get(wordHex);\n const isRunContinuation = prevWordHex === wordHex;\n if (!existing) {\n const stats: WordStats = [1, 1, wordIndex, wordIndex, base, base, -1];\n wordStats.set(wordHex, stats);\n } else {\n existing[0] += 1;\n if (!isRunContinuation) existing[1] += 1;\n existing[3] = wordIndex;\n existing[5] = base;\n }\n prevWordHex = wordHex;\n\n const seg: MemorySegment[] = [];\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 << 8) | (i - 1));\n }\n segments[wordIndex] = seg;\n }\n\n for (const stats of wordStats.values()) {\n const baseBytes = stats[4] === 0 ? 0 : (32 - Math.clz32(stats[4]) + 7) >> 3;\n const reuseCost = baseBytes + 3;\n stats[6] = 32 > reuseCost ? reuseCost : -1;\n }\n\n const getWord = (wordIndex: number): Uint8Array => {\n return wordIndex < 0 || wordIndex >= wordCount ? _zeroWord : wordAt(wordIndex);\n };\n\n const getSegments = (wordIndex: number): MemorySegment[] => {\n return wordIndex < 0 || wordIndex >= wordCount ? _emptySegments : segments[wordIndex];\n };\n\n const slice = (offset: number, size: number): Uint8Array => {\n if (size <= 0) return new Uint8Array(0);\n const out = new Uint8Array(size);\n if (offset < 0 || offset >= rawLength) return out;\n const end = Math.min(offset + size, rawLength);\n out.set(buffer.subarray(offset, end), 0);\n return out;\n };\n\n const mload = (offset: number): Uint8Array => slice(offset, 32);\n\n return {\n hex,\n buffer,\n roundedLength,\n padding,\n dataLength: originalBuf.length,\n wordCount,\n wordHexes,\n wordStats,\n getWord,\n getSegments,\n mload,\n slice,\n };\n};\n", "import { MAX_128_BIT, MAX_256_BIT } from './constants';\nimport { add, and, not, or, shl, shr, sigext, sub, xor } from './opcodes';\nimport { _normHex, _uint8ArrayToHex, initMemoryView, MemorySegment } from './utils';\nexport const DEC_ADDR = '0x00000000000000000000000000000000000000e0';\n\nconst _pad64 = (s: string) => s.padStart(64, '0'),\n _zeroW = _pad64('0'),\n _cdsizeW = _pad64('20'),\n _decW = _pad64('e0'),\n _retSuffix = '345f355af13d5f5f3e3d5ff3';\n\nexport const _jitDecompressor = function (\n calldata: string,\n to: string,\n from?: string,\n): { bytecode: string; calldata: string; to: string; from?: string; balance: string } {\n const fromHex = from ? _normHex(from) : null;\n\n let padding = 28,\n bestW: string | null = null,\n bestF = 0,\n originalTo = _normHex(to).padStart(16, '0'),\n fromAddr = fromHex ? BigInt('0x' + fromHex) : 96n,\n selfbalance = 2n,\n ops: number[] = [],\n data: (Uint8Array | null)[] = [],\n stack: bigint[] = [],\n trackedMemSize = 0,\n mem: bigint[] = [],\n firstPass = true;\n\n const view = initMemoryView(calldata, padding);\n const { wordCount } = view;\n\n const decAddr = 224n,\n stackFreq = new Map<bigint, number>(),\n decW = _decW,\n fromW = _pad64(fromHex ?? fromAddr.toString(16)),\n toW = _pad64(originalTo);\n\n for (const [w, st] of view.wordStats) {\n const f = st[0];\n if (w === _zeroW || w === _cdsizeW || w === decW || w === fromW || w === toW) continue;\n if (f > bestF) (bestF = f), (bestW = w);\n }\n if (bestW) selfbalance = BigInt('0x' + bestW);\n\n const roundUp32 = (x: number) => (x + 31) & ~31;\n\n const getStackIdx = (val: bigint): number => {\n for (let i = stack.length - 1, d = 0; d < 16 && i >= 0; --i, ++d) {\n if (stack[i] === val) return d;\n }\n return -1;\n };\n\n const ctr = <K>(m: Map<K, number>, k: K, delta: number) => m.set(k, (m.get(k) || 0) + delta);\n\n const pushOp = (op: number, d?: Uint8Array | null) => {\n ops.push(op);\n data.push(d ?? null);\n };\n\n const pushS = (v: bigint, freqDelta: number = 1) => {\n stack.push(v);\n if (freqDelta !== 0) ctr(stackFreq, v, freqDelta);\n };\n\n const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n\n const trackMem = (offset: number, size: number) => {\n trackedMemSize = roundUp32(offset + size);\n };\n\n const addOp = (op: number, imm?: Uint8Array) => {\n if (op === 0x80) {\n // DUP1\n pushS(stack[stack.length - 1]!, firstPass ? 0 : 1);\n }\n if (op === 0x50) stack.pop();\n if (op === 0x47) pushS(selfbalance, 0);\n if (op === 0x30) pushS(decAddr, 0);\n if (op === 0x33) pushS(fromAddr, 0);\n if (op === 0x36) pushS(32n, 0);\n if (op === 0x59) pushS(BigInt(trackedMemSize), 0);\n if (op === 0x0b) {\n // SIGNEXTEND\n const [byteSize, val] = pop2();\n pushS(sigext(byteSize, val), 1);\n }\n if (op === 0x19) {\n // NOT\n pushS(not(stack.pop()!), 0);\n }\n if (op === 0x18) {\n // XOR\n const [a, b] = pop2();\n pushS(xor(a, b), 1);\n }\n if (op === 0x16) {\n // AND\n const [a, b] = pop2();\n pushS(and(a, b), 1);\n }\n if (op === 0x17) {\n // OR\n const [a, b] = pop2();\n pushS(or(a, b), 1);\n }\n if (op === 0x01) {\n // ADD\n const [a, b] = pop2();\n pushS(add(a, b), 1);\n }\n if (op === 0x03) {\n // SUB\n const [a, b] = pop2();\n pushS(sub(b, a), 1);\n }\n if (op === 0x1b) {\n // SHL\n const [shift, val] = pop2();\n pushS(shl(shift, val), 1);\n }\n if (op === 0x1c) {\n // SHR\n const [shift, val] = pop2();\n pushS(shr(shift, val), 1);\n }\n if ((op >= 0x60 && op <= 0x7f) || op === 0x5f) {\n let v = 0n; // PUSH* and PUSH0\n for (const b of imm || []) v = (v << 8n) | BigInt(b);\n if (v === selfbalance) {\n pushS(v, 0);\n pushOp(0x47);\n return;\n }\n if (v === decAddr) {\n pushS(v, 0);\n pushOp(0x30);\n return;\n }\n if (v === fromAddr) {\n pushS(v, 0);\n pushOp(0x33); // FROM ADDRESS\n return;\n }\n if (v === 32n) {\n pushS(v, 0);\n pushOp(0x36); // CALLDATASIZE\n return;\n }\n if (v === BigInt(trackedMemSize) && v != 0n) {\n pushS(v, 0);\n pushOp(0x59);\n return;\n }\n const idx = getStackIdx(v);\n if (idx != -1 && op != 0x5f) {\n const freqDelta = firstPass ? 1 : 0;\n pushS(v, freqDelta);\n pushOp(0x80 + idx);\n return;\n }\n if (v === MAX_256_BIT) {\n pushS(v, 0);\n pushOp(0x5f); // PUSH0\n pushOp(0x19); // NOT\n return;\n }\n pushS(v, 1);\n pushOp(op, imm || null);\n return;\n }\n if (op === 0x51) {\n // MLOAD\n pushS(mem[Number(stack.pop()!) >>> 5] ?? 0n, 0);\n }\n if (op === 0x52) {\n // MSTORE\n const [offset, value] = pop2();\n const k = Number(offset);\n mem[k >>> 5] = value & MAX_256_BIT;\n trackMem(k, 32);\n }\n if (op === 0x53) {\n // MSTORE8\n const [offset, _] = pop2();\n trackMem(Number(offset), 1);\n }\n pushOp(op, imm || null);\n };\n\n const op = (opcode: number) => addOp(opcode);\n\n const bytesLen = (v: bigint): number => {\n if (v === 0n) return 0;\n let n = 0;\n let t = v < 0n ? -v : v;\n while (t > 0n) {\n ++n;\n t >>= 8n;\n }\n return n;\n };\n\n const pushCost = (v: bigint): number => (v === 0n ? 1 : 1 + bytesLen(v));\n\n const pushN = (value: number | bigint) => {\n const v = typeof value === 'bigint' ? value : BigInt(value);\n if (v > 0n && v === BigInt(trackedMemSize)) return addOp(0x59);\n if (v === 32n) return addOp(0x36);\n if (v === 0n) return addOp(0x5f);\n\n let tmp = v;\n const len = bytesLen(tmp);\n const bytes = new Uint8Array(len);\n for (let i = len - 1; i >= 0; --i) {\n bytes[i] = Number(tmp & 0xffn);\n tmp >>= 8n;\n }\n return addOp(0x5f + len, bytes);\n };\n\n const pushB = (buf: Uint8Array) => addOp(0x5f + buf.length, buf);\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\n const emitPushN = (v: number | bigint) => {\n plan.push({ t: 'num', v });\n pushN(v);\n };\n const emitPushB = (b: Uint8Array) => {\n plan.push({ t: 'bytes', b });\n pushB(b);\n };\n const emitOp = (o: number) => {\n plan.push({ t: 'op', o });\n op(o);\n };\n\n const estShlCost = (seg: MemorySegment[]) => {\n let cost = 0;\n let first = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n const s = se >>> 8,\n e = se & 0xff;\n cost += 1 + (e - s + 1); // PUSH<n> immediate bytes\n if (31 - e > 0) cost += 3; // PUSH1 shift + SHL\n if (!first) cost += 1; // OR\n first = false;\n }\n return cost;\n };\n\n const emitBestValueForWord = (word: Uint8Array, seg: MemorySegment[]) => {\n const literal = word.subarray(seg[0]! >>> 8);\n let literalVal = 0n;\n for (let i = 0; i < literal.length; i++) literalVal = (literalVal << 8n) | BigInt(literal[i]!);\n const literalCost = literal.length + 1;\n const shlCost = estShlCost(seg);\n let bestCost = literalCost;\n let bestEmit: () => void = () => emitPushB(literal);\n // Try NOT: PUSH(~x) NOT\n const notVal = not(literalVal);\n const notCost = pushCost(notVal) + 1;\n if (notCost < bestCost) {\n bestCost = notCost;\n bestEmit = () => {\n emitPushN(notVal);\n emitOp(0x19);\n };\n }\n\n // Try SUB: PUSH0, PUSH(x), SUB\n const subVal = sub(0n, literalVal);\n const subCost = pushCost(subVal) + 2;\n if (subCost < bestCost) {\n bestCost = subCost;\n bestEmit = () => {\n emitPushN(0);\n emitPushN(subVal);\n emitOp(0x03);\n };\n }\n\n // Try 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 (\n extended === literalVal &&\n (truncated & (1n << BigInt(numBytes * 8 - 1))) !== 0n // must be negative in that width\n ) {\n const signCost = pushCost(truncated) + 3; // PUSH + 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\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 if (reconstructed === literalVal) {\n const shiftNotCost = pushCost(notShifted) + pushCost(BigInt(shiftBits)) + 2; // PUSH + PUSH + SHL + NOT\n if (shiftNotCost < bestCost) {\n bestCost = shiftNotCost;\n bestEmit = () => {\n emitPushN(notShifted);\n emitPushN(shiftBits);\n emitOp(0x1b);\n emitOp(0x19);\n };\n }\n }\n }\n // Try SHL/OR\n if (shlCost < bestCost) {\n bestCost = shlCost;\n bestEmit = () => {\n let first = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n const s = se >>> 8,\n e = se & 0xff;\n const suffix0s = 31 - e;\n emitPushB(word.subarray(s, e + 1));\n if (suffix0s > 0) {\n emitPushN(suffix0s * 8);\n emitOp(0x1b); // SHL\n }\n if (!first) emitOp(0x17); // OR\n first = false;\n }\n };\n }\n return { literal, literalVal, bestCost, bestEmit, literalCost, shlCost };\n };\n\n let wordIndex = 0;\n while (wordIndex < wordCount) {\n const base = wordIndex * 32;\n const word = view.getWord(wordIndex);\n const seg = view.getSegments(wordIndex);\n if (!seg.length) {\n ++wordIndex;\n continue;\n }\n\n const wordHex = view.wordHexes[wordIndex]!;\n // Encode Run?\n let nextIndex = wordIndex + 1;\n while (nextIndex < wordCount) {\n const s2 = view.getSegments(nextIndex);\n if (!s2.length) break;\n if (view.wordHexes[nextIndex] !== wordHex) break;\n ++nextIndex;\n }\n const runLen = nextIndex - wordIndex;\n\n if (runLen >= 2) {\n const lastIndex = nextIndex - 1;\n const { bestEmit } = emitBestValueForWord(word, seg);\n // First store: keep word value on stack.\n bestEmit(); // push value\n emitOp(0x80); // DUP1 (keep value)\n emitPushN(base); // offset (MSIZE if aligned)\n emitOp(0x52); // MSTORE\n\n for (let j = 1; j < runLen; j++) {\n emitOp(0x80); // DUP1\n emitOp(0x59); // MSIZE\n emitOp(0x52); // MSTORE\n }\n const stats = view.wordStats.get(wordHex);\n if (stats && stats[3] <= lastIndex) {\n emitOp(0x50); // POP\n }\n wordIndex = nextIndex;\n continue;\n }\n\n const { literalCost, shlCost, bestCost, bestEmit } = emitBestValueForWord(word, seg);\n // Try MLOAD/MSTORE reuse\n if (literalCost > 8) {\n const stats = view.wordStats.get(wordHex);\n if (stats && stats[6] !== -1 && wordIndex > stats[2]) {\n const baseBytes = stats[4] === 0 ? 0 : (32 - Math.clz32(stats[4]) + 7) >> 3;\n if (literalCost > stats[6] + baseBytes) {\n emitPushN(stats[4]);\n emitOp(0x51); // MLOAD\n emitPushN(base);\n emitOp(0x52); // MSTORE\n ++wordIndex;\n continue;\n }\n }\n }\n let byte8s = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n if (se >>> 8 !== (se & 0xff)) {\n byte8s = false;\n break;\n }\n }\n const byte8sCost = seg.length * 3; // PUSH1(value), PUSH1(offset), MSTORE8\n if (byte8s && byte8sCost < bestCost && byte8sCost <= shlCost) {\n for (let i = 0; i < seg.length; i++) {\n const s = seg[i]! >>> 8;\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n ++wordIndex;\n continue;\n }\n // Default\n bestEmit();\n emitPushN(base);\n emitOp(0x52); // MSTORE\n ++wordIndex;\n }\n\n //2nd pass: preseed dictionary + emit final ops\n ops = [];\n data = [];\n stack = [];\n trackedMemSize = 0;\n mem = [];\n firstPass = false;\n\n const pre: { val: bigint; uses: number; net: number; p: number }[] = [];\n for (const [val, uses] of stackFreq) {\n if (\n uses > 1 &&\n val !== 0n &&\n val !== 32n &&\n val !== selfbalance &&\n val !== decAddr &&\n val !== fromAddr &&\n val <= MAX_128_BIT\n ) {\n const p = pushCost(val);\n const net = uses * (p - 1) - p;\n if (net > 0) pre.push({ val, uses, net, p });\n }\n }\n\n pre.sort((a, b) => b.net - a.net || b.uses - a.uses || a.p - b.p);\n for (let i = 0; i < 15 && i < pre.length; ++i) pushN(pre[i]!.val);\n\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 // - 0x5f5f: PUSH0 PUSH0 (retSize=0, retOffset=0)\n // - pushN(view.dataLength): argsSize\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(view.dataLength); // argsSize = actual data length\n pushN(padding); // argsOffset = padding\n\n // - CALLVALUE, load target address from calldata[0], GAS, CALL\n // - RETURNDATACOPY(0, 0, RETURNDATASIZE)\n // - RETURN(0, RETURNDATASIZE)\n let outLen = ops.length;\n\n for (let i = 0; i < ops.length; ++i)\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) outLen += data[i]!.length;\n\n const out = new Uint8Array(outLen);\n\n for (let i = 0, o = 0; i < ops.length; ++i) {\n out[o++] = ops[i]!;\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) out.set(data[i]!, o), (o += data[i]!.length);\n }\n\n const bytecode = '0x' + _uint8ArrayToHex(out) + _retSuffix;\n const calldataOut = '0x' + _pad64(originalTo);\n\n return {\n bytecode,\n calldata: calldataOut,\n to: DEC_ADDR,\n from: fromAddr.toString(16).padStart(40, '0'),\n balance: selfbalance.toString(16),\n };\n};\n", "import { _normHex } from './compiler/utils';\n\n/**\n * Generates FastLZ (LZ77) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const flzFwdBytecode = (address: string): string =>\n `0x365f73${_normHex(address)}815b838110602f575f80848134865af1503d5f803e3d5ff35b803590815f1a8060051c908115609857600190600783149285831a6007018118840218600201948383011a90601f1660081b0101808603906020811860208211021890815f5b80830151818a015201858110609257505050600201019201916018565b82906075565b6001929350829150019101925f5b82811060b3575001916018565b85851060c1575b60010160a6565b936001818192355f1a878501530194905060ba56`;\n\n/**\n * Generates RLE (run-length encoded) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.\n * @param address - Target contract address\n * @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}\n * @pure\n */\n//! @__PURE__\nexport const rleFwdBytecode = (address: string): string =>\n `0x5f5f5b368110602d575f8083813473${_normHex(address)}5af1503d5f803e3d5ff35b600180820192909160031981019035185f1a8015604c57815301906002565b505f19815282820192607f9060031981019035185f1a818111156072575b160101906002565b838101368437606a56`;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["LibZip", "MAX_128_BIT", "MAX_256_BIT", "not", "a", "MAX_256_BIT", "and", "a", "b", "MAX_256_BIT", "or", "xor", "add", "sub", "shl", "shift", "value", "shr", "sigext", "byteSize", "bits", "_normHex", "hex", "_hexes", "_", "i", "_nibbles", "t", "_hexToUint8Array", "normalized", "len", "bytes", "j", "_uint8ArrayToHex", "_zeroWord", "_emptySegments", "initMemoryView", "calldata", "padding", "originalBuf", "buffer", "rawLength", "wordCount", "roundedLength", "rounded", "segments", "wordHexes", "wordStats", "prevWordHex", "wordAt", "wordIndex", "base", "word", "wordHex", "existing", "isRunContinuation", "stats", "seg", "s", "reuseCost", "getWord", "getSegments", "slice", "offset", "size", "out", "end", "mload", "DEC_ADDR", "_pad64", "s", "_zeroW", "_cdsizeW", "_decW", "
|
|
4
|
+
"sourcesContent": ["import { LibZip } from 'solady';\nimport { _jitDecompressor, DEC_ADDR } from './compiler';\nimport type { ForwardMode } from './compiler/jit';\nimport { _normHex } from './compiler/utils';\nimport { flzFwdBytecode, rleFwdBytecode } from './contracts';\nimport { MIN_BODY_SIZE } from './index';\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 * - 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 (\n payload: any,\n alg?: string,\n forward: ForwardMode = 'call',\n revert = false,\n clean_env = false,\n): 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 !txObj?.to ||\n !txObj?.data ||\n (() => {\n if (overrides) for (const _ in overrides) return true;\n for (const k in txObj) if (k !== 'to' && k !== 'data' && k !== 'from') return true;\n return false;\n })()\n ) {\n return payload;\n }\n\n const originalSize = txObj.data.length;\n if (originalSize < MIN_BODY_SIZE) return payload;\n\n const inputData = txObj.data;\n const to = txObj.to;\n const from = txObj.from;\n const noForward = forward === 'none';\n\n let bytecode: string;\n let calldata: string;\n let decompressorAddress: string;\n let fromAddr: string | undefined;\n let balanceHex: string;\n\n if (noForward || alg === 'jit' || (!alg && (originalSize < 3000 || originalSize >= 8000))) {\n const result = _jitDecompressor(inputData, to, from, forward, revert, clean_env);\n bytecode = result.bytecode;\n calldata = result.calldata;\n decompressorAddress = result.to;\n fromAddr = result.from;\n balanceHex = result.balance;\n } else {\n const jit = !alg ? _jitDecompressor(inputData, to, from, forward, revert, clean_env) : null;\n const flzData = alg === 'flz' || !alg ? LibZip.flzCompress(inputData) : null;\n const cdData = alg === 'cd' || (!alg && flzData) ? LibZip.cdCompress(inputData) : null;\n const useFlz =\n alg === 'flz' || (!alg && flzData && (!cdData || flzData.length < cdData.length));\n\n if (useFlz) {\n calldata = flzData!;\n bytecode = flzFwdBytecode(to, forward, revert);\n } else {\n // Solady cdCompress negates the first 4 bytes (selector dispatch); XOR it back\n const h = cdData!.replace(/^0x/, '');\n let sel = '';\n for (let i = 0; i < 8; i += 2)\n sel += (parseInt(h.substring(i, i + 2), 16) ^ 0xff).toString(16).padStart(2, '0');\n calldata = '0x' + sel + h.substring(8);\n bytecode = rleFwdBytecode(to, forward, revert);\n }\n\n decompressorAddress = DEC_ADDR;\n fromAddr = from ? _normHex(from).padStart(16, '0') : undefined;\n balanceHex = '0';\n if (\n !alg &&\n jit &&\n jit.bytecode.length + jit.calldata.length < bytecode.length + calldata.length\n ) {\n bytecode = jit.bytecode;\n calldata = jit.calldata;\n decompressorAddress = jit.to;\n fromAddr = jit.from;\n balanceHex = jit.balance;\n }\n }\n\n // Skip if not beneficial\n if (bytecode.length + calldata.length >= originalSize) return payload;\n\n const stateOverride: any = {\n code: bytecode,\n balance: '0x' + balanceHex,\n };\n\n const compressedTxObj: any = { to: decompressorAddress, data: calldata };\n\n if (fromAddr) compressedTxObj.from = '0x' + fromAddr;\n\n return {\n ...payload,\n params: [compressedTxObj, blockParam, { ...overrides, [decompressorAddress]: stateOverride }],\n };\n};\n", "export const MAX_128_BIT = (1n << 128n) - 1n;\nexport const MAX_256_BIT = (1n << 256n) - 1n;\n", "import { MAX_256_BIT } from './constants';\n\nexport const not = (a: bigint): bigint => ~a & MAX_256_BIT;\nexport const eq = (a: bigint, b: bigint): bigint => (a === b ? 1n : 0n);\nexport const and = (a: bigint, b: bigint): bigint => a & b & MAX_256_BIT;\nexport const or = (a: bigint, b: bigint): bigint => (a | b) & MAX_256_BIT;\nexport const xor = (a: bigint, b: bigint): bigint => (a ^ b) & MAX_256_BIT;\n\nexport const add = (a: bigint, b: bigint): bigint => (a + b) & MAX_256_BIT;\nexport const sub = (a: bigint, b: bigint): bigint => (a - b) & MAX_256_BIT;\n\nexport const shl = (shift: bigint, value: bigint): bigint => (value << shift) & MAX_256_BIT;\nexport const shr = (shift: bigint, value: bigint): bigint => (value >> shift) & MAX_256_BIT;\n\nexport const sigext = (byteSize: bigint, value: bigint): bigint => {\n if (byteSize >= 31n) return value & MAX_256_BIT;\n const bits = Number((byteSize + 1n) * 8n);\n return BigInt.asUintN(256, BigInt.asIntN(bits, value));\n};\n\nexport const clz = (value: bigint): bigint => {\n if (value === 0n) return 256n;\n let count = 0n;\n let mask = 1n << 255n;\n while ((value & mask) === 0n && count < 256n) {\n count++;\n mask >>= 1n;\n }\n return count;\n};\n", "export const _normHex = (hex: string): string =>\n (hex.charCodeAt(0) === 48 && (hex.charCodeAt(1) | 32) === 120 ? hex.slice(2) : hex).toLowerCase();\n\nconst _hexes = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0')),\n _nibbles = (() => {\n const t = new Int8Array(103).fill(-1);\n for (let i = 0; i < 10; i++) t[48 + i] = i;\n for (let i = 0; i < 6; i++) t[97 + i] = 10 + i;\n return t;\n })();\n\nexport const _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, j = 0; i < len; i += 2) {\n bytes[j++] = (_nibbles[normalized.charCodeAt(i)] << 4) | _nibbles[normalized.charCodeAt(i + 1)];\n }\n return bytes;\n};\n\nexport const _uint8ArrayToHex = (bytes: Uint8Array): string => {\n let hex = '';\n for (let i = 0; i < bytes.length; i++) hex += _hexes[bytes[i]]!;\n return hex;\n};\n\nexport type MemorySegment = number; // (s << 8) | e, both in [0..31]\nconst _zeroWord = new Uint8Array(32);\nconst _emptySegments: MemorySegment[] = [];\n\nexport type WordStats = [\n freq: number,\n normFreq: number,\n firstWordIndex: number,\n lastWordIndex: number,\n firstOffset: number,\n lastOffset: number,\n reuseCost: number,\n];\n\nexport interface MemoryView {\n /** Normalized hex string (without 0x) of the original payload. */\n readonly hex: string;\n /** Backing buffer containing `padding` zero bytes followed by the payload. */\n readonly buffer: Uint8Array;\n /** Total length of the backing buffer (padding + payload length), rounded up to full words. */\n readonly roundedLength: number;\n /** Number of zero bytes prefixed before the payload. */\n readonly padding: number;\n /** Length of the original (unpadded) payload in bytes. */\n readonly dataLength: number;\n /** Number of 32-byte words in this view. */\n readonly wordCount: number;\n /** Hex string (without 0x) for each 32-byte word in the view. */\n readonly wordHexes: readonly string[];\n readonly wordStats: ReadonlyMap<string, WordStats>;\n /** Return the nth 32-byte word (zero-padded on the right if incomplete). */\n getWord(wordIndex: number): Uint8Array;\n /** Return all non-zero byte segments (packed as (s<<8)|e) within the nth 32-byte word. */\n getSegments(wordIndex: number): MemorySegment[];\n mload(offset: number): Uint8Array;\n /**\n * Read an arbitrary slice starting at `offset` for `size` bytes,\n * padding with zeros when reading past `length`.\n */\n slice(offset: number, size: number): Uint8Array;\n}\n\nexport const initMemoryView = (calldata: string, padding: number): MemoryView => {\n const hex = _normHex(calldata);\n const originalBuf = _hexToUint8Array(hex);\n let buffer = new Uint8Array(padding + originalBuf.length);\n buffer.set(originalBuf, padding);\n const rawLength = buffer.length;\n const wordCount = Math.ceil(rawLength / 32);\n const roundedLength = wordCount * 32;\n if (rawLength !== roundedLength) {\n const rounded = new Uint8Array(roundedLength);\n rounded.set(buffer, 0);\n buffer = rounded;\n }\n\n const segments: MemorySegment[][] = new Array(wordCount);\n const wordHexes: string[] = new Array(wordCount);\n const wordStats = new Map<string, WordStats>();\n\n let prevWordHex: string | null = null;\n const wordAt = (wordIndex: number) => {\n const base = wordIndex << 5;\n return buffer.subarray(base, base + 32);\n };\n\n for (let wordIndex = 0; wordIndex < wordCount; wordIndex++) {\n const base = wordIndex << 5;\n const word = wordAt(wordIndex);\n\n const wordHex = _uint8ArrayToHex(word);\n wordHexes[wordIndex] = wordHex;\n const existing = wordStats.get(wordHex);\n const isRunContinuation = prevWordHex === wordHex;\n if (!existing) {\n const stats: WordStats = [1, 1, wordIndex, wordIndex, base, base, -1];\n wordStats.set(wordHex, stats);\n } else {\n existing[0] += 1;\n if (!isRunContinuation) existing[1] += 1;\n existing[3] = wordIndex;\n existing[5] = base;\n }\n prevWordHex = wordHex;\n\n const seg: MemorySegment[] = [];\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 << 8) | (i - 1));\n }\n segments[wordIndex] = seg;\n }\n\n for (const stats of wordStats.values()) {\n const baseBytes = stats[4] === 0 ? 0 : (32 - Math.clz32(stats[4]) + 7) >> 3;\n const reuseCost = baseBytes + 3;\n stats[6] = 32 > reuseCost ? reuseCost : -1;\n }\n\n const getWord = (wordIndex: number): Uint8Array => {\n return wordIndex < 0 || wordIndex >= wordCount ? _zeroWord : wordAt(wordIndex);\n };\n\n const getSegments = (wordIndex: number): MemorySegment[] => {\n return wordIndex < 0 || wordIndex >= wordCount ? _emptySegments : segments[wordIndex];\n };\n\n const slice = (offset: number, size: number): Uint8Array => {\n if (size <= 0) return new Uint8Array(0);\n const out = new Uint8Array(size);\n if (offset < 0 || offset >= rawLength) return out;\n const end = Math.min(offset + size, rawLength);\n out.set(buffer.subarray(offset, end), 0);\n return out;\n };\n\n const mload = (offset: number): Uint8Array => slice(offset, 32);\n\n return {\n hex,\n buffer,\n roundedLength,\n padding,\n dataLength: originalBuf.length,\n wordCount,\n wordHexes,\n wordStats,\n getWord,\n getSegments,\n mload,\n slice,\n };\n};\n", "import { MAX_128_BIT, MAX_256_BIT } from './constants';\nimport { add, and, not, or, shl, shr, sigext, sub, xor } from './opcodes';\nimport { _normHex, _uint8ArrayToHex, initMemoryView, MemorySegment } from './utils';\nexport const DEC_ADDR = '0x00000000000000000000000000000000000000e0';\n\nexport type ForwardMode = 'call' | 'delegatecall' | 'staticcall' | 'none';\n\nconst _pad64 = (s: string) => s.padStart(64, '0'),\n _zeroW = _pad64('0'),\n _cdsizeW = _pad64('20'),\n _decW = _pad64('e0'),\n _returnSuffix = '3d5f5f3e3d5ff3',\n _revertSuffix = '3d5f5f3e3d5ffd';\n\nexport const _jitDecompressor = function (\n calldata: string,\n to: string,\n from?: string,\n forward: ForwardMode = 'call',\n revert = false,\n clean_env = false,\n): { bytecode: string; calldata: string; to: string; from?: string; balance: string } {\n const fromHex = from ? _normHex(from) : null;\n const cleanEnv = clean_env || forward === 'none';\n\n let padding = 28,\n bestW: string | null = null,\n bestF = 0,\n originalTo = _normHex(to).padStart(16, '0'),\n fromAddr = fromHex ? BigInt('0x' + fromHex) : 96n,\n selfbalance = 2n,\n ops: number[] = [],\n data: (Uint8Array | null)[] = [],\n stack: bigint[] = [],\n trackedMemSize = 0,\n mem: bigint[] = [],\n firstPass = true;\n\n const view = initMemoryView(calldata, padding);\n const { wordCount } = view;\n\n const decAddr = 224n,\n stackFreq = new Map<bigint, number>(),\n decW = _decW,\n fromW = _pad64(fromHex ?? fromAddr.toString(16)),\n toW = _pad64(originalTo);\n\n for (const [w, st] of view.wordStats) {\n const f = st[0];\n if (w === _zeroW || w === _cdsizeW || w === decW || w === fromW || w === toW) continue;\n if (f > bestF) (bestF = f), (bestW = w);\n }\n if (bestW) selfbalance = BigInt('0x' + bestW);\n\n const roundUp32 = (x: number) => (x + 31) & ~31;\n\n const getStackIdx = (val: bigint): number => {\n for (let i = stack.length - 1, d = 0; d < 16 && i >= 0; --i, ++d) {\n if (stack[i] === val) return d;\n }\n return -1;\n };\n\n const ctr = <K>(m: Map<K, number>, k: K, delta: number) => m.set(k, (m.get(k) || 0) + delta);\n\n const pushOp = (op: number, d?: Uint8Array | null) => {\n ops.push(op);\n data.push(d ?? null);\n // Byte offset of next opcode in the final bytecode stream.\n // For PUSHn (0x60..0x7f), add the immediate length (n) as well.\n programCnt += BigInt(1 + (op >= 0x60 && op <= 0x7f ? op - 0x5f : 0));\n };\n\n const pushS = (v: bigint, freqDelta: number = 1) => {\n stack.push(v);\n if (freqDelta !== 0) ctr(stackFreq, v, freqDelta);\n };\n\n const pop2 = (): [bigint, bigint] => [stack.pop()!, stack.pop()!];\n\n const trackMem = (offset: number, size: number) => {\n trackedMemSize = roundUp32(offset + size);\n };\n\n let programCnt = 0n;\n\n const addOp = (op: number, imm?: Uint8Array) => {\n if (op === 0x80) {\n // DUP1\n pushS(stack[stack.length - 1]!, firstPass ? 0 : 1);\n }\n if (op === 0x50) stack.pop();\n if (op === 0x47) pushS(selfbalance, 0);\n if (op === 0x30) pushS(decAddr, 0);\n if (op === 0x33) pushS(fromAddr, 0);\n if (op === 0x36) pushS(32n, 0);\n if (op === 0x59) pushS(BigInt(trackedMemSize), 0);\n if (op === 0x0b) {\n // SIGNEXTEND\n const [byteSize, val] = pop2();\n pushS(sigext(byteSize, val), 1);\n }\n if (op === 0x19) {\n // NOT\n pushS(not(stack.pop()!), 0);\n }\n if (op === 0x18) {\n // XOR\n const [a, b] = pop2();\n pushS(xor(a, b), 1);\n }\n if (op === 0x16) {\n // AND\n const [a, b] = pop2();\n pushS(and(a, b), 1);\n }\n if (op === 0x17) {\n // OR\n const [a, b] = pop2();\n pushS(or(a, b), 1);\n }\n if (op === 0x01) {\n // ADD\n const [a, b] = pop2();\n pushS(add(a, b), 1);\n }\n if (op === 0x03) {\n // SUB\n const [a, b] = pop2();\n pushS(sub(b, a), 1);\n }\n if (op === 0x1b) {\n // SHL\n const [shift, val] = pop2();\n pushS(shl(shift, val), 1);\n }\n if (op === 0x1c) {\n // SHR\n const [shift, val] = pop2();\n pushS(shr(shift, val), 1);\n }\n if ((op >= 0x60 && op <= 0x7f) || op === 0x5f) {\n let v = 0n; // PUSH* and PUSH0\n for (const b of imm || []) v = (v << 8n) | BigInt(b);\n if (!cleanEnv) {\n if (v === selfbalance) {\n pushS(v, 0);\n pushOp(0x47);\n return;\n }\n if (v === decAddr) {\n pushS(v, 0);\n pushOp(0x30);\n return;\n }\n if (v === fromAddr) {\n pushS(v, 0);\n pushOp(0x33); // FROM ADDRESS\n return;\n }\n if (v === 32n) {\n pushS(v, 0);\n pushOp(0x36); // CALLDATASIZE\n return;\n }\n }\n if (v === BigInt(trackedMemSize) && v != 0n) {\n pushS(v, 0);\n pushOp(0x59);\n return;\n }\n const idx = getStackIdx(v);\n if (idx != -1 && op != 0x5f) {\n const freqDelta = firstPass ? 1 : 0;\n pushS(v, freqDelta);\n pushOp(0x80 + idx);\n return;\n }\n if (!firstPass && op !== 0x5f && v === programCnt) {\n pushS(v, 0);\n pushOp(0x58);\n return;\n }\n if (v === MAX_256_BIT) {\n pushS(v, 0);\n pushOp(0x5f); // PUSH0\n pushOp(0x19); // NOT\n return;\n }\n pushS(v, 1);\n pushOp(op, imm || null);\n return;\n }\n if (op === 0x51) {\n // MLOAD\n pushS(mem[Number(stack.pop()!) >>> 5] ?? 0n, 0);\n }\n if (op === 0x52) {\n // MSTORE\n const [offset, value] = pop2();\n const k = Number(offset);\n mem[k >>> 5] = value & MAX_256_BIT;\n trackMem(k, 32);\n }\n if (op === 0x53) {\n // MSTORE8\n const [offset, _] = pop2();\n trackMem(Number(offset), 1);\n }\n pushOp(op, imm || null);\n };\n\n const op = (opcode: number) => addOp(opcode);\n\n const bytesLen = (v: bigint): number => {\n if (v === 0n) return 0;\n let n = 0;\n let t = v < 0n ? -v : v;\n while (t > 0n) {\n ++n;\n t >>= 8n;\n }\n return n;\n };\n\n const pushCost = (v: bigint): number =>\n v === 0n || v === 1n || (v !== 0n && v === BigInt(trackedMemSize))\n ? 1\n : v === MAX_256_BIT\n ? 2\n : 1 + bytesLen(v);\n\n const pushN = (value: number | bigint) => {\n const v = typeof value === 'bigint' ? value : BigInt(value);\n if (v > 0n && v === BigInt(trackedMemSize)) return addOp(0x59);\n if (v === 0n) return addOp(0x5f);\n\n let tmp = v;\n const len = bytesLen(tmp);\n const bytes = new Uint8Array(len);\n for (let i = len - 1; i >= 0; --i) {\n bytes[i] = Number(tmp & 0xffn);\n tmp >>= 8n;\n }\n return addOp(0x5f + len, bytes);\n };\n\n const pushB = (buf: Uint8Array) => addOp(0x5f + buf.length, buf);\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\n const emitPushN = (v: number | bigint) => {\n plan.push({ t: 'num', v });\n pushN(v);\n };\n const emitPushB = (b: Uint8Array) => {\n plan.push({ t: 'bytes', b });\n pushB(b);\n };\n const emitOp = (o: number) => {\n plan.push({ t: 'op', o });\n op(o);\n };\n\n const estShlCost = (seg: MemorySegment[]) => {\n let cost = 0;\n let first = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n const s = se >>> 8,\n e = se & 0xff;\n cost += 1 + (e - s + 1); // PUSH<n> immediate bytes\n if (31 - e > 0) cost += 3; // PUSH1 shift + SHL\n if (!first) cost += 1; // OR\n first = false;\n }\n return cost;\n };\n\n const emitBestValueForWord = (word: Uint8Array, seg: MemorySegment[]) => {\n const literal = word.subarray(seg[0]! >>> 8);\n let literalVal = 0n;\n for (let i = 0; i < literal.length; i++) literalVal = (literalVal << 8n) | BigInt(literal[i]!);\n const literalCost = pushCost(literalVal);\n const shlCost = estShlCost(seg);\n let bestCost = literalCost;\n let bestEmit: () => void = () => emitPushB(literal);\n // Try NOT: PUSH(~x) NOT\n const notVal = not(literalVal);\n const notCost = pushCost(notVal) + 1;\n if (notCost < bestCost) {\n bestCost = notCost;\n bestEmit = () => {\n emitPushN(notVal);\n emitOp(0x19);\n };\n }\n\n // Try SUB: PUSH0, PUSH(x), SUB\n const subVal = sub(0n, literalVal);\n const subCost = pushCost(subVal) + 2;\n if (subCost < bestCost) {\n bestCost = subCost;\n bestEmit = () => {\n emitPushN(0);\n emitPushN(subVal);\n emitOp(0x03);\n };\n }\n\n // Try 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 (\n extended === literalVal &&\n (truncated & (1n << BigInt(numBytes * 8 - 1))) !== 0n // must be negative in that width\n ) {\n const signCost = pushCost(truncated) + 3; // PUSH + 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\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 if (reconstructed === literalVal) {\n const shiftNotCost = pushCost(notShifted) + pushCost(BigInt(shiftBits)) + 2; // PUSH + PUSH + SHL + NOT\n if (shiftNotCost < bestCost) {\n bestCost = shiftNotCost;\n bestEmit = () => {\n emitPushN(notShifted);\n emitPushN(shiftBits);\n emitOp(0x1b);\n emitOp(0x19);\n };\n }\n }\n }\n // Try SHL/OR\n if (shlCost < bestCost) {\n bestCost = shlCost;\n bestEmit = () => {\n let first = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n const s = se >>> 8,\n e = se & 0xff;\n const suffix0s = 31 - e;\n emitPushB(word.subarray(s, e + 1));\n if (suffix0s > 0) {\n emitPushN(suffix0s * 8);\n emitOp(0x1b); // SHL\n }\n if (!first) emitOp(0x17); // OR\n first = false;\n }\n };\n }\n return { literal, literalVal, bestCost, bestEmit, literalCost, shlCost };\n };\n\n let wordIndex = 0;\n while (wordIndex < wordCount) {\n const base = wordIndex * 32;\n const word = view.getWord(wordIndex);\n const seg = view.getSegments(wordIndex);\n if (!seg.length) {\n ++wordIndex;\n continue;\n }\n\n const wordHex = view.wordHexes[wordIndex]!;\n // Encode Run?\n let nextIndex = wordIndex + 1;\n while (nextIndex < wordCount) {\n const s2 = view.getSegments(nextIndex);\n if (!s2.length) break;\n if (view.wordHexes[nextIndex] !== wordHex) break;\n ++nextIndex;\n }\n const runLen = nextIndex - wordIndex;\n\n if (runLen >= 2) {\n const lastIndex = nextIndex - 1;\n const { bestEmit } = emitBestValueForWord(word, seg);\n // First store: keep word value on stack.\n bestEmit(); // push value\n emitOp(0x80); // DUP1 (keep value)\n emitPushN(base); // offset (MSIZE if aligned)\n emitOp(0x52); // MSTORE\n\n for (let j = 1; j < runLen; j++) {\n emitOp(0x80); // DUP1\n emitOp(0x59); // MSIZE\n emitOp(0x52); // MSTORE\n }\n const stats = view.wordStats.get(wordHex);\n if (stats && stats[3] <= lastIndex) {\n emitOp(0x50); // POP\n }\n wordIndex = nextIndex;\n continue;\n }\n\n const { literalCost, shlCost, bestCost, bestEmit } = emitBestValueForWord(word, seg);\n // Try MLOAD/MSTORE reuse\n if (literalCost > 8) {\n const stats = view.wordStats.get(wordHex);\n if (stats && stats[6] !== -1 && wordIndex > stats[2]) {\n const baseBytes = stats[4] === 0 ? 0 : (32 - Math.clz32(stats[4]) + 7) >> 3;\n if (literalCost > stats[6] + baseBytes) {\n emitPushN(stats[4]);\n emitOp(0x51); // MLOAD\n emitPushN(base);\n emitOp(0x52); // MSTORE\n ++wordIndex;\n continue;\n }\n }\n }\n let byte8s = true;\n for (let i = 0; i < seg.length; i++) {\n const se = seg[i]!;\n if (se >>> 8 !== (se & 0xff)) {\n byte8s = false;\n break;\n }\n }\n const byte8sCost = seg.length * 3; // PUSH1(value), PUSH1(offset), MSTORE8\n if (byte8s && byte8sCost < bestCost && byte8sCost <= shlCost) {\n for (let i = 0; i < seg.length; i++) {\n const s = seg[i]! >>> 8;\n emitPushN(word[s]);\n emitPushN(base + s);\n emitOp(0x53); // MSTORE8\n }\n ++wordIndex;\n continue;\n }\n // Default\n bestEmit();\n emitPushN(base);\n emitOp(0x52); // MSTORE\n ++wordIndex;\n }\n\n //2nd pass: preseed dictionary + emit final ops\n ops = [];\n data = [];\n stack = [];\n trackedMemSize = 0;\n mem = [];\n firstPass = false;\n programCnt = 0n;\n\n const pre: { val: bigint; uses: number; net: number; p: number }[] = [];\n for (const [val, uses] of stackFreq) {\n if (\n uses > 1 &&\n val !== 0n &&\n val !== 32n &&\n val !== selfbalance &&\n val !== decAddr &&\n val !== fromAddr &&\n val <= MAX_128_BIT\n ) {\n const p = pushCost(val);\n const net = uses * (p - 1) - p;\n if (net > 0) pre.push({ val, uses, net, p });\n }\n }\n\n pre.sort((a, b) => b.net - a.net || b.uses - a.uses || a.p - b.p);\n for (let i = 0; i < 15 && i < pre.length; ++i) pushN(pre[i]!.val);\n\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 let suffix = '';\n if (forward === 'none') {\n pushN(view.dataLength);\n pushN(padding);\n op(revert ? 0xfd : 0xf3); // REVERT or RETURN the decompressed memory\n } else {\n // Stack: retSize=0, retOffset=0, argsSize, argsOffset\n op(0x5f); // PUSH0 (retSize)\n op(0x5f); // PUSH0 (retOffset)\n pushN(view.dataLength); // argsSize\n pushN(padding); // argsOffset\n if (forward === 'call') {\n // CALLVALUE PUSH0 CALLDATALOAD GAS CALL\n suffix = '345f355af1';\n } else if (forward === 'delegatecall') {\n // PUSH0 CALLDATALOAD GAS DELEGATECALL (no value param)\n suffix = '5f355af4';\n } else {\n // PUSH0 CALLDATALOAD GAS STATICCALL (no value param)\n suffix = '5f355afa';\n }\n suffix += revert ? _revertSuffix : _returnSuffix;\n }\n\n let outLen = ops.length;\n\n for (let i = 0; i < ops.length; ++i)\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) outLen += data[i]!.length;\n\n const out = new Uint8Array(outLen);\n\n for (let i = 0, o = 0; i < ops.length; ++i) {\n out[o++] = ops[i]!;\n if (ops[i] >= 0x60 && ops[i] <= 0x7f && data[i]) out.set(data[i]!, o), (o += data[i]!.length);\n }\n\n const bytecode = '0x' + _uint8ArrayToHex(out) + suffix;\n const calldataOut = '0x' + _pad64(originalTo);\n const fromOut = cleanEnv\n ? fromHex\n ? fromHex.padStart(40, '0')\n : undefined\n : fromAddr.toString(16).padStart(40, '0');\n const balanceOut = cleanEnv ? '0' : selfbalance.toString(16);\n\n return {\n bytecode,\n calldata: calldataOut,\n to: DEC_ADDR,\n from: fromOut,\n balance: balanceOut,\n };\n};\n", "import type { ForwardMode } from './compiler/jit';\nimport { _normHex } from './compiler/utils';\n\nconst _flzLoop = (a: number, b: number, c: number, d: number, e: number) => {\n const h = (v: number) => v.toString(16).padStart(2, '0');\n return (\n '5b803590815f1a918260051c908160' +\n h(a) +\n '575050906002818360018095013586520101920101906002565b' +\n '600260078396949314958260011a87020194611f0082870193886001011a9160081b16019560018701968503930101945f198301518452808211602083111760' +\n h(b) +\n '575b' +\n '50505001600201906002565b6020811860208211021891825b82811060' +\n h(c) +\n '575060' +\n h(d) +\n '565b8181015f19015185820152830160' +\n h(e) +\n '56'\n );\n};\n\nconst _rleCore =\n '578082527f' +\n '7f'.repeat(32) +\n '8082168101909117171980157fc0c8c8d0c8e8d0d8c8e8e0e8d0d8e0f0c8d0e8d0e0e0d8f0d0d0e0d8f8f8f8f8' +\n '601f6f8421084210842108cc6318c6db6d54be660204081020408185821060071b' +\n '86811c6001600160401b031060061b1795861c0260181a1c161a90911860031c019081019101368110';\n\nconst _rleTail = (a: string, b: string) =>\n '5b50' +\n a +\n '565b90610006565b60029060011a920191608081600101111561' +\n b +\n '575f19825201607e1901368210610006575f91508190' +\n a +\n '565b5f825201600101368210610006575f91508190' +\n a +\n '56';\n\n/** Solady LibZip. FLZ*/\n//! @__PURE__\nexport const flzFwdBytecode = (\n address: string,\n forward: ForwardMode = 'call',\n revert = false,\n): string => {\n const ret = revert ? 'fd' : 'f3';\n if (forward === 'none')\n return '0x5f5f5b368110600c57505f' + ret + _flzLoop(0x35, 0x84, 0x9c, 0x78, 0x91);\n\n const addr = _normHex(address).padStart(40, '0');\n const d = forward === 'call' ? 1 : 0;\n const h = (v: number) => v.toString(16).padStart(2, '0');\n const op = forward === 'delegatecall' ? 'f4' : forward === 'call' ? 'f1' : 'fa';\n\n return (\n '0x5f5f5b36811060' +\n h(0x32 + d) +\n '575f808381' +\n (d ? '34' : '') +\n '73' +\n addr +\n '5a' +\n op +\n '3d5f803e60' +\n h(0x2e + d) +\n '573d5ffd5b3d5f' +\n ret +\n _flzLoop(0x5b + d, 0xaa + d, 0xc2 + d, 0x9e + d, 0xb7 + d)\n );\n};\n\n/** Solady LibZip. RLE.*/\n//! @__PURE__\nexport const rleFwdBytecode = (\n address: string,\n forward: ForwardMode = 'call',\n revert = false,\n): string => {\n const ret = revert ? 'fd' : 'f3';\n if (forward === 'none')\n return (\n '0x365f80375f365b8151805f1a156100cf' +\n _rleCore +\n '6100c957368111156100c35736900390035b36900336' +\n ret +\n _rleTail('6100bd', '6100fb')\n );\n\n const addr = _normHex(address).padStart(40, '0');\n const d = forward === 'call' ? 1 : 0;\n const h = (v: number) => v.toString(16).padStart(2, '0');\n const op = forward === 'delegatecall' ? 'f4' : forward === 'call' ? 'f1' : 'fa';\n\n return (\n '0x365f80375f365b8151805f1a156100' +\n h(0xf8 + d) +\n _rleCore +\n '6100' +\n h(0xf2 + d) +\n '575f918291368111156100' +\n h(0xec + d) +\n '5736900390035b36900336' +\n (d ? '34' : '') +\n '73' +\n addr +\n '5a' +\n op +\n '3d5f803e6100' +\n h(0xe8 + d) +\n '573d5ffd5b3d5f' +\n ret +\n _rleTail('6100c1', '01' + h(0x27 + d))\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["LibZip", "MAX_128_BIT", "MAX_256_BIT", "not", "a", "MAX_256_BIT", "and", "a", "b", "MAX_256_BIT", "or", "xor", "add", "sub", "shl", "shift", "value", "shr", "sigext", "byteSize", "bits", "_normHex", "hex", "_hexes", "_", "i", "_nibbles", "t", "_hexToUint8Array", "normalized", "len", "bytes", "j", "_uint8ArrayToHex", "_zeroWord", "_emptySegments", "initMemoryView", "calldata", "padding", "originalBuf", "buffer", "rawLength", "wordCount", "roundedLength", "rounded", "segments", "wordHexes", "wordStats", "prevWordHex", "wordAt", "wordIndex", "base", "word", "wordHex", "existing", "isRunContinuation", "stats", "seg", "s", "reuseCost", "getWord", "getSegments", "slice", "offset", "size", "out", "end", "mload", "DEC_ADDR", "_pad64", "s", "_zeroW", "_cdsizeW", "_decW", "_returnSuffix", "_revertSuffix", "_jitDecompressor", "calldata", "to", "from", "forward", "revert", "clean_env", "fromHex", "_normHex", "cleanEnv", "padding", "bestW", "bestF", "originalTo", "fromAddr", "selfbalance", "ops", "data", "stack", "trackedMemSize", "mem", "firstPass", "view", "initMemoryView", "wordCount", "decAddr", "stackFreq", "decW", "fromW", "toW", "w", "st", "f", "roundUp32", "x", "getStackIdx", "val", "i", "d", "ctr", "m", "k", "delta", "pushOp", "op", "programCnt", "pushS", "v", "freqDelta", "pop2", "trackMem", "offset", "size", "addOp", "imm", "byteSize", "sigext", "not", "a", "b", "xor", "and", "or", "add", "sub", "shift", "shl", "shr", "idx", "MAX_256_BIT", "value", "_", "opcode", "bytesLen", "n", "t", "pushCost", "pushN", "tmp", "len", "bytes", "pushB", "buf", "plan", "emitPushN", "emitPushB", "emitOp", "o", "estShlCost", "seg", "cost", "first", "se", "e", "emitBestValueForWord", "word", "literal", "literalVal", "literalCost", "shlCost", "bestCost", "bestEmit", "notVal", "notCost", "subVal", "subCost", "numBytes", "mask", "truncated", "signCost", "shiftBits", "shifted", "notShifted", "shiftNotCost", "suffix0s", "wordIndex", "base", "wordHex", "nextIndex", "runLen", "lastIndex", "j", "stats", "baseBytes", "byte8s", "byte8sCost", "pre", "uses", "MAX_128_BIT", "p", "net", "step", "suffix", "outLen", "out", "bytecode", "_uint8ArrayToHex", "calldataOut", "fromOut", "balanceOut", "_flzLoop", "a", "b", "c", "e", "h", "v", "_rleCore", "_rleTail", "flzFwdBytecode", "address", "forward", "revert", "ret", "addr", "_normHex", "d", "op", "rleFwdBytecode", "compress_call", "payload", "alg", "forward", "revert", "clean_env", "method", "params", "txObj", "blockParam", "overrides", "_", "k", "originalSize", "inputData", "to", "from", "noForward", "bytecode", "calldata", "decompressorAddress", "fromAddr", "balanceHex", "result", "_jitDecompressor", "jit", "flzData", "LibZip", "cdData", "flzFwdBytecode", "h", "sel", "i", "rleFwdBytecode", "DEC_ADDR", "_normHex", "stateOverride", "compressedTxObj"]
|
|
7
7
|
}
|
package/_types/compiler/jit.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const DEC_ADDR = "0x00000000000000000000000000000000000000e0";
|
|
2
|
-
export
|
|
2
|
+
export type ForwardMode = 'call' | 'delegatecall' | 'staticcall' | 'none';
|
|
3
|
+
export declare const _jitDecompressor: (calldata: string, to: string, from?: string, forward?: ForwardMode, revert?: boolean, clean_env?: boolean) => {
|
|
3
4
|
bytecode: string;
|
|
4
5
|
calldata: string;
|
|
5
6
|
to: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jit.d.ts","sourceRoot":"","sources":["../../../src/compiler/jit.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"jit.d.ts","sourceRoot":"","sources":["../../../src/compiler/jit.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,+CAA+C,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,CAAC;AAS1E,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,IAAI,MAAM,EACV,OAAO,MAAM,EACb,UAAS,WAAoB,EAC7B,gBAAc,EACd,mBAAiB,KAChB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAmhBlF,CAAC"}
|
package/_types/contracts.d.ts
CHANGED
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
7
|
-
export declare const flzFwdBytecode: (address: string) => string;
|
|
8
|
-
/**
|
|
9
|
-
* Generates RLE (run-length encoded) decompressor bytecode. The generated code decompresses incoming calldata and forwards it to the target address.
|
|
10
|
-
* @param address - Target contract address
|
|
11
|
-
* @see {@link https://github.com/Vectorized/solady/blob/main/src/utils/LibZip.sol}
|
|
12
|
-
* @pure
|
|
13
|
-
*/
|
|
14
|
-
export declare const rleFwdBytecode: (address: string) => string;
|
|
1
|
+
import type { ForwardMode } from './compiler/jit';
|
|
2
|
+
/** Solady LibZip. FLZ*/
|
|
3
|
+
export declare const flzFwdBytecode: (address: string, forward?: ForwardMode, revert?: boolean) => string;
|
|
4
|
+
/** Solady LibZip. RLE.*/
|
|
5
|
+
export declare const rleFwdBytecode: (address: string, forward?: ForwardMode, revert?: boolean) => string;
|
|
15
6
|
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/contracts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAwClD,wBAAwB;AAExB,eAAO,MAAM,cAAc,GACzB,SAAS,MAAM,EACf,UAAS,WAAoB,EAC7B,gBAAc,KACb,MAyBF,CAAC;AAEF,yBAAyB;AAEzB,eAAO,MAAM,cAAc,GACzB,SAAS,MAAM,EACf,UAAS,WAAoB,EAC7B,gBAAc,KACb,MAoCF,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ForwardMode } from './compiler/jit';
|
|
1
2
|
/**
|
|
2
3
|
* Compresses eth_call payload using JIT, FastLZ (FLZ), or calldata RLE (CD) compression.
|
|
3
4
|
* Auto-selects best algorithm if not specified. Only compresses if >800 bytes and beneficial.
|
|
@@ -12,5 +13,5 @@
|
|
|
12
13
|
* @returns (un)compressed eth_call payload
|
|
13
14
|
* @pure
|
|
14
15
|
*/
|
|
15
|
-
export declare const compress_call: (payload: any, alg?: string) => any;
|
|
16
|
+
export declare const compress_call: (payload: any, alg?: string, forward?: ForwardMode, revert?: boolean, clean_env?: boolean) => any;
|
|
16
17
|
//# sourceMappingURL=jit-compressor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jit-compressor.d.ts","sourceRoot":"","sources":["../../src/jit-compressor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jit-compressor.d.ts","sourceRoot":"","sources":["../../src/jit-compressor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,aAAa,GACxB,SAAS,GAAG,EACZ,MAAM,MAAM,EACZ,UAAS,WAAoB,EAC7B,gBAAc,EACd,mBAAiB,KAChB,GA6FF,CAAC"}
|
package/jit-compressor.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { LibZip } from 'solady';
|
|
2
2
|
import { _jitDecompressor, DEC_ADDR } from './compiler';
|
|
3
|
+
import type { ForwardMode } from './compiler/jit';
|
|
3
4
|
import { _normHex } from './compiler/utils';
|
|
4
5
|
import { flzFwdBytecode, rleFwdBytecode } from './contracts';
|
|
5
6
|
import { MIN_BODY_SIZE } from './index';
|
|
7
|
+
|
|
6
8
|
/**
|
|
7
9
|
* Compresses eth_call payload using JIT, FastLZ (FLZ), or calldata RLE (CD) compression.
|
|
8
10
|
* Auto-selects best algorithm if not specified. Only compresses if >800 bytes and beneficial.
|
|
@@ -18,7 +20,13 @@ import { MIN_BODY_SIZE } from './index';
|
|
|
18
20
|
* @pure
|
|
19
21
|
*/
|
|
20
22
|
//! @__PURE__
|
|
21
|
-
export const compress_call = function (
|
|
23
|
+
export const compress_call = function (
|
|
24
|
+
payload: any,
|
|
25
|
+
alg?: string,
|
|
26
|
+
forward: ForwardMode = 'call',
|
|
27
|
+
revert = false,
|
|
28
|
+
clean_env = false,
|
|
29
|
+
): any {
|
|
22
30
|
const { method, params } = payload;
|
|
23
31
|
if (method && method !== 'eth_call') return payload;
|
|
24
32
|
const txObj = params?.[0] || payload;
|
|
@@ -44,6 +52,7 @@ export const compress_call = function (payload: any, alg?: string): any {
|
|
|
44
52
|
const inputData = txObj.data;
|
|
45
53
|
const to = txObj.to;
|
|
46
54
|
const from = txObj.from;
|
|
55
|
+
const noForward = forward === 'none';
|
|
47
56
|
|
|
48
57
|
let bytecode: string;
|
|
49
58
|
let calldata: string;
|
|
@@ -51,15 +60,15 @@ export const compress_call = function (payload: any, alg?: string): any {
|
|
|
51
60
|
let fromAddr: string | undefined;
|
|
52
61
|
let balanceHex: string;
|
|
53
62
|
|
|
54
|
-
if (alg === 'jit' || (!alg && (originalSize < 3000 || originalSize >= 8000))) {
|
|
55
|
-
const result = _jitDecompressor(inputData, to, from);
|
|
63
|
+
if (noForward || alg === 'jit' || (!alg && (originalSize < 3000 || originalSize >= 8000))) {
|
|
64
|
+
const result = _jitDecompressor(inputData, to, from, forward, revert, clean_env);
|
|
56
65
|
bytecode = result.bytecode;
|
|
57
66
|
calldata = result.calldata;
|
|
58
67
|
decompressorAddress = result.to;
|
|
59
68
|
fromAddr = result.from;
|
|
60
69
|
balanceHex = result.balance;
|
|
61
70
|
} else {
|
|
62
|
-
const jit = !alg ? _jitDecompressor(inputData, to, from) : null;
|
|
71
|
+
const jit = !alg ? _jitDecompressor(inputData, to, from, forward, revert, clean_env) : null;
|
|
63
72
|
const flzData = alg === 'flz' || !alg ? LibZip.flzCompress(inputData) : null;
|
|
64
73
|
const cdData = alg === 'cd' || (!alg && flzData) ? LibZip.cdCompress(inputData) : null;
|
|
65
74
|
const useFlz =
|
|
@@ -67,10 +76,15 @@ export const compress_call = function (payload: any, alg?: string): any {
|
|
|
67
76
|
|
|
68
77
|
if (useFlz) {
|
|
69
78
|
calldata = flzData!;
|
|
70
|
-
bytecode = flzFwdBytecode(to);
|
|
79
|
+
bytecode = flzFwdBytecode(to, forward, revert);
|
|
71
80
|
} else {
|
|
72
|
-
|
|
73
|
-
|
|
81
|
+
// Solady cdCompress negates the first 4 bytes (selector dispatch); XOR it back
|
|
82
|
+
const h = cdData!.replace(/^0x/, '');
|
|
83
|
+
let sel = '';
|
|
84
|
+
for (let i = 0; i < 8; i += 2)
|
|
85
|
+
sel += (parseInt(h.substring(i, i + 2), 16) ^ 0xff).toString(16).padStart(2, '0');
|
|
86
|
+
calldata = '0x' + sel + h.substring(8);
|
|
87
|
+
bytecode = rleFwdBytecode(to, forward, revert);
|
|
74
88
|
}
|
|
75
89
|
|
|
76
90
|
decompressorAddress = DEC_ADDR;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eth-compress",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Client-to-server compression (viem-compatible) module for compressed, gas-efficient, low-latency eth_call requests.",
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"node": ">=22",
|
|
100
100
|
"pnpm": ">=10"
|
|
101
101
|
},
|
|
102
|
-
"packageManager": "pnpm@10.
|
|
102
|
+
"packageManager": "pnpm@10.32.1",
|
|
103
103
|
"pnpm": {
|
|
104
104
|
"peerDependencyRules": {
|
|
105
105
|
"ignoreMissing": [
|
|
@@ -111,16 +111,16 @@
|
|
|
111
111
|
"solady": "0.1.26"
|
|
112
112
|
},
|
|
113
113
|
"devDependencies": {
|
|
114
|
-
"@biomejs/biome": "2.
|
|
115
|
-
"@ethereumjs/common": "10.1.
|
|
116
|
-
"@ethereumjs/util": "10.1.
|
|
117
|
-
"@ethereumjs/vm": "10.1.
|
|
118
|
-
"@types/bun": "1.3.
|
|
119
|
-
"@types/node": "25.0
|
|
120
|
-
"esbuild": "0.27.
|
|
114
|
+
"@biomejs/biome": "2.4.7",
|
|
115
|
+
"@ethereumjs/common": "10.1.1",
|
|
116
|
+
"@ethereumjs/util": "10.1.1",
|
|
117
|
+
"@ethereumjs/vm": "10.1.1",
|
|
118
|
+
"@types/bun": "1.3.10",
|
|
119
|
+
"@types/node": "25.5.0",
|
|
120
|
+
"esbuild": "0.27.4",
|
|
121
121
|
"typescript": "5.9.3",
|
|
122
|
-
"viem": "2.
|
|
123
|
-
"vitest": "4.0
|
|
122
|
+
"viem": "2.47.4",
|
|
123
|
+
"vitest": "4.1.0"
|
|
124
124
|
},
|
|
125
125
|
"browserslist": [
|
|
126
126
|
">0.3%",
|
|
@@ -131,5 +131,9 @@
|
|
|
131
131
|
"ios_saf >= 16.4",
|
|
132
132
|
"not dead"
|
|
133
133
|
],
|
|
134
|
-
"sideEffects": false
|
|
134
|
+
"sideEffects": false,
|
|
135
|
+
"workspaces": [
|
|
136
|
+
"src",
|
|
137
|
+
"!**/test/**"
|
|
138
|
+
]
|
|
135
139
|
}
|