# SolanaFees

Defined in: [atomiq-chain-solana/src/solana/chain/modules/SolanaFees.ts:43](https://github.com/atomiqlabs/atomiq-chain-solana/blob/4094a4a5b53d0864511200476446f3034a3c7c10/src/solana/chain/modules/SolanaFees.ts#L43)

Fee estimation service for the Solana network. Uses client-side fee estimation algorithm by default, which fetches a bunch (default 8) random blocks in the past period (default 150) and computes the average fee. It automatically detects whether the underlying RPC endpoint is a Helius one which features the `getPriorityFeeEstimate` endpoint, and if available uses that one.

## Constructors

### Constructor

```
new SolanaFees(

   connection, 

   maxFeeMicroLamports, 

   numSamples, 

   period, 

   useHeliusApi, 

   heliusFeeLevel, 

   getStaticFee?, 

   bribeData?): SolanaFees;
```

Defined in: [atomiq-chain-solana/src/solana/chain/modules/SolanaFees.ts:77](https://github.com/atomiqlabs/atomiq-chain-solana/blob/4094a4a5b53d0864511200476446f3034a3c7c10/src/solana/chain/modules/SolanaFees.ts#L77)

#### Parameters

| Parameter             | Type                                                                                                                  | Default value | Description                                                                                                                                                                                                                |
| --------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `connection`          | `Connection`                                                                                                          | `undefined`   | Underlying Solana network connection to use for read access to Solana                                                                                                                                                      |
| `maxFeeMicroLamports` | `number`                                                                                                              | `250000`      | Maximum allowed fee in microLamports/CU (1/1,000,000 of a lamport per compute unit)                                                                                                                                        |
| `numSamples`          | `number`                                                                                                              | `8`           | Number of samples to use when estimating the global fee on the client-side, this many blocks are sampled from the last `period` blocks to estimate an average fee rate                                                     |
| `period`              | `number`                                                                                                              | `150`         | Period of past blocks to sample random blocks from when estimating the global fee on the client-side                                                                                                                       |
| `useHeliusApi`        | `"yes"` \| `"no"` \| `"auto"`                                                                                         | `"auto"`      | Whether to use the helius API or not, default to `"auto"`, which automatically detects if the underlying RPC supports Helius's `getPriorityFeeEstimate` RPC call                                                           |
| `heliusFeeLevel`      | `"min"` \| `"low"` \| `"medium"` \| `"high"` \| `"veryHigh"` \| `"unsafeMax"`                                         | `"veryHigh"`  | Fee level to use when fetching the fee rate from Helius's `getPriorityFeeEstimate` RPC endpoint, for the meaning of the different levels refer to <https://www.helius.dev/docs/priority-fee-api#priority-levels-explained> |
| `getStaticFee?`       | (`feeRate`) => `bigint`                                                                                               | `undefined`   | Optional function for adding a base fee to transactions (this function returns the base fee in lamports to be added to the transaction) - this fee doesn't scale with CUs of the transaction and is instead applied as-is  |
| `bribeData?`          | [`FeeBribeData`](https://docs.atomiq.exchange/sdk-reference/api/atomiq-chain-solana/src/type-aliases/FeeBribeData.md) | `undefined`   | Bribe fee configuration (used for e.g. Jito tips)                                                                                                                                                                          |

#### Returns

`SolanaFees`

## Methods

### applyFeeRateBegin()

```
static applyFeeRateBegin(

   tx, 

   computeBudget, 

   feeRate): void;
```

Defined in: [atomiq-chain-solana/src/solana/chain/modules/SolanaFees.ts:428](https://github.com/atomiqlabs/atomiq-chain-solana/blob/4094a4a5b53d0864511200476446f3034a3c7c10/src/solana/chain/modules/SolanaFees.ts#L428)

Applies fee rate to a transaction, should be called before adding instructions to the transaction, specifically it adds the setComputeUnitLimit & setComputeUnitPrice instruction.

#### Parameters

| Parameter       | Type          | Description |
| --------------- | ------------- | ----------- |
| `tx`            | `Transaction` |             |
| `computeBudget` | `number`      |             |
| `feeRate`       | `string`      |             |

#### Returns

`void`

#### Example

```
const feeRate = solanaFees.getFeeRate([...writeableAccounts]);

const tx = new Transaction();

//Apply the fee rate part at the beginning of the transaction (specifically setComputeUnitLimit & setComputeUnitPrice)

SolanaFees.applyFeeRateBegin(tx, feeRate);

//Add instructions here

tx.add(instruction1);

tx.add(instruction2);

//Set the fee payer

tx.feePayer = feePayerPublicKey;

//Apply the fee rate part at the end of the transaction (specifically the transfer to the bribe account, e.g. Jito tip)

SolanaFees.applyFeeRateEnd(tx, feeRate);
```

***

### applyFeeRateEnd()

```
static applyFeeRateEnd(

   tx, 

   computeBudget, 

   feeRate): void;
```

Defined in: [atomiq-chain-solana/src/solana/chain/modules/SolanaFees.ts:481](https://github.com/atomiqlabs/atomiq-chain-solana/blob/4094a4a5b53d0864511200476446f3034a3c7c10/src/solana/chain/modules/SolanaFees.ts#L481)

Applies fee rate to a transaction, should be called after adding instructions to the transaction, specifically it adds the adds the bribe SystemProgram.transfer instruction.

#### Parameters

| Parameter       | Type          | Description |
| --------------- | ------------- | ----------- |
| `tx`            | `Transaction` |             |
| `computeBudget` | `number`      |             |
| `feeRate`       | `string`      |             |

#### Returns

`void`

#### Example

```
const feeRate = solanaFees.getFeeRate([...writeableAccounts]);

const tx = new Transaction();

//Apply the fee rate part at the beginning of the transaction (specifically setComputeUnitLimit & setComputeUnitPrice)

SolanaFees.applyFeeRateBegin(tx, feeRate);

//Add instructions here

tx.add(instruction1);

tx.add(instruction2);

//Set the fee payer

tx.feePayer = feePayerPublicKey;

//Apply the fee rate part at the end of the transaction (specifically the transfer to the bribe account, e.g. Jito tip)

SolanaFees.applyFeeRateEnd(tx, feeRate);
```

***

### getGlobalFeeRate()

```
getGlobalFeeRate(): Promise<bigint>;
```

Defined in: [atomiq-chain-solana/src/solana/chain/modules/SolanaFees.ts:341](https://github.com/atomiqlabs/atomiq-chain-solana/blob/4094a4a5b53d0864511200476446f3034a3c7c10/src/solana/chain/modules/SolanaFees.ts#L341)

Gets global fee rate, with caching

#### Returns

`Promise`<`bigint`>

global fee rate microLamports/CU

***

### getPriorityFee()

```
getPriorityFee(

   computeUnits, 

   feeRate, 

   includeStaticFee): bigint;
```

Defined in: [atomiq-chain-solana/src/solana/chain/modules/SolanaFees.ts:390](https://github.com/atomiqlabs/atomiq-chain-solana/blob/4094a4a5b53d0864511200476446f3034a3c7c10/src/solana/chain/modules/SolanaFees.ts#L390)

Calculates the total priority fee paid for a given compute budget at a given fee rate

#### Parameters

| Parameter          | Type      | Default value | Description                                              |
| ------------------ | --------- | ------------- | -------------------------------------------------------- |
| `computeUnits`     | `number`  | `undefined`   |                                                          |
| `feeRate`          | `string`  | `undefined`   |                                                          |
| `includeStaticFee` | `boolean` | `true`        | whether the include the static/base part of the fee rate |

#### Returns

`bigint`

***

### submitTx()

```
submitTx(tx, options?): Promise<string>;
```

Defined in: [atomiq-chain-solana/src/solana/chain/modules/SolanaFees.ts:513](https://github.com/atomiqlabs/atomiq-chain-solana/blob/4094a4a5b53d0864511200476446f3034a3c7c10/src/solana/chain/modules/SolanaFees.ts#L513)

Checks if the transaction should be submitted over Jito and if yes submits it

#### Parameters

| Parameter  | Type          | Description                                                 |
| ---------- | ------------- | ----------------------------------------------------------- |
| `tx`       | `Buffer`      | Raw signed transaction to be attempted to be sent over Jito |
| `options?` | `SendOptions` | Send options for the sendTransaction RPC call               |

#### Returns

`Promise`<`string`>

null if the transaction was not sent over Jito, tx signature when tx was sent over Jito
