fema-pf-calc 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -75
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/services/solana.d.ts.map +1 -1
- package/dist/services/solana.js +0 -1
- package/dist/services/solana.js.map +1 -1
- package/package.json +1 -4
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Supports **mainnet-beta** and **devnet**.
|
|
|
8
8
|
|
|
9
9
|
## The Problem
|
|
10
10
|
|
|
11
|
-
Every Solana transaction can include a priority fee
|
|
11
|
+
Every Solana transaction can include a priority fee, a tip paid to validators to land the transaction faster. Set it too low and your transaction gets stuck or dropped. Set it too high and you overpay.
|
|
12
12
|
|
|
13
13
|
The fee you need also depends on what kind of transaction you are sending. A Jupiter swap competes with other Jupiter swaps. An NFT mint competes with other NFT mints. They are not in the same queue, so they should not use the same fee.
|
|
14
14
|
|
|
@@ -24,7 +24,7 @@ FEMA solves this by scanning recent blocks, building a real fee distribution, an
|
|
|
24
24
|
4. If you specify a protocol or pass your transaction, it filters the data to only transactions that used the same programs as yours
|
|
25
25
|
5. It returns the fee at the percentile matching your chosen speed and strategy
|
|
26
26
|
|
|
27
|
-
Results are cached for
|
|
27
|
+
Results are cached for 30 seconds to avoid hammering the RPC on every call.
|
|
28
28
|
|
|
29
29
|
---
|
|
30
30
|
|
|
@@ -65,30 +65,30 @@ That is all a developer needs to do. No RPC calls, no math, no guessing.
|
|
|
65
65
|
|
|
66
66
|
```ts
|
|
67
67
|
const result = await estimateFee({
|
|
68
|
-
speed:
|
|
69
|
-
strategy:
|
|
70
|
-
protocol:
|
|
71
|
-
transaction:
|
|
72
|
-
maxFee:
|
|
73
|
-
includeStats: true,
|
|
68
|
+
speed: "fast", // "slow" | "medium" | "fast"
|
|
69
|
+
strategy: "balanced", // "cheap" | "balanced" | "aggressive"
|
|
70
|
+
protocol: "jupiter", // see supported protocols below
|
|
71
|
+
transaction: myTransaction, // pass your actual tx for automatic protocol detection
|
|
72
|
+
maxFee: 500_000, // optional cap in microLamports
|
|
73
|
+
includeStats: true, // include full distribution in response
|
|
74
74
|
});
|
|
75
75
|
```
|
|
76
76
|
|
|
77
77
|
### Speed
|
|
78
78
|
|
|
79
|
-
| Speed
|
|
80
|
-
|
|
81
|
-
| `slow`
|
|
82
|
-
| `medium` | p50
|
|
83
|
-
| `fast`
|
|
79
|
+
| Speed | Percentile | What it means |
|
|
80
|
+
| -------- | ---------- | --------------------------------------------------- |
|
|
81
|
+
| `slow` | p25 | Cheaper. May take a few blocks to land. |
|
|
82
|
+
| `medium` | p50 | Balanced. Lands within a couple of blocks. |
|
|
83
|
+
| `fast` | p75 | More expensive. Designed to land in the next block. |
|
|
84
84
|
|
|
85
85
|
### Strategy
|
|
86
86
|
|
|
87
|
-
| Strategy
|
|
88
|
-
|
|
89
|
-
| `cheap`
|
|
90
|
-
| `balanced`
|
|
91
|
-
| `aggressive` | +15 percentile points | Slightly overpay to guarantee landing.
|
|
87
|
+
| Strategy | Adjustment | What it means |
|
|
88
|
+
| ------------ | --------------------- | ------------------------------------------------------------------------- |
|
|
89
|
+
| `cheap` | −10 percentile points | Slightly undercut the target. Risk: might not land if the network spikes. |
|
|
90
|
+
| `balanced` | none | Hit the target exactly. Safe default for most use cases. |
|
|
91
|
+
| `aggressive` | +15 percentile points | Slightly overpay to guarantee landing. |
|
|
92
92
|
|
|
93
93
|
---
|
|
94
94
|
|
|
@@ -98,13 +98,19 @@ The most powerful feature of FEMA. When you specify a protocol, FEMA filters the
|
|
|
98
98
|
|
|
99
99
|
```ts
|
|
100
100
|
// Jupiter swap
|
|
101
|
-
const { fee: swapFee } = await estimateFee({
|
|
101
|
+
const { fee: swapFee } = await estimateFee({
|
|
102
|
+
speed: "fast",
|
|
103
|
+
protocol: "jupiter",
|
|
104
|
+
});
|
|
102
105
|
|
|
103
106
|
// NFT mint
|
|
104
107
|
const { fee: nftFee } = await estimateFee({ speed: "fast", protocol: "nft" });
|
|
105
108
|
|
|
106
109
|
// Pump.fun trade
|
|
107
|
-
const { fee: pumpFee } = await estimateFee({
|
|
110
|
+
const { fee: pumpFee } = await estimateFee({
|
|
111
|
+
speed: "fast",
|
|
112
|
+
protocol: "pumpfun",
|
|
113
|
+
});
|
|
108
114
|
```
|
|
109
115
|
|
|
110
116
|
Alternatively, pass your actual transaction and FEMA will detect the protocol automatically:
|
|
@@ -118,16 +124,16 @@ const { fee } = await estimateFee({
|
|
|
118
124
|
|
|
119
125
|
### Supported Protocols
|
|
120
126
|
|
|
121
|
-
| Protocol
|
|
122
|
-
|
|
123
|
-
| `jupiter`
|
|
124
|
-
| `raydium`
|
|
125
|
-
| `orca`
|
|
126
|
-
| `nft`
|
|
127
|
-
| `pumpfun`
|
|
128
|
-
| `openbook` | OpenBook V1, OpenBook V2
|
|
129
|
-
| `system`
|
|
130
|
-
| `token`
|
|
127
|
+
| Protocol | Programs Included |
|
|
128
|
+
| ---------- | --------------------------------------------------- |
|
|
129
|
+
| `jupiter` | Jupiter V4, Jupiter V6 |
|
|
130
|
+
| `raydium` | Raydium AMM V4, AMM V5, CLMM |
|
|
131
|
+
| `orca` | Orca Whirlpool, Orca V1 |
|
|
132
|
+
| `nft` | Token Metadata, Candy Machine V2/V3, Auction House |
|
|
133
|
+
| `pumpfun` | Pump.fun |
|
|
134
|
+
| `openbook` | OpenBook V1, OpenBook V2 |
|
|
135
|
+
| `system` | System Program (SOL transfers) |
|
|
136
|
+
| `token` | Token Program, Token 2022, Associated Token Program |
|
|
131
137
|
|
|
132
138
|
---
|
|
133
139
|
|
|
@@ -166,18 +172,18 @@ The `fee` value is in **microLamports per compute unit** — the exact unit that
|
|
|
166
172
|
|
|
167
173
|
```ts
|
|
168
174
|
init({
|
|
169
|
-
cluster:
|
|
170
|
-
rpcUrl:
|
|
171
|
-
cacheDurationMs: 7000,
|
|
175
|
+
cluster: "mainnet-beta", // "mainnet-beta" | "devnet" (default: "mainnet-beta")
|
|
176
|
+
rpcUrl: "https://your-rpc.com", // optional — overrides the cluster default
|
|
177
|
+
cacheDurationMs: 7000, // how long to cache results in ms (default: 7000)
|
|
172
178
|
});
|
|
173
179
|
```
|
|
174
180
|
|
|
175
181
|
### Cluster RPC defaults
|
|
176
182
|
|
|
177
|
-
| Cluster
|
|
178
|
-
|
|
183
|
+
| Cluster | Default RPC |
|
|
184
|
+
| -------------- | ------------------------------------- |
|
|
179
185
|
| `mainnet-beta` | `https://api.mainnet-beta.solana.com` |
|
|
180
|
-
| `devnet`
|
|
186
|
+
| `devnet` | `https://api.devnet.solana.com` |
|
|
181
187
|
|
|
182
188
|
Or configure via `.env`:
|
|
183
189
|
|
|
@@ -185,52 +191,19 @@ Or configure via `.env`:
|
|
|
185
191
|
# Network: mainnet-beta (default) or devnet
|
|
186
192
|
SOLANA_CLUSTER=mainnet-beta
|
|
187
193
|
|
|
188
|
-
#
|
|
194
|
+
# Helius API key — get one free at https://helius.dev
|
|
195
|
+
# The base URL is set in code; only your key goes here
|
|
196
|
+
HELIUS_API_KEY=your-api-key-here
|
|
197
|
+
|
|
198
|
+
# Optional: use a different RPC provider entirely (overrides HELIUS_API_KEY)
|
|
189
199
|
# SOLANA_RPC_URL=https://your-custom-rpc.com
|
|
190
200
|
|
|
191
201
|
# How long to cache fee data in milliseconds (default: 7000)
|
|
192
202
|
CACHE_DURATION_MS=7000
|
|
193
|
-
|
|
194
|
-
# Express server port (default: 3000)
|
|
195
|
-
PORT=3000
|
|
196
203
|
```
|
|
197
204
|
|
|
198
205
|
---
|
|
199
206
|
|
|
200
|
-
## Test Script
|
|
201
|
-
|
|
202
|
-
Run a live fee report from the terminal:
|
|
203
|
-
|
|
204
|
-
```bash
|
|
205
|
-
# Mainnet (default)
|
|
206
|
-
ts-node test-fees.ts
|
|
207
|
-
|
|
208
|
-
# Devnet
|
|
209
|
-
ts-node test-fees.ts --network devnet
|
|
210
|
-
ts-node test-fees.ts --network=devnet
|
|
211
|
-
|
|
212
|
-
# Via env var
|
|
213
|
-
SOLANA_CLUSTER=devnet ts-node test-fees.ts
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## Optional HTTP Server
|
|
219
|
-
|
|
220
|
-
FEMA includes an Express server for teams who want to expose fee estimation over HTTP instead of importing the package directly.
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
npm run server
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
| Endpoint | Description |
|
|
227
|
-
|----------|-------------|
|
|
228
|
-
| `GET /health` | Check server status and active RPC URL |
|
|
229
|
-
| `GET /estimate-fee?speed=fast&strategy=balanced` | Get a fee recommendation |
|
|
230
|
-
| `GET /stats` | Get fee with full distribution stats |
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
207
|
## RPC Recommendations
|
|
235
208
|
|
|
236
209
|
The public Solana RPC endpoints rate-limit aggressively. For reliable results use a private RPC:
|
|
@@ -246,7 +219,6 @@ The public Solana RPC endpoints rate-limit aggressively. For reliable results us
|
|
|
246
219
|
```
|
|
247
220
|
src/
|
|
248
221
|
├── index.ts # SDK entry point — estimateFee() and init()
|
|
249
|
-
├── server.ts # Optional Express HTTP server
|
|
250
222
|
├── types.ts # TypeScript types and interfaces
|
|
251
223
|
├── config.ts # Configuration and cluster RPC resolution
|
|
252
224
|
├── protocols.ts # Known protocol registry (Jupiter, Raydium, etc.)
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEpD,QAAA,MAAM,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAG9C,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEpD,QAAA,MAAM,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAG9C,CAAC;AA0BF,wBAAgB,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAIzD;AAED,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,wBAAgB,SAAS,IAAI,UAAU,CAEtC"}
|
package/dist/config.js
CHANGED
|
@@ -15,8 +15,13 @@ function resolveCluster() {
|
|
|
15
15
|
return "devnet";
|
|
16
16
|
return "mainnet-beta";
|
|
17
17
|
}
|
|
18
|
+
const HELIUS_RPC = "https://mainnet.helius-rpc.com/?api-key=";
|
|
18
19
|
function resolveRpc(cluster) {
|
|
19
|
-
|
|
20
|
+
if (process.env.SOLANA_RPC_URL)
|
|
21
|
+
return process.env.SOLANA_RPC_URL;
|
|
22
|
+
if (process.env.HELIUS_API_KEY)
|
|
23
|
+
return `${HELIUS_RPC}${process.env.HELIUS_API_KEY}`;
|
|
24
|
+
return CLUSTER_RPC[cluster];
|
|
20
25
|
}
|
|
21
26
|
const defaultCluster = resolveCluster();
|
|
22
27
|
let _config = {
|
|
@@ -26,7 +31,7 @@ let _config = {
|
|
|
26
31
|
};
|
|
27
32
|
function init(overrides) {
|
|
28
33
|
const cluster = overrides.cluster ?? _config.cluster;
|
|
29
|
-
const rpcUrl = overrides.rpcUrl ??
|
|
34
|
+
const rpcUrl = overrides.rpcUrl ?? resolveRpc(cluster);
|
|
30
35
|
_config = { ..._config, ...overrides, cluster, rpcUrl };
|
|
31
36
|
}
|
|
32
37
|
function getConfig() {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AA+BA,oBAIC;AAID,8BAEC;AAvCD,MAAM,WAAW,GAAkC;IACjD,cAAc,EAAE,qCAAqC;IACrD,QAAQ,EAAE,+BAA+B;CAC1C,CAAC;AAgCO,kCAAW;AA9BpB,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,cAAc,CAAC;IACzD,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACtC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,GAAG,0CAA0C,CAAC;AAE9D,SAAS,UAAU,CAAC,OAAsB;IACxC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAClE,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;IACpF,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,cAAc,GAAG,cAAc,EAAE,CAAC;AAExC,IAAI,OAAO,GAAe;IACxB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,UAAU,CAAC,cAAc,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,gBAAgB,CAAC;CAC3E,CAAC;AAEF,SAAgB,IAAI,CAAC,SAA8B;IACjD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC1D,CAAC;AAID,SAAgB,SAAS;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAA6B,MAAM,SAAS,CAAC;AAiBvG,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAA6B,MAAM,SAAS,CAAC;AAiBvG,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAkBxC,wBAAgB,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAiBtD;AAID,wBAAsB,WAAW,CAC/B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAsE5B"}
|
package/dist/index.js
CHANGED
|
@@ -13,11 +13,30 @@ var protocols_2 = require("./protocols");
|
|
|
13
13
|
Object.defineProperty(exports, "PROTOCOLS", { enumerable: true, get: function () { return protocols_2.PROTOCOLS; } });
|
|
14
14
|
// ─── SDK initialisation ───────────────────────────────────────────────────────
|
|
15
15
|
let _started = false;
|
|
16
|
+
// Deduplicate concurrent fetches — if a block scan is already in flight,
|
|
17
|
+
// all callers share the same promise instead of each firing their own RPC requests.
|
|
18
|
+
let _pendingFetch = null;
|
|
19
|
+
async function fetchEntries(needsProgramData) {
|
|
20
|
+
if (_pendingFetch)
|
|
21
|
+
return _pendingFetch;
|
|
22
|
+
_pendingFetch = (0, solana_1.fetchRecentPriorityFees)(30, needsProgramData).finally(() => {
|
|
23
|
+
_pendingFetch = null;
|
|
24
|
+
});
|
|
25
|
+
return _pendingFetch;
|
|
26
|
+
}
|
|
16
27
|
function init(config) {
|
|
17
28
|
(0, config_1.init)(config);
|
|
18
29
|
(0, solana_1.resetConnection)();
|
|
19
30
|
if (!_started) {
|
|
20
|
-
|
|
31
|
+
// Pre-warm the cache so the first estimateFee call is instant
|
|
32
|
+
fetchEntries(true).then((entries) => {
|
|
33
|
+
if (entries.length > 0) {
|
|
34
|
+
const { snapshot } = (0, feeCalculator_1.calculateFee)(entries.map(e => e.fee).sort((a, b) => a - b), "medium", "balanced");
|
|
35
|
+
(0, cache_1.setCache)(snapshot, entries);
|
|
36
|
+
(0, database_1.setLatestSnapshot)(snapshot);
|
|
37
|
+
}
|
|
38
|
+
}).catch(() => { });
|
|
39
|
+
(0, database_1.startPersistedInterval)(() => (0, database_1.getLatestSnapshotSync)(), 30000);
|
|
21
40
|
_started = true;
|
|
22
41
|
}
|
|
23
42
|
}
|
|
@@ -53,7 +72,7 @@ async function estimateFee(options = {}) {
|
|
|
53
72
|
let entries = [];
|
|
54
73
|
let fromFallback = false;
|
|
55
74
|
try {
|
|
56
|
-
entries = await (
|
|
75
|
+
entries = await fetchEntries(needsProgramData);
|
|
57
76
|
if (entries.length === 0)
|
|
58
77
|
throw new Error("No fee data returned from RPC");
|
|
59
78
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/services/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,oBAAoB,EAGrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAWpC,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,GAAE,MAAW,EACvB,gBAAgB,GAAE,OAAe,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqBrB;
|
|
1
|
+
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/services/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,oBAAoB,EAGrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAWpC,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,GAAE,MAAW,EACvB,gBAAgB,GAAE,OAAe,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqBrB;AAoGD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,WAAW,GAAG,oBAAoB,GACrC,MAAM,EAAE,CAmBV;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,WAAW,GAAG,oBAAoB,GACrC,MAAM,CAgCR"}
|
package/dist/services/solana.js
CHANGED
|
@@ -79,7 +79,6 @@ async function scanBlocks(connection, blockCount) {
|
|
|
79
79
|
const microLamportsPerCU = Math.round((priorityFeeLamports * 1000000) / cuConsumed);
|
|
80
80
|
if (microLamportsPerCU <= 0)
|
|
81
81
|
continue;
|
|
82
|
-
// Extract program IDs from the transaction's instructions
|
|
83
82
|
const programs = extractProgramIdsFromBlock(tx.transaction);
|
|
84
83
|
entries.push({ fee: microLamportsPerCU, programs });
|
|
85
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solana.js","sourceRoot":"","sources":["../../src/services/solana.ts"],"names":[],"mappings":";;AAmBA,0CAEC;AAWD,0DAwBC;
|
|
1
|
+
{"version":3,"file":"solana.js","sourceRoot":"","sources":["../../src/services/solana.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fema-pf-calc",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Intelligent Solana priority fee estimation engine",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -21,8 +21,6 @@
|
|
|
21
21
|
"build": "tsc",
|
|
22
22
|
"prepublishOnly": "npm run build",
|
|
23
23
|
"dev": "ts-node test-fees.ts",
|
|
24
|
-
"server": "ts-node src/server.ts",
|
|
25
|
-
"start": "node dist/server.js",
|
|
26
24
|
"lint": "eslint src/**/*.ts"
|
|
27
25
|
},
|
|
28
26
|
"keywords": [
|
|
@@ -37,7 +35,6 @@
|
|
|
37
35
|
},
|
|
38
36
|
"devDependencies": {
|
|
39
37
|
"@solana/web3.js": "^1.98.0",
|
|
40
|
-
"@types/express": "^5.0.1",
|
|
41
38
|
"@types/node": "^22.15.2",
|
|
42
39
|
"dotenv": "^16.5.0",
|
|
43
40
|
"express": "^4.21.2",
|