Full Code of MeteoraAg/dlmm-sdk for AI

main 1ac25be5c41e cached
201 files
2.0 MB
533.6k tokens
1063 symbols
1 requests
Download .txt
Showing preview only (2,133K chars total). Download the full file or copy to clipboard to get everything.
Repository: MeteoraAg/dlmm-sdk
Branch: main
Commit: 1ac25be5c41e
Files: 201
Total size: 2.0 MB

Directory structure:
gitextract_8odblry4/

├── .github/
│   ├── actions/
│   │   ├── setup-anchor/
│   │   │   └── action.yml
│   │   ├── setup-dep/
│   │   │   └── action.yml
│   │   └── setup-solana/
│   │       └── action.yml
│   └── workflows/
│       ├── ci-pr-main-cli.yml
│       ├── ci-pr-main-market-making.yml
│       ├── ci-pr-main-program.yml
│       └── ci-pr-main-sdk.yml
├── .gitignore
├── .prettierignore
├── Anchor.toml
├── CHANGELOG.md
├── Cargo.toml
├── Dockerfile
├── README.md
├── artifacts/
│   └── FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/
│       ├── 6ipV2Sn7GCVgKG3Doqz1MpM33hranTMqxDmShj8Ro8cx.json
│       ├── ERuqwiEFbQwNM8NhUMxUsvgGWbQpEyjbzhQLbBftCMPd.json
│       ├── FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB.json
│       ├── FQuMNJ6UcrkA3xMLsmmLL8sk47RkZYod57mX3a8w1brg.json
│       ├── FR8HAZwQkmbmJXSqSp4CM3424emaMmJf7vz3u3RrYgRL.json
│       ├── Gai2jqUAaJv8S68ibe69beV5DkhdBxAc6zoV3YQpuSNX.json
│       └── So11111111111111111111111111111111111111112.json
├── cli/
│   ├── Cargo.toml
│   ├── README.md
│   └── src/
│       ├── args.rs
│       ├── instructions/
│       │   ├── add_liquidity.rs
│       │   ├── admin/
│       │   │   ├── close_claim_protocol_fee_operator.rs
│       │   │   ├── close_preset_parameter.rs
│       │   │   ├── create_claim_protocol_fee_operator.rs
│       │   │   ├── initialize_permission_lb_pair.rs
│       │   │   ├── initialize_preset_parameter.rs
│       │   │   ├── initialize_reward.rs
│       │   │   ├── initialize_token_badge.rs
│       │   │   ├── mod.rs
│       │   │   ├── set_activation_point.rs
│       │   │   ├── set_pre_activation_duration.rs
│       │   │   ├── set_pre_activation_swap_address.rs
│       │   │   ├── toggle_pair_status.rs
│       │   │   ├── update_base_fee.rs
│       │   │   ├── update_reward_duration.rs
│       │   │   ├── update_reward_funder.rs
│       │   │   └── withdraw_protocol_fee.rs
│       │   ├── claim_fee.rs
│       │   ├── claim_reward.rs
│       │   ├── close_position.rs
│       │   ├── fund_reward.rs
│       │   ├── get_all_positions.rs
│       │   ├── ilm/
│       │   │   ├── mod.rs
│       │   │   ├── remove_liquidity_by_price_range.rs
│       │   │   ├── seed_liquidity_from_operator.rs
│       │   │   └── seed_liquidity_single_bin_by_operator.rs
│       │   ├── increase_oracle_length.rs
│       │   ├── initialize_bin_array.rs
│       │   ├── initialize_bin_array_with_bin_range.rs
│       │   ├── initialize_bin_array_with_price_range.rs
│       │   ├── initialize_customizable_permissionless_lb_pair.rs
│       │   ├── initialize_customizable_permissionless_lb_pair2.rs
│       │   ├── initialize_lb_pair.rs
│       │   ├── initialize_lb_pair2.rs
│       │   ├── initialize_position.rs
│       │   ├── initialize_position_with_price_range.rs
│       │   ├── list_all_binstep.rs
│       │   ├── mod.rs
│       │   ├── remove_liquidity.rs
│       │   ├── set_pair_status.rs
│       │   ├── set_pair_status_permissionless.rs
│       │   ├── show_pair.rs
│       │   ├── show_position.rs
│       │   ├── show_preset_parameters.rs
│       │   ├── simulate_swap_demand.rs
│       │   ├── swap_exact_in.rs
│       │   ├── swap_exact_out.rs
│       │   ├── swap_with_price_impact.rs
│       │   ├── sync_price.rs
│       │   └── utils.rs
│       ├── main.rs
│       └── math.rs
├── command_list/
│   ├── claim_fee_from_operator.sh
│   ├── ilm_curve_by_operator.sh
│   ├── ilm_single_bin_by_operator.sh
│   └── set_bootstrapping_pair_status.sh
├── commons/
│   ├── Cargo.toml
│   ├── src/
│   │   ├── account_filters.rs
│   │   ├── constants.rs
│   │   ├── conversions/
│   │   │   ├── activation_type.rs
│   │   │   ├── mod.rs
│   │   │   ├── pair_type.rs
│   │   │   ├── status.rs
│   │   │   └── token_program_flag.rs
│   │   ├── extensions/
│   │   │   ├── bin.rs
│   │   │   ├── bin_array.rs
│   │   │   ├── bin_array_bitmap.rs
│   │   │   ├── lb_pair.rs
│   │   │   ├── mod.rs
│   │   │   └── position.rs
│   │   ├── lib.rs
│   │   ├── math/
│   │   │   ├── mod.rs
│   │   │   ├── price_math.rs
│   │   │   ├── u128x128_math.rs
│   │   │   ├── u64x64_math.rs
│   │   │   └── utils.rs
│   │   ├── pda.rs
│   │   ├── quote.rs
│   │   ├── rpc_client_extension.rs
│   │   ├── seeds.rs
│   │   ├── token_2022.rs
│   │   └── typedefs.rs
│   └── tests/
│       └── integration/
│           ├── helpers/
│           │   ├── mod.rs
│           │   └── utils.rs
│           ├── main.rs
│           ├── test_swap.rs
│           └── test_swap_token2022.rs
├── idls/
│   └── dlmm.json
├── keys/
│   └── localnet/
│       ├── admin-bossj3JvwiNK7pvjr149DqdtJxf2gdygbcmEPTkb2F1.json
│       └── program-LbVRzDTvBDEcrthxfZ4RL6yiq3uZw8bS6MwtdY6UhFQ.json
├── market_making/
│   ├── Cargo.toml
│   ├── README.MD
│   └── src/
│       ├── bin_array_manager.rs
│       ├── config.json
│       ├── core.rs
│       ├── main.rs
│       ├── pair_config.rs
│       ├── router.rs
│       ├── state.rs
│       └── utils.rs
├── package.json
├── python-client/
│   └── dlmm/
│       ├── .gitignore
│       ├── README.md
│       ├── dist/
│       │   └── dlmm-0.1.0-py3-none-any.whl
│       ├── dlmm/
│       │   ├── __init__.py
│       │   ├── dlmm.py
│       │   ├── types.py
│       │   └── utils.py
│       ├── pyproject.toml
│       └── tests/
│           ├── __init__.py
│           ├── test_lp_flow.py
│           └── test_util_methods.py
├── rust-toolchain.toml
└── ts-client/
    ├── README.md
    ├── jest.config.js
    ├── package.json
    ├── src/
    │   ├── dlmm/
    │   │   ├── constants/
    │   │   │   └── index.ts
    │   │   ├── error.ts
    │   │   ├── helpers/
    │   │   │   ├── accountFilters.ts
    │   │   │   ├── binArray.ts
    │   │   │   ├── computeUnit.ts
    │   │   │   ├── derive.ts
    │   │   │   ├── fee.ts
    │   │   │   ├── index.ts
    │   │   │   ├── lbPair.ts
    │   │   │   ├── math.ts
    │   │   │   ├── oracle/
    │   │   │   │   ├── index.ts
    │   │   │   │   └── wrapper.ts
    │   │   │   ├── positions/
    │   │   │   │   ├── index.ts
    │   │   │   │   └── wrapper.ts
    │   │   │   ├── rebalance/
    │   │   │   │   ├── index.ts
    │   │   │   │   ├── liquidity_strategy/
    │   │   │   │   │   ├── bidAsk.ts
    │   │   │   │   │   ├── curve.ts
    │   │   │   │   │   ├── index.ts
    │   │   │   │   │   └── spot.ts
    │   │   │   │   ├── rebalancePosition.ts
    │   │   │   │   └── strategy/
    │   │   │   │       ├── balanced.ts
    │   │   │   │       └── index.ts
    │   │   │   ├── strategy.ts
    │   │   │   ├── token_2022.ts
    │   │   │   ├── u64xu64_math.ts
    │   │   │   ├── weight.ts
    │   │   │   └── weightToAmounts.ts
    │   │   ├── idl/
    │   │   │   ├── idl.json
    │   │   │   └── idl.ts
    │   │   ├── index.ts
    │   │   └── types/
    │   │       └── index.ts
    │   ├── examples/
    │   │   ├── example.ts
    │   │   ├── fetch_lb_pair_lock_info.ts
    │   │   ├── get_oracle.ts
    │   │   ├── initialize_bin_arrays.ts
    │   │   └── swap_quote.ts
    │   ├── index.ts
    │   ├── server/
    │   │   ├── index.ts
    │   │   └── utils.ts
    │   └── test/
    │       ├── bug_fix.test.ts
    │       ├── calculate_distribution.test.ts
    │       ├── cjs.test.js
    │       ├── decode.test.ts
    │       ├── esm_import.test.ts
    │       ├── esm_module.test.ts
    │       ├── external/
    │       │   ├── helper.ts
    │       │   ├── program.ts
    │       │   ├── transfer_hook_counter.json
    │       │   └── transfer_hook_counter.ts
    │       ├── helper.ts
    │       ├── ilm.test.ts
    │       ├── oracle.test.ts
    │       ├── rebalance.test.ts
    │       ├── rebalance_parameter_builder.test.ts
    │       ├── rebalance_with_strategy.test.ts
    │       ├── sdk.test.ts
    │       ├── sdk_token2022.test.ts
    │       ├── single_bin.test.ts
    │       └── token_2022.test.ts
    ├── tsconfig.json
    └── tsup.config.ts

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/actions/setup-anchor/action.yml
================================================
name: "Setup anchor-cli"
description: "Setup anchor cli"
runs:
  using: "composite"
  steps:
    - uses: taiki-e/cache-cargo-install-action@v2
      with:
        tool: avm
        tag: v${{ env.ANCHOR_CLI_VERSION }}
        git: https://github.com/coral-xyz/anchor
    - run: avm install ${{ env.ANCHOR_CLI_VERSION }}
      shell: bash


================================================
FILE: .github/actions/setup-dep/action.yml
================================================
name: "Setup"
description: "Setup program dependencies"
runs:
  using: "composite"
  steps:
    - run: sudo apt-get update && sudo apt-get install -y pkg-config build-essential libudev-dev
      shell: bash


================================================
FILE: .github/actions/setup-solana/action.yml
================================================
name: "Setup Solana"
description: "Setup Solana"
runs:
  using: "composite"
  steps:
    - uses: actions/cache@v4
      name: Cache Solana Tool Suite
      id: cache-solana
      with:
        path: |
          ~/.cache/solana/
          ~/.local/share/solana/
        key: solana-${{ runner.os }}-v0000-${{ env.SOLANA_CLI_VERSION }}
    - run: sh -c "$(curl -sSfL https://release.anza.xyz/v${{ env.SOLANA_CLI_VERSION }}/install)"
      shell: bash
    - run: echo "$HOME/.local/share/solana/install/active_release/bin/" >> $GITHUB_PATH
      shell: bash
    - run: solana-keygen new --no-bip39-passphrase
      shell: bash
    - run: solana config set --url localhost
      shell: bash


================================================
FILE: .github/workflows/ci-pr-main-cli.yml
================================================
name: DLMM Cli

on:
  pull_request:
    branches:
      - main

env:
  SOLANA_CLI_VERSION: 2.1.0
  NODE_VERSION: 20.11.0
  ANCHOR_CLI_VERSION: 0.31.0

jobs:
  cli_changed_files:
    runs-on: ubuntu-latest
    outputs:
      cli: ${{steps.changed-files-specific.outputs.any_changed}}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Get specific changed files
        id: changed-files-specific
        uses: tj-actions/changed-files@v18.6
        with:
          files: |
            cli

  cli_build:
    runs-on: ubuntu-latest
    needs: cli_changed_files
    if: needs.cli_changed_files.outputs.cli == 'true'
    steps:
      - uses: actions/checkout@v2
      # Install rust + toolchain
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.85.0
          override: true
          components: clippy
      # Cache rust, cargo
      - uses: Swatinem/rust-cache@v1
      - run: cargo build -p cli
        shell: bash


================================================
FILE: .github/workflows/ci-pr-main-market-making.yml
================================================
name: DLMM Market Making Example

on:
  pull_request:
    branches:
      - main

env:
  SOLANA_CLI_VERSION: 2.1.0
  NODE_VERSION: 20.11.0
  ANCHOR_CLI_VERSION: 0.31.0

jobs:
  market_making_changed_files:
    runs-on: ubuntu-latest
    outputs:
      market_making: ${{steps.changed-files-specific.outputs.any_changed}}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Get specific changed files
        id: changed-files-specific
        uses: tj-actions/changed-files@v18.6
        with:
          files: |
            market_making

  market_making_build:
    runs-on: ubuntu-latest
    needs: market_making_changed_files
    if: needs.market_making_changed_files.outputs.market_making == 'true'
    steps:
      - uses: actions/checkout@v2
      # Install rust + toolchain
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.85.0
          override: true
          components: clippy
      # Cache rust, cargo
      - uses: Swatinem/rust-cache@v1
      - run: cargo build -p market_making
        shell: bash


================================================
FILE: .github/workflows/ci-pr-main-program.yml
================================================
name: DLMM Commons

on:
  pull_request:
    branches:
      - main

jobs:
  common_changed_files:
    runs-on: ubuntu-latest
    outputs:
      program: ${{steps.changed-files-specific.outputs.any_changed}}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Get specific changed files
        id: changed-files-specific
        uses: tj-actions/changed-files@v18.6
        with:
          files: |
            commons
            artifacts

  common_test:
    runs-on: ubuntu-latest
    needs: common_changed_files
    if: needs.common_changed_files.outputs.program == 'true'
    steps:
      - uses: actions/checkout@v2
      # Install rust + toolchain
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.85.0
          override: true
          components: clippy
      # Cache rust, cargo
      - uses: Swatinem/rust-cache@v1
      - run: cargo t -p commons --test '*'
        shell: bash


================================================
FILE: .github/workflows/ci-pr-main-sdk.yml
================================================
name: DLMM SDK

on:
  pull_request:
    branches:
      - main

env:
  SOLANA_CLI_VERSION: 2.1.0
  NODE_VERSION: 20.11.0
  ANCHOR_CLI_VERSION: 0.31.0

jobs:
  sdk_changed_files:
    runs-on: ubuntu-latest
    outputs:
      sdk: ${{steps.changed-files-specific.outputs.any_changed}}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Get specific changed files
        id: changed-files-specific
        uses: tj-actions/changed-files@v18.6
        with:
          files: |
            ts-client
            artifacts

  sdk_test:
    runs-on: ubuntu-latest
    needs: sdk_changed_files
    if: needs.sdk_changed_files.outputs.sdk == 'true'
    env:
      RPC: ${{ secrets.RPC }}
    steps:
      - uses: actions/checkout@v2
      - uses: ./.github/actions/setup-solana
      - uses: ./.github/actions/setup-dep
      - uses: ./.github/actions/setup-anchor
      # Install rust + toolchain
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          components: clippy
      - uses: pnpm/action-setup@v4
        with:
          version: 10
      # Cache node_modules
      - uses: actions/cache@v4
        id: cache-node-modules
        with:
          path: ./ts-client/node_modules
          key: ${{ runner.os }}-${{ hashFiles('./pnpm-lock.yaml') }}
      - run: anchor localnet -- --features localnet & sleep 2
        shell: bash
      - run: cd ts-client && pnpm install && pnpm run test
        shell: bash


================================================
FILE: .gitignore
================================================

.anchor
.DS_Store
**/*.rs.bk
node_modules
test-ledger
.yarn
yarn.lock
.yarnrc.yml

target/*
!target/types
!target/idl
!target/debug/cli
deployment

ts-client/dist
ts-client/.env
ts-client/scripts

.pnpm-debug.log


================================================
FILE: .prettierignore
================================================

.anchor
.DS_Store
target
node_modules
dist
build
test-ledger


================================================
FILE: Anchor.toml
================================================
[features]
seeds = false
skip-lint = false

[registry]
url = "https://api.apr.dev"

[provider]
cluster = "Localnet"
wallet = "keys/localnet/admin-bossj3JvwiNK7pvjr149DqdtJxf2gdygbcmEPTkb2F1.json"

[[test.genesis]]
address = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"
program = "./artifacts/token_2022.so"

[[test.genesis]]
address = "LbVRzDTvBDEcrthxfZ4RL6yiq3uZw8bS6MwtdY6UhFQ"
program = "./artifacts/lb_clmm.so"

[[test.genesis]]
address = "abcSyangMHdGzUGKhBhKoQzSFdJKUdkPGf5cbXVHpEw"
program = "./artifacts/transfer_hook_counter.so"

[scripts]
test = "yarn run ts-mocha --sort --type-check --bail -p ./tsconfig.json -t 1000000 tests/*.ts"

[toolchain]
solana_version = "2.1.0"
anchor_version = "0.31.0"


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

### Changed

### Deprecated

### Removed

### Fixed

### Security

## @meteora-ag/dlmm [1.9.7] - [PR #286](https://github.com/MeteoraAg/dlmm-sdk/pull/286)

### Fixed

- Allow `dlmm.simulateRebalancePosition` on single bin

## @meteora-ag/dlmm [1.9.6] - [PR #285](https://github.com/MeteoraAg/dlmm-sdk/pull/285)

### Fixed

- isSwapDisabled for missing pair types (`CustomizablePermissionless`)
- Add missing `PairType`: `CustomizablePermissionless` `PermissionlessV2`

## @meteora-ag/dlmm [1.9.5] - [PR #282](https://github.com/MeteoraAg/dlmm-sdk/pull/282)

### Added

- Added `getOracle` function to fetch oracle account for TWAP.
- Added `increaseOracleLength` function to increase oracle length.

## @meteora-ag/dlmm [1.9.4] - [PR #272](https://github.com/MeteoraAg/dlmm-sdk/pull/272)

### Fixed

- Fixed `removeLiquidity` with `shouldClaimAndClose` failing to close position when bins have unclaimed fees but no remaining liquidity.

## @meteora-ag/dlmm [1.9.3] - [PR #262](https://github.com/MeteoraAg/dlmm-sdk/pull/262)

### Added

- Added `chunkedGetMultipleAccountsInfo` helper function to fetch program accounts in chunks, improving reliability for large account queries.

## @meteora-ag/dlmm [1.9.2] - [PR #265](https://github.com/MeteoraAg/dlmm-sdk/pull/265)

### Fixed

- Fixed `createCustomizablePermissionlessLbPair` and `createCustomizablePermissionlessLbPair2` to include pre instructions for creating user token accounts.

## @meteora-ag/dlmm [1.9.1] - [PR #263](https://github.com/MeteoraAg/dlmm-sdk/pull/263)

### Added

- Added `functionType` parameter to `createCustomizablePermissionlessLbPair` and `createCustomizablePermissionlessLbPair2`. No breaking change to the interface.

### Changed

- Changed `admin` to `signer` in `setActivationPoint`, `setPairStatusPermissionless` and `setPairStatus`.
- Changed `rewardPerTokenStored` to `functionBytes`
- Added `rent` account to `createEmptyPosition`, `initializePositionAndAddLiquidityByStrategy`, `initializePositionAndAddLiquidityByWeight` and `createInitAndExtendPositionIx`

### Removed

- Removed `amountXIn` and `amountYIn` from bin state

## @meteora-ag/dlmm [1.9.0] - [PR #260](https://github.com/MeteoraAg/dlmm-sdk/pull/260)

### Added

- Added `binDeltaToMinMaxBinId` helper function. To have a canonical conversion from binDelta to minBinId and maxBinId

### Fixed

- Fixed `simulateRebalancePosition` to account for when the activeBinArray has not been initialized.

## @meteora-ag/dlmm [1.8.0] - [PR #231](https://github.com/MeteoraAg/dlmm-sdk/pull/231)

### Added

- Added `initializeMultiplePositionAndAddLiquidityByStrategy2` function. It should improve transaction landing by allowing parallel execution of returned transaction's instructions. However, the drawback is the function will only expand position up to 525 bins, and chunk the remaining bins into another position with 525 bins again, and so on. This is due to transaction size limitation.

## @meteora-ag/dlmm [1.7.6] - PR 250

### Fixed

- Fixed modern esm and old commonjs import compatibility

## cli [0.5.2] - PR #251

### Fixed

- Fixed `fetch_quote_required_accounts` zero copy account deserialization

## commons [0.3.2] - PR 249

### Fixed

- Fix rust quote infinite loop

## @meteora-ag/dlmm [1.7.5] - PR 244

### Fixed

- Fixed wrapping more SOL than required during add liquidity

## @meteora-ag/dlmm [1.7.4] - PR 235

### Added

- Added exports for `accountFilters`

## @meteora-ag/dlmm [1.7.3] - PR 240

### Fixed

- Fixed `getPairPubkeyIfExists` return same pair pubkey for different baseFeeFactor

## @meteora-ag/dlmm [1.7.2] - PR #239

### Fixed

- Reduced pending fee / reward value computed due to ghost bin

## @meteora-ag/dlmm [1.7.1] - PR #237

### Fixed

- Inconsistent bid ask liquidity shape

## @meteora-ag/dlmm [1.7.0] - PR #233

### Changed

- update `removeLiquidity` to have a new `skipUnwrapSOL` boolean flag that indicates whether to skip unwrapping SOL. Enable this when using zap-sdk to ensure accuracy in SOL zap out amount when SOL is the in token

## @meteora-ag/dlmm [1.6.0] - PR #229

### Changed

- update `initializeMultiplePositionAndAddLiquidityByStrategy` to include `initializeAtaIxs` so that create ATA instructions don't need to be include in every rebalance transactions

## @meteora-ag/dlmm [1.6.0] - PR #196

### Changed

- Update anchor to `0.31.0`
- Decreased `MAX_CLAIM_ALL_ALLOWED` from `3` to `2`. This decreased the chunked claim instruction from 3 to 2 per transaction.

### Added

- Added `getPositionRentExemption` function. It return minimum balance required to pay for a position account for rent exemption.
- Added `getPositionExpandRentExemption` function. It return minimum balance required to pay for a position account expansion for rent exemption.
- Added `quoteExtendPosition` function. It return minimum balance required to pay for rent exemption for the given position expansion and bin array accounts to cover the expanded position range.
- Added `decreasePositionLength` function. It return transaction to shrink an expanded position. The rent is not returned upon decrement, but returned when the position is closed.
- Added `increasePositionLength` function. It return transaction to expand a position up to maximum 1400 bins.
- Added `simulateRebalancePosition` function. It return a locally simulated rebalanced position, and required parameters for on chain rebalancing.
- Added `createExtendedEmptyPosition` function. It return transaction to create an empty position with maximum 1400 bins.
- Added `simulateRebalancePositionWithStrategy` function. It return a locally simulated rebalanced position with current price rebalanced to the center of the position.
- Added `rebalancePosition` function. It return instructions to rebalance a position.
- Added `initializeMultiplePositionAndAddLiquidityByStrategy` function. It allow user to initialize multiple extendable positions that cover wide bin range without chainsaw issue.
- Added `addLiquidityByStrategyChunkable` function. It allow user to add liquidity to single extendable positions that cover wide bin range without chainsaw issue.

### Changed

- `removeLiquidity` function. It will chunk the bin range into multiple remove liquidity transactions if it exceed max size. The return type changed from `Promise<Transaction>` to `Promise<Transaction[]>`.
- `claimLMReward` function. It will chunk the bin range into multiple claim reward transactions if it exceed max size. The return type changed from `Promise<Transaction>` to `Promise<Transaction[]>`.
- `claimSwapFee` function. It will chunk the bin range into multiple claim swap fee transactions if it exceed max size. The return type changed from `Promise<Transaction>` to `Promise<Transaction[]>`.
- `quoteCreatePosition` function. It return cost for position creation cost, realloc position cost and initialize bitmap extension.

## cli [0.5.1] - PR #196

- Added `sync_price` command.

## dlmm_interface [Removed]

- Removed since anchor now support generation of program CPI types using `declare_program!`.
- For integrators using lower version of anchor, you may use [anchor_gen](https://github.com/saber-hq/anchor-gen) to generate program CPI types.
- For rust client, you may import the types generated using `declare_program!` from `commons`.

## @meteora-ag/dlmm [1.5.5] - PR #227

### Fix

- fix export helpers function for position

## @meteora-ag/dlmm [1.5.4] - PR #220

### Fixed

- fix `swapQuote` price impact should be absolute

## cli [0.5.1] - PR #215

### Fixed

- Fix swap bin array account ordering and account fetching

## common [0.3.1] - PR #215

### Fixed

- Fix swap quote

## @meteora-ag/dlmm [1.5.3] - PR #211

### Fixed

- fix `getBinsBetweenLowerAndUpperBound` when bin Array not found

## @meteora-ag/dlmm [1.5.2] - PR #209

### Fixed

- `seedLiquiditySingle` used wrong token program for token2022

## @meteora-ag/dlmm [1.5.1] - PR #205

### Fixed

- `seedLiquidity` find optimal decompress multiplier
- Minor bug fix

## @meteora-ag/dlmm [1.5.0] - PR #201

### Changed

- `seedLiquidity` now return `costBreakdown` field for account rental in `SeedLiquidityResponse`.
- `seedLiquiditySingleBin` now return `SeedLiquiditySingleBinResponse` instead of `TransactionInstruction[]`. `SeedLiquiditySingleBinResponse` has `costBreakdown` field for account rental.

### Fixed

- Fixed `POSITION_FEE` and `BIN_ARRAY_FEE` account rental cost constant.

## @meteora-ag/dlmm [1.4.11] - PR #195

### Fixed

- Fixed all claim method not working if position no liquidity

## @meteora-ag/dlmm [1.4.10] - PR #194

### Fixed

- Fixed `createClaimBuildMethod` return undefined;

## @meteora-ag/dlmm [1.4.9] - PR #193

### Fixed

- Fixed readme `Remove Liquidity` section

## @meteora-ag/dlmm [1.4.8] - PR #192

### Fixed

- Fixed `getPositionsByUserAndLbPair` assertion

## @meteora-ag/dlmm [1.4.7] - PR #191

### Fixed

- Fixed `seedLiquiditySingleBin` create token account for position owner token proof.
- FIxed `syncWithMarketPrice` not initializing bitmap extensions if needed

## @meteora-ag/dlmm [1.4.6] - PR #190

### Fixed

- Fixed `seedLiquiditySingleBin` function

## @meteora-ag/dlmm [1.4.5] - PR #162

### Changed

- `calculateFeeInfo` added new optional `baseFeePowerFactor` parameter

#### Breaking

- `getPairPubkeyIfExists` added new `baseFeePowerFactor` parameter
- `getAllPresetParameters` now return `presetParameter` and `presetParameter2` accounts instead of only `presetParameter`
- `removeLiquidity`, `binIds` parameter has been replaced by `fromBinId` and `toBinId` which represent the bin range to be removed

- `toAmountsBothSideByStrategy`, `fromWeightDistributionToAmount`, `toAmountBothSide` added `mintX`, `mintY` and `clock` parameters
- `toAmountAskSide` added `mintX` and `clock` parameters
- `toAmountBidSide` added `mintX` and `clock` parameters

- Rename `LBCLMM_PROGRAM_IDS` to `DLMM_PROGRAM_IDS`
- `computeBaseFactorFromFeeBps` return `baseFactor` + `baseFeePowerFactor` instead of only `baseFactor`

### Added

- `createCustomizablePermissionlessLbPair2`, similar as `createCustomizablePermissionlessLbPair` but support token 2022.
- `createLbPair2`, similar as `createLbPair` but support token 2022. It require `PresetParameter2` account instead of `PresetParameter` which allow pool to have higher base fee.
- `closePositionIfEmpty`. Will close the position only if it's empty, else do nothing.

- `derivePresetParameterWithIndex`. Used to derive `PresetParameter2` account for `createLbPair2`
- `deriveLbPairWithPresetParamWithIndexKey`. Used to derive `LbPair` account for `createLbPair2` using `PresetParameter2` account
- `deriveTokenBadge`. Used to derive `TokenBadge` account for whitelisted token2022 mint.

- `getTokenProgramId` to return token X and token Y program id for the pair

- `getBinArrayIndexesCoverage` to return bin array indexes required for the given bin range
- `getBinArrayKeysCoverage` to return bin array addresses required for the given bin range
- `getBinArrayAccountMetasCoverage` to return bin array account metas required for the given bin range

- `getExtraAccountMetasForTransferHook` to return extra account metas required for transfer hook
- `calculateTransferFeeIncludedAmount` to calculate transfer fee included amount for token2022
- `calculateTransferFeeExcludedAmount` to calculate transfer fee excluded amount for token2022

### Deprecated

- `initializePositionAndAddLiquidityByWeight`. Use `initializePositionAndAddLiquidityByStrategy` instead which support both token and token 2022 program.
- `addLiquidityByWeight`. Use `addLiquidityByStrategy` instead which support both token and token2022.

### Removed

- `getWithdrawSingleSideAmount`. Unused.
- `createPermissionLbPair`. Admin-only function.
- `findSwappableMinMaxBinId`. Unused anymore.

## cli [0.5.0]

### Changed

- File structure refactoring
- Switched all the existing functions to support token 2022

### Changed

- `seed_liquidity` doesn't require file snapshot to support resume anymore

### Removed

- `seed_liquidity` and `seed_liquidity_single_bin`. Please use `seed_liquidity_by_operator` and `seed_liquidity_single_bin_by_operator`

### Added

- Admin function `initialize_token_badge` to initialize token badge for token 2022

## lb_clmm [0.7.0]

- DEPRECATED. Use `dlmm_interface` for types and `commons` for related account functions.

## dlmm_interface [0.9.0]

- Program interface generated using `solores`

## commons [0.3.0]

- Added token 2022 supportive functions.
- Added position account supportive functions.

## @meteora-ag/dlmm [1.4.2] - PR #183

### Added

- Add `getCustomizablePermissionlessLbPairIfExists` function to fetch existing customizable permissionless LB pair

### Changed

- remove CU estimation for `seedLiquidity`

### Fixed

- Fix incorrect enable/disable mapping in `setPairStatusPermissionless`

## @meteora-ag/dlmm [1.4.1] - PR #182

### Changed

- Update readme to include `claimFee`

## @meteora-ag/dlmm [1.4.0] - PR #181

### Changed

- Revamp StrategyType, now only have `StrategyType.Spot`, `StrategyType.BidAsk` & `StrategyType.Curve`

## @meteora-ag/dlmm [1.3.16] - PR #179

### Changed

- Add `feeOwner`, `operator`, `lockReleasePoint`, `shouldSeedPositionOwner`, `txPayer` parameters for `seedLiquidity` function

## @meteora-ag/dlmm [1.3.16] - PR #179

### Changed

- Add `feeOwner`, `operator`, `lockReleasePoint`, `shouldSeedPositionOwner`, `txPayer` parameters for `seedLiquidity` function

## @meteora-ag/dlmm [1.3.15] - PR #173

### Added

- Add param `enablePoolOnOffControl` to `createCustomizablePermissionlessLbPair` function.
- Add `setPairStatusPermissionless` function. This require pool field `creator_pool_on_off_control` to be true and pair type is `CustomizablePermissionless`. Pool creator can enable/disable the pair anytime before the pool is opened / activated. Once the pool activation time is passed, the pool creator can only enable the pair. Useful for token launches which do not have fixed activation time.

## cli [0.4.2] - PR #173

- Add param `creator_pool_on_off_control` to `InitializeCustomizablePermissionlessLbPair` function.
- Add `set_pair_status_permissionless` function.

## @meteora-ag/dlmm [1.3.14] - PR #167

### Added

- Add param `maxExtraBinArrays` to `swapQuote` and `swapQuoteExactOut` functions.

## @meteora-ag/dlmm [1.3.13] - PR #166

### Added

- Add `ts-client` function `getLbPairLockInfo`.

## @meteora-ag/dlmm [1.3.12] - PR #161

### Added

- Remove `@solana-developers/helpers` dependency.

## cli [0.4.1] - PR #160

### Added

- Add admin commmand `set_pair_status`.

### Removed

- Removed admin command `toggle_pair_status`.

## @meteora-ag/dlmm [1.3.11] - PR #160

### Added

- Add admin function `setPairStatus`.

## @meteora-ag/dlmm [1.3.10] - PR #159

### Changed

- Bump DLMM IDL to 0.8.5.
- Update `lb_clmm.so` artifact.
- Update function `createCustomizablePermissionlessLbPair` to use account `userTokenY`.

### Removed

- Removed account `rent` in function `createCustomizablePermissionlessLbPair`.

## @meteora-ag/dlmm [1.3.9] - PR #145

### Fixed

- Remove Strategy `SpotOneSide`, `CurveOneSide` & `BidAskOneSide`

## @meteora-ag/dlmm [1.3.8] - PR #144

### Fixed

- Fix `getOrCreateATAInstruction` to use `createAssociatedTokenAccountIdempotentInstruction`

## @meteora-ag/dlmm [1.3.7] - PR #143

### Fixed

- Fix `swapQuote` end price

## @meteora-ag/dlmm [1.3.6] - PR #116

### Changed

- Refactored; remove `position(V1)` interaction from SDK
- Throw error in `removeLiquidity` function if position doesn't have any liquidity

### Fixed

- Removed unused rpc call in `swap`

### Added

- Function `getPosition` to retrieve a single position data

## @meteora-ag/dlmm [1.3.5] - PR #136

### Fixed

- Fixed the `getBins` method to handle the corner case when no bin arrays created for the requested bin ids.

## @meteora-ag/dlmm [1.3.4] - PR #127

### Changed

- Use estimated compute unit instead of 1.4m compute unit for instructions.

## @meteora-ag/dlmm [1.3.3] - PR #133

### Changed

- Update parameters for `ts-client` function `seedLiquiditySingleBin`

## @meteora-ag/dlmm [1.3.2] - PR #134

### Changed

- Close wrap SOL ATA when SOL is swap in direction.

## lb_clmm [0.8.2] - PR #115

### Added

- Add a new endpoint `initialize_customizable_permissionless_lb_pair`, that allows pool creator to be able to create pool with input `active_id`, `bin_step`, `base_factor`, `activation_point` and `alpha-vault`

### Changed

- Add a new PairType `CustomizablePermissionless`, that is set by using the new endpoint above.

- Remove `whitelisted_wallet` and `lock_duration` in pool state.

- Remove `subjected_to_bootstrap_liquidity_locking` in position state.

- With PairType as `Permission` and `CustomizablePermissionless`, `token_y_mint` is always quote token (SOL/USDC). Users are able to deposit both quote token and base token before `activation_slot`, but those pools doesn't allow user to deposit quote token in active_bin before `activation_slot`. After `activation_slot`, that are free for everyone.

- `PairType::Permission` allows user to withdraw base token before `activation_slot`, but `PairType::CustomizablePermissionless` doesn't allow user to withdraw base token before `activation_slot`

- Refactoring on file structures

### Removed

- Remove endpoint `set_lock_release_point`
- Remove endpoint `update_whitelisted_address`

### Breaking Changes

- Endpoint `initialize_position_by_operator` requires a new field `lock_release_point`, to allow position liquidity locking for compatibility with old launch mechanism in permissioned lb pair

## @meteora-ag/dlmm [1.3.0] - PR #115

### Added

- Add `createCustomizablePermissionlessLbPair` to allow user to create launch pool with more flexible configuration.

### Removed

- Remove `updateWhitelistedWallet`

### Breaking Changes

- `createPermissionLbPair` removed `lockDuration`
- `initializePositionByOperator` added `lockReleasePoint`
- `seedLiquidity` removed `operator` and `feeOwner`

## cli [0.4.0] - PR #115

### Added

- Add `initialize_customizable_permission_lb_pair`

### Removed

- Remove `update_whitelisted_wallet`

## @meteora-ag/dlmm [1.2.4] - PR #119

### Fixed

- Refactor `getBins` to work with any bin ranges

## @meteora-ag/dlmm [1.2.3] - PR #112

### Fixed

- Fixed `addLiquidityByStrategy` incorrect array bin indices calculation

## @meteora-ag/dlmm [1.2.2] - PR #110

### Fixed

- Fixed `quoteCreatePosition` incorrect result if bin range too short

## @meteora-ag/dlmm [1.2.0] - PR #109

### Removed

- Removed `removeLiquiditySingleSide`

## @meteora-ag/dlmm [1.1.6] - PR #108

### Added

- new method `createEmptyPosition` allows to create an empty position with the corresponding bin arrays.

## @meteora-ag/dlmm [1.1.5] - PR #107

### Fixed

- fix `getPairPubkeyIfExists` return type

## @meteora-ag/dlmm [1.1.4] - PR #107

### Fixed

- `removeLiquiditySingleSide`. Add in unwrap sol in post instructions

## @meteora-ag/dlmm [1.1.2] - PR #104

### Fixed

- `isSwapDisabled` checked against wrong field

## @meteora-ag/dlmm [1.1.1] - PR #103

### Removed

- Removed `swapInitiator` parameter from `swapQuoteExactOut` and `swapQuote`.

### Added

- `isSwapDisabled` to check whether the pool allow swap

## @meteora-ag/dlmm [1.1.0] - PR #101

### Changed

- `swapQuoteExactOut` and `swapQuote` require an additional `swapInitiator` parameter. `swapInitiator` is the address of the user who will initiate the swap transaction.

## lb_clmm [0.8.0] - PR #96

### Added

- Pool supports 2 modes now defined by `activation_type`. If `activation_type == 0`, activation is calculated based on slot. If `activation_type == 1`, activation is calculated based on timestamp.

### Changed

- Pool state added a new field `activation_type`
- Rename `pool.activation_slot` to `pool.activation_point`
- Rename `pool.pre_activation_slot_duration` to `pool.pre_activation_duration`
- Rename `pool.lock_duration_in_slot` to `pool.lock_duration`
- Rename `position.lock_release_slot` to `position.lock_release_point`

### Breaking Changes

- The activation condition for all endpoints will by validated by slot or timestamp based on `activation_type` in pool state
- All program endpoints to modify permissioned pool will migrate parameters with post_fix `_slot` to `_point`
- Rename endpoint `set_activation_slot` to `set_activation_point`
- Rename endpoint `set_pre_activation_slot_duration` to `set_pre_activation_duration`
- Rename endpoint `set_lock_release_slot` to `set_lock_release_point`
- Endpoint `initialize_permission_lb_pair` requires a new field `activation_type` in input parameters

### Removed

- `update_fee_owner` endpoint is removed

## common [0.3.0] - PR #96

### Changed

- `quote_exact_out` and `quote_exact_in` throw error when pool is disabled, or not activated for swap yet.

### Breaking Changes

- `quote_exact_out` and `quote_exact_in` require a new field `current_slot` in input parameters

## cli [0.3.0] - PR #96

### Removed

- `update_fee_owner` command is removed

### Breaking Changes

- Rename command `set_activation_slot` to `set_activation_point`
- Rename command `set_pre_activation_slot_duration` to `set_pre_activation_duration`
- Command `initialize_permission_lb_pair` require new `activation_type` parameter

## @meteora-ag/dlmm [1.0.55] - PR #96

### Changed

- `swapQuoteExactOut` and `swapQuote` throw error when pool is disabled, or not activated for swap yet.

### Breaking Changes

- Renamed `setActivationSlot` to `setActivationPoint`
- `createPermissionLbPair` require new `ActivationType` parameter

## @mercurial-finance/dynamic-amm-sdk [1.0.54] - PR #99

### Fixed

- `getAmountOutWithdrawSingleSide`. Ensured the correct withdrawal amount is returned

## @meteora-ag/dlmm [1.0.53] - PR #98

### Added

- `removeLiquiditySingleSide`. Withdraw only 1 token in the pair for the position
- `getWithdrawSingleSideAmount`. Calculates the total single-sided withdrawable amount

## @meteora-ag/dlmm [1.0.52] - PR #90

### Added

- extra field (`endPrice`) in swapQuote

## @meteora-ag/dlmm [1.0.51] - PR #94

### Added

- `getBinArraysRequiredByPositionRange`. Retrieves the bin arrays required to initialize multiple positions in continuous range.
- `initializeBinArrays`. Initializes bin arrays for the given bin array indexes if it wasn't initialized.

## @meteora-ag/dlmm [1.0.50] - PR #91

### Changed

- Support partial fill in `swapQuote` function

## @meteora-ag/dlmm [1.0.49] - PR #88

### Improvement

- Improve the `claimAllRewards` method with a more distinct filtering for claiming non empty swap fees and lm rewards per each kind.
- Filter positions with non zero LM rewards in the `claimAllLMRewards` method.
- Filter positions with non zero swap fees in the `claimAllSwapFee` method.

## @meteora-ag/dlmm [1.0.48] - PR #87

### Improvement

- Exclude positions without any fees and/or rewards from reward claims in the `claimAllRewards` method.

## @meteora-ag/dlmm [1.0.46] - PR #84

### Added

- `swapQuoteExactOut` for swap quote of program endpoint `swap_exact_out`.
- `swapExactOut` to create transaction to swap using program endpoint `swap_exact_out`.
- `swapWithPriceImpact` to create transaction to swap using program endpoint `swap_with_price_impact`.

### Breaking

- Renamed `swapQuoteAtBin` function to `swapExactInQuoteAtBin`

## lb_clmm [0.7.0] - PR #84

### Added

- Program endpoint `swap_exact_out`. It will consume the in amount until the exact out amount reached.
- Program endpoint `swap_with_price_impact`. Similar to minimum amount out (slippage), but in price impact form.

## common [0.1.1] - PR #84

### Added

- `quote_exact_out` for swap quote of program endpoint `swap_exact_out`.

### Breaking

- Renamed return type of `swap_exact_in` function, `SwapQuote` to `SwapExactInQuote`

## @meteora-ag/dlmm [1.0.45] - PR #76

### Improvement

- improve `getAllLbPairPositionsByUser` on some promise to run in parallel

## @meteora-ag/dlmm [1.0.45] - PR #76

### Fixed

- fix `addLiquidityByStrategy` not working when active bin is not within the liquidity

## commons [0.1.0] - PR #80

### Added

- Swap exact in quote

## @meteora-ag/dlmm [1.0.44] - PR #81

### Added

- `getEmissionRate` should not return ended reward, which can be read from `rewardDurationEnd`

## @meteora-ag/dlmm [1.0.43] - PR #76

### Changed

- update static function to support param program id

## lb_clmm [0.6.1] - PR #79

### Added

- Staging program id

## @meteora-ag/dlmm [1.0.42] - PR #78

### Fixed

- `swapQuote` not working on pool with bitmap extension when in token is tokenX

## @meteora-ag/dlmm [1.0.41] - PR #77

### Fixed

- `swapQuote` not working on pool with bitmap extension

## @meteora-ag/dlmm [1.0.40] - PR #74

### Added

- `getMaxPriceInBinArrays` to get the max price of a bin that has liquidity

## lb_clmm [0.6.0] - PR #75

### Added

- Introduces `pre_activation_swap_address` and pre_activation_slot_duration
  `pre_activation_slot_duration` fields.

### Removed

- `swap_cap_amount` and `swap_cap_deactivate_slot` fields.

### Breaking

- Reduced whitelisted_wallet from the size of 2 to 1. This break the `update_whitelisted_wallet` endpoint.

## @meteora-ag/dlmm [1.0.38] - PR #71

### Added

- `getTokensMintFromPoolAddress` helper function to get tokenX mint & tokenY mint from lb pair address

## @meteora-ag/dlmm [1.0.37] - PR #68

### Added

- `initializePositionByOperator` function allow operator to initialize positio for other user

### Fixed

- `withdrawLiquidity` error when close position due to rent receiver must be position owner

## @meteora-ag/dlmm [1.0.36] - PR #68

### Added

- `getPairPubkeyIfExists` function to get the public key of existing pool address, if the pool doesn't exists return null

## @meteora-ag/dlmm [1.0.35] - PR #59

### Added

- Support liquidity seeding for launch pool (permission pair) based on https://ilm.jup.ag/

### Fixed

- `findSwappableMinMaxBinId` returned invalid min/max bin id under some edge case
- `derivePosition` using invalid seed

## lb_clmm [0.5.2] - PR #59

### Added

- Add deposit single sided with exact amount endpoint

## lb_clmm [0.5.1] - PR #49

### Features

- Support creation of permissionless pair with same binstep but a different fee tier.

### Deprecated

- `derive_lb_pair_pda` no longer in use. Use `derive_lb_pair_pda2` for new pair PDA.
- `derive_preset_parameter_pda` no longer in use. Use `derive_preset_parameter_pda2` for new pair PDA.

### Breaking

- Initialization of `LbPair` PDA require `base_factor` as the fourth seed now. This break `InitializeLbPair` account context.
- Initialization of `PresetParameter` PDA require `base_factor` as the third seed now. This break `InitializePresetParameter` account context.

## @meteora-ag/dlmm [1.0.34] - PR #49

### Features

- Support creation of permissionless pair with same binstep, different fee tier.

### Deprecated

- `deriveLbPair` no longer in use. Use `deriveLbPair2` for new pair PDA.
- `derivePresetParameter` no longer in use. Use `derivePresetParameter2` for new preset parameter PDA.

## @mercurial-finance/dynamic-amm-sdk [1.0.33] - PR #67

### Fixed

- Fix position liquidity withdraw to position owner, instead of customized fee owner

## @mercurial-finance/dynamic-amm-sdk [1.0.32] - PR #58

### Added

- A new function to sync outdated pool to nearest market price bin

## @mercurial-finance/dlmm-sdk [1.0.30] - PR #65

- Fix create permission lb pair browser compatibility

## @mercurial-finance/dlmm-sdk [1.0.29] - PR #59

## Fixed

- Fix position quotation calculation for bin array creation.

## @mercurial-finance/dlmm-sdk [1.0.27] - PR #57

### Fixed

- Fix position quotation calculation for position count.


================================================
FILE: Cargo.toml
================================================
[workspace]
members = ["cli", "commons", "market_making"]
resolver = "2"

[workspace.dependencies]
anchor-lang = "0.31.0"
anchor-spl = "0.31.0"
anchor-client = "0.31.0"

solana-sdk = "2.1.0"
spl-associated-token-account = "6.0.0"
solana-transaction-status = "2.1.0"
solana-account-decoder = "2.1.0"
spl-memo = "6.0.0"
spl-transfer-hook-interface = "0.9.0"

serde_json = "1.0.140"
serde = "1.0.219"
bincode = "1.3.3"
bs58 = "0.5.0"
bytemuck = "1.13.1"

clap = "4.3.3"
shellexpand = "3.1.0"

env_logger = "0.9.0"
log = "0.4.17"

rust_decimal = "1.31.0"
ruint = "1.3.0"
num-integer = "0.1.45"
num-traits = "0.2.16"

hyper = "0.14.17"
routerify = "3"

tokio = "^1.0"
futures-util = "0.3.0"
async-trait = "0.1.0"

anyhow = "1.0.71"

rand = "0.8.5"

chrono = "0.4.31"

ureq = "2.0.0"

itertools = "0.10.0"

commons = { path = "./commons" }

[profile.release]
overflow-checks = true
lto = "fat"
codegen-units = 1

[profile.release.build-override]
opt-level = 3
incremental = false
codegen-units = 1


================================================
FILE: Dockerfile
================================================
FROM node:20
RUN mkdir dlmm-server
WORKDIR /dlmm-server
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start-server"]


================================================
FILE: README.md
================================================
# LB CLMM SDK

#### Quote Testing

```
cargo t -p commons --test '*'
```

#### SDK Testing

```
1. cd ts-client
2. anchor localnet -- --features localnet
3. pnpm run test
```


================================================
FILE: artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/6ipV2Sn7GCVgKG3Doqz1MpM33hranTMqxDmShj8Ro8cx.json
================================================
{"account":{"data":["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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrJku2g8GCwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArUZZ3GkPZSwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv+YavhX2sSwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+yaPaXHw/iwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ5Hl6IH+Sy0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFvmXR0wgmS0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAINBqktVV5i0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1Hpt1yKfMy4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMqX6JTn8gC4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiZe4jh1tzi4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZouZI9XxGy8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQDc92SKaS8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8RELINI2ty8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsv+sSH3BDABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7XzcxFjLUjABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkxMXcXyzoDABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGtv0JGv7jABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApqb0/Z2/PDEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkb6pa7rbiTUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ6TT2KQZ2TUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARnjDd9hrKDYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA02rueVrSdzYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwQeEjBNxzYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATXpwdF7cFjcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyQlZ1up/ZjcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkugbto3tjcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM41kdTIEBjgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+CcaJPjkVTgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAptiLtTDapTgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBfbZeHj9TgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA422Acg8CRjkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWdJLGsA0ljkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASvxknfh75jkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFL5LPb7XNjoBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu1zYPBZIhzoBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGOg74AXN1zoBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJMAbZJmKDsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgwKKsEUeTsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","base64"],"executable":false,"lamports":71437440,"owner":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","rentEpoch":18446744073709551615,"space":10136},"pubkey":"6ipV2Sn7GCVgKG3Doqz1MpM33hranTMqxDmShj8Ro8cx"}

================================================
FILE: artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/ERuqwiEFbQwNM8NhUMxUsvgGWbQpEyjbzhQLbBftCMPd.json
================================================
{"account":{"data":["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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtzzpkl02egYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATMi2eRVovQYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzepUBAGrAAcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJYYmiT/QwcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqlR3o4RkhwcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+5MHiiXbygcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoh+0Xz51ggsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAucx+vcDwxgsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzNxGLMt9CwwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuDr+KGIcUAwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlfK8MYrMlAwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX3BxUeO2QwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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","base64"],"executable":false,"lamports":71437440,"owner":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","rentEpoch":18446744073709551615,"space":10136},"pubkey":"ERuqwiEFbQwNM8NhUMxUsvgGWbQpEyjbzhQLbBftCMPd"}

================================================
FILE: artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB.json
================================================
{"account":{"data":["IQsxYrVlsQ0QJx4AWAKIE0CcAAAwVwUAalX//5aqAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/woAAwAAAAAKAAAAECcAANYjK1IINMala6PQnLIrNY+ueDyVA1jhf0pZXPi99RQJBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAFnFuSSu++GgmnDsghSLvWYwChGzA+Xtw+GiGhD24q7TDHD5EuDMLrU9QzNBex+RQhysQLe3Wwgk3qe6dYJTIy2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhzz3TkqQbRDAtSIURflxYm+t9S0J8HtJm6TM3mhnJwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcmd/lEKbh/6BL/3yM1WQGzw0ub30RbKoBToEq06bMHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXvvLVcHYs26rHu6FZqhyvtry55mtf8qnM+QE50MBOzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","base64"],"executable":false,"lamports":7182720,"owner":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","rentEpoch":18446744073709551615,"space":904},"pubkey":"FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB"}

================================================
FILE: artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/FQuMNJ6UcrkA3xMLsmmLL8sk47RkZYod57mX3a8w1brg.json
================================================
{"account":{"data":["AQAAANe+8tVwdizbqse7oVmqHK+2vLnma1/yqcz5ATnQwE7PABAvMmFGYwEJAQEAAADXvvLVcHYs26rHu6FZqhyvtry55mtf8qnM+QE50MBOzw==","base64"],"executable":false,"lamports":1461600,"owner":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch":18446744073709551615,"space":82},"pubkey":"FQuMNJ6UcrkA3xMLsmmLL8sk47RkZYod57mX3a8w1brg"}

================================================
FILE: artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/FR8HAZwQkmbmJXSqSp4CM3424emaMmJf7vz3u3RrYgRL.json
================================================
{"account":{"data":["XI5c3AWURrX9/////////wEAAAAAAAAA1IU0HY1iX4PqLSKapSAZ9V7oYfw81zuci7LhJHF22IQAAAAAAAAAAAAAAAAAAAAAadPBMAkGiM8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzlD5V88mvc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArZKESy9V8s8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtri6hiyRJ9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAehHXhcraXNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0lT5xQwyktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYd4lxfaWx9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+hFAowJ/dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAucQn/c+JMtEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArhp/NsYXaNEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjR7lL3KzndEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8c3Ya9dc09EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATyq/bfkTCdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA03PjudvYPtIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU2R31YGrdNIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGqTRu+LqtIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeQ2lCd64NIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhlpIRi52FtMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA67yV5QaATNMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkZvU+7SXgtMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaWOiEzy9uNMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARJmEuJ/w7tMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVBXpduMxJdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkT4m3AqBW9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0Z7dhnekdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0mMQ1RJJyNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9A/3h/rB/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3kAqINRINdUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzKWOL6Pda9UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OLySGuAotUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG80PADAx2dUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9BLOYWqg3NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXzlBBqwkFNkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+BokASS3S9kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPtDg9dVXg9kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4uLPiMUGu9kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAy4o4X/bD8tkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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","base64"],"executable":false,"lamports":71437440,"owner":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","rentEpoch":18446744073709551615,"space":10136},"pubkey":"FR8HAZwQkmbmJXSqSp4CM3424emaMmJf7vz3u3RrYgRL"}

================================================
FILE: artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/Gai2jqUAaJv8S68ibe69beV5DkhdBxAc6zoV3YQpuSNX.json
================================================
{"account":{"data":["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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA706WHswMR/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnaiJ8DtUhfMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuPCPR52rw/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4qKHOPQSAvQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARLda2USKQPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEuf+QJMRf/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/F1h+OovfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEt7NxTlQ/PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+kUhFpoHO/UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJSXkwjPefUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0xlWommuPUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv0/MhyCO9/UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvyEcOtKFNvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADC2ykKKNdfYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvQj6q5WltPYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfb1tra/N8/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAqWt/QFM/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqwK7mhOcvcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYJ5ydRCnsfcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtGWEc+8P8fcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFIGDwqJMPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqMbOb2QScPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnXzEvgKsr/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl8veJelV7/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGe4l0BsQL/kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArkez6Z7abvkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA06qxn3a1rvkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+J5dIKeg7vkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaYFmzScLvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4UKQCOobvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1IXfQHfErvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGsEK0DTx7voAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmmMlIWAuL/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV/TbaP17b/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPpvu3BDar/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGcxtJ5I8PsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJpeMJqvHMPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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","base64"],"executable":false,"lamports":71437440,"owner":"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo","rentEpoch":18446744073709551615,"space":10136},"pubkey":"Gai2jqUAaJv8S68ibe69beV5DkhdBxAc6zoV3YQpuSNX"}

================================================
FILE: artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/So11111111111111111111111111111111111111112.json
================================================
{"account":{"data":["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","base64"],"executable":false,"lamports":1384775953167,"owner":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch":18446744073709551615,"space":82},"pubkey":"So11111111111111111111111111111111111111112"}

================================================
FILE: cli/Cargo.toml
================================================
[package]
name = "cli"
version = "0.5.2"
edition = "2021"
description = "cli"
authors = ["tian <tian@racoons.dev>"]

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[features]

[dependencies]
commons = { workspace = true }
anchor-lang = { workspace = true }
anchor-spl = { workspace = true }
anchor-client = { workspace = true, features = ["async"] }
clap = { workspace = true, features = ["derive"] }
anyhow = { workspace = true }
shellexpand = { workspace = true }
rust_decimal = { workspace = true, features = ["maths"] }
spl-associated-token-account = { workspace = true }
rand = { workspace = true }
tokio = { workspace = true, features = ["full", "parking_lot"] }
bincode = { workspace = true }
spl-memo = { workspace = true, features = ["no-entrypoint"] }
spl-transfer-hook-interface = { workspace = true }
solana-account-decoder = { workspace = true }
num-integer = { workspace = true }
bytemuck = { workspace = true }
futures-util = { workspace = true }

bigdecimal = "0.4.2"
serde = "1.0.167"
serde_json = "1.0.100"
serde_json_any_key = "2.0.0"


================================================
FILE: cli/README.md
================================================
# DLMM Cli

Command line utility for managing DLMM program.

### Toolchain

```
channel = 1.76.0
```

If you're using M1 chip

```
channel = 1.76.0
target triple = x86_64-apple-darwin
# Eg: 1.76.0-x86_64-apple-darwin
```

### Build

```
cargo build
```

### Run

target/debug/cli --help


================================================
FILE: cli/src/args.rs
================================================
use crate::instructions::{set_pair_status_permissionless::SetPairStatusPermissionlessParams, *};
use anchor_client::Cluster;
use clap::*;

#[derive(Parser, Debug)]
pub struct ConfigOverride {
    /// Cluster override
    ///
    /// Values = mainnet, testnet, devnet, localnet.
    /// Default: mainnet
    #[clap(global = true, long = "provider.cluster", default_value_t = Cluster::Mainnet)]
    pub cluster: Cluster,
    /// Wallet override
    ///
    /// Example: /path/to/wallet/keypair.json
    /// Default: ~/.config/solana/id.json
    #[clap(
        global = true,
        long = "provider.wallet",
        default_value_t = String::from(shellexpand::tilde("~/.config/solana/id.json"))
    )]
    pub wallet: String,
    /// Priority fee
    #[clap(global = true, long = "priority-fee", default_value_t = 0)]
    pub priority_fee: u64,
}

pub fn parse_bin_liquidity_removal(src: &str) -> Result<(i32, f64), Error> {
    let mut parsed_str: Vec<&str> = src.split(',').collect();

    let bps_to_remove = parsed_str
        .pop()
        .and_then(|s| s.parse::<f64>().ok())
        .ok_or_else(|| clap::error::Error::new(error::ErrorKind::InvalidValue))?;

    let bin_id = parsed_str
        .pop()
        .and_then(|s| s.parse::<i32>().ok())
        .ok_or_else(|| clap::error::Error::new(error::ErrorKind::InvalidValue))?;

    Ok((bin_id, bps_to_remove))
}

pub fn parse_bin_liquidity_distribution(src: &str) -> Result<(i32, f64, f64), Error> {
    let mut parsed_str: Vec<&str> = src.split(',').collect();

    let dist_y = parsed_str
        .pop()
        .and_then(|s| s.parse::<f64>().ok())
        .ok_or_else(|| clap::error::Error::new(error::ErrorKind::InvalidValue))?;

    let dist_x = parsed_str
        .pop()
        .and_then(|s| s.parse::<f64>().ok())
        .ok_or_else(|| clap::error::Error::new(error::ErrorKind::InvalidValue))?;

    let delta_id = parsed_str
        .pop()
        .and_then(|s| s.parse::<i32>().ok())
        .ok_or_else(|| clap::error::Error::new(error::ErrorKind::InvalidValue))?;

    Ok((delta_id, dist_x, dist_y))
}

#[derive(Debug, Clone, ValueEnum)]
pub enum SelectiveRounding {
    Up,
    Down,
    None,
}

#[derive(Parser, Debug)]
pub enum DLMMCommand {
    /// Create a new liquidity pair.
    InitializePair2(InitLbPair2Params),
    /// Create a new liquidity pair.
    InitializePair(InitLbPairParams),
    /// Initialize bin array for the given liquidity pair. Use InitializeBinArrayWithPriceRange or InitializeBinArrayWithBinRange for a more user friendly version.
    InitializeBinArray(InitBinArrayParams),
    /// Initialize bin array for the given liquidity pair based on price range. For example: Initialize bin arrays for BTC/USDC from 20000 -> 30000 price.
    InitializeBinArrayWithPriceRange(InitBinArrayWithPriceRangeParams),
    /// Initialize bin array for the given liquidity pair based on bin range. For example: Initialize bin arrays for BTC/USDC from bin 5660 -> 6600.
    InitializeBinArrayWithBinRange(InitBinArrayWithBinRangeParams),
    /// Initialize position for the given liquidity pair based on price range.
    InitializePositionWithPriceRange(InitPositionWithPriceRangeParams),
    /// Initialize position for the given liquidity pair based on bin range.
    InitializePosition(InitPositionParams),
    /// Deposit liquidity to the position of the given liquidity pair.
    AddLiquidity(AddLiquidityParams),
    /// Remove liquidity from the position of the given liquidity pair.
    RemoveLiquidity(RemoveLiquidityParams),
    /// Trade token X -> Y, or vice versa.
    SwapExactIn(SwapExactInParams),
    SwapExactOut(SwapExactOutParams),
    SwapWithPriceImpact(SwapWithPriceImpactParams),
    /// Show information of the given liquidity pair.
    ShowPair(ShowPairParams),
    /// Show information of the given position.
    ShowPosition(ShowPositionParams),
    ClaimReward(ClaimRewardParams),
    UpdateRewardDuration(UpdateRewardDurationParams),
    UpdateRewardFunder(UpdateRewardFunderParams),
    /// Close liquidity position.
    ClosePosition(ClosePositionParams),
    /// Claim fee
    ClaimFee(ClaimFeeParams),
    /// Increase an oracle observation sample length
    IncreaseOracleLength(IncreaseOracleLengthParams),
    ShowPresetParameter(ShowPresetAccountParams),
    ListAllBinStep,
    InitializeCustomizablePermissionlessLbPair(InitCustomizablePermissionlessLbPairParam),
    InitializeCustomizablePermissionlessLbPair2(InitCustomizablePermissionlessLbPair2Param),
    /// Seed liquidity by operator
    SeedLiquidityByOperator(SeedLiquidityByOperatorParameters),
    SeedLiquiditySingleBinByOperator(SeedLiquiditySingleBinByOperatorParameters),
    SetPairStatusPermissionless(SetPairStatusPermissionlessParams),
    GetAllPositionsForAnOwner(GetAllPositionsParams),
    SyncPrice(SyncPriceParams),
    #[clap(flatten)]
    Admin(AdminCommand),
}

#[derive(Parser, Debug)]
#[clap(version, about, author)]
pub struct Cli {
    #[clap(flatten)]
    pub config_override: ConfigOverride,
    #[clap(subcommand)]
    pub command: DLMMCommand,
}

#[derive(Debug, Parser)]
pub enum AdminCommand {
    /// Create a new permission liquidity pair. It allow liquidity fragmentation with exact bin step.
    InitializePermissionPair(InitPermissionLbPairParameters),
    SetPairStatus(SetPairStatusParams),
    /// Remove liquidity by price range
    RemoveLiquidityByPriceRange(RemoveLiquidityByPriceRangeParameters),
    SetActivationPoint(SetActivationPointParam),
    WithdrawProtocolFee(WithdrawProtocolFeeParams),
    InitializeReward(InitializeRewardParams),
    FundReward(FundRewardParams),
    InitializePresetParameter(InitPresetParameters),
    ClosePresetParameter(ClosePresetAccountParams),
    SetPreActivationDuration(SetPreactivationDurationParam),
    SetPreActivationSwapAddress(SetPreactivationSwapAddressParam),
    InitializeTokenBadge(InitializeTokenBadgeParams),
    CreateClaimProtocolFeeOperator(CreateClaimFeeOperatorParams),
    CloseClaimProtocolFeeOperator(CloseClaimFeeOperatorParams),
    UpdateBaseFee(UpdateBaseFeeParams),
}


================================================
FILE: cli/src/instructions/add_liquidity.rs
================================================
use crate::*;
use commons::dlmm::accounts::{LbPair, PositionV2};
use instructions::*;

#[derive(Debug, Parser)]
pub struct AddLiquidityParams {
    /// Address of the liquidity pair.
    pub lb_pair: Pubkey,
    /// Position for the deposit.
    pub position: Pubkey,
    /// Amount of token X to be deposited.
    pub amount_x: u64,
    /// Amount of token Y to be deposited.
    pub amount_y: u64,
    /// Liquidity distribution to the bins. "<DELTA_ID,DIST_X,DIST_Y, DELTA_ID,DIST_X,DIST_Y, ...>" where
    /// DELTA_ID = Number of bins surrounding the active bin. This decide which bin the token is going to deposit to. For example: if the current active id is 5555, delta_ids is 1, the user will be depositing to bin 5554, 5555, and 5556.
    /// DIST_X = Percentage of amount_x to be deposited to the bins. Must not > 1.0
    /// DIST_Y = Percentage of amount_y to be deposited to the bins. Must not > 1.0
    /// For example: --bin-liquidity-distribution "-1,0.0,0.25 0,0.75,0.75 1,0.25,0.0"
    #[clap(long, value_parser = parse_bin_liquidity_distribution, value_delimiter = ' ', allow_hyphen_values = true)]
    pub bin_liquidity_distribution: Vec<(i32, f64, f64)>,
}

pub async fn execute_add_liquidity<C: Deref<Target = impl Signer> + Clone>(
    params: AddLiquidityParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
    compute_unit_price: Option<Instruction>,
) -> Result<()> {
    let AddLiquidityParams {
        lb_pair,
        position,
        amount_x,
        amount_y,
        mut bin_liquidity_distribution,
    } = params;

    // Sort by bin id
    bin_liquidity_distribution.sort_by(|a, b| a.0.cmp(&b.0));

    let rpc_client = program.rpc();

    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let [token_x_program, token_y_program] = lb_pair_state.get_token_programs()?;

    let bin_liquidity_distribution = bin_liquidity_distribution
        .into_iter()
        .map(|(bin_id, dist_x, dist_y)| BinLiquidityDistribution {
            bin_id,
            distribution_x: (dist_x * BASIS_POINT_MAX as f64) as u16,
            distribution_y: (dist_y * BASIS_POINT_MAX as f64) as u16,
        })
        .collect::<Vec<_>>();

    let position_state: PositionV2 = rpc_client
        .get_account_and_deserialize(&position, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let min_bin_id = bin_liquidity_distribution
        .first()
        .map(|bld| bld.bin_id)
        .context("No bin liquidity distribution provided")?;

    let max_bin_id = bin_liquidity_distribution
        .last()
        .map(|bld| bld.bin_id)
        .context("No bin liquidity distribution provided")?;

    let bin_arrays_account_meta =
        position_state.get_bin_array_accounts_meta_coverage_by_chunk(min_bin_id, max_bin_id)?;

    let user_token_x = get_or_create_ata(
        program,
        transaction_config,
        lb_pair_state.token_x_mint,
        program.payer(),
        compute_unit_price.clone(),
    )
    .await?;

    let user_token_y = get_or_create_ata(
        program,
        transaction_config,
        lb_pair_state.token_y_mint,
        program.payer(),
        compute_unit_price.clone(),
    )
    .await?;

    let (bin_array_bitmap_extension, _bump) = derive_bin_array_bitmap_extension(lb_pair);

    let bin_array_bitmap_extension = rpc_client
        .get_account(&bin_array_bitmap_extension)
        .await
        .map(|_| bin_array_bitmap_extension)
        .ok()
        .or(Some(dlmm::ID));

    let (event_authority, _bump) = derive_event_authority_pda();

    let main_accounts = dlmm::client::accounts::AddLiquidity2 {
        lb_pair,
        bin_array_bitmap_extension,
        position,
        reserve_x: lb_pair_state.reserve_x,
        reserve_y: lb_pair_state.reserve_y,
        token_x_mint: lb_pair_state.token_x_mint,
        token_y_mint: lb_pair_state.token_y_mint,
        sender: program.payer(),
        user_token_x,
        user_token_y,
        token_x_program,
        token_y_program,
        event_authority,
        program: dlmm::ID,
    }
    .to_account_metas(None);

    let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] };
    let mut remaining_accounts = vec![];

    if let Some((slices, transfer_hook_remaining_accounts)) =
        get_potential_token_2022_related_ix_data_and_accounts(
            &lb_pair_state,
            program.rpc(),
            ActionType::Liquidity,
        )
        .await?
    {
        remaining_accounts_info.slices = slices;
        remaining_accounts.extend(transfer_hook_remaining_accounts);
    };

    remaining_accounts.extend(bin_arrays_account_meta);

    let data = dlmm::client::args::AddLiquidity2 {
        liquidity_parameter: LiquidityParameter {
            amount_x,
            amount_y,
            bin_liquidity_dist: bin_liquidity_distribution,
        },
        remaining_accounts_info,
    }
    .data();

    let accounts = [main_accounts.to_vec(), remaining_accounts].concat();

    let add_liquidity_ix = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(1_400_000);

    let request_builder = program.request();
    let signature = request_builder
        .instruction(compute_budget_ix)
        .instruction(add_liquidity_ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Add Liquidity. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/close_claim_protocol_fee_operator.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct CloseClaimFeeOperatorParams {
    #[clap(long)]
    pub operator: Pubkey,
}

pub async fn execute_close_claim_protocol_fee_operator<C: Deref<Target = impl Signer> + Clone>(
    params: CloseClaimFeeOperatorParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let CloseClaimFeeOperatorParams { operator } = params;

    let (claim_fee_operator, _bump) = derive_claim_protocol_fee_operator_pda(operator);

    let accounts = dlmm::client::accounts::CloseClaimProtocolFeeOperator {
        claim_fee_operator,
        admin: program.payer(),
        rent_receiver: program.payer(),
    }
    .to_account_metas(None);

    let data = dlmm::client::args::CloseClaimProtocolFeeOperator {}.data();

    let instruction = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(instruction)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Close claim protocol fee operator. Signature: {signature:#?}");

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/close_preset_parameter.rs
================================================
use crate::*;
use anchor_lang::Discriminator;

#[derive(Debug, Parser)]
pub struct ClosePresetAccountParams {
    /// Preset parameter pubkey. Get from ListAllBinStep
    pub preset_parameter: Pubkey,
}

pub async fn execute_close_preset_parameter<C: Deref<Target = impl Signer> + Clone>(
    params: ClosePresetAccountParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<Pubkey> {
    let ClosePresetAccountParams { preset_parameter } = params;

    let rpc_client = program.rpc();
    let preset_parameter_account = rpc_client.get_account(&preset_parameter).await?;

    let disc = &preset_parameter_account.data[..8];

    let instruction = if disc == dlmm::accounts::PresetParameter::DISCRIMINATOR {
        let accounts = dlmm::client::accounts::ClosePresetParameter {
            admin: program.payer(),
            rent_receiver: program.payer(),
            preset_parameter,
        }
        .to_account_metas(None);

        let data = dlmm::client::args::ClosePresetParameter {}.data();

        Instruction {
            program_id: dlmm::ID,
            accounts,
            data,
        }
    } else if disc == dlmm::accounts::PresetParameter2::DISCRIMINATOR {
        let accounts = dlmm::client::accounts::ClosePresetParameter2 {
            admin: program.payer(),
            rent_receiver: program.payer(),
            preset_parameter,
        }
        .to_account_metas(None);

        let data = dlmm::client::args::ClosePresetParameter2 {}.data();

        Instruction {
            program_id: dlmm::ID,
            accounts,
            data,
        }
    } else {
        bail!("Not a valid preset parameter account");
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(instruction)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!(
        "Close preset parameter {}. Signature: {signature:#?}",
        preset_parameter
    );

    signature?;

    Ok(preset_parameter)
}


================================================
FILE: cli/src/instructions/admin/create_claim_protocol_fee_operator.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct CreateClaimFeeOperatorParams {
    #[clap(long)]
    pub operator: Pubkey,
}

pub async fn execute_create_claim_protocol_fee_operator<C: Deref<Target = impl Signer> + Clone>(
    params: CreateClaimFeeOperatorParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let CreateClaimFeeOperatorParams { operator } = params;

    let (claim_fee_operator, _bump) = derive_claim_protocol_fee_operator_pda(operator);

    let accounts = dlmm::client::accounts::CreateClaimProtocolFeeOperator {
        claim_fee_operator,
        operator,
        admin: program.payer(),
        system_program: anchor_lang::system_program::ID,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::CreateClaimProtocolFeeOperator {}.data();

    let instruction = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(instruction)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Create claim protocol fee operator. Signature: {signature:#?}");

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/initialize_permission_lb_pair.rs
================================================
use std::sync::Arc;

use crate::*;
use anchor_lang::AccountDeserialize;
use anchor_spl::token_interface::Mint;
use commons::dlmm::types::{InitPermissionPairIx, Rounding};

#[derive(Debug, Parser)]
pub struct InitPermissionLbPairParameters {
    /// Bin step of the liquidity pair. It decide the bps when between bins.
    pub bin_step: u16,
    /// Token X mint of the liquidity pair. Eg: BTC. This should be the base token.
    pub token_mint_x: Pubkey,
    /// Token Y mint of the liquidity pair. Eg: USDC. This should be the quote token.
    pub token_mint_y: Pubkey,
    /// The initial price of the liquidity pair. Eg: 24123.12312412 USDC per 1 BTC.
    pub initial_price: f64,
    /// Base keypair path
    pub base_keypair_path: String,
    /// Base fee bps
    pub base_fee_bps: u16,
    /// Activation type
    pub activation_type: u8,
}

pub async fn execute_initialize_permission_lb_pair<C: Deref<Target = impl Signer> + Clone>(
    params: InitPermissionLbPairParameters,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<Pubkey> {
    let InitPermissionLbPairParameters {
        bin_step,
        token_mint_x,
        token_mint_y,
        initial_price,
        base_keypair_path,
        base_fee_bps,
        activation_type,
    } = params;

    let base_keypair =
        Arc::new(read_keypair_file(base_keypair_path).expect("base keypair file not found"));

    let rpc_client = program.rpc();

    let mut accounts = rpc_client
        .get_multiple_accounts(&[token_mint_x, token_mint_y])
        .await?;

    let token_mint_base_account = accounts[0].take().context("token_mint_base not found")?;
    let token_mint_quote_account = accounts[1].take().context("token_mint_quote not found")?;

    let token_mint_base = Mint::try_deserialize(&mut token_mint_base_account.data.as_ref())?;
    let token_mint_quote = Mint::try_deserialize(&mut token_mint_quote_account.data.as_ref())?;

    let price_per_lamport = price_per_token_to_per_lamport(
        initial_price,
        token_mint_base.decimals,
        token_mint_quote.decimals,
    )
    .context("price_per_token_to_per_lamport overflow")?;

    let computed_active_id = get_id_from_price(bin_step, &price_per_lamport, Rounding::Up)
        .context("get_id_from_price overflow")?;

    let (lb_pair, _bump) =
        derive_permission_lb_pair_pda(base_keypair.pubkey(), token_mint_x, token_mint_y, bin_step);

    if program.rpc().get_account_data(&lb_pair).await.is_ok() {
        return Ok(lb_pair);
    }

    let (reserve_x, _bump) = derive_reserve_pda(token_mint_x, lb_pair);
    let (reserve_y, _bump) = derive_reserve_pda(token_mint_y, lb_pair);
    let (oracle, _bump) = derive_oracle_pda(lb_pair);

    let (event_authority, _bump) = derive_event_authority_pda();

    let (token_badge_x, _bump) = derive_token_badge_pda(token_mint_x);
    let (token_badge_y, _bump) = derive_token_badge_pda(token_mint_y);

    let accounts = rpc_client
        .get_multiple_accounts(&[token_badge_x, token_badge_y])
        .await?;

    let token_badge_x = accounts[0]
        .as_ref()
        .map(|_| token_badge_x)
        .or(Some(dlmm::ID));

    let token_badge_y = accounts[1]
        .as_ref()
        .map(|_| token_badge_y)
        .or(Some(dlmm::ID));

    let accounts = dlmm::client::accounts::InitializePermissionLbPair {
        lb_pair,
        bin_array_bitmap_extension: Some(dlmm::ID),
        reserve_x,
        reserve_y,
        token_mint_x,
        token_mint_y,
        token_badge_x,
        token_badge_y,
        token_program_x: token_mint_base_account.owner,
        token_program_y: token_mint_quote_account.owner,
        oracle,
        admin: program.payer(),
        rent: solana_sdk::sysvar::rent::ID,
        system_program: solana_sdk::system_program::ID,
        event_authority,
        program: dlmm::ID,
        base: base_keypair.pubkey(),
    }
    .to_account_metas(None);

    let (base_factor, base_fee_power_factor) =
        compute_base_factor_from_fee_bps(bin_step, base_fee_bps)?;

    let data = dlmm::client::args::InitializePermissionLbPair {
        ix_data: InitPermissionPairIx {
            active_id: computed_active_id,
            bin_step,
            base_factor,
            activation_type,
            base_fee_power_factor,
            protocol_share: ILM_PROTOCOL_SHARE,
        },
    }
    .data();

    let init_pair_ix = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(init_pair_ix)
        .signer(base_keypair)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Initialize Permission LB pair {lb_pair}. Signature: {signature:#?}");

    signature?;

    println!("{lb_pair}");

    Ok(lb_pair)
}


================================================
FILE: cli/src/instructions/admin/initialize_preset_parameter.rs
================================================
use anchor_lang::Discriminator;
use commons::dlmm::{accounts::PresetParameter2, types::InitPresetParameters2Ix};
use solana_client::{
    rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig},
    rpc_filter::{Memcmp, RpcFilterType},
};

use crate::*;

#[derive(Debug, Parser)]
pub struct InitPresetParameters {
    /// Bin step. Represent the price increment / decrement.
    pub bin_step: u16,
    /// Used for base fee calculation. base_fee_rate = base_factor * bin_step
    pub base_factor: u16,
    /// Filter period determine high frequency trading time window.
    pub filter_period: u16,
    /// Decay period determine when the volatile fee start decay / decrease.
    pub decay_period: u16,
    /// Reduction factor controls the volatile fee rate decrement rate.
    pub reduction_factor: u16,
    /// Used to scale the variable fee component depending on the dynamic of the market
    pub variable_fee_control: u32,
    /// Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.
    pub max_volatility_accumulator: u32,
    /// Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee
    pub protocol_share: u16,
    /// Base fee power factor  
    pub base_fee_power_factor: u8,
}

pub async fn execute_initialize_preset_parameter<C: Deref<Target = impl Signer> + Clone>(
    params: InitPresetParameters,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<Pubkey> {
    let InitPresetParameters {
        base_factor,
        bin_step,
        decay_period,
        filter_period,
        max_volatility_accumulator,
        protocol_share,
        reduction_factor,
        variable_fee_control,
        base_fee_power_factor,
    } = params;

    let rpc_client = program.rpc();

    let preset_parameter_v2_count = rpc_client
        .get_program_accounts_with_config(
            &dlmm::ID,
            RpcProgramAccountsConfig {
                filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded(
                    0,
                    &PresetParameter2::DISCRIMINATOR,
                ))]),
                account_config: RpcAccountInfoConfig {
                    encoding: Some(UiAccountEncoding::Base64),
                    data_slice: Some(UiDataSliceConfig {
                        offset: 0,
                        length: 0,
                    }),
                    ..Default::default()
                },
                ..Default::default()
            },
        )
        .await?
        .len();

    let index = preset_parameter_v2_count as u16;

    let (preset_parameter, _bump) =
        derive_preset_parameter_pda_v2(preset_parameter_v2_count as u16);

    let accounts = dlmm::client::accounts::InitializePresetParameter2 {
        preset_parameter,
        admin: program.payer(),
        system_program: solana_sdk::system_program::ID,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::InitializePresetParameter2 {
        ix: InitPresetParameters2Ix {
            index,
            bin_step,
            base_factor,
            filter_period,
            decay_period,
            reduction_factor,
            variable_fee_control,
            max_volatility_accumulator,
            protocol_share,
            base_fee_power_factor,
        },
    }
    .data();

    let init_preset_param_ix = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(init_preset_param_ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!(
        "Initialize preset parameter {}. Signature: {signature:#?}",
        preset_parameter
    );

    signature?;

    Ok(preset_parameter)
}


================================================
FILE: cli/src/instructions/admin/initialize_reward.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct InitializeRewardParams {
    pub lb_pair: Pubkey,
    pub reward_mint: Pubkey,
    pub reward_index: u64,
    pub reward_duration: u64,
    pub funder: Pubkey,
}

pub async fn execute_initialize_reward<C: Deref<Target = impl Signer> + Clone>(
    params: InitializeRewardParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let InitializeRewardParams {
        lb_pair,
        reward_mint,
        reward_index,
        reward_duration,
        funder,
    } = params;

    let (reward_vault, _bump) = derive_reward_vault_pda(lb_pair, reward_index);
    let (event_authority, _bump) = derive_event_authority_pda();

    let rpc_client = program.rpc();
    let reward_mint_account = rpc_client.get_account(&reward_mint).await?;

    let (token_badge, _bump) = derive_token_badge_pda(reward_mint);
    let token_badge = rpc_client
        .get_account(&token_badge)
        .await
        .ok()
        .map(|_| token_badge)
        .or(Some(dlmm::ID));

    let accounts = dlmm::client::accounts::InitializeReward {
        lb_pair,
        reward_vault,
        reward_mint,
        admin: program.payer(),
        token_program: reward_mint_account.owner,
        token_badge,
        rent: solana_sdk::sysvar::rent::ID,
        system_program: solana_sdk::system_program::ID,
        event_authority,
        program: dlmm::ID,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::InitializeReward {
        reward_index,
        reward_duration,
        funder,
    }
    .data();

    let instruction = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(instruction)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Initialize reward. Signature: {signature:#?}");

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/initialize_token_badge.rs
================================================
use crate::*;
use solana_sdk::system_program;

#[derive(Debug, Parser)]
pub struct InitializeTokenBadgeParams {
    /// Token mint address
    pub mint: Pubkey,
}

pub async fn execute_initialize_token_badge<C: Deref<Target = impl Signer> + Clone>(
    params: InitializeTokenBadgeParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let InitializeTokenBadgeParams { mint } = params;

    let (token_badge, _bump) = derive_token_badge_pda(mint);

    let accounts = dlmm::client::accounts::InitializeTokenBadge {
        admin: program.payer(),
        token_mint: mint,
        system_program: system_program::ID,
        token_badge,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::InitializeTokenBadge {}.data();

    let instruction = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(instruction)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Initialize token badge {}. Signature: {signature:#?}", mint);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/mod.rs
================================================
pub mod close_preset_parameter;
pub use close_preset_parameter::*;

pub mod initialize_permission_lb_pair;
pub use initialize_permission_lb_pair::*;

pub mod initialize_preset_parameter;
pub use initialize_preset_parameter::*;

pub mod initialize_reward;
pub use initialize_reward::*;

pub mod set_activation_point;
pub use set_activation_point::*;

pub mod set_pre_activation_duration;
pub use set_pre_activation_duration::*;

pub mod set_pre_activation_swap_address;
pub use set_pre_activation_swap_address::*;

pub mod toggle_pair_status;
pub use toggle_pair_status::*;

pub mod update_reward_duration;
pub use update_reward_duration::*;

pub mod update_reward_funder;
pub use update_reward_funder::*;

pub mod withdraw_protocol_fee;
pub use withdraw_protocol_fee::*;

pub mod initialize_token_badge;
pub use initialize_token_badge::*;

pub mod create_claim_protocol_fee_operator;
pub use create_claim_protocol_fee_operator::*;

pub mod close_claim_protocol_fee_operator;
pub use close_claim_protocol_fee_operator::*;

pub mod update_base_fee;
pub use update_base_fee::*;


================================================
FILE: cli/src/instructions/admin/set_activation_point.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct SetActivationPointParam {
    /// Address of the pair
    pub lb_pair: Pubkey,
    /// Activation point
    pub activation_point: u64,
}

pub async fn execute_set_activation_point<C: Deref<Target = impl Signer> + Clone>(
    params: SetActivationPointParam,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let SetActivationPointParam {
        lb_pair,
        activation_point,
    } = params;

    let accounts = dlmm::client::accounts::SetActivationPoint {
        admin: program.payer(),
        lb_pair,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::SetActivationPoint { activation_point }.data();

    let set_activation_point_ix = Instruction {
        accounts,
        data,
        program_id: dlmm::ID,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(set_activation_point_ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Set activation point. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/set_pre_activation_duration.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct SetPreactivationDurationParam {
    pub lb_pair: Pubkey,
    pub pre_activation_duration: u16,
}

pub async fn execute_set_pre_activation_duration<C: Deref<Target = impl Signer> + Clone>(
    params: SetPreactivationDurationParam,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let SetPreactivationDurationParam {
        lb_pair,
        pre_activation_duration,
    } = params;

    let accounts = dlmm::client::accounts::SetPreActivationDuration {
        creator: program.payer(),
        lb_pair,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::SetPreActivationDuration {
        pre_activation_duration: pre_activation_duration as u64,
    }
    .data();

    let set_pre_activation_slot_duration_ix = Instruction {
        accounts,
        data,
        program_id: dlmm::ID,
    };

    let request_builder = program.request();

    let signature = request_builder
        .instruction(set_pre_activation_slot_duration_ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Set pre activation duration. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/set_pre_activation_swap_address.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct SetPreactivationSwapAddressParam {
    pub lb_pair: Pubkey,
    pub pre_activation_swap_address: Pubkey,
}

pub async fn execute_set_pre_activation_swap_address<C: Deref<Target = impl Signer> + Clone>(
    params: SetPreactivationSwapAddressParam,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let SetPreactivationSwapAddressParam {
        lb_pair,
        pre_activation_swap_address,
    } = params;

    let accounts = dlmm::client::accounts::SetPreActivationSwapAddress {
        creator: program.payer(),
        lb_pair,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::SetPreActivationSwapAddress {
        pre_activation_swap_address,
    }
    .data();

    let set_pre_activation_swap_address_ix = Instruction {
        accounts,
        data,
        program_id: dlmm::ID,
    };

    let request_builder = program.request();

    let signature = request_builder
        .instruction(set_pre_activation_swap_address_ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!(
        "Set pre activation swap address. Signature: {:#?}",
        signature
    );

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/toggle_pair_status.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct SetPairStatusParams {
    /// Address of the pair
    pub lb_pair: Pubkey,
    /// Pair status. 0 is enabled, 1 is disabled
    pub pair_status: u8,
}

pub async fn execute_set_pair_status<C: Deref<Target = impl Signer> + Clone>(
    params: SetPairStatusParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let SetPairStatusParams {
        lb_pair,
        pair_status,
    } = params;

    let accounts = dlmm::client::accounts::SetPairStatus {
        admin: program.payer(),
        lb_pair,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::SetPairStatus {
        status: pair_status,
    }
    .data();

    let instruction = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(instruction)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Set pair status. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/update_base_fee.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct UpdateBaseFeeParams {
    pub lb_pair: Pubkey,
    pub base_fee_bps: u16,
}

pub async fn execute_update_base_fee<C: Deref<Target = impl Signer> + Clone>(
    params: UpdateBaseFeeParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let UpdateBaseFeeParams {
        lb_pair,
        base_fee_bps,
    } = params;

    let rpc_client = program.rpc();

    let pair_account = rpc_client.get_account(&lb_pair).await?;

    let lb_pair_state = LbPair::try_deserialize(&mut pair_account.data.as_ref())?;

    let (base_factor, base_fee_power_factor) =
        compute_base_factor_from_fee_bps(lb_pair_state.bin_step, base_fee_bps)?;

    let ix_data = dlmm::client::args::UpdateBaseFeeParameters {
        fee_parameter: BaseFeeParameter {
            protocol_share: lb_pair_state.parameters.protocol_share,
            base_factor,
            base_fee_power_factor,
        },
    }
    .data();

    let event_authority = derive_event_authority_pda().0;

    let accounts = dlmm::client::accounts::UpdateBaseFeeParameters {
        lb_pair,
        admin: program.payer(),
        event_authority,
        program: dlmm::ID,
    }
    .to_account_metas(None);

    let ix = Instruction {
        program_id: program.id(),
        data: ix_data,
        accounts: accounts.to_vec(),
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Update base fee. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/update_reward_duration.rs
================================================
use crate::*;
use commons::dlmm::accounts::{BinArray, LbPair};

#[derive(Debug, Parser)]
pub struct UpdateRewardDurationParams {
    pub lb_pair: Pubkey,
    pub reward_index: u64,
    pub reward_duration: u64,
}

pub async fn execute_update_reward_duration<C: Deref<Target = impl Signer> + Clone>(
    params: UpdateRewardDurationParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let UpdateRewardDurationParams {
        lb_pair,
        reward_index,
        reward_duration,
    } = params;

    let rpc_client = program.rpc();
    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let active_bin_array_idx = BinArray::bin_id_to_bin_array_index(lb_pair_state.active_id)?;
    let (bin_array, _bump) = derive_bin_array_pda(lb_pair, active_bin_array_idx as i64);

    let (event_authority, _bump) = derive_event_authority_pda();

    let accounts = dlmm::client::accounts::UpdateRewardDuration {
        lb_pair,
        admin: program.payer(),
        bin_array,
        event_authority,
        program: dlmm::ID,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::UpdateRewardDuration {
        reward_index,
        new_duration: reward_duration,
    }
    .data();

    let ix = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Fund reward. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/update_reward_funder.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct UpdateRewardFunderParams {
    pub lb_pair: Pubkey,
    pub reward_index: u64,
    pub funder: Pubkey,
}

pub async fn execute_update_reward_funder<C: Deref<Target = impl Signer> + Clone>(
    params: UpdateRewardFunderParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let UpdateRewardFunderParams {
        lb_pair,
        reward_index,
        funder,
    } = params;

    let (event_authority, _bump) = derive_event_authority_pda();

    let accounts = dlmm::client::accounts::UpdateRewardFunder {
        lb_pair,
        admin: program.payer(),
        event_authority,
        program: dlmm::ID,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::UpdateRewardFunder {
        reward_index,
        new_funder: funder,
    }
    .data();

    let ix = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Fund reward. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/admin/withdraw_protocol_fee.rs
================================================
use anchor_spl::associated_token::get_associated_token_address_with_program_id;
use commons::dlmm::accounts::LbPair;

use crate::*;
#[derive(Debug, Parser)]
pub struct WithdrawProtocolFeeParams {
    pub lb_pair: Pubkey,
}

pub async fn execute_withdraw_protocol_fee<C: Deref<Target = impl Signer> + Clone>(
    params: WithdrawProtocolFeeParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let WithdrawProtocolFeeParams { lb_pair } = params;

    let rpc_client = program.rpc();

    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let [token_x_program, token_y_program] = lb_pair_state.get_token_programs()?;

    let receiver_token_x = get_associated_token_address_with_program_id(
        &program.payer(),
        &lb_pair_state.token_x_mint,
        &token_x_program,
    );

    let receiver_token_y = get_associated_token_address_with_program_id(
        &program.payer(),
        &lb_pair_state.token_y_mint,
        &token_y_program,
    );

    let (claim_fee_operator, _) = derive_claim_protocol_fee_operator_pda(program.payer());

    let main_accounts = dlmm::client::accounts::WithdrawProtocolFee {
        lb_pair,
        reserve_x: lb_pair_state.reserve_x,
        reserve_y: lb_pair_state.reserve_y,
        token_x_mint: lb_pair_state.token_x_mint,
        token_y_mint: lb_pair_state.token_y_mint,
        token_x_program,
        token_y_program,
        receiver_token_x,
        receiver_token_y,
        claim_fee_operator,
        operator: program.payer(),
        memo_program: spl_memo::ID,
    }
    .to_account_metas(None);

    let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] };
    let mut remaining_accounts = vec![];

    if let Some((slices, transfer_hook_remaining_accounts)) =
        get_potential_token_2022_related_ix_data_and_accounts(
            &lb_pair_state,
            program.rpc(),
            ActionType::Liquidity,
        )
        .await?
    {
        remaining_accounts_info.slices = slices;
        remaining_accounts.extend(transfer_hook_remaining_accounts);
    };

    let data = dlmm::client::args::WithdrawProtocolFee {
        max_amount_x: u64::MAX,
        max_amount_y: u64::MAX,
        remaining_accounts_info,
    }
    .data();

    let accounts = [main_accounts.to_vec(), remaining_accounts].concat();

    let withdraw_ix = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(200_000);

    let request_builder = program.request();
    let signature = request_builder
        .instruction(compute_budget_ix)
        .instruction(withdraw_ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("WithdrawProtocolFee. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/claim_fee.rs
================================================
use crate::*;
use instructions::*;

#[derive(Debug, Parser)]
pub struct ClaimFeeParams {
    /// Position address
    pub position: Pubkey,
}

pub async fn execute_claim_fee<C: Deref<Target = impl Signer> + Clone>(
    params: ClaimFeeParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
    compute_unit_price: Option<Instruction>,
) -> Result<()> {
    let ClaimFeeParams { position } = params;

    let rpc_client = program.rpc();
    let position_state: PositionV2 = rpc_client
        .get_account_and_deserialize(&position, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&position_state.lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let (user_token_x, user_token_y) = if position_state.fee_owner.eq(&Pubkey::default()) {
        let user_token_x = get_or_create_ata(
            program,
            transaction_config,
            lb_pair_state.token_x_mint,
            program.payer(),
            compute_unit_price.clone(),
        )
        .await?;

        let user_token_y = get_or_create_ata(
            program,
            transaction_config,
            lb_pair_state.token_y_mint,
            program.payer(),
            compute_unit_price.clone(),
        )
        .await?;

        (user_token_x, user_token_y)
    } else {
        let user_token_x = get_or_create_ata(
            program,
            transaction_config,
            lb_pair_state.token_x_mint,
            position_state.fee_owner,
            compute_unit_price.clone(),
        )
        .await?;

        let user_token_y = get_or_create_ata(
            program,
            transaction_config,
            lb_pair_state.token_y_mint,
            position_state.fee_owner,
            compute_unit_price.clone(),
        )
        .await?;

        (user_token_x, user_token_y)
    };

    let [token_program_x, token_program_y] = lb_pair_state.get_token_programs()?;

    let (event_authority, _bump) = derive_event_authority_pda();

    let main_accounts = dlmm::client::accounts::ClaimFee2 {
        lb_pair: position_state.lb_pair,
        sender: program.payer(),
        position,
        reserve_x: lb_pair_state.reserve_x,
        reserve_y: lb_pair_state.reserve_y,
        token_program_x,
        token_program_y,
        token_x_mint: lb_pair_state.token_x_mint,
        token_y_mint: lb_pair_state.token_y_mint,
        user_token_x,
        user_token_y,
        event_authority,
        program: dlmm::ID,
        memo_program: spl_memo::id(),
    }
    .to_account_metas(None);

    let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] };
    let mut token_2022_remaining_accounts = vec![];

    if let Some((slices, transfer_hook_remaining_accounts)) =
        get_potential_token_2022_related_ix_data_and_accounts(
            &lb_pair_state,
            program.rpc(),
            ActionType::Liquidity,
        )
        .await?
    {
        remaining_accounts_info.slices = slices;
        token_2022_remaining_accounts.extend(transfer_hook_remaining_accounts);
    };

    for (min_bin_id, max_bin_id) in
        position_bin_range_chunks(position_state.lower_bin_id, position_state.upper_bin_id)
    {
        let data = dlmm::client::args::ClaimFee2 {
            min_bin_id,
            max_bin_id,
            remaining_accounts_info: remaining_accounts_info.clone(),
        }
        .data();

        let bin_arrays_account_meta =
            position_state.get_bin_array_accounts_meta_coverage_by_chunk(min_bin_id, max_bin_id)?;

        let accounts = [
            main_accounts.to_vec(),
            token_2022_remaining_accounts.clone(),
            bin_arrays_account_meta,
        ]
        .concat();

        let claim_fee_ix = Instruction {
            program_id: dlmm::ID,
            accounts,
            data,
        };

        let mut request_builder = program.request();

        if let Some(compute_unit_price_ix) = compute_unit_price.clone() {
            request_builder = request_builder.instruction(compute_unit_price_ix);
        }

        let signature = request_builder
            .instruction(claim_fee_ix)
            .send_with_spinner_and_config(transaction_config)
            .await;

        println!("Claim fee. Signature: {:#?}", signature);

        signature?;
    }

    Ok(())
}


================================================
FILE: cli/src/instructions/claim_reward.rs
================================================
use crate::*;
use instructions::*;

#[derive(Debug, Parser)]
pub struct ClaimRewardParams {
    pub lb_pair: Pubkey,
    pub reward_index: u64,
    pub position: Pubkey,
}

pub async fn execute_claim_reward<C: Deref<Target = impl Signer> + Clone>(
    params: ClaimRewardParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
    compute_unit_price: Option<Instruction>,
) -> Result<()> {
    let ClaimRewardParams {
        lb_pair,
        reward_index,
        position,
    } = params;

    let rpc_client = program.rpc();
    let (reward_vault, _bump) = derive_reward_vault_pda(lb_pair, reward_index);

    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let position_state: PositionV2 = rpc_client
        .get_account_and_deserialize(&position, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let reward_info = lb_pair_state.reward_infos[reward_index as usize];
    let reward_mint = reward_info.mint;

    let reward_mint_program = rpc_client.get_account(&reward_mint).await?.owner;

    let user_token_account = get_or_create_ata(
        program,
        transaction_config,
        reward_mint,
        program.payer(),
        compute_unit_price.clone(),
    )
    .await?;

    let (event_authority, _bump) = derive_event_authority_pda();

    let main_accounts = dlmm::client::accounts::ClaimReward2 {
        lb_pair,
        reward_vault,
        reward_mint,
        memo_program: spl_memo::ID,
        token_program: reward_mint_program,
        position,
        user_token_account,
        sender: program.payer(),
        event_authority,
        program: dlmm::ID,
    }
    .to_account_metas(None);

    let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] };
    let mut token_2022_remaining_accounts = vec![];

    if let Some((slices, transfer_hook_remaining_accounts)) =
        get_potential_token_2022_related_ix_data_and_accounts(
            &lb_pair_state,
            program.rpc(),
            ActionType::Reward(reward_index as usize),
        )
        .await?
    {
        remaining_accounts_info.slices = slices;
        token_2022_remaining_accounts.extend(transfer_hook_remaining_accounts);
    };

    for (min_bin_id, max_bin_id) in
        position_bin_range_chunks(position_state.lower_bin_id, position_state.upper_bin_id)
    {
        let data = dlmm::client::args::ClaimReward2 {
            reward_index,
            min_bin_id,
            max_bin_id,
            remaining_accounts_info: remaining_accounts_info.clone(),
        }
        .data();

        let bin_arrays_account_meta =
            position_state.get_bin_array_accounts_meta_coverage_by_chunk(min_bin_id, max_bin_id)?;

        let accounts = [
            main_accounts.to_vec(),
            token_2022_remaining_accounts.clone(),
            bin_arrays_account_meta,
        ]
        .concat();

        let claim_reward_ix = Instruction {
            program_id: dlmm::ID,
            accounts,
            data,
        };

        let request_builder = program.request();
        let signature = request_builder
            .instruction(claim_reward_ix)
            .send_with_spinner_and_config(transaction_config)
            .await;

        println!("Claim reward. Signature: {:#?}", signature);

        signature?;
    }

    Ok(())
}


================================================
FILE: cli/src/instructions/close_position.rs
================================================
use crate::*;

#[derive(Debug, Parser)]
pub struct ClosePositionParams {
    pub position: Pubkey,
}

pub async fn execute_close_position<C: Deref<Target = impl Signer> + Clone>(
    params: ClosePositionParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
) -> Result<()> {
    let ClosePositionParams { position } = params;

    let rpc_client = program.rpc();
    let position_state: PositionV2 = rpc_client
        .get_account_and_deserialize(&position, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let bin_arrays_account_meta = position_state.get_bin_array_accounts_meta_coverage()?;

    let (event_authority, _bump) = derive_event_authority_pda();

    let main_accounts = dlmm::client::accounts::ClosePosition2 {
        sender: position_state.owner,
        rent_receiver: position_state.owner,
        position,
        event_authority,
        program: dlmm::ID,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::ClosePosition2 {}.data();
    let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_limit(1_400_000);

    let accounts = [main_accounts.to_vec(), bin_arrays_account_meta].concat();

    let close_position_ix = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(compute_budget_ix)
        .instruction(close_position_ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Close position. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/fund_reward.rs
================================================
use crate::*;
use instructions::*;

#[derive(Debug, Parser)]
pub struct FundRewardParams {
    pub lb_pair: Pubkey,
    pub reward_index: u64,
    pub funding_amount: u64,
}

pub async fn execute_fund_reward<C: Deref<Target = impl Signer> + Clone>(
    params: FundRewardParams,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
    compute_unit_price: Option<Instruction>,
) -> Result<()> {
    let FundRewardParams {
        lb_pair,
        reward_index,
        funding_amount,
    } = params;

    let rpc_client = program.rpc();

    let (reward_vault, _bump) = derive_reward_vault_pda(lb_pair, reward_index);

    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let reward_info = lb_pair_state.reward_infos[reward_index as usize];
    let reward_mint = reward_info.mint;

    let reward_mint_program = rpc_client.get_account(&reward_mint).await?.owner;

    let funder_token_account = get_or_create_ata(
        program,
        transaction_config,
        reward_mint,
        program.payer(),
        compute_unit_price.clone(),
    )
    .await?;

    let active_bin_array_idx = BinArray::bin_id_to_bin_array_index(lb_pair_state.active_id)?;
    let (bin_array, _bump) = derive_bin_array_pda(lb_pair, active_bin_array_idx as i64);

    let (event_authority, _bump) = derive_event_authority_pda();

    let reward_transfer_hook_accounts =
        get_extra_account_metas_for_transfer_hook(reward_mint, program.rpc()).await?;

    let remaining_accounts_info = RemainingAccountsInfo {
        slices: vec![RemainingAccountsSlice {
            accounts_type: AccountsType::TransferHookReward,
            length: reward_transfer_hook_accounts.len() as u8,
        }],
    };

    let main_accounts = dlmm::client::accounts::FundReward {
        lb_pair,
        reward_vault,
        reward_mint,
        funder: program.payer(),
        funder_token_account,
        bin_array,
        token_program: reward_mint_program,
        event_authority,
        program: dlmm::ID,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::FundReward {
        reward_index,
        amount: funding_amount,
        carry_forward: true,
        remaining_accounts_info,
    }
    .data();

    let accounts = [main_accounts.to_vec(), reward_transfer_hook_accounts].concat();

    let fund_reward_ix = Instruction {
        program_id: dlmm::ID,
        accounts,
        data,
    };

    let request_builder = program.request();
    let signature = request_builder
        .instruction(fund_reward_ix)
        .send_with_spinner_and_config(transaction_config)
        .await;

    println!("Fund reward. Signature: {:#?}", signature);

    signature?;

    Ok(())
}


================================================
FILE: cli/src/instructions/get_all_positions.rs
================================================
use crate::*;
use solana_client::rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig};

#[derive(Debug, Parser)]
pub struct GetAllPositionsParams {
    /// Address of the pair
    #[clap(long)]
    lb_pair: Pubkey,
    /// Owner of position
    #[clap(long)]
    owner: Pubkey,
}

pub async fn execute_get_all_positions<C: Deref<Target = impl Signer> + Clone>(
    program: &Program<C>,
    params: GetAllPositionsParams,
) -> Result<()> {
    let GetAllPositionsParams { lb_pair, owner } = params;

    let rpc_client = program.rpc();

    let account_config = RpcAccountInfoConfig {
        encoding: Some(UiAccountEncoding::Base64),
        ..Default::default()
    };
    let config = RpcProgramAccountsConfig {
        filters: Some(position_filter_by_wallet_and_pair(owner, lb_pair)),
        account_config,
        ..Default::default()
    };

    let accounts = rpc_client
        .get_program_accounts_with_config(&dlmm::ID, config)
        .await?;

    for (position_key, position_raw_account) in accounts {
        let position_state: PositionV2 =
            bytemuck::pod_read_unaligned(&position_raw_account.data[8..]);
        println!(
            "Position {} fee owner {}",
            position_key, position_state.fee_owner
        );
    }

    Ok(())
}


================================================
FILE: cli/src/instructions/ilm/mod.rs
================================================
pub mod remove_liquidity_by_price_range;
pub use remove_liquidity_by_price_range::*;

pub mod seed_liquidity_from_operator;
pub use seed_liquidity_from_operator::*;

pub mod seed_liquidity_single_bin_by_operator;
pub use seed_liquidity_single_bin_by_operator::*;


================================================
FILE: cli/src/instructions/ilm/remove_liquidity_by_price_range.rs
================================================
use crate::*;
use anchor_lang::AccountDeserialize;
use anchor_spl::token_interface::Mint;
use instructions::*;

#[derive(Debug, Parser)]
pub struct RemoveLiquidityByPriceRangeParameters {
    /// Address of the pair
    pub lb_pair: Pubkey,
    // base position path
    pub base_position_key: Pubkey,
    /// min price
    pub min_price: f64,
    /// max price
    pub max_price: f64,
}

pub async fn execute_remove_liquidity_by_price_range<C: Deref<Target = impl Signer> + Clone>(
    params: RemoveLiquidityByPriceRangeParameters,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
    compute_unit_price: Option<Instruction>,
) -> Result<()> {
    let RemoveLiquidityByPriceRangeParameters {
        lb_pair,
        base_position_key,
        min_price,
        max_price,
    } = params;

    let rpc_client = program.rpc();

    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let bin_step = lb_pair_state.bin_step;
    let [token_x_program, token_y_program] = lb_pair_state.get_token_programs()?;

    let mut accounts = rpc_client
        .get_multiple_accounts(&[lb_pair_state.token_x_mint, lb_pair_state.token_y_mint])
        .await?;

    let token_mint_base_account = accounts[0].take().context("token_mint_base not found")?;
    let token_mint_quote_account = accounts[1].take().context("token_mint_quote not found")?;

    let token_mint_base = Mint::try_deserialize(&mut token_mint_base_account.data.as_ref())?;
    let token_mint_quote = Mint::try_deserialize(&mut token_mint_quote_account.data.as_ref())?;

    let min_price_per_lamport = price_per_token_to_per_lamport(
        min_price,
        token_mint_base.decimals,
        token_mint_quote.decimals,
    )
    .context("price_per_token_to_per_lamport overflow")?;

    let min_active_id = get_id_from_price(bin_step, &min_price_per_lamport, Rounding::Up)
        .context("get_id_from_price overflow")?;

    let max_price_per_lamport = price_per_token_to_per_lamport(
        max_price,
        token_mint_base.decimals,
        token_mint_quote.decimals,
    )
    .context("price_per_token_to_per_lamport overflow")?;

    let max_active_id = get_id_from_price(bin_step, &max_price_per_lamport, Rounding::Up)
        .context("get_id_from_price overflow")?;

    assert!(min_active_id < max_active_id);

    let user_token_x = get_or_create_ata(
        program,
        transaction_config,
        lb_pair_state.token_x_mint,
        program.payer(),
        compute_unit_price.clone(),
    )
    .await?;

    let user_token_y = get_or_create_ata(
        program,
        transaction_config,
        lb_pair_state.token_y_mint,
        program.payer(),
        compute_unit_price.clone(),
    )
    .await?;

    let (event_authority, _bump) = derive_event_authority_pda();

    let (bin_array_bitmap_extension, _bump) = derive_bin_array_bitmap_extension(lb_pair);
    let bin_array_bitmap_extension = rpc_client
        .get_account(&bin_array_bitmap_extension)
        .await
        .map(|_| bin_array_bitmap_extension)
        .ok()
        .or(Some(dlmm::ID));

    let width = DEFAULT_BIN_PER_POSITION as i32;

    let mut remaining_accounts_info = RemainingAccountsInfo { slices: vec![] };
    let mut transfer_hook_remaining_accounts = vec![];

    if let Some((slices, remaining_accounts)) =
        get_potential_token_2022_related_ix_data_and_accounts(
            &lb_pair_state,
            program.rpc(),
            ActionType::Liquidity,
        )
        .await?
    {
        remaining_accounts_info.slices = slices;
        transfer_hook_remaining_accounts.extend(remaining_accounts);
    };

    for i in min_active_id..=max_active_id {
        let (position, _bump) = derive_position_pda(lb_pair, base_position_key, i, width);

        let position_account = rpc_client.get_account(&position).await;
        if let std::result::Result::Ok(account) = position_account {
            let position_state: PositionV2 = bytemuck::pod_read_unaligned(&account.data[8..]);

            let bin_arrays_account_meta = position_state.get_bin_array_accounts_meta_coverage()?;

            let remaining_accounts = [
                transfer_hook_remaining_accounts.clone(),
                bin_arrays_account_meta,
            ]
            .concat();

            let mut instructions =
                vec![ComputeBudgetInstruction::set_compute_unit_limit(1_400_000)];

            let main_accounts = dlmm::client::accounts::RemoveLiquidityByRange2 {
                position,
                lb_pair,
                bin_array_bitmap_extension,
                user_token_x,
                user_token_y,
                reserve_x: lb_pair_state.reserve_x,
                reserve_y: lb_pair_state.reserve_y,
                token_x_mint: lb_pair_state.token_x_mint,
                token_y_mint: lb_pair_state.token_y_mint,
                sender: program.payer(),
                token_x_program,
                token_y_program,
                memo_program: spl_memo::ID,
                event_authority,
                program: dlmm::ID,
            }
            .to_account_metas(None);

            let data = dlmm::client::args::RemoveLiquidityByRange2 {
                from_bin_id: position_state.lower_bin_id,
                to_bin_id: position_state.upper_bin_id,
                bps_to_remove: BASIS_POINT_MAX as u16,
                remaining_accounts_info: remaining_accounts_info.clone(),
            }
            .data();

            let accounts = [main_accounts.to_vec(), remaining_accounts.clone()].concat();

            let withdraw_all_ix = Instruction {
                program_id: dlmm::ID,
                accounts,
                data,
            };

            instructions.push(withdraw_all_ix);

            let main_accounts = dlmm::client::accounts::ClaimFee2 {
                lb_pair,
                position,
                sender: program.payer(),
                reserve_x: lb_pair_state.reserve_x,
                reserve_y: lb_pair_state.reserve_y,
                token_x_mint: lb_pair_state.token_x_mint,
                token_y_mint: lb_pair_state.token_y_mint,
                token_program_x: token_x_program,
                token_program_y: token_y_program,
                memo_program: spl_memo::ID,
                event_authority,
                program: dlmm::ID,
                user_token_x,
                user_token_y,
            }
            .to_account_metas(None);

            let data = dlmm::client::args::ClaimFee2 {
                min_bin_id: position_state.lower_bin_id,
                max_bin_id: position_state.upper_bin_id,
                remaining_accounts_info: remaining_accounts_info.clone(),
            }
            .data();

            let accounts = [main_accounts.to_vec(), remaining_accounts.clone()].concat();

            let claim_fee_ix = Instruction {
                program_id: dlmm::ID,
                accounts,
                data,
            };

            instructions.push(claim_fee_ix);

            let accounts = dlmm::client::accounts::ClosePosition2 {
                position,
                sender: program.payer(),
                rent_receiver: program.payer(),
                event_authority,
                program: dlmm::ID,
            }
            .to_account_metas(None);

            let data = dlmm::client::args::ClosePosition2 {}.data();

            let close_position_ix = Instruction {
                program_id: dlmm::ID,
                accounts,
                data,
            };

            instructions.push(close_position_ix);

            println!(
                "Close position {}. Min bin id {}, Max bin id {}",
                position, position_state.lower_bin_id, position_state.upper_bin_id
            );
        }
    }
    Ok(())
}


================================================
FILE: cli/src/instructions/ilm/seed_liquidity_from_operator.rs
================================================
use std::{collections::HashMap, ops::Index, u64};

use crate::*;
use anchor_lang::{prelude::Clock, AccountDeserialize};
use anchor_spl::{
    associated_token::get_associated_token_address_with_program_id,
    token_interface::{spl_token_2022::instruction::transfer_checked, Mint, TokenAccount},
};

use futures_util::future::try_join_all;
use spl_associated_token_account::instruction::create_associated_token_account_idempotent;

pub fn to_wei_amount(amount: u64, decimal: u8) -> Result<u64> {
    let wei_amount = amount
        .checked_mul(10u64.pow(decimal.into()))
        .context("to_wei_amount overflow")?;

    Ok(wei_amount)
}

pub fn convert_min_max_ui_price_to_min_max_bin_id(
    bin_step: u16,
    min_price: f64,
    max_price: f64,
    base_token_decimal: u8,
    quote_token_decimal: u8,
) -> Result<(i32, i32)> {
    let min_price_per_lamport =
        price_per_token_to_per_lamport(min_price, base_token_decimal, quote_token_decimal)
            .context("price_per_token_to_per_lamport overflow")?;

    let min_active_id = get_id_from_price(bin_step, &min_price_per_lamport, Rounding::Up)
        .context("get_id_from_price overflow")?;

    let max_price_per_lamport =
        price_per_token_to_per_lamport(max_price, base_token_decimal, quote_token_decimal)
            .context("price_per_token_to_per_lamport overflow")?;

    let max_active_id = get_id_from_price(bin_step, &max_price_per_lamport, Rounding::Up)
        .context("get_id_from_price overflow")?;

    Ok((min_active_id, max_active_id))
}

fn get_base(bin_step: u16) -> f64 {
    1.0 + bin_step as f64 / 10_000.0
}

pub fn get_ui_price_from_id(
    bin_step: u16,
    bin_id: i32,
    base_token_decimal: i32,
    quote_token_decimal: i32,
) -> f64 {
    let base = get_base(bin_step);
    base.powi(bin_id) * 10.0f64.powi(base_token_decimal - quote_token_decimal)
}

pub fn get_number_of_position_required_to_cover_range(
    min_bin_id: i32,
    max_bin_id: i32,
) -> Result<i32> {
    let bin_delta = max_bin_id
        .checked_sub(min_bin_id)
        .context("bin_delta overflow")?;
    let mut position_required = bin_delta
        .checked_div(DEFAULT_BIN_PER_POSITION as i32)
        .context("position_required overflow")?;
    let rem = bin_delta % DEFAULT_BIN_PER_POSITION as i32;

    if rem > 0 {
        position_required += 1;
    }

    Ok(position_required)
}

struct CompressionResult {
    compressed_bin_amount: HashMap<i32, u32>,
    compression_loss: u64,
}

fn compress_bin_amount(
    bins_amount: HashMap<i32, u64>,
    multiplier: u64,
) -> Result<CompressionResult> {
    let mut compressed_bin_amount = HashMap::new();

    let mut compression_loss = 0u64;

    for (bin_id, amount) in bins_amount.into_iter() {
        let compressed_amount: u32 = amount
            .checked_div(multiplier)
            .context("overflow")?
            .try_into()
            .context("compressed fail")?;
        compressed_bin_amount.insert(bin_id, compressed_amount);

        let loss = amount
            .checked_sub(
                u64::from(compressed_amount)
                    .checked_mul(multiplier)
                    .context("overflow")?,
            )
            .context("overflow")?;

        compression_loss = compression_loss.checked_add(loss).context("overflow")?;
    }

    Ok(CompressionResult {
        compressed_bin_amount,
        compression_loss,
    })
}

#[derive(Debug, Parser, Clone)]
pub struct SeedLiquidityByOperatorParameters {
    /// Address of the pair
    #[clap(long)]
    pub lb_pair: Pubkey,
    /// Base position path
    #[clap(long)]
    pub base_position_path: String,
    /// Amount of x
    #[clap(long)]
    pub amount: u64,
    /// Min price
    #[clap(long)]
    pub min_price: f64,
    /// Max price
    #[clap(long)]
    pub max_price: f64,
    /// Base pubkey
    #[clap(long)]
    pub base_pubkey: Pubkey,
    /// Curvature
    #[clap(long)]
    pub curvature: f64,
    /// position owner
    #[clap(long)]
    pub position_owner: Pubkey,
    /// fee owner
    #[clap(long)]
    pub fee_owner: Pubkey,
    /// lock release point
    #[clap(long)]
    pub lock_release_point: u64,
    /// Max retries
    #[clap(long)]
    pub max_retries: u16,
}

pub async fn execute_seed_liquidity_by_operator<C: Deref<Target = impl Signer> + Clone>(
    params: SeedLiquidityByOperatorParameters,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
    compute_unit_price: Option<Instruction>,
) -> Result<()> {
    let SeedLiquidityByOperatorParameters {
        lb_pair,
        base_position_path,
        amount,
        min_price,
        max_price,
        base_pubkey,
        curvature,
        position_owner,
        fee_owner,
        lock_release_point,
        ..
    } = params;

    let position_base_kp = read_keypair_file(base_position_path.clone())
        .expect("position base keypair file not found");

    assert!(
        position_base_kp.pubkey() == base_pubkey,
        "base_pubkey mismatch"
    );

    let rpc_client = program.rpc();

    let k = 1.0 / curvature;

    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let bin_step = lb_pair_state.bin_step;

    let (mut bitmap_extension, _bump) = derive_bin_array_bitmap_extension(lb_pair);

    let mut accounts = rpc_client
        .get_multiple_accounts(&[
            lb_pair_state.token_x_mint,
            lb_pair_state.token_y_mint,
            solana_sdk::sysvar::clock::ID,
            bitmap_extension,
        ])
        .await?;

    let token_mint_base_account = accounts[0].take().context("token_mint_base not found")?;
    let token_mint_quote_account = accounts[1].take().context("token_mint_quote not found")?;
    let clock_account = accounts[2].take().context("clock not found")?;
    let bitmap_extension_account = accounts[3].take();

    let token_mint_base = Mint::try_deserialize(&mut token_mint_base_account.data.as_ref())?;
    let token_mint_quote = Mint::try_deserialize(&mut token_mint_quote_account.data.as_ref())?;
    let clock = bincode::deserialize::<Clock>(&clock_account.data)?;

    let fund_amount = to_wei_amount(amount, token_mint_base.decimals)?;

    let (min_bin_id, max_bin_id) = convert_min_max_ui_price_to_min_max_bin_id(
        bin_step,
        min_price,
        max_price,
        token_mint_base.decimals,
        token_mint_quote.decimals,
    )?;

    let actual_min_price = get_ui_price_from_id(
        bin_step,
        min_bin_id,
        token_mint_base.decimals.into(),
        token_mint_quote.decimals.into(),
    );
    let actual_max_price = get_ui_price_from_id(
        bin_step,
        max_bin_id,
        token_mint_base.decimals.into(),
        token_mint_quote.decimals.into(),
    );

    let position_number = get_number_of_position_required_to_cover_range(min_bin_id, max_bin_id)?;

    println!("Start seed. Min price: {} Max price: {} Actual min price: {} Actual max price: {} Min bin id: {} Max bin id: {} Position: {}", min_price, max_price, actual_min_price, actual_max_price, min_bin_id, max_bin_id, position_number);

    assert!(min_bin_id < max_bin_id, "Invalid price range");

    let bins_amount = generate_amount_for_bins(
        bin_step,
        min_bin_id,
        max_bin_id,
        actual_min_price,
        actual_max_price,
        token_mint_base.decimals,
        token_mint_quote.decimals,
        fund_amount,
        k,
    );

    let bins_amount_map: HashMap<i32, u64> = bins_amount
        .iter()
        .map(|(bin_id, amount_x)| (*bin_id, *amount_x))
        .collect();

    let decompress_multiplier = 10u64.pow(token_mint_base.decimals.into());

    let CompressionResult {
        compressed_bin_amount,
        compression_loss,
    } = compress_bin_amount(bins_amount_map, decompress_multiplier)?;

    let width = DEFAULT_BIN_PER_POSITION as i32;

    let mut token_account_and_bitmap_ext_and_token_prove_setup_ixs = vec![];
    let mut position_and_bin_array_setup_ixs = vec![];
    let mut liquidity_setup_ixs = vec![];

    let (event_authority, _bump) = derive_event_authority_pda();
    let seeder = program.payer();

    let token_mint_base_owner = token_mint_base_account.owner;
    let token_mint_quote_owner = token_mint_quote_account.owner;

    let seeder_token_x = get_associated_token_address_with_program_id(
        &seeder,
        &lb_pair_state.token_x_mint,
        &token_mint_base_owner,
    );

    let seeder_token_y = get_associated_token_address_with_program_id(
        &seeder,
        &lb_pair_state.token_y_mint,
        &token_mint_quote_owner,
    );

    let owner_token_x = get_associated_token_address_with_program_id(
        &position_owner,
        &lb_pair_state.token_x_mint,
        &token_mint_base_owner,
    );

    let transfer_hook_x_account =
        get_extra_account_metas_for_transfer_hook(lb_pair_state.token_x_mint, program.rpc())
            .await?;

    let transfer_hook_y_account =
        get_extra_account_metas_for_transfer_hook(lb_pair_state.token_y_mint, program.rpc())
            .await?;

    let accounts = rpc_client
        .get_multiple_accounts(&[seeder_token_x, seeder_token_y, owner_token_x])
        .await?;

    let seeder_token_x_account = accounts.index(0);
    if seeder_token_x_account.is_none() {
        token_account_and_bitmap_ext_and_token_prove_setup_ixs.push(
            create_associated_token_account_idempotent(
                &seeder,
                &seeder,
                &lb_pair_state.token_x_mint,
                &token_mint_base_owner,
            ),
        );
    }

    let seeder_token_y_account = accounts.index(1);
    if seeder_token_y_account.is_none() {
        token_account_and_bitmap_ext_and_token_prove_setup_ixs.push(
            create_associated_token_account_idempotent(
                &seeder,
                &seeder,
                &lb_pair_state.token_y_mint,
                &token_mint_quote_owner,
            ),
        );
    }

    let owner_token_x_account = accounts.index(2);
    let mut require_token_prove = false;

    if owner_token_x_account.is_none() {
        require_token_prove = true;
    } else if let Some(account) = owner_token_x_account.to_owned() {
        let owner_token_x_state = TokenAccount::try_deserialize(&mut account.data.as_slice())?;
        require_token_prove = owner_token_x_state.amount == 0;
    }

    if require_token_prove {
        token_account_and_bitmap_ext_and_token_prove_setup_ixs.push(
            create_associated_token_account_idempotent(
                &seeder,
                &position_owner,
                &lb_pair_state.token_x_mint,
                &token_mint_base_owner,
            ),
        );

        let prove_amount =
            calculate_transfer_fee_included_amount(&token_mint_base_account, 1, clock.epoch)?
                .amount;

        let mut transfer_ix = transfer_checked(
            &token_mint_base_owner,
            &seeder_token_x,
            &lb_pair_state.token_x_mint,
            &owner_token_x,
            &seeder,
            &[],
            prove_amount,
            token_mint_base.decimals,
        )?;

        transfer_ix
            .accounts
            .extend_from_slice(&transfer_hook_x_account);

        token_account_and_bitmap_ext_and_token_prove_setup_ixs.push(transfer_ix);
    }

    let (min_bitmap_id, max_bitmap_id) = LbPair::bitmap_range();
    let lower_bin_array_index = BinArray::bin_id_to_bin_array_index(min_bin_id)?;
    let upper_bin_array_index = BinArray::bin_id_to_bin_array_index(max_bin_id - 1)?;

    let overflow_internal_bitmap_range =
        upper_bin_array_index > max_bitmap_id || lower_bin_array_index < min_bitmap_id;

    if overflow_internal_bitmap_range && bitmap_extension_account.is_none() {
        let accounts = dlmm::client::accounts::InitializeBinArrayBitmapExtension {
            lb_pair,
            bin_array_bitmap_extension: bitmap_extension,
            funder: seeder,
            system_program: solana_sdk::system_program::ID,
            rent: solana_sdk::sysvar::rent::ID,
        }
        .to_account_metas(None);

        let ix_data = dlmm::client::args::InitializeBinArrayBitmapExtension {}.data();

        let init_bitmap_ext_ix = Instruction {
            program_id: dlmm::ID,
            accounts,
            data: ix_data,
        };

        token_account_and_bitmap_ext_and_token_prove_setup_ixs.push(init_bitmap_ext_ix);
    } else {
        bitmap_extension = dlmm::ID;
    }

    for i in 0..position_number {
        let lower_bin_id = min_bin_id + (DEFAULT_BIN_PER_POSITION as i32 * i);
        let upper_bin_id = lower_bin_id + DEFAULT_BIN_PER_POSITION as i32 - 1;
        let upper_bin_id = std::cmp::min(upper_bin_id, max_bin_id - 1);

        let mut instructions = vec![];

        let (position, _bump) =
            derive_position_pda(lb_pair, position_base_kp.pubkey(), lower_bin_id, width);

        let bin_array_account_metas =
            BinArray::get_bin_array_account_metas_coverage(lower_bin_id, upper_bin_id, lb_pair)?;

        let bin_array_indexes =
            BinArray::get_bin_array_indexes_coverage(lower_bin_id, upper_bin_id)?;

        let keys: Vec<_> = [position]
            .into_iter()
            .chain(
                bin_array_indexes
                    .iter()
                    .map(|&index| derive_bin_array_pda(lb_pair, index.into()).0),
            )
            .collect();

        let accounts = rpc_client.get_multiple_accounts(&keys).await?;

        let position_account = accounts.index(0).to_owned();
        if position_account.is_none() {
            let account = dlmm::client::accounts::InitializePositionByOperator {
                position,
                payer: seeder,
                base: position_base_kp.pubkey(),
                lb_pair,
                owner: position_owner,
                operator: seeder,
                operator_token_x: seeder_token_x,
                owner_token_x,
                system_program: solana_sdk::system_program::ID,
                event_authority,
                program: dlmm::ID,
            }
            .to_account_metas(None);

            let ix_data = dlmm::client::args::InitializePositionByOperator {
                lower_bin_id,
                width,
                fee_owner,
                lock_release_point,
            }
            .data();

            let init_position_ix = Instruction {
                program_id: dlmm::ID,
                accounts: account.to_vec(),
                data: ix_data,
            };

            instructions.push(init_position_ix);
        }

        let bin_array_account = &accounts[1..];

        for (account, index) in bin_array_account.iter().zip(bin_array_indexes) {
            if account.is_none() {
                let bin_array = derive_bin_array_pda(lb_pair, index.into()).0;
                let accounts = dlmm::client::accounts::InitializeBinArray {
                    bin_array,
                    lb_pair,
                    funder: seeder,
                    system_program: solana_sdk::system_program::ID,
                }
                .to_account_metas(None);

                let ix_data = dlmm::client::args::InitializeBinArray {
                    index: index.into(),
                }
                .data();

                let init_bin_array_ix = Instruction {
                    program_id: dlmm::ID,
                    accounts,
                    data: ix_data,
                };

                instructions.push(init_bin_array_ix);
            }
        }

        if !instructions.is_empty() {
            if let Some(cu_price_ix) = compute_unit_price.clone() {
                instructions.push(cu_price_ix);
            }

            position_and_bin_array_setup_ixs.push(instructions.clone());
        }

        instructions.clear();

        let position_deposited = position_account
            .map(|account| {
                let state: PositionV2 = bytemuck::pod_read_unaligned(&account.data[8..]);
                state.liquidity_shares.iter().any(|share| *share > 0)
            })
            .unwrap_or(false);

        if !position_deposited {
            let mut bins = vec![];

            for bin_id in lower_bin_id..=upper_bin_id {
                bins.push(CompressedBinDepositAmount {
                    bin_id,
                    amount: *compressed_bin_amount
                        .get(&bin_id)
                        .context("Missing bin amount to deposit")?,
                });
            }

            let ix_data = dlmm::client::args::AddLiquidityOneSidePrecise2 {
                liquidity_parameter: AddLiquiditySingleSidePreciseParameter2 {
                    bins,
                    decompress_multiplier,
                    max_amount: u64::MAX,
                },
                remaining_accounts_info: RemainingAccountsInfo {
                    slices: vec![RemainingAccountsSlice {
                        accounts_type: AccountsType::TransferHookX,
                        length: transfer_hook_x_account.len() as u8,
                    }],
                },
            }
            .data();

            let accounts = dlmm::client::accounts::AddLiquidityOneSidePrecise2 {
                position,
                lb_pair,
                bin_array_bitmap_extension: Some(bitmap_extension),
                user_token: seeder_token_x,
                reserve: lb_pair_state.reserve_x,
                token_mint: lb_pair_state.token_x_mint,
                sender: program.payer(),
                token_program: token_mint_base_owner,
                event_authority,
                program: dlmm::ID,
            }
            .to_account_metas(None);

            let mut accounts = accounts.to_vec();
            accounts.extend_from_slice(&transfer_hook_x_account);
            accounts.extend_from_slice(&bin_array_account_metas);

            let add_liquidity_ix = Instruction {
                program_id: dlmm::ID,
                accounts,
                data: ix_data,
            };

            if instructions.is_empty() {
                if let Some(cu_price_ix) = compute_unit_price.clone() {
                    instructions.push(cu_price_ix);
                }
                instructions.push(ComputeBudgetInstruction::set_compute_unit_limit(800_000));
            }

            instructions.push(add_liquidity_ix);

            // Last position
            if i + 1 == position_number && compression_loss > 0 {
                let loss_includes_transfer_fee = calculate_transfer_fee_included_amount(
                    &token_mint_base_account,
                    compression_loss,
                    clock.epoch,
                )?
                .amount;

                let bin_array_account_metas = BinArray::get_bin_array_account_metas_coverage(
                    upper_bin_id,
                    upper_bin_id,
                    lb_pair,
                )?;

                let ix_data = dlmm::client::args::AddLiquidity2 {
                    liquidity_parameter: LiquidityParameter {
                        amount_x: loss_includes_transfer_fee,
                        amount_y: 0,
                        bin_liquidity_dist: vec![BinLiquidityDistribution {
                            bin_id: upper_bin_id,
                            distribution_x: BASIS_POINT_MAX as u16,
                            distribution_y: BASIS_POINT_MAX as u16,
                        }],
                    },
                    remaining_accounts_info: RemainingAccountsInfo {
                        slices: vec![
                            RemainingAccountsSlice {
                                accounts_type: AccountsType::TransferHookX,
                                length: transfer_hook_x_account.len() as u8,
                            },
                            RemainingAccountsSlice {
                                accounts_type: AccountsType::TransferHookY,
                                length: transfer_hook_y_account.len() as u8,
                            },
                        ],
                    },
                }
                .data();

                let accounts = dlmm::client::accounts::AddLiquidity2 {
                    position,
                    lb_pair,
                    bin_array_bitmap_extension: Some(bitmap_extension),
                    user_token_x: seeder_token_x,
                    user_token_y: seeder_token_y,
                    reserve_x: lb_pair_state.reserve_x,
                    reserve_y: lb_pair_state.reserve_y,
                    token_x_mint: lb_pair_state.token_x_mint,
                    token_y_mint: lb_pair_state.token_y_mint,
                    token_x_program: token_mint_base_owner,
                    token_y_program: token_mint_quote_owner,
                    sender: program.payer(),
                    event_authority,
                    program: dlmm::ID,
                }
                .to_account_metas(None);

                let mut accounts = accounts.to_vec();
                accounts.extend_from_slice(&transfer_hook_x_account);
                accounts.extend_from_slice(&transfer_hook_y_account);
                accounts.extend_from_slice(&bin_array_account_metas);

                let add_liquidity_ix = Instruction {
                    program_id: dlmm::ID,
                    accounts,
                    data: ix_data,
                };

                if instructions.is_empty() {
                    if let Some(cu_price_ix) = compute_unit_price.clone() {
                        instructions.push(cu_price_ix);
                    }

                    instructions.push(ComputeBudgetInstruction::set_compute_unit_limit(800_000));
                }

                instructions.push(add_liquidity_ix);
            }

            if !instructions.is_empty() {
                liquidity_setup_ixs.push(instructions);
            }
        }
    }

    println!("Init token account, bitmap extension and transfer token prove if necessary");
    if !token_account_and_bitmap_ext_and_token_prove_setup_ixs.is_empty() {
        let mut builder = program.request();

        for ix in token_account_and_bitmap_ext_and_token_prove_setup_ixs {
            builder = builder.instruction(ix);
        }

        let signature = builder
            .send_with_spinner_and_config(transaction_config)
            .await;

        println!("{:#?}", signature);
        signature?;
    }
    println!("Init token account, bitmap extension and transfer token prove if necessary - DONE");

    println!("Setup position and bin arrays if necessary");
    if !position_and_bin_array_setup_ixs.is_empty() {
        let mut futures = vec![];

        for ixs in position_and_bin_array_setup_ixs {
            let mut builder = program.request();

            for ix in ixs {
                builder = builder.instruction(ix);
            }

            futures.push(builder.send_with_spinner_and_config(transaction_config));
        }

        let result = try_join_all(futures).await;
        println!("{:#?}", result);
        result?;
    }
    println!("Setup position and bin arrays if necessary - DONE");

    println!("Seed liquidity");
    if !liquidity_setup_ixs.is_empty() {
        let mut futures = vec![];
        for ixs in liquidity_setup_ixs {
            let mut builder = program.request();

            for ix in ixs {
                builder = builder.instruction(ix);
            }

            futures.push(builder.send_with_spinner_and_config(transaction_config));
        }

        let result = try_join_all(futures).await;
        println!("{:#?}", result);
        result?;
    }
    println!("Seed liquidity - DONE");

    Ok(())
}

fn get_bin_deposit_amount(
    amount: u64,
    bin_step: u16,
    bin_id: i32,
    base_token_decimal: u8,
    quote_token_decimal: u8,
    min_price: f64,
    max_price: f64,
    k: f64,
) -> u64 {
    let c1 = get_c(
        amount,
        bin_step,
        bin_id + 1,
        base_token_decimal,
        quote_token_decimal,
        min_price,
        max_price,
        k,
    );

    let c0 = get_c(
        amount,
        bin_step,
        bin_id,
        base_token_decimal,
        quote_token_decimal,
        min_price,
        max_price,
        k,
    );

    assert!(c1 > c0);

    let amount_into_bin = c1 - c0;
    amount_into_bin
}

// c(p) = 5 * 10^8 ((p - 0.1)/0.7) ^ 1.25, where P = ui price
// c(p) = 5 * 10^8 ((p - min_price)/(max_price - min_price)) ^ 1.25
fn get_c(
    amount: u64,
    bin_step: u16,
    bin_id: i32,
    base_token_decimal: u8,
    quote_token_decimal: u8,
    min_price: f64,
    max_price: f64,
    k: f64,
) -> u64 {
    let price_per_lamport = (1.0 + bin_step as f64 / 10000.0).powi(bin_id);

    let current_price =
        price_per_lamport * 10.0f64.powi(base_token_decimal as i32 - quote_token_decimal as i32);

    let price_range = max_price - min_price;
    let current_price_delta_from_min = current_price - min_price;

    let c = amount as f64 * ((current_price_delta_from_min / price_range).powf(k));
    c as u64
}

pub fn generate_amount_for_bins(
    bin_step: u16,
    min_bin_id: i32,
    max_bin_id: i32,
    min_price: f64,
    max_price: f64,
    base_token_decimal: u8,
    quote_token_decimal: u8,
    amount: u64,
    k: f64,
) -> Vec<(i32, u64)> {
    let mut total_amount = 0;
    let mut bin_amounts = vec![];

    // Last bin is purposely no included because for the last bin, c(last_bin +1) - c(last_bin) will > fund amount
    for bin_id in min_bin_id..max_bin_id {
        let bin_amount = get_bin_deposit_amount(
            amount,
            bin_step,
            bin_id,
            base_token_decimal,
            quote_token_decimal,
            min_price,
            max_price,
            k,
        );

        bin_amounts.push((bin_id, bin_amount));

        total_amount += bin_amount;
    }

    assert_eq!(
        total_amount, amount,
        "Amount distributed to bins not equals to funding amount"
    );

    bin_amounts
}


================================================
FILE: cli/src/instructions/ilm/seed_liquidity_single_bin_by_operator.rs
================================================
use std::sync::Arc;

use anchor_lang::{prelude::Clock, AccountDeserialize};
use anchor_spl::{
    associated_token::get_associated_token_address_with_program_id,
    token::spl_token::instruction::transfer_checked,
    token_interface::{Mint, TokenAccount},
};
use spl_associated_token_account::instruction::create_associated_token_account_idempotent;

use crate::*;

#[derive(Debug, Parser)]
pub struct SeedLiquiditySingleBinByOperatorParameters {
    /// Address of the pair
    #[clap(long)]
    pub lb_pair: Pubkey,
    /// Base position path
    #[clap(long)]
    pub base_position_path: String,
    /// Base position pubkey
    #[clap(long)]
    pub base_pubkey: Pubkey,
    /// amount of x
    #[clap(long)]
    pub amount: u64,
    /// price
    #[clap(long)]
    pub price: f64,
    /// Position owner
    #[clap(long)]
    pub position_owner: Pubkey,
    /// lock release point
    #[clap(long)]
    pub lock_release_point: u64,
    /// fee owner
    #[clap(long)]
    pub fee_owner: Pubkey,
    /// Selective rounding
    #[clap(long)]
    pub selective_rounding: SelectiveRounding,
}

pub async fn execute_seed_liquidity_single_bin_by_operator<
    C: Deref<Target = impl Signer> + Clone,
>(
    params: SeedLiquiditySingleBinByOperatorParameters,
    program: &Program<C>,
    transaction_config: RpcSendTransactionConfig,
    compute_unit_price: Option<Instruction>,
) -> Result<()> {
    let SeedLiquiditySingleBinByOperatorParameters {
        lb_pair,
        base_position_path,
        base_pubkey,
        amount,
        price,
        position_owner,
        lock_release_point,
        fee_owner,
        selective_rounding,
    } = params;

    let position_base_kp = Arc::new(
        read_keypair_file(base_position_path).expect("position base keypair file not found"),
    );

    assert_eq!(
        position_base_kp.pubkey(),
        base_pubkey,
        "Invalid position base key"
    );

    let rpc_client = program.rpc();
    let operator = program.payer();

    let lb_pair_state: LbPair = rpc_client
        .get_account_and_deserialize(&lb_pair, |account| {
            Ok(bytemuck::pod_read_unaligned(&account.data[8..]))
        })
        .await?;

    let [token_x_owner, token_y_owner] = lb_pair_state.get_token_programs()?;

    let bin_step = lb_pair_state.bin_step;

    let operator_token_x = get_associated_token_address_with_program_id(
        &operator,
        &lb_pair_state.token_x_mint,
        &token_x_owner,
    );

    let operator_token_y = get_associated_token_address_with_program_id(
        &operator,
        &lb_pair_state.token_y_mint,
        &token_y_owner,
    );

    let owner_token_x = get_associated_token_address_with_program_id(
        &position_owner,
        &lb_pair_state.token_x_mint,
        &token_x_owner,
    );

    let (mut bin_array_bitmap_extension, _bump) = derive_bin_array_bitmap_extension(lb_pair);

    let mut accounts = rpc_client
        .get_multiple_accounts(&[
            lb_pair_state.token_x_mint,
            lb_pair_state.token_y_mint,
            owner_token_x,
            bin_array_bitmap_extension,
            solana_sdk::sysvar::clock::ID,
        ])
        .await?;

    let token_mint_base_account = accounts[0].take().context("token_mint_base not found")?;
    let token_mint_quote_account = accounts[1].take().context("token_mint_quote not found")?;
    let owner_token_x_account = accounts[2].take();
    let bin_array_bitmap_extension_account = accounts[3].take();
    let clock_account = accounts[4].take().context("clock not found")?;

    let clock = bincode::deserialize::<Clock>(&clock_account.data)?;

    let token_mint_base = Mint::try_deserialize(&mut token_mint_base_account.data.as_ref())?;
    let token_mint_quote = Mint::try_deserialize(&mut token_mint_quote_account.data.as_ref())?;

    let native_amount = to_wei_amount(amount, token_mint_base.decimals)?;
    let native_amount = calculate_transfer_fee_included_amount(
        &token_mint_base_account,
        native_amount,
        clock.epoch,
    )?
    .amount;

    let price =
        price_per_token_to_per_lamport(price, token_mint_base.decimals, token_mint_quote.decimals)
            .context("price_per_token_per_lamport overflow")?;

    let bin_id = match selective_rounding {
        SelectiveRounding::None => get_precise_id_from_price(bin_step, &price)
            .context("fail to get exact bin id for the price"),
        SelectiveRounding::Down => get_id_from_price(bin_step, &price, Rounding::Down)
            .context("get_id_from_price overflow"),
        SelectiveRounding::Up => {
            get_id_from_price(bin_step, &price, Rounding::Up).context("get_id_from_price overflow")
        }
    }?;

    assert_eq!(
        lb_pair_state.active_id, bin_id,
        "bin id doesn't match active bin id"
    );

    let (event_authority, _bump) = derive_event_authority_pda();
    let (position, _bump) = derive_position_pda(lb_pair, base_pubkey, bin_id, 1);

    let bin_array_accounts_meta =
        BinArray::get_bin_array_account_metas_coverage(bin_id, bin_id, lb_pair)?;

    let bin_array_index = BinArray::bin_id_to_bin_array_index(bin_id)?;

    let mut instructions = vec![ComputeBudgetInstruction::set_compute_unit_limit(1_400_000)];

    if let Some(priority_fee_ix) = compute_unit_price {
        instructions.push(priority_fee_ix);
    }

    let (min_bitmap_id, max_bitmap_id) = LbPair::bitmap_range();
    // We only deposit to lower bin array
    let overflow_internal_bitmap_range =
        bin_array_index > max_bitmap_id || bin_array_index < min_bitmap_id;

    if overflow_internal_bitmap_range && bin_array_bitmap_extension_account.is_none() {
        let accounts = dlmm::client::accounts::InitializeBinArrayBitmapExtension {
            lb_pair,
            bin_array_bitmap_extension,
            funder: program.payer(),
            system_program: solana_sdk::system_program::ID,
            rent: solana_sdk::sysvar::rent::ID,
        }
        .to_account_metas(None);

        let data = dlmm::client::args::InitializeBinArrayBitmapExtension {}.data();

        let initialize_bitmap_extension_ix = Instruction {
            accounts,
            program_id: dlmm::ID,
            data,
        };

        instructions.push(initialize_bitmap_extension_ix);
    } else {
        bin_array_bitmap_extension = dlmm::ID;
    }

    let account = dlmm::client::accounts::InitializeBinArray {
        lb_pair,
        bin_array: bin_array_accounts_meta[0].pubkey,
        funder: program.payer(),
        system_program: solana_sdk::system_program::ID,
    }
    .to_account_metas(None);

    let data = dlmm::client::args::InitializeBinArray {
        index: bin_array_index.into(),
    }
    .data();

    let initialize_bin_array_ix = Instruction {
        accounts: account.to_vec(),
        program_id: dlmm::ID,
        data,
    };

    instructions.push(initialize_bin_array_ix);

    let require_token_prove = if let Some(account) = owner_token_x_account {
        let token_account = TokenAccount::try_deserialize(&mut account.data.as_ref())?;
        token_account.amount == 0
    } else {
        true
    };

    if require_token_prove {
        instructions.push(create_associated_token_account_idempotent(
            &operator,
            &position_owner,
            &lb_pair_state.token_x_mint,
            &token_x_owner,
        ));

        let prove_amount =
            calculate_transfer_fee_included_amount(&token_mint_base_account, 1, clock.epoch)?
                .amount;

        instructions.push(transfer_checked(
            &token_x_owner,
            &operator_token_x,
            &lb_pair_state.token_x
Download .txt
gitextract_8odblry4/

├── .github/
│   ├── actions/
│   │   ├── setup-anchor/
│   │   │   └── action.yml
│   │   ├── setup-dep/
│   │   │   └── action.yml
│   │   └── setup-solana/
│   │       └── action.yml
│   └── workflows/
│       ├── ci-pr-main-cli.yml
│       ├── ci-pr-main-market-making.yml
│       ├── ci-pr-main-program.yml
│       └── ci-pr-main-sdk.yml
├── .gitignore
├── .prettierignore
├── Anchor.toml
├── CHANGELOG.md
├── Cargo.toml
├── Dockerfile
├── README.md
├── artifacts/
│   └── FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/
│       ├── 6ipV2Sn7GCVgKG3Doqz1MpM33hranTMqxDmShj8Ro8cx.json
│       ├── ERuqwiEFbQwNM8NhUMxUsvgGWbQpEyjbzhQLbBftCMPd.json
│       ├── FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB.json
│       ├── FQuMNJ6UcrkA3xMLsmmLL8sk47RkZYod57mX3a8w1brg.json
│       ├── FR8HAZwQkmbmJXSqSp4CM3424emaMmJf7vz3u3RrYgRL.json
│       ├── Gai2jqUAaJv8S68ibe69beV5DkhdBxAc6zoV3YQpuSNX.json
│       └── So11111111111111111111111111111111111111112.json
├── cli/
│   ├── Cargo.toml
│   ├── README.md
│   └── src/
│       ├── args.rs
│       ├── instructions/
│       │   ├── add_liquidity.rs
│       │   ├── admin/
│       │   │   ├── close_claim_protocol_fee_operator.rs
│       │   │   ├── close_preset_parameter.rs
│       │   │   ├── create_claim_protocol_fee_operator.rs
│       │   │   ├── initialize_permission_lb_pair.rs
│       │   │   ├── initialize_preset_parameter.rs
│       │   │   ├── initialize_reward.rs
│       │   │   ├── initialize_token_badge.rs
│       │   │   ├── mod.rs
│       │   │   ├── set_activation_point.rs
│       │   │   ├── set_pre_activation_duration.rs
│       │   │   ├── set_pre_activation_swap_address.rs
│       │   │   ├── toggle_pair_status.rs
│       │   │   ├── update_base_fee.rs
│       │   │   ├── update_reward_duration.rs
│       │   │   ├── update_reward_funder.rs
│       │   │   └── withdraw_protocol_fee.rs
│       │   ├── claim_fee.rs
│       │   ├── claim_reward.rs
│       │   ├── close_position.rs
│       │   ├── fund_reward.rs
│       │   ├── get_all_positions.rs
│       │   ├── ilm/
│       │   │   ├── mod.rs
│       │   │   ├── remove_liquidity_by_price_range.rs
│       │   │   ├── seed_liquidity_from_operator.rs
│       │   │   └── seed_liquidity_single_bin_by_operator.rs
│       │   ├── increase_oracle_length.rs
│       │   ├── initialize_bin_array.rs
│       │   ├── initialize_bin_array_with_bin_range.rs
│       │   ├── initialize_bin_array_with_price_range.rs
│       │   ├── initialize_customizable_permissionless_lb_pair.rs
│       │   ├── initialize_customizable_permissionless_lb_pair2.rs
│       │   ├── initialize_lb_pair.rs
│       │   ├── initialize_lb_pair2.rs
│       │   ├── initialize_position.rs
│       │   ├── initialize_position_with_price_range.rs
│       │   ├── list_all_binstep.rs
│       │   ├── mod.rs
│       │   ├── remove_liquidity.rs
│       │   ├── set_pair_status.rs
│       │   ├── set_pair_status_permissionless.rs
│       │   ├── show_pair.rs
│       │   ├── show_position.rs
│       │   ├── show_preset_parameters.rs
│       │   ├── simulate_swap_demand.rs
│       │   ├── swap_exact_in.rs
│       │   ├── swap_exact_out.rs
│       │   ├── swap_with_price_impact.rs
│       │   ├── sync_price.rs
│       │   └── utils.rs
│       ├── main.rs
│       └── math.rs
├── command_list/
│   ├── claim_fee_from_operator.sh
│   ├── ilm_curve_by_operator.sh
│   ├── ilm_single_bin_by_operator.sh
│   └── set_bootstrapping_pair_status.sh
├── commons/
│   ├── Cargo.toml
│   ├── src/
│   │   ├── account_filters.rs
│   │   ├── constants.rs
│   │   ├── conversions/
│   │   │   ├── activation_type.rs
│   │   │   ├── mod.rs
│   │   │   ├── pair_type.rs
│   │   │   ├── status.rs
│   │   │   └── token_program_flag.rs
│   │   ├── extensions/
│   │   │   ├── bin.rs
│   │   │   ├── bin_array.rs
│   │   │   ├── bin_array_bitmap.rs
│   │   │   ├── lb_pair.rs
│   │   │   ├── mod.rs
│   │   │   └── position.rs
│   │   ├── lib.rs
│   │   ├── math/
│   │   │   ├── mod.rs
│   │   │   ├── price_math.rs
│   │   │   ├── u128x128_math.rs
│   │   │   ├── u64x64_math.rs
│   │   │   └── utils.rs
│   │   ├── pda.rs
│   │   ├── quote.rs
│   │   ├── rpc_client_extension.rs
│   │   ├── seeds.rs
│   │   ├── token_2022.rs
│   │   └── typedefs.rs
│   └── tests/
│       └── integration/
│           ├── helpers/
│           │   ├── mod.rs
│           │   └── utils.rs
│           ├── main.rs
│           ├── test_swap.rs
│           └── test_swap_token2022.rs
├── idls/
│   └── dlmm.json
├── keys/
│   └── localnet/
│       ├── admin-bossj3JvwiNK7pvjr149DqdtJxf2gdygbcmEPTkb2F1.json
│       └── program-LbVRzDTvBDEcrthxfZ4RL6yiq3uZw8bS6MwtdY6UhFQ.json
├── market_making/
│   ├── Cargo.toml
│   ├── README.MD
│   └── src/
│       ├── bin_array_manager.rs
│       ├── config.json
│       ├── core.rs
│       ├── main.rs
│       ├── pair_config.rs
│       ├── router.rs
│       ├── state.rs
│       └── utils.rs
├── package.json
├── python-client/
│   └── dlmm/
│       ├── .gitignore
│       ├── README.md
│       ├── dist/
│       │   └── dlmm-0.1.0-py3-none-any.whl
│       ├── dlmm/
│       │   ├── __init__.py
│       │   ├── dlmm.py
│       │   ├── types.py
│       │   └── utils.py
│       ├── pyproject.toml
│       └── tests/
│           ├── __init__.py
│           ├── test_lp_flow.py
│           └── test_util_methods.py
├── rust-toolchain.toml
└── ts-client/
    ├── README.md
    ├── jest.config.js
    ├── package.json
    ├── src/
    │   ├── dlmm/
    │   │   ├── constants/
    │   │   │   └── index.ts
    │   │   ├── error.ts
    │   │   ├── helpers/
    │   │   │   ├── accountFilters.ts
    │   │   │   ├── binArray.ts
    │   │   │   ├── computeUnit.ts
    │   │   │   ├── derive.ts
    │   │   │   ├── fee.ts
    │   │   │   ├── index.ts
    │   │   │   ├── lbPair.ts
    │   │   │   ├── math.ts
    │   │   │   ├── oracle/
    │   │   │   │   ├── index.ts
    │   │   │   │   └── wrapper.ts
    │   │   │   ├── positions/
    │   │   │   │   ├── index.ts
    │   │   │   │   └── wrapper.ts
    │   │   │   ├── rebalance/
    │   │   │   │   ├── index.ts
    │   │   │   │   ├── liquidity_strategy/
    │   │   │   │   │   ├── bidAsk.ts
    │   │   │   │   │   ├── curve.ts
    │   │   │   │   │   ├── index.ts
    │   │   │   │   │   └── spot.ts
    │   │   │   │   ├── rebalancePosition.ts
    │   │   │   │   └── strategy/
    │   │   │   │       ├── balanced.ts
    │   │   │   │       └── index.ts
    │   │   │   ├── strategy.ts
    │   │   │   ├── token_2022.ts
    │   │   │   ├── u64xu64_math.ts
    │   │   │   ├── weight.ts
    │   │   │   └── weightToAmounts.ts
    │   │   ├── idl/
    │   │   │   ├── idl.json
    │   │   │   └── idl.ts
    │   │   ├── index.ts
    │   │   └── types/
    │   │       └── index.ts
    │   ├── examples/
    │   │   ├── example.ts
    │   │   ├── fetch_lb_pair_lock_info.ts
    │   │   ├── get_oracle.ts
    │   │   ├── initialize_bin_arrays.ts
    │   │   └── swap_quote.ts
    │   ├── index.ts
    │   ├── server/
    │   │   ├── index.ts
    │   │   └── utils.ts
    │   └── test/
    │       ├── bug_fix.test.ts
    │       ├── calculate_distribution.test.ts
    │       ├── cjs.test.js
    │       ├── decode.test.ts
    │       ├── esm_import.test.ts
    │       ├── esm_module.test.ts
    │       ├── external/
    │       │   ├── helper.ts
    │       │   ├── program.ts
    │       │   ├── transfer_hook_counter.json
    │       │   └── transfer_hook_counter.ts
    │       ├── helper.ts
    │       ├── ilm.test.ts
    │       ├── oracle.test.ts
    │       ├── rebalance.test.ts
    │       ├── rebalance_parameter_builder.test.ts
    │       ├── rebalance_with_strategy.test.ts
    │       ├── sdk.test.ts
    │       ├── sdk_token2022.test.ts
    │       ├── single_bin.test.ts
    │       └── token_2022.test.ts
    ├── tsconfig.json
    └── tsup.config.ts
Download .txt
SYMBOL INDEX (1063 symbols across 133 files)

FILE: cli/src/args.rs
  type ConfigOverride (line 6) | pub struct ConfigOverride {
  function parse_bin_liquidity_removal (line 28) | pub fn parse_bin_liquidity_removal(src: &str) -> Result<(i32, f64), Erro...
  function parse_bin_liquidity_distribution (line 44) | pub fn parse_bin_liquidity_distribution(src: &str) -> Result<(i32, f64, ...
  type SelectiveRounding (line 66) | pub enum SelectiveRounding {
  type DLMMCommand (line 73) | pub enum DLMMCommand {
  type Cli (line 125) | pub struct Cli {
  type AdminCommand (line 133) | pub enum AdminCommand {

FILE: cli/src/instructions/add_liquidity.rs
  type AddLiquidityParams (line 6) | pub struct AddLiquidityParams {
  function execute_add_liquidity (line 24) | pub async fn execute_add_liquidity<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/admin/close_claim_protocol_fee_operator.rs
  type CloseClaimFeeOperatorParams (line 4) | pub struct CloseClaimFeeOperatorParams {
  function execute_close_claim_protocol_fee_operator (line 9) | pub async fn execute_close_claim_protocol_fee_operator<C: Deref<Target =...

FILE: cli/src/instructions/admin/close_preset_parameter.rs
  type ClosePresetAccountParams (line 5) | pub struct ClosePresetAccountParams {
  function execute_close_preset_parameter (line 10) | pub async fn execute_close_preset_parameter<C: Deref<Target = impl Signe...

FILE: cli/src/instructions/admin/create_claim_protocol_fee_operator.rs
  type CreateClaimFeeOperatorParams (line 4) | pub struct CreateClaimFeeOperatorParams {
  function execute_create_claim_protocol_fee_operator (line 9) | pub async fn execute_create_claim_protocol_fee_operator<C: Deref<Target ...

FILE: cli/src/instructions/admin/initialize_permission_lb_pair.rs
  type InitPermissionLbPairParameters (line 9) | pub struct InitPermissionLbPairParameters {
  function execute_initialize_permission_lb_pair (line 26) | pub async fn execute_initialize_permission_lb_pair<C: Deref<Target = imp...

FILE: cli/src/instructions/admin/initialize_preset_parameter.rs
  type InitPresetParameters (line 11) | pub struct InitPresetParameters {
  function execute_initialize_preset_parameter (line 32) | pub async fn execute_initialize_preset_parameter<C: Deref<Target = impl ...

FILE: cli/src/instructions/admin/initialize_reward.rs
  type InitializeRewardParams (line 4) | pub struct InitializeRewardParams {
  function execute_initialize_reward (line 12) | pub async fn execute_initialize_reward<C: Deref<Target = impl Signer> + ...

FILE: cli/src/instructions/admin/initialize_token_badge.rs
  type InitializeTokenBadgeParams (line 5) | pub struct InitializeTokenBadgeParams {
  function execute_initialize_token_badge (line 10) | pub async fn execute_initialize_token_badge<C: Deref<Target = impl Signe...

FILE: cli/src/instructions/admin/set_activation_point.rs
  type SetActivationPointParam (line 4) | pub struct SetActivationPointParam {
  function execute_set_activation_point (line 11) | pub async fn execute_set_activation_point<C: Deref<Target = impl Signer>...

FILE: cli/src/instructions/admin/set_pre_activation_duration.rs
  type SetPreactivationDurationParam (line 4) | pub struct SetPreactivationDurationParam {
  function execute_set_pre_activation_duration (line 9) | pub async fn execute_set_pre_activation_duration<C: Deref<Target = impl ...

FILE: cli/src/instructions/admin/set_pre_activation_swap_address.rs
  type SetPreactivationSwapAddressParam (line 4) | pub struct SetPreactivationSwapAddressParam {
  function execute_set_pre_activation_swap_address (line 9) | pub async fn execute_set_pre_activation_swap_address<C: Deref<Target = i...

FILE: cli/src/instructions/admin/toggle_pair_status.rs
  type SetPairStatusParams (line 4) | pub struct SetPairStatusParams {
  function execute_set_pair_status (line 11) | pub async fn execute_set_pair_status<C: Deref<Target = impl Signer> + Cl...

FILE: cli/src/instructions/admin/update_base_fee.rs
  type UpdateBaseFeeParams (line 4) | pub struct UpdateBaseFeeParams {
  function execute_update_base_fee (line 9) | pub async fn execute_update_base_fee<C: Deref<Target = impl Signer> + Cl...

FILE: cli/src/instructions/admin/update_reward_duration.rs
  type UpdateRewardDurationParams (line 5) | pub struct UpdateRewardDurationParams {
  function execute_update_reward_duration (line 11) | pub async fn execute_update_reward_duration<C: Deref<Target = impl Signe...

FILE: cli/src/instructions/admin/update_reward_funder.rs
  type UpdateRewardFunderParams (line 4) | pub struct UpdateRewardFunderParams {
  function execute_update_reward_funder (line 10) | pub async fn execute_update_reward_funder<C: Deref<Target = impl Signer>...

FILE: cli/src/instructions/admin/withdraw_protocol_fee.rs
  type WithdrawProtocolFeeParams (line 6) | pub struct WithdrawProtocolFeeParams {
  function execute_withdraw_protocol_fee (line 10) | pub async fn execute_withdraw_protocol_fee<C: Deref<Target = impl Signer...

FILE: cli/src/instructions/claim_fee.rs
  type ClaimFeeParams (line 5) | pub struct ClaimFeeParams {
  function execute_claim_fee (line 10) | pub async fn execute_claim_fee<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/claim_reward.rs
  type ClaimRewardParams (line 5) | pub struct ClaimRewardParams {
  function execute_claim_reward (line 11) | pub async fn execute_claim_reward<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/close_position.rs
  type ClosePositionParams (line 4) | pub struct ClosePositionParams {
  function execute_close_position (line 8) | pub async fn execute_close_position<C: Deref<Target = impl Signer> + Clo...

FILE: cli/src/instructions/fund_reward.rs
  type FundRewardParams (line 5) | pub struct FundRewardParams {
  function execute_fund_reward (line 11) | pub async fn execute_fund_reward<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/get_all_positions.rs
  type GetAllPositionsParams (line 5) | pub struct GetAllPositionsParams {
  function execute_get_all_positions (line 14) | pub async fn execute_get_all_positions<C: Deref<Target = impl Signer> + ...

FILE: cli/src/instructions/ilm/remove_liquidity_by_price_range.rs
  type RemoveLiquidityByPriceRangeParameters (line 7) | pub struct RemoveLiquidityByPriceRangeParameters {
  function execute_remove_liquidity_by_price_range (line 18) | pub async fn execute_remove_liquidity_by_price_range<C: Deref<Target = i...

FILE: cli/src/instructions/ilm/seed_liquidity_from_operator.rs
  function to_wei_amount (line 13) | pub fn to_wei_amount(amount: u64, decimal: u8) -> Result<u64> {
  function convert_min_max_ui_price_to_min_max_bin_id (line 21) | pub fn convert_min_max_ui_price_to_min_max_bin_id(
  function get_base (line 45) | fn get_base(bin_step: u16) -> f64 {
  function get_ui_price_from_id (line 49) | pub fn get_ui_price_from_id(
  function get_number_of_position_required_to_cover_range (line 59) | pub fn get_number_of_position_required_to_cover_range(
  type CompressionResult (line 78) | struct CompressionResult {
  function compress_bin_amount (line 83) | fn compress_bin_amount(
  type SeedLiquidityByOperatorParameters (line 117) | pub struct SeedLiquidityByOperatorParameters {
  function execute_seed_liquidity_by_operator (line 153) | pub async fn execute_seed_liquidity_by_operator<C: Deref<Target = impl S...
  function get_bin_deposit_amount (line 715) | fn get_bin_deposit_amount(
  function get_c (line 755) | fn get_c(
  function generate_amount_for_bins (line 777) | pub fn generate_amount_for_bins(

FILE: cli/src/instructions/ilm/seed_liquidity_single_bin_by_operator.rs
  type SeedLiquiditySingleBinByOperatorParameters (line 14) | pub struct SeedLiquiditySingleBinByOperatorParameters {
  function execute_seed_liquidity_single_bin_by_operator (line 44) | pub async fn execute_seed_liquidity_single_bin_by_operator<

FILE: cli/src/instructions/increase_oracle_length.rs
  type IncreaseOracleLengthParams (line 5) | pub struct IncreaseOracleLengthParams {
  function execute_increase_oracle_length (line 10) | pub async fn execute_increase_oracle_length<C: Deref<Target = impl Signe...

FILE: cli/src/instructions/initialize_bin_array.rs
  type InitBinArrayParams (line 4) | pub struct InitBinArrayParams {
  function execute_initialize_bin_array (line 12) | pub async fn execute_initialize_bin_array<C: Deref<Target = impl Signer>...

FILE: cli/src/instructions/initialize_bin_array_with_bin_range.rs
  type InitBinArrayWithBinRangeParams (line 5) | pub struct InitBinArrayWithBinRangeParams {
  function execute_initialize_bin_array_with_bin_range (line 16) | pub async fn execute_initialize_bin_array_with_bin_range<C: Deref<Target...

FILE: cli/src/instructions/initialize_bin_array_with_price_range.rs
  type InitBinArrayWithPriceRangeParams (line 6) | pub struct InitBinArrayWithPriceRangeParams {
  function execute_initialize_bin_array_with_price_range (line 15) | pub async fn execute_initialize_bin_array_with_price_range<

FILE: cli/src/instructions/initialize_customizable_permissionless_lb_pair.rs
  type InitCustomizablePermissionlessLbPairParam (line 7) | pub struct InitCustomizablePermissionlessLbPairParam {
  function execute_initialize_customizable_permissionless_lb_pair (line 40) | pub async fn execute_initialize_customizable_permissionless_lb_pair<

FILE: cli/src/instructions/initialize_customizable_permissionless_lb_pair2.rs
  type InitCustomizablePermissionlessLbPair2Param (line 7) | pub struct InitCustomizablePermissionlessLbPair2Param {
  function execute_initialize_customizable_permissionless_lb_pair2 (line 40) | pub async fn execute_initialize_customizable_permissionless_lb_pair2<

FILE: cli/src/instructions/initialize_lb_pair.rs
  type InitLbPairParams (line 6) | pub struct InitLbPairParams {
  function execute_initialize_lb_pair (line 17) | pub async fn execute_initialize_lb_pair<C: Deref<Target = impl Signer> +...

FILE: cli/src/instructions/initialize_lb_pair2.rs
  type InitLbPair2Params (line 6) | pub struct InitLbPair2Params {
  function execute_initialize_lb_pair2 (line 17) | pub async fn execute_initialize_lb_pair2<C: Deref<Target = impl Signer> ...

FILE: cli/src/instructions/initialize_position.rs
  type InitPositionParams (line 6) | pub struct InitPositionParams {
  function execute_initialize_position (line 16) | pub async fn execute_initialize_position<C: Deref<Target = impl Signer> ...

FILE: cli/src/instructions/initialize_position_with_price_range.rs
  type InitPositionWithPriceRangeParams (line 6) | pub struct InitPositionWithPriceRangeParams {
  function execute_initialize_position_with_price_range (line 15) | pub async fn execute_initialize_position_with_price_range<

FILE: cli/src/instructions/list_all_binstep.rs
  function execute_list_all_bin_step (line 9) | pub async fn execute_list_all_bin_step<C: Deref<Target = impl Signer> + ...

FILE: cli/src/instructions/remove_liquidity.rs
  type RemoveLiquidityParams (line 5) | pub struct RemoveLiquidityParams {
  function execute_remove_liquidity (line 17) | pub async fn execute_remove_liquidity<C: Deref<Target = impl Signer> + C...

FILE: cli/src/instructions/set_pair_status.rs
  type SetPairStatusParam (line 11) | pub struct SetPairStatusParam {
  function set_pair_status (line 16) | pub async fn set_pair_status<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/set_pair_status_permissionless.rs
  type SetPairStatusPermissionlessParams (line 4) | pub struct SetPairStatusPermissionlessParams {
  function execute_set_pair_status_permissionless (line 11) | pub async fn execute_set_pair_status_permissionless<C: Deref<Target = im...

FILE: cli/src/instructions/show_pair.rs
  function fee_rate_to_fee_pct (line 11) | fn fee_rate_to_fee_pct(fee_rate: u128) -> Option<Decimal> {
  type ShowPairParams (line 17) | pub struct ShowPairParams {
  function execute_show_pair (line 21) | pub async fn execute_show_pair<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/show_position.rs
  type ShowPositionParams (line 6) | pub struct ShowPositionParams {
  function execute_show_position (line 10) | pub async fn execute_show_position<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/show_preset_parameters.rs
  type ShowPresetAccountParams (line 6) | pub struct ShowPresetAccountParams {
  function execute_show_preset_parameters (line 10) | pub async fn execute_show_preset_parameters<C: Deref<Target = impl Signe...

FILE: cli/src/instructions/simulate_swap_demand.rs
  type SimulateSwapDemandParameters (line 14) | pub struct SimulateSwapDemandParameters {
  function simulate_swap_demand (line 21) | pub async fn simulate_swap_demand<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/swap_exact_in.rs
  type SwapExactInParams (line 5) | pub struct SwapExactInParams {
  function execute_swap (line 15) | pub async fn execute_swap<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/swap_exact_out.rs
  type SwapExactOutParams (line 5) | pub struct SwapExactOutParams {
  function execute_swap_exact_out (line 15) | pub async fn execute_swap_exact_out<C: Deref<Target = impl Signer> + Clo...

FILE: cli/src/instructions/swap_with_price_impact.rs
  type SwapWithPriceImpactParams (line 5) | pub struct SwapWithPriceImpactParams {
  function execute_swap_with_price_impact (line 17) | pub async fn execute_swap_with_price_impact<C: Deref<Target = impl Signe...

FILE: cli/src/instructions/sync_price.rs
  type SyncPriceParams (line 5) | pub struct SyncPriceParams {
  function execute_sync_price (line 10) | pub async fn execute_sync_price<C: Deref<Target = impl Signer> + Clone>(

FILE: cli/src/instructions/utils.rs
  function position_bin_range_chunks (line 19) | pub fn position_bin_range_chunks(lower_bin_id: i32, upper_bin_id: i32) -...
  function get_transfer_instruction (line 40) | pub async fn get_transfer_instruction(
  function get_or_create_ata (line 113) | pub async fn get_or_create_ata<C: Deref<Target = impl Signer> + Clone>(
  type SwapQuoteAccounts (line 152) | pub struct SwapQuoteAccounts {
  function fetch_quote_required_accounts (line 161) | pub async fn fetch_quote_required_accounts(

FILE: cli/src/main.rs
  function get_set_compute_unit_price_ix (line 36) | fn get_set_compute_unit_price_ix(micro_lamports: u64) -> Option<Instruct...
  function main (line 47) | async fn main() -> Result<()> {

FILE: cli/src/math.rs
  function compute_base_factor_from_fee_bps (line 10) | pub fn compute_base_factor_from_fee_bps(bin_step: u16, fee_bps: u16) -> ...
  function get_precise_id_from_price (line 54) | pub fn get_precise_id_from_price(bin_step: u16, price: &Decimal) -> Opti...
  function get_id_from_price (line 70) | pub fn get_id_from_price(bin_step: u16, price: &Decimal, rounding: Round...
  function q64x64_price_to_decimal (line 83) | pub fn q64x64_price_to_decimal(q64x64_price: u128) -> Option<Decimal> {
  function price_per_token_to_per_lamport (line 90) | pub fn price_per_token_to_per_lamport(
  function price_per_lamport_to_price_per_token (line 102) | pub fn price_per_lamport_to_price_per_token(

FILE: commons/src/account_filters.rs
  function position_filter_by_wallet_and_pair (line 4) | pub fn position_filter_by_wallet_and_pair(wallet: Pubkey, pair: Pubkey) ...

FILE: commons/src/constants.rs
  constant BASIS_POINT_MAX (line 1) | pub const BASIS_POINT_MAX: i32 = 10000;
  constant MAX_BIN_PER_ARRAY (line 4) | pub const MAX_BIN_PER_ARRAY: usize = 70;
  constant DEFAULT_BIN_PER_POSITION (line 7) | pub const DEFAULT_BIN_PER_POSITION: usize = 70;
  constant MAX_RESIZE_LENGTH (line 10) | pub const MAX_RESIZE_LENGTH: usize = 70;
  constant POSITION_MAX_LENGTH (line 13) | pub const POSITION_MAX_LENGTH: usize = 1400;
  constant MIN_BIN_ID (line 16) | pub const MIN_BIN_ID: i32 = -443636;
  constant MAX_BIN_ID (line 19) | pub const MAX_BIN_ID: i32 = 443636;
  constant MAX_FEE_RATE (line 22) | pub const MAX_FEE_RATE: u64 = 100_000_000;
  constant FEE_PRECISION (line 24) | pub const FEE_PRECISION: u64 = 1_000_000_000;
  constant MAX_PROTOCOL_SHARE (line 27) | pub const MAX_PROTOCOL_SHARE: u16 = 2_500;
  constant HOST_FEE_BPS (line 30) | pub const HOST_FEE_BPS: u16 = 2_000;
  constant NUM_REWARDS (line 33) | pub const NUM_REWARDS: usize = 2;
  constant MIN_REWARD_DURATION (line 36) | pub const MIN_REWARD_DURATION: u64 = 1;
  constant MAX_REWARD_DURATION (line 38) | pub const MAX_REWARD_DURATION: u64 = 31536000;
  constant DEFAULT_OBSERVATION_LENGTH (line 40) | pub const DEFAULT_OBSERVATION_LENGTH: u64 = 100;
  constant SAMPLE_LIFETIME (line 42) | pub const SAMPLE_LIFETIME: u64 = 120;
  constant EXTENSION_BINARRAY_BITMAP_SIZE (line 44) | pub const EXTENSION_BINARRAY_BITMAP_SIZE: usize = 12;
  constant BIN_ARRAY_BITMAP_SIZE (line 46) | pub const BIN_ARRAY_BITMAP_SIZE: i32 = 512;
  constant MAX_BASE_FACTOR_STEP (line 48) | pub const MAX_BASE_FACTOR_STEP: u16 = 100;
  constant MAX_FEE_UPDATE_WINDOW (line 50) | pub const MAX_FEE_UPDATE_WINDOW: i64 = 0;
  constant MAX_REWARD_BIN_SPLIT (line 52) | pub const MAX_REWARD_BIN_SPLIT: usize = 15;
  constant SLOT_BUFFER (line 54) | pub const SLOT_BUFFER: u64 = 9000;
  constant TIME_BUFFER (line 56) | pub const TIME_BUFFER: u64 = 3600;
  constant MAX_ACTIVATION_SLOT_DURATION (line 58) | pub const MAX_ACTIVATION_SLOT_DURATION: u64 = SLOT_BUFFER * 24 * 31;
  constant MAX_ACTIVATION_TIME_DURATION (line 60) | pub const MAX_ACTIVATION_TIME_DURATION: u64 = TIME_BUFFER * 24 * 31;
  constant FIVE_MINUTES_SLOT_BUFFER (line 62) | pub const FIVE_MINUTES_SLOT_BUFFER: u64 = SLOT_BUFFER / 12;
  constant FIVE_MINUTES_TIME_BUFFER (line 64) | pub const FIVE_MINUTES_TIME_BUFFER: u64 = TIME_BUFFER / 12;
  constant ILM_PROTOCOL_SHARE (line 67) | pub const ILM_PROTOCOL_SHARE: u16 = 2000;
  constant MAX_BIN_STEP (line 70) | pub const MAX_BIN_STEP: u16 = 400;
  constant MAX_BASE_FEE (line 73) | pub const MAX_BASE_FEE: u128 = 100_000_000;
  constant MIN_BASE_FEE (line 76) | pub const MIN_BASE_FEE: u128 = 100_000;

FILE: commons/src/conversions/activation_type.rs
  type Error (line 4) | type Error = anyhow::Error;
  method try_from (line 6) | fn try_from(value: u8) -> Result<Self, Self::Error> {

FILE: commons/src/conversions/pair_type.rs
  type Error (line 4) | type Error = anyhow::Error;
  method try_from (line 6) | fn try_from(value: u8) -> Result<Self, Self::Error> {
  method eq (line 18) | fn eq(&self, other: &Self) -> bool {

FILE: commons/src/conversions/status.rs
  type Error (line 4) | type Error = anyhow::Error;
  method try_from (line 6) | fn try_from(value: u8) -> Result<Self, Self::Error> {
  method eq (line 16) | fn eq(&self, other: &Self) -> bool {

FILE: commons/src/conversions/token_program_flag.rs
  type TokenProgramFlagWrapper (line 4) | pub struct TokenProgramFlagWrapper(TokenProgramFlags);
    type Error (line 15) | type Error = anyhow::Error;
    method try_from (line 17) | fn try_from(value: u8) -> Result<Self, Self::Error> {
  type Target (line 7) | type Target = TokenProgramFlags;
  method deref (line 9) | fn deref(&self) -> &Self::Target {

FILE: commons/src/extensions/bin.rs
  type BinExtension (line 3) | pub trait BinExtension {
    method get_or_store_bin_price (line 4) | fn get_or_store_bin_price(&mut self, id: i32, bin_step: u16) -> Result...
    method is_empty (line 5) | fn is_empty(&self, is_x: bool) -> bool;
    method get_max_amount_out (line 6) | fn get_max_amount_out(&self, swap_for_y: bool) -> u64;
    method get_max_amount_in (line 7) | fn get_max_amount_in(&self, price: u128, swap_for_y: bool) -> Result<u...
    method calculate_out_amount (line 8) | fn calculate_out_amount(&self, liquidity_share: u128) -> Result<(u64, ...
    method swap (line 10) | fn swap(
    method get_amount_out (line 19) | fn get_amount_out(amount_in: u64, price: u128, swap_for_y: bool) -> Re...
    method get_amount_in (line 20) | fn get_amount_in(amount_out: u64, price: u128, swap_for_y: bool) -> Re...
    method get_or_store_bin_price (line 24) | fn get_or_store_bin_price(&mut self, id: i32, bin_step: u16) -> Result...
    method is_empty (line 32) | fn is_empty(&self, is_x: bool) -> bool {
    method get_max_amount_out (line 40) | fn get_max_amount_out(&self, swap_for_y: bool) -> u64 {
    method get_max_amount_in (line 48) | fn get_max_amount_in(&self, price: u128, swap_for_y: bool) -> Result<u...
    method get_amount_in (line 56) | fn get_amount_in(amount_out: u64, price: u128, swap_for_y: bool) -> Re...
    method get_amount_out (line 64) | fn get_amount_out(amount_in: u64, price: u128, swap_for_y: bool) -> Re...
    method calculate_out_amount (line 72) | fn calculate_out_amount(&self, liquidity_share: u128) -> Result<(u64, ...
    method swap (line 89) | fn swap(

FILE: commons/src/extensions/bin_array.rs
  type BinArrayExtension (line 5) | pub trait BinArrayExtension {
    method is_bin_id_within_range (line 6) | fn is_bin_id_within_range(&self, bin_id: i32) -> Result<bool>;
    method get_bin_index_in_array (line 7) | fn get_bin_index_in_array(&self, bin_id: i32) -> Result<usize>;
    method get_bin_array_lower_upper_bin_id (line 9) | fn get_bin_array_lower_upper_bin_id(index: i32) -> Result<(i32, i32)>;
    method bin_id_to_bin_array_index (line 10) | fn bin_id_to_bin_array_index(bin_id: i32) -> Result<i32>;
    method bin_id_to_bin_array_key (line 11) | fn bin_id_to_bin_array_key(lb_pair: Pubkey, bin_id: i32) -> Result<Pub...
    method get_bin_mut (line 13) | fn get_bin_mut<'a>(&'a mut self, bin_id: i32) -> Result<&'a mut Bin>;
    method get_bin (line 14) | fn get_bin<'a>(&'a self, bin_id: i32) -> Result<&'a Bin>;
    method get_bin_array_account_metas_coverage (line 16) | fn get_bin_array_account_metas_coverage(
    method get_bin_array_indexes_coverage (line 22) | fn get_bin_array_indexes_coverage(lower_bin_id: i32, upper_bin_id: i32...
    method get_bin_array_lower_upper_bin_id (line 26) | fn get_bin_array_lower_upper_bin_id(index: i32) -> Result<(i32, i32)> {
    method is_bin_id_within_range (line 40) | fn is_bin_id_within_range(&self, bin_id: i32) -> Result<bool> {
    method get_bin_mut (line 47) | fn get_bin_mut<'a>(&'a mut self, bin_id: i32) -> Result<&'a mut Bin> {
    method get_bin (line 51) | fn get_bin<'a>(&'a self, bin_id: i32) -> Result<&'a Bin> {
    method get_bin_index_in_array (line 55) | fn get_bin_index_in_array(&self, bin_id: i32) -> Result<usize> {
    method bin_id_to_bin_array_index (line 62) | fn bin_id_to_bin_array_index(bin_id: i32) -> Result<i32> {
    method bin_id_to_bin_array_key (line 72) | fn bin_id_to_bin_array_key(lb_pair: Pubkey, bin_id: i32) -> Result<Pub...
    method get_bin_array_indexes_coverage (line 77) | fn get_bin_array_indexes_coverage(lower_bin_id: i32, upper_bin_id: i32...
    method get_bin_array_account_metas_coverage (line 90) | fn get_bin_array_account_metas_coverage(

FILE: commons/src/extensions/bin_array_bitmap.rs
  type BinArrayBitmapExtExtension (line 4) | pub trait BinArrayBitmapExtExtension {
    method bitmap_range (line 5) | fn bitmap_range() -> (i32, i32);
    method get_bitmap_offset (line 6) | fn get_bitmap_offset(bin_array_index: i32) -> Result<usize>;
    method bin_array_offset_in_bitmap (line 7) | fn bin_array_offset_in_bitmap(bin_array_index: i32) -> Result<usize>;
    method to_bin_array_index (line 8) | fn to_bin_array_index(offset: usize, bin_array_offset: usize, is_posit...
    method get_bitmap (line 11) | fn get_bitmap(&self, bin_array_index: i32) -> Result<(usize, [u64; 8])>;
    method bit (line 12) | fn bit(&self, bin_array_index: i32) -> Result<bool>;
    method iter_bitmap (line 13) | fn iter_bitmap(&self, start_index: i32, end_index: i32) -> Result<Opti...
    method next_bin_array_index_with_liquidity (line 14) | fn next_bin_array_index_with_liquidity(
    method bitmap_range (line 22) | fn bitmap_range() -> (i32, i32) {
    method next_bin_array_index_with_liquidity (line 29) | fn next_bin_array_index_with_liquidity(
    method bit (line 60) | fn bit(&self, bin_array_index: i32) -> Result<bool> {
    method get_bitmap (line 67) | fn get_bitmap(&self, bin_array_index: i32) -> Result<(usize, [u64; 8])> {
    method to_bin_array_index (line 76) | fn to_bin_array_index(
    method bin_array_offset_in_bitmap (line 90) | fn bin_array_offset_in_bitmap(bin_array_index: i32) -> Result<usize> {
    method get_bitmap_offset (line 102) | fn get_bitmap_offset(bin_array_index: i32) -> Result<usize> {
    method iter_bitmap (line 111) | fn iter_bitmap(&self, start_index: i32, end_index: i32) -> Result<Opti...

FILE: commons/src/extensions/lb_pair.rs
  type LbPairExtension (line 10) | pub trait LbPairExtension {
    method bitmap_range (line 11) | fn bitmap_range() -> (i32, i32);
    method get_bin_array_offset (line 12) | fn get_bin_array_offset(bin_array_index: i32) -> usize;
    method status (line 14) | fn status(&self) -> Result<PairStatus>;
    method pair_type (line 15) | fn pair_type(&self) -> Result<PairType>;
    method activation_type (line 16) | fn activation_type(&self) -> Result<ActivationType>;
    method compute_fee (line 17) | fn compute_fee(&self, amount: u64) -> Result<u64>;
    method get_total_fee (line 18) | fn get_total_fee(&self) -> Result<u128>;
    method get_base_fee (line 19) | fn get_base_fee(&self) -> Result<u128>;
    method get_variable_fee (line 20) | fn get_variable_fee(&self) -> Result<u128>;
    method get_token_programs (line 21) | fn get_token_programs(&self) -> Result<[Pubkey; 2]>;
    method compute_variable_fee (line 22) | fn compute_variable_fee(&self, volatility_accumulator: u32) -> Result<...
    method compute_protocol_fee (line 23) | fn compute_protocol_fee(&self, fee_amount: u64) -> Result<u64>;
    method compute_fee_from_amount (line 24) | fn compute_fee_from_amount(&self, amount_with_fees: u64) -> Result<u64>;
    method is_overflow_default_bin_array_bitmap (line 25) | fn is_overflow_default_bin_array_bitmap(&self, bin_array_index: i32) -...
    method next_bin_array_index_with_liquidity_internal (line 26) | fn next_bin_array_index_with_liquidity_internal(
    method update_references (line 32) | fn update_references(&mut self, current_timestamp: i64) -> Result<()>;
    method update_volatility_accumulator (line 33) | fn update_volatility_accumulator(&mut self) -> Result<()>;
    method advance_active_bin (line 34) | fn advance_active_bin(&mut self, swap_for_y: bool) -> Result<()>;
    method status (line 38) | fn status(&self) -> Result<PairStatus> {
    method get_token_programs (line 42) | fn get_token_programs(&self) -> Result<[Pubkey; 2]> {
    method pair_type (line 63) | fn pair_type(&self) -> Result<PairType> {
    method activation_type (line 67) | fn activation_type(&self) -> Result<ActivationType> {
    method update_references (line 71) | fn update_references(&mut self, current_timestamp: i64) -> Result<()> {
    method update_volatility_accumulator (line 103) | fn update_volatility_accumulator(&mut self) -> Result<()> {
    method get_base_fee (line 130) | fn get_base_fee(&self) -> Result<u128> {
    method get_variable_fee (line 140) | fn get_variable_fee(&self) -> Result<u128> {
    method compute_variable_fee (line 144) | fn compute_variable_fee(&self, volatility_accumulator: u32) -> Result<...
    method get_total_fee (line 172) | fn get_total_fee(&self) -> Result<u128> {
    method compute_fee (line 181) | fn compute_fee(&self, amount: u64) -> Result<u64> {
    method advance_active_bin (line 201) | fn advance_active_bin(&mut self, swap_for_y: bool) -> Result<()> {
    method compute_protocol_fee (line 219) | fn compute_protocol_fee(&self, fee_amount: u64) -> Result<u64> {
    method compute_fee_from_amount (line 229) | fn compute_fee_from_amount(&self, amount_with_fees: u64) -> Result<u64> {
    method bitmap_range (line 245) | fn bitmap_range() -> (i32, i32) {
    method is_overflow_default_bin_array_bitmap (line 249) | fn is_overflow_default_bin_array_bitmap(&self, bin_array_index: i32) -...
    method get_bin_array_offset (line 254) | fn get_bin_array_offset(bin_array_index: i32) -> usize {
    method next_bin_array_index_with_liquidity_internal (line 258) | fn next_bin_array_index_with_liquidity_internal(

FILE: commons/src/extensions/position.rs
  type PositionExtension (line 4) | pub trait PositionExtension {
    method get_bin_array_indexes_bound (line 5) | fn get_bin_array_indexes_bound(&self) -> Result<(i32, i32)>;
    method get_bin_array_keys_coverage (line 6) | fn get_bin_array_keys_coverage(&self) -> Result<Vec<Pubkey>>;
    method get_bin_array_accounts_meta_coverage (line 7) | fn get_bin_array_accounts_meta_coverage(&self) -> Result<Vec<AccountMe...
    method get_bin_array_indexes_bound_by_chunk (line 9) | fn get_bin_array_indexes_bound_by_chunk(
    method get_bin_array_keys_coverage_by_chunk (line 15) | fn get_bin_array_keys_coverage_by_chunk(
    method get_bin_array_accounts_meta_coverage_by_chunk (line 21) | fn get_bin_array_accounts_meta_coverage_by_chunk(
    method is_empty (line 27) | fn is_empty(&self) -> bool;
    method get_bin_array_indexes_bound (line 31) | fn get_bin_array_indexes_bound(&self) -> Result<(i32, i32)> {
    method get_bin_array_indexes_bound_by_chunk (line 35) | fn get_bin_array_indexes_bound_by_chunk(
    method get_bin_array_keys_coverage (line 46) | fn get_bin_array_keys_coverage(&self) -> Result<Vec<Pubkey>> {
    method get_bin_array_keys_coverage_by_chunk (line 50) | fn get_bin_array_keys_coverage_by_chunk(
    method get_bin_array_accounts_meta_coverage (line 64) | fn get_bin_array_accounts_meta_coverage(&self) -> Result<Vec<AccountMe...
    method get_bin_array_accounts_meta_coverage_by_chunk (line 68) | fn get_bin_array_accounts_meta_coverage_by_chunk(
    method is_empty (line 81) | fn is_empty(&self) -> bool {

FILE: commons/src/math/price_math.rs
  function get_price_from_id (line 3) | pub fn get_price_from_id(active_id: i32, bin_step: u16) -> Result<u128> {

FILE: commons/src/math/u128x128_math.rs
  function mul_div (line 5) | pub fn mul_div(x: u128, y: u128, denominator: u128, rounding: Rounding) ...
  function mul_shr (line 27) | pub fn mul_shr(x: u128, y: u128, offset: u8, rounding: Rounding) -> Opti...
  function shl_div (line 34) | pub fn shl_div(x: u128, y: u128, offset: u8, rounding: Rounding) -> Opti...

FILE: commons/src/math/u64x64_math.rs
  constant PRECISION (line 2) | pub const PRECISION: u128 = 1_000_000_000_000;
  constant SCALE_OFFSET (line 5) | pub const SCALE_OFFSET: u8 = 64;
  constant MAX_EXPONENTIAL (line 14) | const MAX_EXPONENTIAL: u32 = 0x80000;
  constant ONE (line 17) | pub const ONE: u128 = 1u128 << SCALE_OFFSET;
  function pow (line 19) | pub fn pow(base: u128, exp: i32) -> Option<u128> {

FILE: commons/src/math/utils.rs
  function safe_mul_shr_cast (line 5) | pub fn safe_mul_shr_cast<T: FromPrimitive>(
  function safe_shl_div_cast (line 15) | pub fn safe_shl_div_cast<T: FromPrimitive>(
  function safe_mul_div_cast (line 24) | pub fn safe_mul_div_cast<T: FromPrimitive>(

FILE: commons/src/pda.rs
  function derive_lb_pair_with_preset_parameter_key (line 6) | pub fn derive_lb_pair_with_preset_parameter_key(
  function derive_lb_pair_pda2 (line 21) | pub fn derive_lb_pair_pda2(
  function derive_customizable_permissionless_lb_pair (line 38) | pub fn derive_customizable_permissionless_lb_pair(
  function derive_permission_lb_pair_pda (line 52) | pub fn derive_permission_lb_pair_pda(
  function derive_lb_pair_pda (line 70) | pub fn derive_lb_pair_pda(
  function derive_position_pda (line 85) | pub fn derive_position_pda(
  function derive_oracle_pda (line 103) | pub fn derive_oracle_pda(lb_pair: Pubkey) -> (Pubkey, u8) {
  function derive_bin_array_pda (line 107) | pub fn derive_bin_array_pda(lb_pair: Pubkey, bin_array_index: i64) -> (P...
  function derive_bin_array_bitmap_extension (line 114) | pub fn derive_bin_array_bitmap_extension(lb_pair: Pubkey) -> (Pubkey, u8) {
  function derive_reserve_pda (line 118) | pub fn derive_reserve_pda(token_mint: Pubkey, lb_pair: Pubkey) -> (Pubke...
  function derive_reward_vault_pda (line 122) | pub fn derive_reward_vault_pda(lb_pair: Pubkey, reward_index: u64) -> (P...
  function derive_event_authority_pda (line 129) | pub fn derive_event_authority_pda() -> (Pubkey, u8) {
  function derive_preset_parameter_pda (line 134) | pub fn derive_preset_parameter_pda(bin_step: u16) -> (Pubkey, u8) {
  function derive_preset_parameter_pda2 (line 138) | pub fn derive_preset_parameter_pda2(bin_step: u16, base_factor: u16) -> ...
  function derive_preset_parameter_pda_v2 (line 149) | pub fn derive_preset_parameter_pda_v2(index: u16) -> (Pubkey, u8) {
  function derive_token_badge_pda (line 153) | pub fn derive_token_badge_pda(mint: Pubkey) -> (Pubkey, u8) {
  function derive_claim_protocol_fee_operator_pda (line 157) | pub fn derive_claim_protocol_fee_operator_pda(operator: Pubkey) -> (Pubk...

FILE: commons/src/quote.rs
  type SwapExactInQuote (line 8) | pub struct SwapExactInQuote {
  type SwapExactOutQuote (line 14) | pub struct SwapExactOutQuote {
  function validate_swap_activation (line 19) | fn validate_swap_activation(
  function shift_active_bin_if_empty_gap (line 46) | fn shift_active_bin_if_empty_gap(
  function quote_exact_out (line 69) | pub fn quote_exact_out(
  function quote_exact_in (line 178) | pub fn quote_exact_in(
  function get_bin_array_pubkeys_for_swap (line 273) | pub fn get_bin_array_pubkeys_for_swap(
  constant DLMM_PROGRAM_FILE_PATH (line 340) | pub const DLMM_PROGRAM_FILE_PATH: &str = "../artifacts/lb_clmm.so";
  function get_clock (line 343) | async fn get_clock(rpc_client: RpcClient) -> Result<Clock> {
  function test_swap_quote_exact_out (line 354) | async fn test_swap_quote_exact_out() {
  function test_swap_quote_exact_in (line 491) | async fn test_swap_quote_exact_in() {
  function test_swap_quote_infinite_loop (line 586) | fn test_swap_quote_infinite_loop() {

FILE: commons/src/rpc_client_extension.rs
  type RpcClientExtension (line 7) | pub trait RpcClientExtension {
    method get_account_and_deserialize (line 8) | async fn get_account_and_deserialize<T>(
    method get_account_and_deserialize (line 17) | async fn get_account_and_deserialize<T>(

FILE: commons/src/seeds.rs
  constant BIN_ARRAY (line 4) | pub const BIN_ARRAY: &[u8] = b"bin_array";
  constant ORACLE (line 6) | pub const ORACLE: &[u8] = b"oracle";
  constant BIN_ARRAY_BITMAP_SEED (line 8) | pub const BIN_ARRAY_BITMAP_SEED: &[u8] = b"bitmap";
  constant PRESET_PARAMETER (line 10) | pub const PRESET_PARAMETER: &[u8] = b"preset_parameter";
  constant PRESET_PARAMETER2 (line 12) | pub const PRESET_PARAMETER2: &[u8] = b"preset_parameter2";
  constant POSITION (line 14) | pub const POSITION: &[u8] = b"position";
  constant ILM_BASE_KEY (line 16) | pub const ILM_BASE_KEY: Pubkey = pubkey!("MFGQxwAmB91SwuYX36okv2Qmdc9aMu...
  constant TOKEN_BADGE (line 18) | pub const TOKEN_BADGE: &[u8] = b"token_badge";
  constant CLAIM_PROTOCOL_FEE_OPERATOR (line 20) | pub const CLAIM_PROTOCOL_FEE_OPERATOR: &[u8] = b"cf_operator";

FILE: commons/src/token_2022.rs
  constant ONE_IN_BASIS_POINTS (line 11) | const ONE_IN_BASIS_POINTS: u128 = MAX_FEE_BASIS_POINTS as u128;
  type ActionType (line 13) | pub enum ActionType {
  function get_potential_token_2022_related_ix_data_and_accounts (line 18) | pub async fn get_potential_token_2022_related_ix_data_and_accounts(
  function get_extra_account_metas_for_transfer_hook (line 63) | pub async fn get_extra_account_metas_for_transfer_hook(
  function get_epoch_transfer_fee (line 124) | pub fn get_epoch_transfer_fee(mint_account: &Account, epoch: u64) -> Res...
  type TransferFeeExcludedAmount (line 144) | pub struct TransferFeeExcludedAmount {
  function calculate_transfer_fee_excluded_amount (line 149) | pub fn calculate_transfer_fee_excluded_amount(
  type TransferFeeIncludedAmount (line 175) | pub struct TransferFeeIncludedAmount {
  function calculate_transfer_fee_included_amount (line 180) | pub fn calculate_transfer_fee_included_amount(
  function calculate_pre_fee_amount (line 217) | pub fn calculate_pre_fee_amount(transfer_fee: &TransferFee, post_fee_amo...
  function calculate_inverse_fee (line 243) | pub fn calculate_inverse_fee(transfer_fee: &TransferFee, post_fee_amount...

FILE: commons/src/typedefs.rs
  type SwapResult (line 2) | pub struct SwapResult {

FILE: commons/tests/integration/helpers/utils.rs
  function process_and_assert_ok (line 11) | pub async fn process_and_assert_ok(
  function get_or_create_ata (line 36) | pub async fn get_or_create_ata(
  function create_associated_token_account (line 65) | pub async fn create_associated_token_account(
  function warp_sol (line 85) | pub async fn warp_sol(
  function get_clock (line 118) | pub async fn get_clock(banks_client: &mut BanksClient) -> solana_program...

FILE: commons/tests/integration/test_swap.rs
  type SplTestPair (line 3) | struct SplTestPair {
  function setup_spl_test_pair (line 14) | fn setup_spl_test_pair() -> (ProgramTest, SplTestPair) {
  function test_swap_exact_out (line 93) | async fn test_swap_exact_out() {
  function test_swap (line 283) | async fn test_swap() {

FILE: commons/tests/integration/test_swap_token2022.rs
  type Token2022TestPair (line 3) | struct Token2022TestPair {
  function setup_token_2022_test_pair (line 14) | fn setup_token_2022_test_pair() -> (ProgramTest, Token2022TestPair) {
  function test_swap_exact_out (line 94) | async fn test_swap_exact_out() {
  function test_swap (line 290) | async fn test_swap() {

FILE: market_making/src/bin_array_manager.rs
  type BinArrayManager (line 3) | pub struct BinArrayManager<'a> {
  function get_bin (line 8) | pub fn get_bin(&self, bin_id: i32) -> Result<&Bin> {
  function get_lower_upper_bin_id (line 20) | pub fn get_lower_upper_bin_id(&self) -> Result<(i32, i32)> {
  function get_total_fee_pending (line 40) | pub fn get_total_fee_pending(&self, position: &PositionV2) -> Result<(u6...
  function get_fee_pending_for_a_bin (line 66) | fn get_fee_pending_for_a_bin(

FILE: market_making/src/core.rs
  type Core (line 16) | pub struct Core {
    method rpc_client (line 25) | fn rpc_client(&self) -> RpcClient {
    method refresh_state (line 29) | pub async fn refresh_state(&self) -> Result<()> {
    method fetch_token_info (line 123) | pub async fn fetch_token_info(&self) -> Result<()> {
    method get_all_token_mints_with_program_id (line 148) | fn get_all_token_mints_with_program_id(&self) -> Result<Vec<(Pubkey, P...
    method get_position_state (line 164) | pub fn get_position_state(&self, lp_pair: Pubkey) -> SinglePosition {
    method init_user_ata (line 170) | pub async fn init_user_ata(&self) -> Result<()> {
    method withdraw (line 189) | pub async fn withdraw(&self, state: &SinglePosition, is_simulation: bo...
    method swap (line 357) | async fn swap(
    method deposit (line 500) | pub async fn deposit(
    method get_deposit_amount (line 694) | pub async fn get_deposit_amount(
    method get_all_positions (line 747) | pub fn get_all_positions(&self) -> Vec<SinglePosition> {
    method get_all_tokens (line 756) | pub fn get_all_tokens(&self) -> HashMap<Pubkey, MintWithProgramId> {
    method check_shift_price_range (line 761) | pub async fn check_shift_price_range(&self) -> Result<()> {
    method shift_right (line 795) | async fn shift_right(&self, state: &SinglePosition) -> Result<()> {
    method shift_left (line 845) | async fn shift_left(&self, state: &SinglePosition) -> Result<()> {
    method inc_rebalance_time (line 896) | pub fn inc_rebalance_time(&self, lb_pair: Pubkey) {
    method get_positions (line 902) | pub fn get_positions(&self) -> Result<Vec<PositionInfo>> {
  function test_withdraw (line 924) | async fn test_withdraw() {
  function test_swap (line 955) | async fn test_swap() {

FILE: market_making/src/main.rs
  type MarketMakingMode (line 54) | pub enum MarketMakingMode {
  method default (line 62) | fn default() -> Self {
  type Err (line 68) | type Err = anyhow::Error;
  method from_str (line 70) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Args (line 82) | pub struct Args {
  function main (line 98) | async fn main() -> Result<()> {

FILE: market_making/src/pair_config.rs
  type PairConfig (line 10) | pub struct PairConfig {
  function should_market_making (line 17) | pub fn should_market_making(config: &Vec<PairConfig>) -> bool {
  function get_pair_config (line 26) | pub fn get_pair_config(config: &Vec<PairConfig>, pair_addr: Pubkey) -> P...
  function get_config_from_file (line 35) | pub fn get_config_from_file(path: &str) -> Result<Vec<PairConfig>> {
  function test_get_get_config_from_file (line 50) | fn test_get_get_config_from_file() {

FILE: market_making/src/router.rs
  function router (line 10) | pub fn router(core: Arc<Core>) -> Router<Body, Infallible> {
  function check_positions (line 20) | async fn check_positions(req: Request<Body>) -> Result<Response<Body>, I...
  function error_handler (line 35) | async fn error_handler(err: routerify::RouteError, _: RequestInfo) -> Re...
  function logger (line 43) | async fn logger(req: Request<Body>) -> Result<Request<Body>, Infallible> {

FILE: market_making/src/state.rs
  type MintWithProgramId (line 6) | pub type MintWithProgramId = (Mint, Pubkey);
  type AllPosition (line 8) | pub struct AllPosition {
    method new (line 14) | pub fn new(config: &Vec<PairConfig>) -> Self {
  type SinglePosition (line 28) | pub struct SinglePosition {
    method inc_rebalance_time (line 44) | pub fn inc_rebalance_time(&mut self) {
    method get_min_out_amount_with_slippage_rate (line 48) | pub fn get_min_out_amount_with_slippage_rate(
    method get_positions (line 65) | pub fn get_positions(&self) -> Result<PositionRaw> {
    method new (line 231) | pub fn new(lb_pair: Pubkey) -> Self {
  constant SLIPPAGE_RATE (line 40) | const SLIPPAGE_RATE: u64 = 300;
  constant BASIC_POINT_MAX (line 41) | const BASIC_POINT_MAX: u64 = 10_000;
  type PositionRaw (line 140) | pub struct PositionRaw {
    method to_position_info (line 155) | pub fn to_position_info(
  type PositionInfo (line 217) | pub struct PositionInfo {
  function get_decimals (line 246) | pub fn get_decimals(token_mint_pk: Pubkey, all_tokens: &HashMap<Pubkey, ...

FILE: market_making/src/utils.rs
  function get_epoch_sec (line 13) | pub fn get_epoch_sec() -> u64 {
  function get_or_create_ata (line 20) | pub async fn get_or_create_ata(
  function get_transaction_config (line 47) | pub fn get_transaction_config() -> RpcSendTransactionConfig {
  function send_tx (line 59) | pub async fn send_tx(
  function simulate_transaction (line 80) | pub async fn simulate_transaction(
  function parse_swap_event (line 95) | pub async fn parse_swap_event(rpc_client: &RpcClient, signature: Signatu...

FILE: python-client/dlmm/dlmm/dlmm.py
  class DLMM (line 11) | class DLMM:
    method __init__ (line 22) | def __init__(self, public_key: Pubkey, rpc: str) -> None:
    method get_active_bin (line 50) | def get_active_bin(self) -> ActiveBin:
    method from_price_per_lamport (line 63) | def from_price_per_lamport(self, price: float) -> float:
    method to_price_per_lamport (line 85) | def to_price_per_lamport(self, price: float) -> float:
    method initialize_position_and_add_liquidity_by_strategy (line 107) | def initialize_position_and_add_liquidity_by_strategy(self, position_p...
    method add_liquidity_by_strategy (line 161) | def add_liquidity_by_strategy(self, position_pub_key: Pubkey, user: Pu...
    method get_positions_by_user_and_lb_pair (line 215) | def get_positions_by_user_and_lb_pair(self, user: Pubkey) -> GetPositi...
    method remove_liqidity (line 237) | def remove_liqidity(self, position_pub_key: Pubkey, user: Pubkey, bin_...
    method close_position (line 279) | def close_position(self, owner: Pubkey, position: Position) -> Transac...
    method get_bin_array_for_swap (line 307) | def get_bin_array_for_swap(self, swap_Y_to_X: bool, count: Optional[in...
    method swap_quote (line 334) | def swap_quote(self, amount: int, swap_Y_to_X: bool, allowed_slippage:...
    method swap (line 376) | def swap(self, in_token: Pubkey, out_token: Pubkey, in_amount: int, mi...
    method refetch_states (line 428) | def refetch_states(self) -> None:
    method get_bin_arrays (line 440) | def get_bin_arrays(self) -> list[BinArray]:
    method get_fee_info (line 452) | def get_fee_info(self) -> FeeInfo:
    method get_dynamic_fee (line 464) | def get_dynamic_fee(self) -> float:
    method get_bin_id_from_price (line 476) | def get_bin_id_from_price(self, price: float, min: bool) -> int | None:
    method get_bins_around_active_bin (line 503) | def get_bins_around_active_bin(self, number_of_bins_to_left: int, numb...
    method get_bins_between_min_and_max_price (line 531) | def get_bins_between_min_and_max_price(self, min_price: float, max_pri...
    method get_bins_between_lower_and_upper_bound (line 558) | def get_bins_between_lower_and_upper_bound(self, lower_bound: int, upp...
    method claim_LM_reward (line 585) | def claim_LM_reward(self, owner: Pubkey, position: Position) -> Transa...
    method claim_all_LM_reards (line 609) | def claim_all_LM_reards(self, owner: Pubkey, positions: List[Position]...
    method claim_swap_fee (line 635) | def claim_swap_fee(self, owner: Pubkey, position: Position) -> Transac...
    method claim_all_swap_fees (line 662) | def claim_all_swap_fees(self, owner: Pubkey, positions: List[Position]...
    method claim_all_rewards (line 689) | def claim_all_rewards(self, owner: Pubkey, positions: List[Position]) ...
  class DLMM_CLIENT (line 716) | class DLMM_CLIENT:
    method create (line 722) | def create(public_key: Pubkey, rpc: str) -> DLMM:
    method create_multiple (line 737) | def create_multiple(public_keys: List[Pubkey], rpc: str) -> List[DLMM]:
    method get_all_lb_pair_positions_by_user (line 752) | def get_all_lb_pair_positions_by_user(user: Pubkey, rpc: str) -> Dict[...
    method create_customizable_permissionless_lb_pair (line 789) | def create_customizable_permissionless_lb_pair(

FILE: python-client/dlmm/dlmm/types.py
  class DlmmHttpError (line 6) | class DlmmHttpError(Exception):
    method __init__ (line 7) | def __init__(self, message):
  class StrategyType (line 10) | class StrategyType(Enum):
    method __str__ (line 21) | def __str__(self) -> str:
    method __repr__ (line 24) | def __repr__(self) -> str:
  class ActivationType (line 27) | class ActivationType(Enum):
    method __str__ (line 31) | def __str__(self) -> str:
    method __repr__ (line 34) | def __repr__(self) -> str:
  class PositionVersion (line 38) | class PositionVersion(Enum):
    method __str__ (line 42) | def __str__(self) -> str:
    method __repr__ (line 45) | def __repr__(self) -> str:
  class StrategyParameters (line 48) | class StrategyParameters(TypedDict):
  class ActiveBin (line 54) | class ActiveBin():
    method __init__ (line 63) | def __init__(self, data: dict):
  class PositionBinData (line 73) | class PositionBinData():
    method __init__ (line 84) | def __init__(self, data: dict):
    method to_json (line 114) | def to_json(self) -> dict:
  class PositionData (line 128) | class PositionData():
    method __init__ (line 143) | def __init__(self, data: dict):
    method to_json (line 185) | def to_json(self) -> dict:
  class Position (line 203) | class  Position():
    method __init__ (line 208) | def __init__(self, data: dict):
    method to_json (line 220) | def to_json(self):
  class GetPositionByUser (line 228) | class GetPositionByUser():
    method __init__ (line 232) | def __init__(self, data: dict):
  class SwapQuote (line 237) | class SwapQuote():
    method __init__ (line 246) | def __init__(self, data: dict):
  class LBPair (line 255) | class LBPair:
    method __init__ (line 271) | def __init__(self, data: dict) -> None:
  class TokenReserve (line 289) | class TokenReserve():
    method __init__ (line 295) | def __init__(self, data: dict) -> None:
  class PositionInfo (line 303) | class PositionInfo():
    method __init__ (line 310) | def __init__(self, data: dict) -> None:
  class FeeInfo (line 318) | class FeeInfo():
    method __init__ (line 323) | def __init__(self, data: dict) -> None:
  class BinLiquidty (line 329) | class BinLiquidty():
    method __init__ (line 338) | def __init__(self, data: dict) -> None:
  class GetBins (line 361) | class GetBins():
    method __init__ (line 365) | def __init__(self, data: dict) -> None:
  class Bin (line 376) | class Bin:
    method __init__ (line 387) | def __init__(self, data: dict) -> None:
  class BinAccount (line 400) | class BinAccount:
    method __init__ (line 404) | def __init__(self, data: dict) -> None:
  class BinArray (line 410) | class BinArray:
    method __init__ (line 414) | def __init__(self, data: dict) -> None:

FILE: python-client/dlmm/dlmm/utils.py
  function convert_to_transaction (line 8) | def convert_to_transaction(response: dict) -> Transaction:

FILE: python-client/dlmm/tests/test_lp_flow.py
  function test_flow (line 10) | def test_flow():

FILE: python-client/dlmm/tests/test_util_methods.py
  function test_util_methods (line 8) | def test_util_methods():

FILE: ts-client/jest.config.js
  constant TIMEOUT_SEC (line 1) | const TIMEOUT_SEC = 1000;

FILE: ts-client/src/dlmm/constants/index.ts
  constant LBCLMM_PROGRAM_IDS (line 6) | const LBCLMM_PROGRAM_IDS = {
  constant ALT_ADDRESS (line 12) | const ALT_ADDRESS = {
  constant ADMIN (line 17) | const ADMIN = {
  type Network (line 22) | enum Network {
  constant BASIS_POINT_MAX (line 29) | const BASIS_POINT_MAX = 10000;
  constant SCALE_OFFSET (line 30) | const SCALE_OFFSET = 64;
  constant SCALE (line 31) | const SCALE = new BN(1).shln(SCALE_OFFSET);
  constant FEE_PRECISION (line 33) | const FEE_PRECISION = new BN(1_000_000_000);
  constant MAX_FEE_RATE (line 34) | const MAX_FEE_RATE = new BN(100_000_000);
  constant BIN_ARRAY_FEE (line 37) | const BIN_ARRAY_FEE = 0.07143744;
  constant POSITION_FEE (line 39) | const POSITION_FEE = 0.05740608;
  constant TOKEN_ACCOUNT_FEE (line 40) | const TOKEN_ACCOUNT_FEE = 0.00203928;
  constant POOL_FEE (line 42) | const POOL_FEE = 0.00718272;
  constant BIN_ARRAY_BITMAP_FEE (line 43) | const BIN_ARRAY_BITMAP_FEE = 0.01180416;
  constant BIN_ARRAY_FEE_BN (line 45) | const BIN_ARRAY_FEE_BN = new BN(
  constant POSITION_FEE_BN (line 48) | const POSITION_FEE_BN = new BN(
  constant TOKEN_ACCOUNT_FEE_BN (line 51) | const TOKEN_ACCOUNT_FEE_BN = new BN(
  constant POOL_FEE_BN (line 54) | const POOL_FEE_BN = new BN(
  constant BIN_ARRAY_BITMAP_FEE_BN (line 57) | const BIN_ARRAY_BITMAP_FEE_BN = new BN(
  constant CONSTANTS (line 61) | const CONSTANTS = Object.entries(IDL.constants);
  constant MAX_BIN_ARRAY_SIZE (line 63) | const MAX_BIN_ARRAY_SIZE = new BN(
  constant DEFAULT_BIN_PER_POSITION (line 66) | const DEFAULT_BIN_PER_POSITION = new BN(
  constant BIN_ARRAY_BITMAP_SIZE (line 70) | const BIN_ARRAY_BITMAP_SIZE = new BN(
  constant EXTENSION_BINARRAY_BITMAP_SIZE (line 73) | const EXTENSION_BINARRAY_BITMAP_SIZE = new BN(
  constant POSITION_MAX_LENGTH (line 78) | const POSITION_MAX_LENGTH = new BN(
  constant MAX_RESIZE_LENGTH (line 82) | const MAX_RESIZE_LENGTH = new BN(
  constant SIMULATION_USER (line 86) | const SIMULATION_USER = new PublicKey(
  constant PRECISION (line 90) | const PRECISION = 18446744073709551616;
  constant MAX_CLAIM_ALL_ALLOWED (line 92) | const MAX_CLAIM_ALL_ALLOWED = 2;
  constant MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX (line 94) | const MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX = 26;
  constant MAX_ACTIVE_BIN_SLIPPAGE (line 96) | const MAX_ACTIVE_BIN_SLIPPAGE = 3;
  constant ILM_BASE (line 98) | const ILM_BASE = new PublicKey(
  constant MAX_EXTRA_BIN_ARRAYS (line 102) | const MAX_EXTRA_BIN_ARRAYS = 3;
  constant U64_MAX (line 103) | const U64_MAX = new BN("18446744073709551615");
  constant MAX_BINS_PER_POSITION (line 105) | const MAX_BINS_PER_POSITION = new BN(
  type FunctionType (line 109) | enum FunctionType {

FILE: ts-client/src/dlmm/error.ts
  type Codes (line 5) | type Codes = (typeof IDL.errors)[number]["code"];
  class DLMMError (line 8) | class DLMMError extends Error {
    method constructor (line 13) | constructor(error: object | Codes) {
  type ErrorName (line 49) | type ErrorName =
  class DlmmSdkError (line 53) | class DlmmSdkError extends Error {
    method constructor (line 57) | constructor(name: ErrorName, message: string) {

FILE: ts-client/src/dlmm/helpers/binArray.ts
  function internalBitmapRange (line 28) | function internalBitmapRange() {
  function buildBitmapFromU64Arrays (line 34) | function buildBitmapFromU64Arrays(u64Arrays: BN[], type: BitmapType) {
  function bitmapTypeDetail (line 44) | function bitmapTypeDetail(type: BitmapType) {
  function mostSignificantBit (line 58) | function mostSignificantBit(number: BN, bitLength: number) {
  function leastSignificantBit (line 72) | function leastSignificantBit(number: BN, bitLength: number) {
  function extensionBitmapRange (line 84) | function extensionBitmapRange() {
  function findSetBit (line 95) | function findSetBit(
  function isOverflowDefaultBinArrayBitmap (line 148) | function isOverflowDefaultBinArrayBitmap(binArrayIndex: BN) {
  function deriveBinArrayBitmapExtension (line 155) | function deriveBinArrayBitmapExtension(
  function binIdToBinArrayIndex (line 165) | function binIdToBinArrayIndex(binId: BN): BN {
  function getBinArrayLowerUpperBinId (line 170) | function getBinArrayLowerUpperBinId(binArrayIndex: BN) {
  function isBinIdWithinBinArray (line 177) | function isBinIdWithinBinArray(activeId: BN, binArrayIndex: BN) {
  function getBinFromBinArray (line 182) | function getBinFromBinArray(binId: number, binArray: BinArray): Bin {
  function findNextBinArrayIndexWithLiquidity (line 196) | function findNextBinArrayIndexWithLiquidity(
  function findNextBinArrayWithLiquidity (line 307) | function findNextBinArrayWithLiquidity(
  function getBinArraysRequiredByPositionRange (line 344) | function getBinArraysRequiredByPositionRange(
  function isRewardInitialized (line 412) | function isRewardInitialized(reward: RewardInfo) {
  function getBinIdIndexInBinArray (line 416) | function getBinIdIndexInBinArray(
  function updateBinArray (line 428) | function updateBinArray(
  function binDeltaToMinMaxBinId (line 476) | function binDeltaToMinMaxBinId(binDelta: number, activeBinId: number) {

FILE: ts-client/src/dlmm/helpers/computeUnit.ts
  constant DEFAULT_ADD_LIQUIDITY_CU (line 14) | const DEFAULT_ADD_LIQUIDITY_CU = 1_000_000;
  constant DEFAULT_EXTEND_POSITION_HIGH_CU (line 15) | const DEFAULT_EXTEND_POSITION_HIGH_CU = 1_000_000;
  constant DEFAULT_EXTEND_POSITION_LOW_CU (line 16) | const DEFAULT_EXTEND_POSITION_LOW_CU = 30_000;
  constant DEFAULT_INIT_POSITION_CU (line 17) | const DEFAULT_INIT_POSITION_CU = 30_000;
  constant DEFAULT_INIT_BIN_ARRAY_CU (line 18) | const DEFAULT_INIT_BIN_ARRAY_CU = 350_000;
  constant MIN_CU_BUFFER (line 20) | const MIN_CU_BUFFER = 50_000;
  constant MAX_CU_BUFFER (line 21) | const MAX_CU_BUFFER = 200_000;
  constant MAX_CU (line 22) | const MAX_CU = 1_400_000;

FILE: ts-client/src/dlmm/helpers/derive.ts
  function sortTokenMints (line 7) | function sortTokenMints(tokenX: PublicKey, tokenY: PublicKey) {
  function derivePresetParameterWithIndex (line 16) | function derivePresetParameterWithIndex(
  function deriveLbPairWithPresetParamWithIndexKey (line 29) | function deriveLbPairWithPresetParamWithIndexKey(
  function derivePresetParameter (line 46) | function derivePresetParameter(binStep: BN, programId: PublicKey) {
  function derivePresetParameter2 (line 56) | function derivePresetParameter2(
  function deriveLbPair2 (line 71) | function deriveLbPair2(
  function deriveLbPair (line 95) | function deriveLbPair(
  function deriveCustomizablePermissionlessLbPair (line 112) | function deriveCustomizablePermissionlessLbPair(
  function derivePermissionLbPair (line 124) | function derivePermissionLbPair(
  function deriveOracle (line 143) | function deriveOracle(lbPair: PublicKey, programId: PublicKey) {
  function derivePosition (line 150) | function derivePosition(
  function deriveBinArray (line 177) | function deriveBinArray(
  function deriveReserve (line 196) | function deriveReserve(
  function deriveTokenBadge (line 207) | function deriveTokenBadge(mint: PublicKey, programId: PublicKey) {
  function deriveEventAuthority (line 214) | function deriveEventAuthority(programId: PublicKey) {
  function deriveRewardVault (line 221) | function deriveRewardVault(
  function derivePlaceHolderAccountMeta (line 232) | function derivePlaceHolderAccountMeta(
  function deriveOperator (line 242) | function deriveOperator(

FILE: ts-client/src/dlmm/helpers/fee.ts
  function getBaseFee (line 12) | function getBaseFee(binStep: number, sParameter: sParameters) {
  function getVariableFee (line 19) | function getVariableFee(
  function getTotalFee (line 35) | function getTotalFee(
  function computeFee (line 46) | function computeFee(
  function computeFeeFromAmount (line 62) | function computeFeeFromAmount(
  function computeProtocolFee (line 75) | function computeProtocolFee(feeAmount: BN, sParameter: sParameters) {
  function swapExactOutQuoteAtBin (line 81) | function swapExactOutQuoteAtBin(
  function swapExactInQuoteAtBin (line 145) | function swapExactInQuoteAtBin(
  function getAmountIn (line 220) | function getAmountIn(amountOut: BN, price: BN, swapForY: Boolean): BN {

FILE: ts-client/src/dlmm/helpers/index.ts
  function chunks (line 88) | function chunks<T>(array: T[], size: number): T[][] {
  function range (line 94) | function range<T>(min: number, max: number, mapfn: (i: number) => T) {
  function chunkedFetchMultiplePoolAccount (line 99) | async function chunkedFetchMultiplePoolAccount(
  function chunkedFetchMultipleBinArrayBitmapExtensionAccount (line 115) | async function chunkedFetchMultipleBinArrayBitmapExtensionAccount(
  function getOutAmount (line 131) | function getOutAmount(bin: Bin, inAmount: BN, swapForY: boolean) {
  function getTokenDecimals (line 137) | async function getTokenDecimals(conn: Connection, mint: PublicKey) {
  function getTokenBalance (line 186) | async function getTokenBalance(
  function chunkedGetMultipleAccountInfos (line 251) | async function chunkedGetMultipleAccountInfos(
  function chunkedGetProgramAccounts (line 285) | async function chunkedGetProgramAccounts(
  type Opt (line 458) | type Opt = {
  function createProgram (line 464) | function createProgram(connection: Connection, opt?: Opt) {
  function decodeAccount (line 478) | function decodeAccount<
  function getAccountDiscriminator (line 492) | function getAccountDiscriminator(
  function capSlippagePercentage (line 505) | function capSlippagePercentage(slippage: number) {
  function getAndCapMaxActiveBinSlippage (line 526) | function getAndCapMaxActiveBinSlippage(
  function getBinCount (line 543) | function getBinCount(minBinId: number, maxBinId: number) {
  function getSlippageMaxAmount (line 555) | function getSlippageMaxAmount(amount: BN, slippage: number) {
  function getSlippageMinAmount (line 580) | function getSlippageMinAmount(amount: BN, slippage: number) {
  function getPositionCountByBinCount (line 597) | function getPositionCountByBinCount(binCount: number) {
  function resetUninvolvedLiquidityParams (line 618) | function resetUninvolvedLiquidityParams(
  function chunkDepositWithRebalanceEndpoint (line 650) | async function chunkDepositWithRebalanceEndpoint(

FILE: ts-client/src/dlmm/helpers/lbPair.ts
  function getTokensMintFromPoolAddress (line 14) | async function getTokensMintFromPoolAddress(
  function getTokenProgramId (line 36) | function getTokenProgramId(lbPairState: LbPair) {

FILE: ts-client/src/dlmm/helpers/math.ts
  type Rounding (line 12) | enum Rounding {
  function mulShr (line 17) | function mulShr(x: BN, y: BN, offset: number, rounding: Rounding) {
  function shlDiv (line 22) | function shlDiv(x: BN, y: BN, offset: number, rounding: Rounding) {
  function mulDiv (line 27) | function mulDiv(x: BN, y: BN, denominator: BN, rounding: Rounding) {
  function computeBaseFactorFromFeeBps (line 36) | function computeBaseFactorFromFeeBps(binStep: BN, feeBps: BN) {
  function getQPriceFromId (line 76) | function getQPriceFromId(binId: BN, binStep: BN): BN {
  function getQPriceBaseFactor (line 80) | function getQPriceBaseFactor(binStep: BN): BN {
  function getC (line 86) | function getC(
  function distributeAmountToCompressedBinsByRatio (line 114) | function distributeAmountToCompressedBinsByRatio(
  function getPositionCount (line 158) | function getPositionCount(minBinId: BN, maxBinId: BN) {
  function findOptimumDecompressMultiplier (line 164) | function findOptimumDecompressMultiplier(
  function compressBinAmount (line 190) | function compressBinAmount(binAmount: Map<number, BN>, multiplier: BN) {
  function generateAmountForBinRange (line 211) | function generateAmountForBinRange(
  function generateBinAmount (line 251) | function generateBinAmount(

FILE: ts-client/src/dlmm/helpers/oracle/wrapper.ts
  constant ORACLE_METADATA_SIZE (line 11) | const ORACLE_METADATA_SIZE = 8 + 24;
  constant OBSERVATION_SIZE (line 13) | const OBSERVATION_SIZE = 32;
  type TwapResult (line 16) | interface TwapResult<T> {
  type IDynamicOracle (line 27) | interface IDynamicOracle {
  class Observation (line 65) | class Observation {
    method constructor (line 66) | constructor(
    method isInitialized (line 72) | isInitialized(): boolean {
  function wrapOracle (line 77) | function wrapOracle(
  class DynamicOracle (line 131) | class DynamicOracle implements IDynamicOracle {
    method constructor (line 132) | constructor(
    method nextIndex (line 142) | nextIndex(): number {
    method getEarliestSample (line 148) | getEarliestSample(): Observation {
    method getLatestSample (line 153) | getLatestSample(): Observation {
    method findCumulativeActiveIdByTimestamp (line 157) | findCumulativeActiveIdByTimestamp(activeId: BN, timestamp: BN): BN | n...
    method getActiveIdByTime (line 213) | getActiveIdByTime(timePoint0: BN, timePoint1: BN): TwapResult<BN> | nu...
    method getActiveId (line 246) | getActiveId(currentTimestamp: BN): TwapResult<BN> | null {
    method getEarliestTimestamp (line 257) | getEarliestTimestamp(): BN | null {
    method getPriceByTime (line 262) | getPriceByTime(timePoint0: BN, timePoint1: BN): TwapResult<Decimal> | ...
    method getUiPriceByTime (line 275) | getUiPriceByTime(timePoint0: BN, timePoint1: BN): TwapResult<Decimal> ...
    method getMaxDuration (line 297) | getMaxDuration(currentTimestamp: BN): BN {

FILE: ts-client/src/dlmm/helpers/positions/index.ts
  function getBinArrayIndexesCoverage (line 19) | function getBinArrayIndexesCoverage(lowerBinId: BN, upperBinId: BN) {
  function getBinArrayKeysCoverage (line 36) | function getBinArrayKeysCoverage(
  function getBinArrayAccountMetasCoverage (line 49) | function getBinArrayAccountMetasCoverage(
  function getPositionLowerUpperBinIdWithLiquidity (line 66) | function getPositionLowerUpperBinIdWithLiquidity(
  function isPositionNoFee (line 86) | function isPositionNoFee(position: PositionData): boolean {
  function isPositionNoReward (line 90) | function isPositionNoReward(position: PositionData): boolean {
  function chunkBinRangeIntoExtendedPositions (line 104) | function chunkBinRangeIntoExtendedPositions(
  function chunkBinRange (line 139) | function chunkBinRange(
  function chunkPositionBinRange (line 163) | function chunkPositionBinRange(
  function calculatePositionSize (line 240) | function calculatePositionSize(binCount: BN) {
  function getPositionRentExemption (line 257) | function getPositionRentExemption(connection: Connection, binCount: BN) {
  function getPositionExpandRentExemption (line 277) | async function getPositionExpandRentExemption(
  function getExtendedPositionBinCount (line 310) | function getExtendedPositionBinCount(minBinId: BN, maxBinId: BN) {
  function decodeExtendedPosition (line 325) | function decodeExtendedPosition(

FILE: ts-client/src/dlmm/helpers/positions/wrapper.ts
  type IPosition (line 18) | interface IPosition {
  type CombinedPositionBinData (line 40) | interface CombinedPositionBinData {
  function combineBaseAndExtendedPositionBinData (line 46) | function combineBaseAndExtendedPositionBinData(
  function wrapPosition (line 67) | function wrapPosition(
  class PositionV2Wrapper (line 97) | class PositionV2Wrapper implements IPosition {
    method constructor (line 98) | constructor(
    method address (line 105) | address(): PublicKey {
    method totalClaimedRewards (line 109) | totalClaimedRewards(): BN[] {
    method feeOwner (line 113) | feeOwner(): PublicKey {
    method lockReleasePoint (line 117) | lockReleasePoint(): BN {
    method operator (line 121) | operator(): PublicKey {
    method totalClaimedFeeYAmount (line 125) | totalClaimedFeeYAmount(): BN {
    method totalClaimedFeeXAmount (line 129) | totalClaimedFeeXAmount(): BN {
    method lbPair (line 133) | lbPair(): PublicKey {
    method lowerBinId (line 137) | lowerBinId(): BN {
    method upperBinId (line 141) | upperBinId(): BN {
    method liquidityShares (line 145) | liquidityShares(): BN[] {
    method rewardInfos (line 149) | rewardInfos(): UserRewardInfo[] {
    method feeInfos (line 153) | feeInfos(): UserFeeInfo[] {
    method lastUpdatedAt (line 157) | lastUpdatedAt(): BN {
    method getBinArrayIndexesCoverage (line 161) | getBinArrayIndexesCoverage(): BN[] {
    method getBinArrayKeysCoverage (line 172) | getBinArrayKeysCoverage(programId: PublicKey): PublicKey[] {
    method version (line 178) | version(): PositionVersion {
    method owner (line 182) | owner(): PublicKey {
    method width (line 186) | width(): BN {

FILE: ts-client/src/dlmm/helpers/rebalance/liquidity_strategy/bidAsk.ts
  function findMinY0 (line 11) | function findMinY0(amountY: BN, minDeltaId: BN, maxDeltaId: BN) {
  function findBaseDeltaY (line 17) | function findBaseDeltaY(amountY: BN, minDeltaId: BN, maxDeltaId: BN) {
  function findY0AndDeltaY (line 50) | function findY0AndDeltaY(
  function findMinX0 (line 90) | function findMinX0(
  function findBaseDeltaX (line 112) | function findBaseDeltaX(
  function findX0AndDeltaX (line 159) | function findX0AndDeltaX(
  class BidAskStrategyParameterBuilder (line 208) | class BidAskStrategyParameterBuilder
    method findXParameters (line 211) | findXParameters(
    method findYParameters (line 221) | findYParameters(
    method suggestBalancedXParametersFromY (line 230) | suggestBalancedXParametersFromY(
    method suggestBalancedYParametersFromX (line 271) | suggestBalancedYParametersFromX(

FILE: ts-client/src/dlmm/helpers/rebalance/liquidity_strategy/curve.ts
  function findBaseY0 (line 13) | function findBaseY0(amountY: BN, minDeltaId: BN, maxDeltaId: BN) {
  function findY0AndDeltaY (line 51) | function findY0AndDeltaY(
  function findBaseX0 (line 92) | function findBaseX0(
  function findX0AndDeltaX (line 138) | function findX0AndDeltaX(
  class CurveStrategyParameterBuilder (line 180) | class CurveStrategyParameterBuilder
    method findXParameters (line 183) | findXParameters(
    method findYParameters (line 193) | findYParameters(
    method suggestBalancedXParametersFromY (line 202) | suggestBalancedXParametersFromY(
    method suggestBalancedYParametersFromX (line 246) | suggestBalancedYParametersFromX(

FILE: ts-client/src/dlmm/helpers/rebalance/liquidity_strategy/index.ts
  type LiquidityStrategyParameters (line 10) | interface LiquidityStrategyParameters {
  type BidAskParameters (line 17) | interface BidAskParameters {
  type LiquidityStrategyParameterBuilder (line 22) | interface LiquidityStrategyParameterBuilder {
  function getLiquidityStrategyParameterBuilder (line 54) | function getLiquidityStrategyParameterBuilder(
  function suggestBalancedXParametersFromY (line 69) | function suggestBalancedXParametersFromY(
  function getAutoFillAmountByRebalancedPosition (line 119) | function getAutoFillAmountByRebalancedPosition(
  function suggestBalancedYParametersFromX (line 230) | function suggestBalancedYParametersFromX(
  function buildLiquidityStrategyParameters (line 288) | function buildLiquidityStrategyParameters(

FILE: ts-client/src/dlmm/helpers/rebalance/liquidity_strategy/spot.ts
  function findY0 (line 9) | function findY0(amountY: BN, minDeltaId: BN, maxDeltaId: BN) {
  function findBaseX0 (line 34) | function findBaseX0(
  function findX0 (line 72) | function findX0(
  class SpotStrategyParameterBuilder (line 107) | class SpotStrategyParameterBuilder
    method findXParameters (line 110) | findXParameters(
    method findYParameters (line 123) | findYParameters(
    method suggestBalancedXParametersFromY (line 135) | suggestBalancedXParametersFromY(
    method suggestBalancedYParametersFromX (line 173) | suggestBalancedYParametersFromX(

FILE: ts-client/src/dlmm/helpers/rebalance/rebalancePosition.ts
  function buildBitFlagAndNegateStrategyParameters (line 39) | function buildBitFlagAndNegateStrategyParameters(
  type AmountIntoBin (line 82) | interface AmountIntoBin {
  function toRebalancePositionBinData (line 88) | function toRebalancePositionBinData(
  function getDepositBinIds (line 118) | function getDepositBinIds(activeId: BN, deposits: RebalanceWithDeposit[]) {
  function findMinMaxBinIdWithLiquidity (line 140) | function findMinMaxBinIdWithLiquidity(
  function onlyDepositToBidSide (line 169) | function onlyDepositToBidSide(maxDeltaId: BN, favorXInActiveBin: boolean) {
  function onlyDepositToAskSide (line 176) | function onlyDepositToAskSide(minDeltaId: BN, favorXInActiveBin: boolean) {
  function getAmountInBinsBidSide (line 183) | function getAmountInBinsBidSide(
  function getAmountInBinsAskSide (line 209) | function getAmountInBinsAskSide(
  function toAmountIntoBins (line 246) | function toAmountIntoBins(
  function getLiquidity (line 296) | function getLiquidity(x: BN, y: BN, price: BN) {
  function computeCompositionFee (line 302) | function computeCompositionFee(
  function simulateDepositBin (line 326) | function simulateDepositBin(
  type SimulateWithdrawResult (line 372) | interface SimulateWithdrawResult {
  type SimulateDepositResult (line 378) | interface SimulateDepositResult {
  type CreateRebalancePositionParams (line 387) | interface CreateRebalancePositionParams {
  class RebalancePosition (line 396) | class RebalancePosition {
    method constructor (line 408) | constructor(
    method create (line 429) | static async create(
    method _simulateDeposit (line 485) | _simulateDeposit(
    method _simulateResize (line 667) | _simulateResize(
    method _simulateWithdraw (line 748) | _simulateWithdraw(withdraws: RebalanceWithWithdraw[]): {
    method simulateRebalance (line 832) | async simulateRebalance(
    method totalAmounts (line 906) | totalAmounts(): BN[] {
    method totalFeeAmounts (line 918) | totalFeeAmounts(): BN[] {
    method totalRewardAmounts (line 930) | totalRewardAmounts(): BN[] {
  function getPositionWidthWithMinWidth (line 946) | function getPositionWidthWithMinWidth(lowerBinId: number, upperBinId: nu...
  function validateAndSortRebalanceDeposit (line 951) | function validateAndSortRebalanceDeposit(deposits: RebalanceWithDeposit[...
  function validateAndSortRebalanceWithdraw (line 974) | function validateAndSortRebalanceWithdraw(
  type RebalancePositionBinData (line 1014) | interface RebalancePositionBinData {
  type RebalanceWithDeposit (line 1033) | interface RebalanceWithDeposit {
  type RebalanceWithWithdraw (line 1050) | interface RebalanceWithWithdraw {
  type SimulateRebalanceResp (line 1059) | interface SimulateRebalanceResp {
  function binRangeToBinIdArray (line 1072) | function binRangeToBinIdArray(minBinId: BN, maxBinId: BN): BN[] {
  function getRebalanceBinArrayIndexesAndBitmapCoverage (line 1085) | function getRebalanceBinArrayIndexesAndBitmapCoverage(

FILE: ts-client/src/dlmm/helpers/rebalance/strategy/balanced.ts
  class BalancedStrategyBuilder (line 18) | class BalancedStrategyBuilder implements RebalanceStrategyBuilder {
    method constructor (line 19) | constructor(
    method buildRebalanceStrategyParameters (line 33) | buildRebalanceStrategyParameters(): RebalanceDepositWithdrawParameters {

FILE: ts-client/src/dlmm/helpers/rebalance/strategy/index.ts
  type RebalanceDepositWithdrawParameters (line 8) | interface RebalanceDepositWithdrawParameters {
  type RebalanceStrategyBuilder (line 15) | interface RebalanceStrategyBuilder {
  constant MAX_BPS (line 19) | const MAX_BPS = new BN(BASIS_POINT_MAX);
  function capBps (line 21) | function capBps(bps: BN) {

FILE: ts-client/src/dlmm/helpers/strategy.ts
  constant DEFAULT_MAX_WEIGHT (line 17) | const DEFAULT_MAX_WEIGHT = 2000;
  constant DEFAULT_MIN_WEIGHT (line 18) | const DEFAULT_MIN_WEIGHT = 200;
  function toWeightSpotBalanced (line 20) | function toWeightSpotBalanced(
  function toWeightDescendingOrder (line 37) | function toWeightDescendingOrder(
  function toWeightAscendingOrder (line 54) | function toWeightAscendingOrder(
  function toWeightCurve (line 71) | function toWeightCurve(
  function toWeightBidAsk (line 113) | function toWeightBidAsk(
  function toAmountsBothSideByStrategy (line 171) | function toAmountsBothSideByStrategy(
  function autoFillYByStrategy (line 508) | function autoFillYByStrategy(
  function autoFillXByStrategy (line 556) | function autoFillXByStrategy(
  function toStrategyParameters (line 603) | function toStrategyParameters({

FILE: ts-client/src/dlmm/helpers/token_2022.ts
  function getMultipleMintsExtraAccountMetasForTransferHook (line 23) | async function getMultipleMintsExtraAccountMetasForTransferHook(
  function getExtraAccountMetasForTransferHook (line 52) | async function getExtraAccountMetasForTransferHook(
  function calculatePreFeeAmount (line 119) | function calculatePreFeeAmount(transferFee: TransferFee, postFeeAmount: ...
  function calculateInverseFee (line 152) | function calculateInverseFee(transferFee: TransferFee, postFeeAmount: BN) {
  type TransferFeeIncludedAmount (line 159) | interface TransferFeeIncludedAmount {
  function calculateTransferFeeIncludedAmount (line 164) | function calculateTransferFeeIncludedAmount(
  type TransferFeeExcludedAmount (line 200) | interface TransferFeeExcludedAmount {
  function calculateTransferFeeExcludedAmount (line 205) | function calculateTransferFeeExcludedAmount(

FILE: ts-client/src/dlmm/helpers/u64xu64_math.ts
  constant MAX_EXPONENTIAL (line 4) | const MAX_EXPONENTIAL = new BN(0x80000);
  constant ONE (line 6) | const ONE = new BN(1).shln(SCALE_OFFSET);
  constant MAX (line 7) | const MAX = new BN(2).pow(new BN(128)).sub(new BN(1));
  function pow (line 9) | function pow(base: BN, exp: BN): BN {

FILE: ts-client/src/dlmm/helpers/weight.ts
  function getPriceOfBinByBinId (line 13) | function getPriceOfBinByBinId(binId: number, binStep: number): Decimal {
  function buildGaussianFromBins (line 19) | function buildGaussianFromBins(activeBin: number, binIds: number[]) {
  function generateBinLiquidityAllocation (line 47) | function generateBinLiquidityAllocation(
  function computeAllocationBps (line 61) | function computeAllocationBps(allocations: number[]): {
  function toWeightDistribution (line 82) | function toWeightDistribution(
  function calculateSpotDistribution (line 133) | function calculateSpotDistribution(
  function calculateBidAskDistribution (line 211) | function calculateBidAskDistribution(
  function calculateNormalDistribution (line 347) | function calculateNormalDistribution(
  function fromWeightDistributionToAmountOneSide (line 480) | function fromWeightDistributionToAmountOneSide(
  function fromWeightDistributionToAmount (line 518) | function fromWeightDistributionToAmount(

FILE: ts-client/src/dlmm/helpers/weightToAmounts.ts
  function toAmountBidSide (line 20) | function toAmountBidSide(
  function toAmountAskSide (line 73) | function toAmountAskSide(
  function toAmountBothSide (line 145) | function toAmountBothSide(
  function autoFillYByWeight (line 321) | function autoFillYByWeight(
  function autoFillXByWeight (line 396) | function autoFillXByWeight(

FILE: ts-client/src/dlmm/idl/idl.ts
  type LbClmm (line 7) | type LbClmm = {

FILE: ts-client/src/dlmm/index.ts
  class DLMM (line 221) | class DLMM {
    method constructor (line 222) | constructor(
    method getLbPairs (line 246) | public static async getLbPairs(
    method getPairPubkeyIfExists (line 265) | public static async getPairPubkeyIfExists(
    method getCustomizablePermissionlessLbPairIfExists (line 342) | public static async getCustomizablePermissionlessLbPairIfExists(
    method create (line 374) | static async create(
    method createMultiple (line 575) | static async createMultiple(
    method getAllPresetParameters (line 858) | static async getAllPresetParameters(connection: Connection, opt?: Opt) {
    method getAllLbPairPositionsByUser (line 884) | static async getAllLbPairPositionsByUser(
    method getPricePerLamport (line 1148) | public static getPricePerLamport(
    method getBinIdFromPrice (line 1158) | public static getBinIdFromPrice(
    method getLbPairLockInfo (line 1178) | public async getLbPairLockInfo(
    method createCustomizablePermissionlessLbPair2 (line 1304) | public static async createCustomizablePermissionlessLbPair2(
    method createCustomizablePermissionlessLbPair (line 1481) | public static async createCustomizablePermissionlessLbPair(
    method createLbPair (line 1645) | public static async createLbPair(
    method createLbPair2 (line 1721) | public static async createLbPair2(
    method refetchStates (line 1813) | public async refetchStates(): Promise<void> {
    method setPairStatusPermissionless (line 1978) | public async setPairStatusPermissionless(
    method getBinArrays (line 2006) | public async getBinArrays(): Promise<BinArrayAccount[]> {
    method getBinArrayForSwap (line 2020) | public async getBinArrayForSwap(
    method calculateFeeInfo (line 2092) | public static calculateFeeInfo(
    method getFeeInfo (line 2119) | public getFeeInfo(): FeeInfo {
    method getDynamicFee (line 2144) | public getDynamicFee(): Decimal {
    method getEmissionRate (line 2177) | public getEmissionRate(): EmissionRate {
    method getBinsAroundActiveBin (line 2206) | public async getBinsAroundActiveBin(
    method getBinsBetweenMinAndMaxPrice (line 2233) | public async getBinsBetweenMinAndMaxPrice(
    method getBinsBetweenLowerAndUpperBound (line 2265) | public async getBinsBetweenLowerAndUpperBound(
    method toPricePerLamport (line 2289) | public toPricePerLamport(price: number): string {
    method fromPricePerLamport (line 2303) | public fromPricePerLamport(pricePerLamport: number): string {
    method getActiveBin (line 2317) | public async getActiveBin(): Promise<BinLiquidity> {
    method getBinIdFromPrice (line 2339) | public getBinIdFromPrice(price: number, min: boolean): number {
    method getPositionsByUserAndLbPair (line 2357) | public async getPositionsByUserAndLbPair(
    method quoteExtendPosition (line 2486) | public async quoteExtendPosition(
    method quoteCreatePosition (line 2517) | public async quoteCreatePosition({ strategy }: TQuoteCreatePositionPar...
    method createEmptyPosition (line 2592) | public async createEmptyPosition({
    method getPosition (line 2652) | public async getPosition(positionPubKey: PublicKey): Promise<LbPositio...
    method initializeMultiplePositionAndAddLiquidityByStrategy2 (line 2722) | public async initializeMultiplePositionAndAddLiquidityByStrategy2(
    method initializeMultiplePositionAndAddLiquidityByStrategy (line 2879) | public async initializeMultiplePositionAndAddLiquidityByStrategy(
    method addLiquidityByStrategyChunkable (line 3020) | public async addLiquidityByStrategyChunkable({
    method initializePositionAndAddLiquidityByStrategy (line 3087) | public async initializePositionAndAddLiquidityByStrategy({
    method initializePositionAndAddLiquidityByWeight (line 3284) | public async initializePositionAndAddLiquidityByWeight({
    method addLiquidityByStrategy (line 3574) | public async addLiquidityByStrategy({
    method addLiquidityByWeight (line 3759) | public async addLiquidityByWeight({
    method removeLiquidity (line 4043) | public async removeLiquidity({
    method closePositionIfEmpty (line 4368) | public async closePositionIfEmpty({
    method closePosition (line 4407) | public async closePosition({
    method swapQuoteExactOut (line 4456) | public swapQuoteExactOut(
    method swapQuote (line 4662) | public swapQuote(
    method swapExactOut (line 4891) | public async swapExactOut({
    method swapWithPriceImpact (line 5019) | public async swapWithPriceImpact({
    method swap (line 5141) | public async swap({
    method claimLMReward (line 5259) | public async claimLMReward({
    method claimAllLMRewards (line 5309) | public async claimAllLMRewards({
    method setActivationPoint (line 5369) | public async setActivationPoint(activationPoint: BN) {
    method setPairStatus (line 5388) | public async setPairStatus(enabled: boolean): Promise<Transaction> {
    method claimSwapFee (line 5416) | public async claimSwapFee({
    method claimAllSwapFee (line 5463) | public async claimAllSwapFee({
    method claimAllRewardsByPosition (line 5530) | public async claimAllRewardsByPosition({
    method seedLiquidity (line 5598) | public async seedLiquidity(
    method seedLiquiditySingleBin (line 6048) | public async seedLiquiditySingleBin(
    method initializeBinArrays (line 6352) | public async initializeBinArrays(binArrayIndexes: BN[], funder: Public...
    method initializePositionByOperator (line 6404) | public async initializePositionByOperator({
    method claimAllRewards (line 6480) | public async claimAllRewards({
    method canSyncWithMarketPrice (line 6547) | public canSyncWithMarketPrice(marketPrice: number, activeBinId: number) {
    method syncWithMarketPrice (line 6584) | public async syncWithMarketPrice(marketPrice: number, owner: PublicKey) {
    method getMaxPriceInBinArrays (line 6696) | public async getMaxPriceInBinArrays(
    method isSwapDisabled (line 6733) | public isSwapDisabled(swapInitiator: PublicKey) {
    method decreasePositionLength (line 6774) | public async decreasePositionLength(
    method increasePositionLength (line 6855) | public async increasePositionLength(
    method simulateRebalancePositionWithBalancedStrategy (line 6898) | public async simulateRebalancePositionWithBalancedStrategy(
    method simulateRebalancePositionWithStrategy (line 6933) | private async simulateRebalancePositionWithStrategy(
    method quoteBinArrayAccountsRentalCost (line 6964) | private async quoteBinArrayAccountsRentalCost(
    method simulateRebalancePosition (line 7044) | public async simulateRebalancePosition(
    method rebalancePosition (line 7094) | public async rebalancePosition(
    method createExtendedEmptyPosition (line 7404) | public async createExtendedEmptyPosition(
    method createInitAndExtendPositionIx (line 7435) | private async createInitAndExtendPositionIx(
    method increasePositionLengthIxs (line 7493) | private async increasePositionLengthIxs(
    method getBinArrays (line 7554) | private static async getBinArrays(
    method processPosition (line 7561) | private static async processPosition(
    method getBinsBetweenLowerAndUpperBound (line 7797) | private static getBinsBetweenLowerAndUpperBound(
    method processXYAmountDistribution (line 7881) | private processXYAmountDistribution(xYAmountDistribution: BinAndAmount...
    method getBins (line 7908) | private async getBins(
    method binArraysToBeCreate (line 7968) | private async binArraysToBeCreate(
    method createBinArraysIfNeeded (line 7995) | private async createBinArraysIfNeeded(
    method updateVolatilityAccumulator (line 8026) | public static updateVolatilityAccumulator(
    method updateReference (line 8041) | public static updateReference(
    method createClaimBuildMethod (line 8064) | private async createClaimBuildMethod({
    method createClaimSwapFeeMethod (line 8150) | private async createClaimSwapFeeMethod({
    method getPotentialToken2022IxDataAndAccounts (line 8272) | public getPotentialToken2022IxDataAndAccounts(
    method getOracle (line 8317) | public async getOracle(): Promise<IDynamicOracle> {
    method increaseOracleLength (line 8351) | public async increaseOracleLength(

FILE: ts-client/src/dlmm/types/index.ts
  type FeeInfo (line 23) | interface FeeInfo {
  type BinAndAmount (line 29) | interface BinAndAmount {
  type TokenReserve (line 35) | interface TokenReserve {
  type ClmmProgram (line 44) | type ClmmProgram = Program<LbClmm>;
  type LbPair (line 46) | type LbPair = IdlAccounts<LbClmm>["lbPair"];
  type LbPairAccount (line 47) | type LbPairAccount = ProgramAccount<IdlAccounts<LbClmm>["lbPair"]>;
  type AccountName (line 49) | type AccountName = keyof AllAccountsMap<LbClmm>;
  type Bin (line 51) | type Bin = IdlTypes<LbClmm>["bin"];
  type BinArray (line 52) | type BinArray = IdlAccounts<LbClmm>["binArray"];
  type BinArrayAccount (line 53) | type BinArrayAccount = ProgramAccount<IdlAccounts<LbClmm>["binArray"]>;
  type Position (line 55) | type Position = IdlAccounts<LbClmm>["position"];
  type PositionV2 (line 56) | type PositionV2 = IdlAccounts<LbClmm>["positionV2"];
  type PresetParameter (line 58) | type PresetParameter = IdlAccounts<LbClmm>["presetParameter"];
  type PresetParameter2 (line 59) | type PresetParameter2 = IdlAccounts<LbClmm>["presetParameter2"];
  type vParameters (line 61) | type vParameters = IdlAccounts<LbClmm>["lbPair"]["vParameters"];
  type sParameters (line 62) | type sParameters = IdlAccounts<LbClmm>["lbPair"]["parameters"];
  type RewardInfos (line 63) | type RewardInfos = IdlAccounts<LbClmm>["lbPair"]["rewardInfos"];
  type RewardInfo (line 64) | type RewardInfo = IdlTypes<LbClmm>["rewardInfo"];
  type UserRewardInfo (line 66) | type UserRewardInfo = IdlTypes<LbClmm>["userRewardInfo"];
  type UserFeeInfo (line 67) | type UserFeeInfo = IdlTypes<LbClmm>["feeInfo"];
  type RebalanceAddLiquidityParam (line 68) | type RebalanceAddLiquidityParam = IdlTypes<LbClmm>["addLiquidityParams"];
  type RebalanceRemoveLiquidityParam (line 69) | type RebalanceRemoveLiquidityParam =
  type InitPermissionPairIx (line 72) | type InitPermissionPairIx = IdlTypes<LbClmm>["initPermissionPairIx"];
  type InitCustomizablePermissionlessPairIx (line 73) | type InitCustomizablePermissionlessPairIx =
  type BinLiquidityDistribution (line 76) | type BinLiquidityDistribution =
  type BinLiquidityReduction (line 78) | type BinLiquidityReduction = IdlTypes<LbClmm>["binLiquidityReduction"];
  type BinArrayBitmapExtensionAccount (line 80) | type BinArrayBitmapExtensionAccount = ProgramAccount<
  type BinArrayBitmapExtension (line 83) | type BinArrayBitmapExtension =
  type LiquidityParameterByWeight (line 86) | type LiquidityParameterByWeight =
  type LiquidityOneSideParameter (line 88) | type LiquidityOneSideParameter =
  type LiquidityParameterByStrategy (line 91) | type LiquidityParameterByStrategy =
  type LiquidityParameterByStrategyOneSide (line 93) | type LiquidityParameterByStrategyOneSide =
  type LiquidityParameter (line 95) | type LiquidityParameter = IdlTypes<LbClmm>["liquidityParameter"];
  type ProgramStrategyParameter (line 97) | type ProgramStrategyParameter = IdlTypes<LbClmm>["strategyParameters"];
  type ProgramStrategyType (line 98) | type ProgramStrategyType = IdlTypes<LbClmm>["strategyType"];
  type RemainingAccountInfo (line 100) | type RemainingAccountInfo = IdlTypes<LbClmm>["remainingAccountsInfo"];
  type RemainingAccountsInfoSlice (line 101) | type RemainingAccountsInfoSlice =
  type CompressedBinDepositAmount (line 104) | type CompressedBinDepositAmount =
  type CompressedBinDepositAmounts (line 106) | type CompressedBinDepositAmounts = CompressedBinDepositAmount[];
  type ResizeSideEnum (line 108) | type ResizeSideEnum = IdlTypes<LbClmm>["resizeSide"];
  type ExtendedPositionBinData (line 109) | type ExtendedPositionBinData = IdlTypes<LbClmm>["positionBinData"];
  type Oracle (line 111) | type Oracle = IdlTypes<LbClmm>["oracle"];
  type LbPosition (line 113) | interface LbPosition {
  type PositionInfo (line 119) | interface PositionInfo {
  type FeeInfo (line 127) | interface FeeInfo {
  type EmissionRate (line 133) | interface EmissionRate {
  type SwapFee (line 138) | interface SwapFee {
  type LMRewards (line 143) | interface LMRewards {
  type PositionVersion (line 148) | enum PositionVersion {
  type PairType (line 153) | enum PairType {
  type ShrinkMode (line 160) | enum ShrinkMode {
  type StrategyType (line 176) | enum StrategyType {
  type ActivationType (line 182) | enum ActivationType {
  constant POSITION_MIN_SIZE (line 188) | const POSITION_MIN_SIZE = 8112;
  constant POSITION_BIN_DATA_SIZE (line 189) | const POSITION_BIN_DATA_SIZE = 112;
  type StrategyParameters (line 191) | interface StrategyParameters {
  type TQuoteCreatePositionParams (line 198) | interface TQuoteCreatePositionParams {
  type TInitializePositionAndAddLiquidityParams (line 202) | interface TInitializePositionAndAddLiquidityParams {
  type TInitializePositionAndAddLiquidityParamsByStrategy (line 211) | interface TInitializePositionAndAddLiquidityParamsByStrategy {
  type InitializeMultiplePositionAndAddLiquidityByStrategyResponse (line 220) | interface InitializeMultiplePositionAndAddLiquidityByStrategyResponse {
  type InitializeMultiplePositionAndAddLiquidityByStrategyResponse2 (line 229) | interface InitializeMultiplePositionAndAddLiquidityByStrategyResponse2 {
  type TInitializeMultiplePositionAndAddLiquidityParamsByStrategy (line 237) | interface TInitializeMultiplePositionAndAddLiquidityParamsByStrategy {
  type BinLiquidity (line 246) | interface BinLiquidity {
  function fromBin (line 260) | function fromBin(
  function empty (line 285) | function empty(
  type SwapQuote (line 310) | interface SwapQuote {
  type SwapQuoteExactOut (line 321) | interface SwapQuoteExactOut {
  type IAccountsCache (line 331) | interface IAccountsCache {
  type PositionBinData (line 336) | interface PositionBinData {
  type PositionData (line 351) | interface PositionData {
  type SwapWithPriceImpactParams (line 374) | interface SwapWithPriceImpactParams {
  type SwapParams (line 402) | interface SwapParams {
  type SwapExactOutParams (line 430) | interface SwapExactOutParams {
  type GetOrCreateATAResponse (line 458) | interface GetOrCreateATAResponse {
  type BitmapType (line 463) | enum BitmapType {
  type SeedLiquidityResponse (line 468) | interface SeedLiquidityResponse {
  type SeedLiquiditySingleBinResponse (line 475) | interface SeedLiquiditySingleBinResponse {
  type SeedLiquidityCostBreakdown (line 480) | interface SeedLiquidityCostBreakdown {
  type Clock (line 489) | interface Clock {
  type PairStatus (line 505) | enum PairStatus {
  type PairLockInfo (line 510) | interface PairLockInfo {
  type PositionLockInfo (line 514) | interface PositionLockInfo {
  type ActionType (line 522) | enum ActionType {
  type ResizeSide (line 527) | enum ResizeSide {
  constant MEMO_PROGRAM_ID (line 532) | const MEMO_PROGRAM_ID = new PublicKey(
  type RebalancePositionResponse (line 536) | interface RebalancePositionResponse {
  type RebalancePositionBinArrayRentalCostQuote (line 541) | interface RebalancePositionBinArrayRentalCostQuote {
  constant REBALANCE_POSITION_PADDING (line 548) | const REBALANCE_POSITION_PADDING = Array(31).fill(0);
  type ChunkCallbackInfo (line 550) | interface ChunkCallbackInfo {
  type ChunkCallback (line 557) | type ChunkCallback = (
  type GetPositionsOpt (line 565) | interface GetPositionsOpt {

FILE: ts-client/src/examples/example.ts
  constant RPC (line 17) | const RPC = process.env.RPC || "https://api.devnet.solana.com";
  type ParsedClockState (line 25) | interface ParsedClockState {
  function getActiveBin (line 45) | async function getActiveBin(dlmmPool: DLMM) {
  function createBalancePosition (line 52) | async function createBalancePosition(dlmmPool: DLMM) {
  function createImbalancePosition (line 92) | async function createImbalancePosition(dlmmPool: DLMM) {
  function createOneSidePosition (line 129) | async function createOneSidePosition(dlmmPool: DLMM) {
  function getPositionsState (line 166) | async function getPositionsState(dlmmPool: DLMM) {
  function addLiquidityToExistingPosition (line 176) | async function addLiquidityToExistingPosition(dlmmPool: DLMM) {
  function removePositionLiquidity (line 212) | async function removePositionLiquidity(dlmmPool: DLMM) {
  function swap (line 250) | async function swap(dlmmPool: DLMM) {
  function initializePositionAndAddLiquidityByStrategyParallelExecution (line 298) | async function initializePositionAndAddLiquidityByStrategyParallelExecut...
  function main (line 370) | async function main() {

FILE: ts-client/src/examples/fetch_lb_pair_lock_info.ts
  function fetchLbPairLockInfoExample (line 4) | async function fetchLbPairLockInfoExample() {

FILE: ts-client/src/examples/get_oracle.ts
  function main (line 11) | async function main() {

FILE: ts-client/src/examples/initialize_bin_arrays.ts
  function initializeBinArrayExample (line 8) | async function initializeBinArrayExample() {

FILE: ts-client/src/examples/swap_quote.ts
  function swapQuote (line 5) | async function swapQuote(
  function main (line 36) | async function main() {

FILE: ts-client/src/server/index.ts
  type Request (line 11) | interface Request {
  function safeStringify (line 36) | function safeStringify(obj: Record<string, any>): string {

FILE: ts-client/src/test/bug_fix.test.ts
  function createMintAndPair (line 48) | async function createMintAndPair(

FILE: ts-client/src/test/calculate_distribution.test.ts
  type Distribution (line 33) | interface Distribution {
  method toBeCloseTo (line 40) | toBeCloseTo(received: number, expected: number, precision: number) {
  function debugDistributionChart (line 51) | function debugDistributionChart(distributions: Distribution[]) {
  function assertDistributionAroundActiveBin (line 414) | function assertDistributionAroundActiveBin(
  function assertDistributionAroundActiveBin (line 574) | function assertDistributionAroundActiveBin(

FILE: ts-client/src/test/external/helper.ts
  function createExtraAccountMetaListAndCounter (line 10) | async function createExtraAccountMetaListAndCounter(
  function deriveCounter (line 36) | function deriveCounter(mint: web3.PublicKey, programId: web3.PublicKey) {

FILE: ts-client/src/test/external/program.ts
  constant TRANSFER_HOOK_COUNTER_PROGRAM_ID (line 6) | const TRANSFER_HOOK_COUNTER_PROGRAM_ID = new web3.PublicKey(
  function createTransferHookCounterProgram (line 10) | function createTransferHookCounterProgram(

FILE: ts-client/src/test/external/transfer_hook_counter.ts
  type TransferHookCounter (line 7) | type TransferHookCounter = {

FILE: ts-client/src/test/helper.ts
  function createTestProgram (line 23) | function createTestProgram(
  function assertAmountWithPrecision (line 36) | function assertAmountWithPrecision(
  function assertPosition (line 56) | async function assertPosition({
  function assertEqRebalanceSimulationWithActualResult (line 109) | function assertEqRebalanceSimulationWithActualResult(
  function swap (line 158) | async function swap(
  function logPositionLiquidities (line 189) | function logPositionLiquidities(parsedPosition: PositionData) {
  function assertionWithTolerance (line 207) | function assertionWithTolerance(
  function assertionWithPercentageTolerance (line 220) | function assertionWithPercentageTolerance(
  function logLbPairLiquidities (line 234) | async function logLbPairLiquidities(
  type OperatorPermission (line 273) | enum OperatorPermission {
  function encodePermissions (line 290) | function encodePermissions(permissions: OperatorPermission[]): BN {
  function createWhitelistOperator (line 296) | async function createWhitelistOperator(

FILE: ts-client/src/test/oracle.test.ts
  function obs (line 11) | function obs(
  constant UNINIT (line 23) | const UNINIT = obs(0, 0, 0);
  function createOracle (line 25) | function createOracle(params: {

FILE: ts-client/src/test/rebalance.test.ts
  constant CONSTANTS (line 51) | const CONSTANTS = Object.entries(IDL.constants);
  constant BIN_ARRAY_BITMAP_SIZE (line 52) | const BIN_ARRAY_BITMAP_SIZE = new BN(
  constant MAX_BIN_PER_ARRAY (line 55) | const MAX_BIN_PER_ARRAY = new BN(
  constant DEFAULT_ACTIVE_ID (line 59) | const DEFAULT_ACTIVE_ID = new BN(1);
  constant DEFAULT_BIN_STEP (line 60) | const DEFAULT_BIN_STEP = new BN(10);
  constant DEFAULT_BASE_FACTOR_2 (line 61) | const DEFAULT_BASE_FACTOR_2 = new BN(4000);
  constant BTC (line 65) | let BTC: web3.PublicKey;
  constant USDC (line 66) | let USDC: web3.PublicKey;
  function getBeforeAfterPositionWidth (line 1182) | function getBeforeAfterPositionWidth(

FILE: ts-client/src/test/rebalance_parameter_builder.test.ts
  function assertBinDepositResult (line 16) | function assertBinDepositResult(
  function logLiquidityInfo (line 65) | function logLiquidityInfo(

FILE: ts-client/src/test/rebalance_with_strategy.test.ts
  constant CONSTANTS (line 52) | const CONSTANTS = Object.entries(IDL.constants);
  constant MAX_BIN_PER_ARRAY (line 53) | const MAX_BIN_PER_ARRAY = new BN(
  constant DEFAULT_ACTIVE_ID (line 57) | const DEFAULT_ACTIVE_ID = new BN(1);
  constant DEFAULT_BIN_STEP (line 58) | const DEFAULT_BIN_STEP = new BN(10);
  constant DEFAULT_BASE_FACTOR_2 (line 59) | const DEFAULT_BASE_FACTOR_2 = new BN(4000);
  constant BTC (line 64) | let BTC: web3.PublicKey;
  constant USDC (line 65) | let USDC: web3.PublicKey;
  function closeAndCreateNewPositionWithSpotLiquidity (line 72) | async function closeAndCreateNewPositionWithSpotLiquidity(

FILE: ts-client/src/test/sdk.test.ts
  constant CONSTANTS (line 58) | const CONSTANTS = Object.entries(IDL.constants);
  constant BIN_ARRAY_BITMAP_SIZE (line 59) | const BIN_ARRAY_BITMAP_SIZE = new BN(
  constant MAX_BIN_PER_ARRAY (line 62) | const MAX_BIN_PER_ARRAY = new BN(
  constant ACTIVE_ID_OUT_OF_RANGE (line 66) | const ACTIVE_ID_OUT_OF_RANGE = BIN_ARRAY_BITMAP_SIZE.addn(1);
  constant DEFAULT_ACTIVE_ID (line 67) | const DEFAULT_ACTIVE_ID = new BN(5660);
  constant DEFAULT_BIN_STEP (line 68) | const DEFAULT_BIN_STEP = new BN(10);
  constant DEFAULT_BASE_FACTOR (line 69) | const DEFAULT_BASE_FACTOR = new BN(10000);
  constant DEFAULT_BASE_FACTOR_2 (line 70) | const DEFAULT_BASE_FACTOR_2 = new BN(4000);
  constant BTC (line 74) | let BTC: web3.PublicKey;
  constant USDC (line 75) | let USDC: web3.PublicKey;
  function assertAmountWithPrecision (line 87) | function assertAmountWithPrecision(

FILE: ts-client/src/test/sdk_token2022.test.ts
  constant BTC2022 (line 94) | const BTC2022 = BTCKeypair.publicKey;
  constant SOL (line 95) | const SOL = NATIVE_MINT;
  constant MET2022 (line 96) | const MET2022 = METKeypair.publicKey;
  constant MAX_ALLOWED_LAMPORT_LOSS (line 115) | const MAX_ALLOWED_LAMPORT_LOSS = 500;
  type Opt (line 117) | type Opt = {

FILE: ts-client/src/test/token_2022.test.ts
  function createMintWithExtensions (line 58) | async function createMintWithExtensions(
Condensed preview — 201 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,222K chars).
[
  {
    "path": ".github/actions/setup-anchor/action.yml",
    "chars": 337,
    "preview": "name: \"Setup anchor-cli\"\ndescription: \"Setup anchor cli\"\nruns:\n  using: \"composite\"\n  steps:\n    - uses: taiki-e/cache-c"
  },
  {
    "path": ".github/actions/setup-dep/action.yml",
    "chars": 207,
    "preview": "name: \"Setup\"\ndescription: \"Setup program dependencies\"\nruns:\n  using: \"composite\"\n  steps:\n    - run: sudo apt-get upda"
  },
  {
    "path": ".github/actions/setup-solana/action.yml",
    "chars": 687,
    "preview": "name: \"Setup Solana\"\ndescription: \"Setup Solana\"\nruns:\n  using: \"composite\"\n  steps:\n    - uses: actions/cache@v4\n      "
  },
  {
    "path": ".github/workflows/ci-pr-main-cli.yml",
    "chars": 988,
    "preview": "name: DLMM Cli\n\non:\n  pull_request:\n    branches:\n      - main\n\nenv:\n  SOLANA_CLI_VERSION: 2.1.0\n  NODE_VERSION: 20.11.0"
  },
  {
    "path": ".github/workflows/ci-pr-main-market-making.yml",
    "chars": 1086,
    "preview": "name: DLMM Market Making Example\n\non:\n  pull_request:\n    branches:\n      - main\n\nenv:\n  SOLANA_CLI_VERSION: 2.1.0\n  NOD"
  },
  {
    "path": ".github/workflows/ci-pr-main-program.yml",
    "chars": 961,
    "preview": "name: DLMM Commons\n\non:\n  pull_request:\n    branches:\n      - main\n\njobs:\n  common_changed_files:\n    runs-on: ubuntu-la"
  },
  {
    "path": ".github/workflows/ci-pr-main-sdk.yml",
    "chars": 1491,
    "preview": "name: DLMM SDK\n\non:\n  pull_request:\n    branches:\n      - main\n\nenv:\n  SOLANA_CLI_VERSION: 2.1.0\n  NODE_VERSION: 20.11.0"
  },
  {
    "path": ".gitignore",
    "chars": 214,
    "preview": "\n.anchor\n.DS_Store\n**/*.rs.bk\nnode_modules\ntest-ledger\n.yarn\nyarn.lock\n.yarnrc.yml\n\ntarget/*\n!target/types\n!target/idl\n!"
  },
  {
    "path": ".prettierignore",
    "chars": 62,
    "preview": "\n.anchor\n.DS_Store\ntarget\nnode_modules\ndist\nbuild\ntest-ledger\n"
  },
  {
    "path": "Anchor.toml",
    "chars": 710,
    "preview": "[features]\nseeds = false\nskip-lint = false\n\n[registry]\nurl = \"https://api.apr.dev\"\n\n[provider]\ncluster = \"Localnet\"\nwall"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 27967,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": "Cargo.toml",
    "chars": 992,
    "preview": "[workspace]\nmembers = [\"cli\", \"commons\", \"market_making\"]\nresolver = \"2\"\n\n[workspace.dependencies]\nanchor-lang = \"0.31.0"
  },
  {
    "path": "Dockerfile",
    "chars": 161,
    "preview": "FROM node:20\nRUN mkdir dlmm-server\nWORKDIR /dlmm-server\nCOPY package*.json ./\nRUN npm install\nCOPY . .\nRUN npm run build"
  },
  {
    "path": "README.md",
    "chars": 175,
    "preview": "# LB CLMM SDK\n\n#### Quote Testing\n\n```\ncargo t -p commons --test '*'\n```\n\n#### SDK Testing\n\n```\n1. cd ts-client\n2. ancho"
  },
  {
    "path": "artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/6ipV2Sn7GCVgKG3Doqz1MpM33hranTMqxDmShj8Ro8cx.json",
    "chars": 13746,
    "preview": "{\"account\":{\"data\":[\"XI5c3AWURrUCAAAAAAAAAAEAAAAAAAAA1IU0HY1iX4PqLSKapSAZ9V7oYfw81zuci7LhJHF22IQAAAAAAAAAAAAAAAAAAAAABY/"
  },
  {
    "path": "artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/ERuqwiEFbQwNM8NhUMxUsvgGWbQpEyjbzhQLbBftCMPd.json",
    "chars": 13746,
    "preview": "{\"account\":{\"data\":[\"XI5c3AWURrUAAAAAAAAAAAEAAAAAAAAA1IU0HY1iX4PqLSKapSAZ9V7oYfw81zuci7LhJHF22IQAAAAAAAAAAAAAAAAAAAAAAAA"
  },
  {
    "path": "artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB.json",
    "chars": 1435,
    "preview": "{\"account\":{\"data\":[\"IQsxYrVlsQ0QJx4AWAKIE0CcAAAwVwUAalX//5aqAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wo"
  },
  {
    "path": "artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/FQuMNJ6UcrkA3xMLsmmLL8sk47RkZYod57mX3a8w1brg.json",
    "chars": 338,
    "preview": "{\"account\":{\"data\":[\"AQAAANe+8tVwdizbqse7oVmqHK+2vLnma1/yqcz5ATnQwE7PABAvMmFGYwEJAQEAAADXvvLVcHYs26rHu6FZqhyvtry55mtf8qn"
  },
  {
    "path": "artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/FR8HAZwQkmbmJXSqSp4CM3424emaMmJf7vz3u3RrYgRL.json",
    "chars": 13746,
    "preview": "{\"account\":{\"data\":[\"XI5c3AWURrX9/////////wEAAAAAAAAA1IU0HY1iX4PqLSKapSAZ9V7oYfw81zuci7LhJHF22IQAAAAAAAAAAAAAAAAAAAAAadP"
  },
  {
    "path": "artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/Gai2jqUAaJv8S68ibe69beV5DkhdBxAc6zoV3YQpuSNX.json",
    "chars": 13746,
    "preview": "{\"account\":{\"data\":[\"XI5c3AWURrX//////////wEAAAAAAAAA1IU0HY1iX4PqLSKapSAZ9V7oYfw81zuci7LhJHF22IQAAAAAAAAAAAAAAAAAAAAAmSf"
  },
  {
    "path": "artifacts/FJbEo74c2W4QLBBVUfUvi8VBWXtMdJVPuFpq2f6UV1iB/So11111111111111111111111111111111111111112.json",
    "chars": 343,
    "preview": "{\"account\":{\"data\":[\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  },
  {
    "path": "cli/Cargo.toml",
    "chars": 1105,
    "preview": "[package]\nname = \"cli\"\nversion = \"0.5.2\"\nedition = \"2021\"\ndescription = \"cli\"\nauthors = [\"tian <tian@racoons.dev>\"]\n\n# S"
  },
  {
    "path": "cli/README.md",
    "chars": 287,
    "preview": "# DLMM Cli\n\nCommand line utility for managing DLMM program.\n\n### Toolchain\n\n```\nchannel = 1.76.0\n```\n\nIf you're using M1"
  },
  {
    "path": "cli/src/args.rs",
    "chars": 6063,
    "preview": "use crate::instructions::{set_pair_status_permissionless::SetPairStatusPermissionlessParams, *};\nuse anchor_client::Clus"
  },
  {
    "path": "cli/src/instructions/add_liquidity.rs",
    "chars": 5712,
    "preview": "use crate::*;\nuse commons::dlmm::accounts::{LbPair, PositionV2};\nuse instructions::*;\n\n#[derive(Debug, Parser)]\npub stru"
  },
  {
    "path": "cli/src/instructions/admin/close_claim_protocol_fee_operator.rs",
    "chars": 1201,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct CloseClaimFeeOperatorParams {\n    #[clap(long)]\n    pub operator: Pub"
  },
  {
    "path": "cli/src/instructions/admin/close_preset_parameter.rs",
    "chars": 2046,
    "preview": "use crate::*;\nuse anchor_lang::Discriminator;\n\n#[derive(Debug, Parser)]\npub struct ClosePresetAccountParams {\n    /// Pr"
  },
  {
    "path": "cli/src/instructions/admin/create_claim_protocol_fee_operator.rs",
    "chars": 1243,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct CreateClaimFeeOperatorParams {\n    #[clap(long)]\n    pub operator: Pu"
  },
  {
    "path": "cli/src/instructions/admin/initialize_permission_lb_pair.rs",
    "chars": 4866,
    "preview": "use std::sync::Arc;\n\nuse crate::*;\nuse anchor_lang::AccountDeserialize;\nuse anchor_spl::token_interface::Mint;\nuse commo"
  },
  {
    "path": "cli/src/instructions/admin/initialize_preset_parameter.rs",
    "chars": 3884,
    "preview": "use anchor_lang::Discriminator;\nuse commons::dlmm::{accounts::PresetParameter2, types::InitPresetParameters2Ix};\nuse sol"
  },
  {
    "path": "cli/src/instructions/admin/initialize_reward.rs",
    "chars": 1997,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct InitializeRewardParams {\n    pub lb_pair: Pubkey,\n    pub reward_mint"
  },
  {
    "path": "cli/src/instructions/admin/initialize_token_badge.rs",
    "chars": 1196,
    "preview": "use crate::*;\nuse solana_sdk::system_program;\n\n#[derive(Debug, Parser)]\npub struct InitializeTokenBadgeParams {\n    /// "
  },
  {
    "path": "cli/src/instructions/admin/mod.rs",
    "chars": 1075,
    "preview": "pub mod close_preset_parameter;\npub use close_preset_parameter::*;\n\npub mod initialize_permission_lb_pair;\npub use initi"
  },
  {
    "path": "cli/src/instructions/admin/set_activation_point.rs",
    "chars": 1148,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct SetActivationPointParam {\n    /// Address of the pair\n    pub lb_pair"
  },
  {
    "path": "cli/src/instructions/admin/set_pre_activation_duration.rs",
    "chars": 1237,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct SetPreactivationDurationParam {\n    pub lb_pair: Pubkey,\n    pub pre_"
  },
  {
    "path": "cli/src/instructions/admin/set_pre_activation_swap_address.rs",
    "chars": 1263,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct SetPreactivationSwapAddressParam {\n    pub lb_pair: Pubkey,\n    pub p"
  },
  {
    "path": "cli/src/instructions/admin/toggle_pair_status.rs",
    "chars": 1126,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct SetPairStatusParams {\n    /// Address of the pair\n    pub lb_pair: Pu"
  },
  {
    "path": "cli/src/instructions/admin/update_base_fee.rs",
    "chars": 1668,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct UpdateBaseFeeParams {\n    pub lb_pair: Pubkey,\n    pub base_fee_bps: "
  },
  {
    "path": "cli/src/instructions/admin/update_reward_duration.rs",
    "chars": 1761,
    "preview": "use crate::*;\nuse commons::dlmm::accounts::{BinArray, LbPair};\n\n#[derive(Debug, Parser)]\npub struct UpdateRewardDuration"
  },
  {
    "path": "cli/src/instructions/admin/update_reward_funder.rs",
    "chars": 1239,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct UpdateRewardFunderParams {\n    pub lb_pair: Pubkey,\n    pub reward_in"
  },
  {
    "path": "cli/src/instructions/admin/withdraw_protocol_fee.rs",
    "chars": 3023,
    "preview": "use anchor_spl::associated_token::get_associated_token_address_with_program_id;\nuse commons::dlmm::accounts::LbPair;\n\nus"
  },
  {
    "path": "cli/src/instructions/claim_fee.rs",
    "chars": 4512,
    "preview": "use crate::*;\nuse instructions::*;\n\n#[derive(Debug, Parser)]\npub struct ClaimFeeParams {\n    /// Position address\n    pu"
  },
  {
    "path": "cli/src/instructions/claim_reward.rs",
    "chars": 3524,
    "preview": "use crate::*;\nuse instructions::*;\n\n#[derive(Debug, Parser)]\npub struct ClaimRewardParams {\n    pub lb_pair: Pubkey,\n   "
  },
  {
    "path": "cli/src/instructions/close_position.rs",
    "chars": 1678,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct ClosePositionParams {\n    pub position: Pubkey,\n}\n\npub async fn execu"
  },
  {
    "path": "cli/src/instructions/fund_reward.rs",
    "chars": 2853,
    "preview": "use crate::*;\nuse instructions::*;\n\n#[derive(Debug, Parser)]\npub struct FundRewardParams {\n    pub lb_pair: Pubkey,\n    "
  },
  {
    "path": "cli/src/instructions/get_all_positions.rs",
    "chars": 1284,
    "preview": "use crate::*;\nuse solana_client::rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig};\n\n#[derive(Debug, Parser)]"
  },
  {
    "path": "cli/src/instructions/ilm/mod.rs",
    "chars": 263,
    "preview": "pub mod remove_liquidity_by_price_range;\npub use remove_liquidity_by_price_range::*;\n\npub mod seed_liquidity_from_operat"
  },
  {
    "path": "cli/src/instructions/ilm/remove_liquidity_by_price_range.rs",
    "chars": 7962,
    "preview": "use crate::*;\nuse anchor_lang::AccountDeserialize;\nuse anchor_spl::token_interface::Mint;\nuse instructions::*;\n\n#[derive"
  },
  {
    "path": "cli/src/instructions/ilm/seed_liquidity_from_operator.rs",
    "chars": 26234,
    "preview": "use std::{collections::HashMap, ops::Index, u64};\n\nuse crate::*;\nuse anchor_lang::{prelude::Clock, AccountDeserialize};\n"
  },
  {
    "path": "cli/src/instructions/ilm/seed_liquidity_single_bin_by_operator.rs",
    "chars": 10820,
    "preview": "use std::sync::Arc;\n\nuse anchor_lang::{prelude::Clock, AccountDeserialize};\nuse anchor_spl::{\n    associated_token::get_"
  },
  {
    "path": "cli/src/instructions/increase_oracle_length.rs",
    "chars": 1355,
    "preview": "use crate::*;\nuse anchor_client::solana_sdk;\n\n#[derive(Debug, Parser)]\npub struct IncreaseOracleLengthParams {\n    pub l"
  },
  {
    "path": "cli/src/instructions/initialize_bin_array.rs",
    "chars": 1385,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct InitBinArrayParams {\n    /// Index of the bin array.\n    #[clap(long,"
  },
  {
    "path": "cli/src/instructions/initialize_bin_array_with_bin_range.rs",
    "chars": 1346,
    "preview": "use crate::*;\nuse instructions::*;\n\n#[derive(Debug, Parser)]\npub struct InitBinArrayWithBinRangeParams {\n    /// Address"
  },
  {
    "path": "cli/src/instructions/initialize_bin_array_with_price_range.rs",
    "chars": 1600,
    "preview": "use crate::*;\nuse instructions::*;\nuse rust_decimal::Decimal;\n\n#[derive(Debug, Parser)]\npub struct InitBinArrayWithPrice"
  },
  {
    "path": "cli/src/instructions/initialize_customizable_permissionless_lb_pair.rs",
    "chars": 5410,
    "preview": "use crate::*;\nuse anchor_lang::AccountDeserialize;\nuse anchor_spl::token_interface::Mint;\nuse instructions::*;\n\n#[derive"
  },
  {
    "path": "cli/src/instructions/initialize_customizable_permissionless_lb_pair2.rs",
    "chars": 5889,
    "preview": "use crate::*;\nuse anchor_lang::AccountDeserialize;\nuse anchor_spl::token_interface::Mint;\nuse instructions::*;\n\n#[derive"
  },
  {
    "path": "cli/src/instructions/initialize_lb_pair.rs",
    "chars": 3758,
    "preview": "use crate::*;\nuse anchor_lang::AccountDeserialize;\nuse anchor_spl::token_interface::Mint;\n\n#[derive(Debug, Parser)]\npub "
  },
  {
    "path": "cli/src/instructions/initialize_lb_pair2.rs",
    "chars": 4296,
    "preview": "use crate::*;\nuse anchor_lang::AccountDeserialize;\nuse anchor_spl::token_interface::Mint;\n\n#[derive(Debug, Parser)]\npub "
  },
  {
    "path": "cli/src/instructions/initialize_position.rs",
    "chars": 1789,
    "preview": "use std::sync::Arc;\n\nuse crate::*;\n\n#[derive(Debug, Parser)]\npub struct InitPositionParams {\n    /// Address of the liqu"
  },
  {
    "path": "cli/src/instructions/initialize_position_with_price_range.rs",
    "chars": 1338,
    "preview": "use crate::*;\nuse instructions::*;\nuse rust_decimal::Decimal;\n\n#[derive(Debug, Parser)]\npub struct InitPositionWithPrice"
  },
  {
    "path": "cli/src/instructions/list_all_binstep.rs",
    "chars": 3204,
    "preview": "use anchor_lang::Discriminator;\nuse solana_client::{\n    rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig},\n "
  },
  {
    "path": "cli/src/instructions/mod.rs",
    "chars": 1754,
    "preview": "pub mod add_liquidity;\npub use add_liquidity::*;\n\npub mod claim_fee;\npub use claim_fee::*;\n\npub mod claim_reward;\npub us"
  },
  {
    "path": "cli/src/instructions/remove_liquidity.rs",
    "chars": 4988,
    "preview": "use crate::*;\nuse instructions::*;\n\n#[derive(Debug, Parser)]\npub struct RemoveLiquidityParams {\n    /// Address of the l"
  },
  {
    "path": "cli/src/instructions/set_pair_status.rs",
    "chars": 1362,
    "preview": "use std::ops::Deref;\n\nuse anchor_client::solana_client::rpc_config::RpcSendTransactionConfig;\nuse anchor_client::{solana"
  },
  {
    "path": "cli/src/instructions/set_pair_status_permissionless.rs",
    "chars": 1239,
    "preview": "use crate::*;\n\n#[derive(Debug, Parser)]\npub struct SetPairStatusPermissionlessParams {\n    #[clap(long)]\n    pub lb_pair"
  },
  {
    "path": "cli/src/instructions/show_pair.rs",
    "chars": 3965,
    "preview": "use crate::*;\nuse anchor_lang::AccountDeserialize;\nuse anchor_spl::token_interface::Mint;\nuse rust_decimal::prelude::*;\n"
  },
  {
    "path": "cli/src/instructions/show_position.rs",
    "chars": 984,
    "preview": "use anchor_lang::Discriminator;\n\nuse crate::*;\n\n#[derive(Debug, Parser)]\npub struct ShowPositionParams {\n    pub positio"
  },
  {
    "path": "cli/src/instructions/show_preset_parameters.rs",
    "chars": 1041,
    "preview": "use anchor_lang::Discriminator;\n\nuse crate::*;\n\n#[derive(Debug, Parser)]\npub struct ShowPresetAccountParams {\n    pub pr"
  },
  {
    "path": "cli/src/instructions/simulate_swap_demand.rs",
    "chars": 2901,
    "preview": "use crate::instructions::utils::get_or_create_ata;\nuse crate::swap;\nuse crate::SwapExactInParameters;\nuse anchor_client:"
  },
  {
    "path": "cli/src/instructions/swap_exact_in.rs",
    "chars": 5085,
    "preview": "use crate::*;\nuse anchor_spl::associated_token::get_associated_token_address_with_program_id;\n\n#[derive(Debug, Parser)]\n"
  },
  {
    "path": "cli/src/instructions/swap_exact_out.rs",
    "chars": 4765,
    "preview": "use crate::*;\nuse anchor_spl::associated_token::get_associated_token_address;\n\n#[derive(Debug, Parser)]\npub struct SwapE"
  },
  {
    "path": "cli/src/instructions/swap_with_price_impact.rs",
    "chars": 5255,
    "preview": "use crate::*;\nuse anchor_spl::associated_token::get_associated_token_address_with_program_id;\n\n#[derive(Debug, Parser)]\n"
  },
  {
    "path": "cli/src/instructions/sync_price.rs",
    "chars": 3652,
    "preview": "use crate::*;\nuse anchor_spl::token_interface::Mint;\n\n#[derive(Debug, Parser)]\npub struct SyncPriceParams {\n    pub lb_p"
  },
  {
    "path": "cli/src/instructions/utils.rs",
    "chars": 7235,
    "preview": "use std::collections::HashMap;\n\nuse crate::*;\nuse anchor_client::solana_client::rpc_client::RpcClient as BlockingRpcClie"
  },
  {
    "path": "cli/src/main.rs",
    "chars": 10372,
    "preview": "use anchor_client::solana_sdk::compute_budget::ComputeBudgetInstruction;\nuse anchor_client::solana_sdk::instruction::Ins"
  },
  {
    "path": "cli/src/math.rs",
    "chars": 4014,
    "preview": "use anyhow::{anyhow, Result};\nuse commons::dlmm::types::Rounding;\nuse commons::{BASIS_POINT_MAX, SCALE_OFFSET};\nuse rust"
  },
  {
    "path": "command_list/claim_fee_from_operator.sh",
    "chars": 425,
    "preview": "cluster=https://api.mainnet-beta.solana.com\noperator_kp=~/.config/solana/id.json\npriority_fee=1000\n\nposition=[Position p"
  },
  {
    "path": "command_list/ilm_curve_by_operator.sh",
    "chars": 1279,
    "preview": "#!/bin/bash\ncluster=\"https://api.devnet.solana.com\"\n\n# Get from initialize pair\npair=\"[LB pair public key]\"\n\n# ILM param"
  },
  {
    "path": "command_list/ilm_single_bin_by_operator.sh",
    "chars": 1183,
    "preview": "#!/bin/bash\ncluster=\"https://api.devnet.solana.com\"\n# Get from initialize pair\npair=\"[LB pair public key]\"\n\n# Liquidity "
  },
  {
    "path": "command_list/set_bootstrapping_pair_status.sh",
    "chars": 473,
    "preview": "#!/bin/bash\n\ncluster=\"https://api.devnet.solana.com\"\n\npair=\"[LB pair public key]\"\npool_creator_path=\"[Pool creator keypa"
  },
  {
    "path": "commons/Cargo.toml",
    "chars": 1083,
    "preview": "[package]\nname = \"commons\"\nversion = \"0.3.2\"\nedition = \"2021\"\ndescription = \"Common libraries for DLMM\"\nauthors = [\"tian"
  },
  {
    "path": "commons/src/account_filters.rs",
    "chars": 530,
    "preview": "use anchor_client::solana_client::rpc_filter::{Memcmp, RpcFilterType};\nuse solana_sdk::pubkey::Pubkey;\n\npub fn position_"
  },
  {
    "path": "commons/src/constants.rs",
    "chars": 2148,
    "preview": "pub const BASIS_POINT_MAX: i32 = 10000;\n\n/// Maximum number of bin a bin array able to contains.\npub const MAX_BIN_PER_A"
  },
  {
    "path": "commons/src/conversions/activation_type.rs",
    "chars": 357,
    "preview": "use crate::*;\n\nimpl TryFrom<u8> for ActivationType {\n    type Error = anyhow::Error;\n\n    fn try_from(value: u8) -> Resu"
  },
  {
    "path": "commons/src/conversions/mod.rs",
    "chars": 217,
    "preview": "#![allow(unused_imports)]\npub mod status;\npub use status::*;\n\npub mod pair_type;\npub use pair_type::*;\n\npub mod activati"
  },
  {
    "path": "commons/src/conversions/pair_type.rs",
    "chars": 920,
    "preview": "use crate::*;\n\nimpl TryFrom<u8> for PairType {\n    type Error = anyhow::Error;\n\n    fn try_from(value: u8) -> Result<Sel"
  },
  {
    "path": "commons/src/conversions/status.rs",
    "chars": 598,
    "preview": "use crate::*;\n\nimpl TryFrom<u8> for PairStatus {\n    type Error = anyhow::Error;\n\n    fn try_from(value: u8) -> Result<S"
  },
  {
    "path": "commons/src/conversions/token_program_flag.rs",
    "chars": 706,
    "preview": "use crate::*;\nuse std::ops::Deref;\n\npub struct TokenProgramFlagWrapper(TokenProgramFlags);\n\nimpl Deref for TokenProgramF"
  },
  {
    "path": "commons/src/extensions/bin.rs",
    "chars": 5182,
    "preview": "use crate::*;\n\npub trait BinExtension {\n    fn get_or_store_bin_price(&mut self, id: i32, bin_step: u16) -> Result<u128>"
  },
  {
    "path": "commons/src/extensions/bin_array.rs",
    "chars": 3707,
    "preview": "use crate::*;\nuse num_integer::Integer;\nuse solana_sdk::{instruction::AccountMeta, pubkey::Pubkey};\n\npub trait BinArrayE"
  },
  {
    "path": "commons/src/extensions/bin_array_bitmap.rs",
    "chars": 10142,
    "preview": "use crate::*;\nuse ruint::aliases::U512;\n\npub trait BinArrayBitmapExtExtension {\n    fn bitmap_range() -> (i32, i32);\n   "
  },
  {
    "path": "commons/src/extensions/lb_pair.rs",
    "chars": 10473,
    "preview": "use crate::*;\nuse anchor_spl::token::spl_token;\nuse anchor_spl::token_2022::spl_token_2022;\nuse ruint::aliases::U1024;\nu"
  },
  {
    "path": "commons/src/extensions/mod.rs",
    "chars": 205,
    "preview": "pub mod lb_pair;\npub use lb_pair::*;\n\npub mod bin_array;\npub use bin_array::*;\n\npub mod bin;\npub use bin::*;\n\npub mod bi"
  },
  {
    "path": "commons/src/extensions/position.rs",
    "chars": 3284,
    "preview": "use crate::*;\nuse solana_sdk::{instruction::AccountMeta, pubkey::Pubkey};\n\npub trait PositionExtension {\n    fn get_bin_"
  },
  {
    "path": "commons/src/lib.rs",
    "chars": 558,
    "preview": "use anchor_lang::prelude::declare_program;\nuse anyhow::*;\n\ndeclare_program!(dlmm);\n\nuse dlmm::accounts::*;\nuse dlmm::typ"
  },
  {
    "path": "commons/src/math/mod.rs",
    "chars": 173,
    "preview": "pub mod price_math;\npub use price_math::*;\n\npub mod u64x64_math;\npub use u64x64_math::*;\n\npub mod u128x128_math;\npub use"
  },
  {
    "path": "commons/src/math/price_math.rs",
    "chars": 380,
    "preview": "use crate::*;\n\npub fn get_price_from_id(active_id: i32, bin_step: u16) -> Result<u128> {\n    let bps = u128::from(bin_st"
  },
  {
    "path": "commons/src/math/u128x128_math.rs",
    "chars": 1006,
    "preview": "use crate::Rounding;\nuse ruint::aliases::U256;\n\n/// (x * y) / denominator\npub fn mul_div(x: u128, y: u128, denominator: "
  },
  {
    "path": "commons/src/math/u64x64_math.rs",
    "chars": 6859,
    "preview": "// Precision when converting from decimal to fixed point. Or the other way around. 10^12\npub const PRECISION: u128 = 1_0"
  },
  {
    "path": "commons/src/math/utils.rs",
    "chars": 740,
    "preview": "use crate::*;\nuse num_traits::FromPrimitive;\n\n#[inline]\npub fn safe_mul_shr_cast<T: FromPrimitive>(\n    x: u128,\n    y: "
  },
  {
    "path": "commons/src/pda.rs",
    "chars": 4362,
    "preview": "use super::seeds::*;\nuse crate::*;\nuse anchor_client::solana_sdk::pubkey::Pubkey;\nuse std::{cmp::max, cmp::min};\n\npub fn"
  },
  {
    "path": "commons/src/quote.rs",
    "chars": 22278,
    "preview": "use crate::*;\nuse anchor_client::solana_sdk::pubkey::Pubkey;\nuse core::result::Result::Ok;\nuse solana_sdk::{account::Acc"
  },
  {
    "path": "commons/src/rpc_client_extension.rs",
    "chars": 707,
    "preview": "use crate::*;\nuse anchor_client::solana_client::nonblocking::rpc_client::RpcClient;\nuse async_trait::async_trait;\nuse so"
  },
  {
    "path": "commons/src/seeds.rs",
    "chars": 553,
    "preview": "use solana_sdk::pubkey;\nuse solana_sdk::pubkey::Pubkey;\n\npub const BIN_ARRAY: &[u8] = b\"bin_array\";\n\npub const ORACLE: &"
  },
  {
    "path": "commons/src/token_2022.rs",
    "chars": 8033,
    "preview": "use crate::*;\nuse anchor_client::solana_client::nonblocking::rpc_client::RpcClient;\nuse anchor_client::solana_client::rp"
  },
  {
    "path": "commons/src/typedefs.rs",
    "chars": 448,
    "preview": "#[derive(Debug)]\npub struct SwapResult {\n    /// Amount of token swap into the bin\n    pub amount_in_with_fees: u64,\n   "
  },
  {
    "path": "commons/tests/integration/helpers/mod.rs",
    "chars": 15,
    "preview": "pub mod utils;\n"
  },
  {
    "path": "commons/tests/integration/helpers/utils.rs",
    "chars": 3474,
    "preview": "use anchor_spl::associated_token::*;\nuse anchor_spl::token::spl_token;\nuse assert_matches::assert_matches;\nuse solana_pr"
  },
  {
    "path": "commons/tests/integration/main.rs",
    "chars": 519,
    "preview": "mod helpers;\nmod test_swap;\nmod test_swap_token2022;\n\nuse anchor_lang::*;\nuse anchor_spl::token::spl_token;\nuse anchor_s"
  },
  {
    "path": "commons/tests/integration/test_swap.rs",
    "chars": 11959,
    "preview": "use crate::*;\n\nstruct SplTestPair {\n    lb_pair: Pubkey,\n    reserve_x: Pubkey,\n    reserve_y: Pubkey,\n    token_x_mint:"
  },
  {
    "path": "commons/tests/integration/test_swap_token2022.rs",
    "chars": 13527,
    "preview": "use crate::*;\n\nstruct Token2022TestPair {\n    lb_pair: Pubkey,\n    reserve_x: Pubkey,\n    reserve_y: Pubkey,\n    token_x"
  },
  {
    "path": "idls/dlmm.json",
    "chars": 195715,
    "preview": "{\n  \"address\": \"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo\",\n  \"metadata\": {\n    \"name\": \"lb_clmm\",\n    \"version\": \"0.1"
  },
  {
    "path": "keys/localnet/admin-bossj3JvwiNK7pvjr149DqdtJxf2gdygbcmEPTkb2F1.json",
    "chars": 226,
    "preview": "[230,207,238,109,95,154,47,93,183,250,147,189,87,15,117,184,44,91,94,231,126,140,238,134,29,58,8,182,88,22,113,234,8,234"
  },
  {
    "path": "keys/localnet/program-LbVRzDTvBDEcrthxfZ4RL6yiq3uZw8bS6MwtdY6UhFQ.json",
    "chars": 226,
    "preview": "[237,14,0,252,204,70,136,161,168,214,209,214,165,86,118,17,167,67,226,89,141,50,93,57,21,217,228,215,232,31,23,19,5,5,8,"
  },
  {
    "path": "market_making/Cargo.toml",
    "chars": 1154,
    "preview": "[package]\nname = \"market_making\"\nversion = \"0.0.1\"\ndescription = \"Market making bot\"\nedition = \"2021\"\nauthors = [\"andrew"
  },
  {
    "path": "market_making/README.MD",
    "chars": 339,
    "preview": "An example for market making with DLMM\n\n### Toolchain\n\n```\nchannel = 1.76.0\n```\n\nIf you're using M1 chip\n\n```\nchannel = "
  },
  {
    "path": "market_making/src/bin_array_manager.rs",
    "chars": 4030,
    "preview": "use crate::*;\n\npub struct BinArrayManager<'a> {\n    pub bin_arrays: &'a [BinArray],\n}\n\nimpl<'a> BinArrayManager<'a> {\n  "
  },
  {
    "path": "market_making/src/config.json",
    "chars": 346,
    "preview": "[\n    {\n        \"pair_address\": \"jKzkEPEnoGkrR7QQqzsTDQ1MuGDSyHM3yCgYpNKwREm\",\n        \"x_amount\": 15000000000,\n        "
  },
  {
    "path": "market_making/src/core.rs",
    "chars": 34590,
    "preview": "use crate::MarketMakingMode;\nuse crate::*;\nuse anchor_spl::associated_token::get_associated_token_address_with_program_i"
  },
  {
    "path": "market_making/src/main.rs",
    "chars": 4772,
    "preview": "pub mod bin_array_manager;\npub mod core;\npub mod pair_config;\npub mod router;\npub mod state;\npub mod utils;\n\nuse crate::"
  },
  {
    "path": "market_making/src/pair_config.rs",
    "chars": 1684,
    "preview": "use crate::MarketMakingMode;\nuse anchor_lang::prelude::Pubkey;\nuse anyhow::*;\nuse serde::Deserialize;\nuse std::fs::File;"
  },
  {
    "path": "market_making/src/router.rs",
    "chars": 1521,
    "preview": "use std::sync::Arc;\n\nuse crate::Core;\nuse hyper::{Body, Request, Response, StatusCode};\nuse log::debug;\nuse routerify::p"
  },
  {
    "path": "market_making/src/state.rs",
    "chars": 8241,
    "preview": "use crate::*;\nuse anchor_spl::token_interface::Mint;\nuse bin_array_manager::BinArrayManager;\nuse rust_decimal::{prelude:"
  },
  {
    "path": "market_making/src/utils.rs",
    "chars": 4061,
    "preview": "use crate::*;\nuse anchor_spl::associated_token::get_associated_token_address_with_program_id;\nuse commitment_config::Com"
  },
  {
    "path": "package.json",
    "chars": 49,
    "preview": "{\n  \"dependencies\": {\n    \"pako\": \"^2.1.0\"\n  }\n}\n"
  },
  {
    "path": "python-client/dlmm/.gitignore",
    "chars": 13,
    "preview": "*/__pycache__"
  },
  {
    "path": "python-client/dlmm/README.md",
    "chars": 1277,
    "preview": "# DLMM Python SDK\n\n## Using the SDK\n1. Install the SDK and other necessary libraries\n```bash\npip install dlmm solders\n``"
  },
  {
    "path": "python-client/dlmm/dlmm/__init__.py",
    "chars": 52,
    "preview": "__version__ = \"0.1.0\"\n\nfrom .dlmm import DLMM_CLIENT"
  },
  {
    "path": "python-client/dlmm/dlmm/dlmm.py",
    "chars": 36383,
    "preview": "import json\nimport requests\nfrom typing import Dict, List, Optional\nfrom solana.transaction import Transaction\nfrom sold"
  },
  {
    "path": "python-client/dlmm/dlmm/types.py",
    "chars": 13976,
    "preview": "from dataclasses import dataclass\nfrom enum import Enum\nfrom solders.pubkey import Pubkey\nfrom typing import Any, List, "
  },
  {
    "path": "python-client/dlmm/dlmm/utils.py",
    "chars": 1099,
    "preview": "from typing import List\nfrom solders.hash import Hash\nfrom solders.pubkey import Pubkey\nfrom solders.keypair import Keyp"
  },
  {
    "path": "python-client/dlmm/pyproject.toml",
    "chars": 386,
    "preview": "[tool.poetry]\nname = \"dlmm\"\nversion = \"0.1.0\"\ndescription = \"\"\nauthors = [\"Tanishq Parkar <tanishqparkar@gmail.com>\"]\nre"
  },
  {
    "path": "python-client/dlmm/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "python-client/dlmm/tests/test_lp_flow.py",
    "chars": 3490,
    "preview": "import pytest\nfrom dlmm import DLMM_CLIENT\nfrom dlmm.dlmm import DLMM\nfrom dlmm.types import GetPositionByUser, Strategy"
  },
  {
    "path": "python-client/dlmm/tests/test_util_methods.py",
    "chars": 2662,
    "preview": "from dlmm.dlmm import DLMM, DLMM_CLIENT\nfrom solana.rpc.api import Client\nfrom solders.pubkey import Pubkey\nfrom dlmm.ty"
  },
  {
    "path": "rust-toolchain.toml",
    "chars": 31,
    "preview": "[toolchain]\nchannel = \"1.85.0\"\n"
  },
  {
    "path": "ts-client/README.md",
    "chars": 17732,
    "preview": "# DLMM SDK\n\n<p align=\"center\">\n<img align=\"center\" src=\"https://app.meteora.ag/icons/logo.svg\" width=\"180\" height=\"180\" "
  },
  {
    "path": "ts-client/jest.config.js",
    "chars": 239,
    "preview": "const TIMEOUT_SEC = 1000;\n\nmodule.exports = {\n  preset: \"ts-jest\",\n  testEnvironment: \"node\",\n  transform: {\n    \"^.+\\\\."
  },
  {
    "path": "ts-client/package.json",
    "chars": 1638,
    "preview": "{\n  \"name\": \"@meteora-ag/dlmm\",\n  \"version\": \"1.9.7\",\n  \"description\": \"\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./d"
  },
  {
    "path": "ts-client/src/dlmm/constants/index.ts",
    "chars": 3614,
    "preview": "import { LAMPORTS_PER_SOL, PublicKey } from \"@solana/web3.js\";\nimport { BN } from \"@coral-xyz/anchor\";\nimport IDL from \""
  },
  {
    "path": "ts-client/src/dlmm/error.ts",
    "chars": 1598,
    "preview": "import IDL from \"./idl/idl.json\";\nimport { AnchorError } from \"@coral-xyz/anchor\";\nimport { LBCLMM_PROGRAM_IDS } from \"."
  },
  {
    "path": "ts-client/src/dlmm/helpers/accountFilters.ts",
    "chars": 1661,
    "preview": "import { GetProgramAccountsFilter, PublicKey } from \"@solana/web3.js\";\nimport { bs58 } from \"@coral-xyz/anchor/dist/cjs/"
  },
  {
    "path": "ts-client/src/dlmm/helpers/binArray.ts",
    "chars": 13218,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport {\n  MAX_BIN_ARRAY_SIZE,\n  DE"
  },
  {
    "path": "ts-client/src/dlmm/helpers/computeUnit.ts",
    "chars": 2444,
    "preview": "import {\n  AddressLookupTableAccount,\n  Commitment,\n  ComputeBudgetProgram,\n  Connection,\n  PublicKey,\n  TransactionInst"
  },
  {
    "path": "ts-client/src/dlmm/helpers/derive.ts",
    "chars": 5744,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport { AccountMeta, Connection, PublicKey } from \"@solana/web3.js\";\nimport { D"
  },
  {
    "path": "ts-client/src/dlmm/helpers/fee.ts",
    "chars": 5558,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport {\n  BASIS_POINT_MAX,\n  FEE_PRECISION,\n  MAX_FEE_RATE,\n  SCALE_OFFSET,\n} f"
  },
  {
    "path": "ts-client/src/dlmm/helpers/index.ts",
    "chars": 27714,
    "preview": "import { AnchorProvider, BN, EventParser, Program } from \"@coral-xyz/anchor\";\nimport { IdlDiscriminator } from \"@coral-x"
  },
  {
    "path": "ts-client/src/dlmm/helpers/lbPair.ts",
    "chars": 1498,
    "preview": "import { AnchorProvider, Program } from \"@coral-xyz/anchor\";\nimport { Cluster, Connection, PublicKey } from \"@solana/web"
  },
  {
    "path": "ts-client/src/dlmm/helpers/math.ts",
    "chars": 7069,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport {\n  BASIS_POINT_MAX,\n  DEFAULT_BIN_PER_POSITION,\n  SCALE_OFFSET,\n} from \""
  },
  {
    "path": "ts-client/src/dlmm/helpers/oracle/index.ts",
    "chars": 27,
    "preview": "export * from \"./wrapper\";\n"
  },
  {
    "path": "ts-client/src/dlmm/helpers/oracle/wrapper.ts",
    "chars": 9480,
    "preview": "import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { Oracle } from \"../../types\";\nimport Decima"
  },
  {
    "path": "ts-client/src/dlmm/helpers/positions/index.ts",
    "chars": 10712,
    "preview": "import { AccountMeta, Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { binIdToBinArrayIn"
  },
  {
    "path": "ts-client/src/dlmm/helpers/positions/wrapper.ts",
    "chars": 4694,
    "preview": "import BN from \"bn.js\";\nimport {\n  ExtendedPositionBinData,\n  POSITION_MIN_SIZE,\n  PositionV2,\n  PositionVersion,\n  User"
  },
  {
    "path": "ts-client/src/dlmm/helpers/rebalance/index.ts",
    "chars": 75,
    "preview": "export * from \"./rebalancePosition\";\nexport * from \"./liquidity_strategy\";\n"
  },
  {
    "path": "ts-client/src/dlmm/helpers/rebalance/liquidity_strategy/bidAsk.ts",
    "chars": 8176,
    "preview": "import BN from \"bn.js\";\nimport { BidAskParameters, LiquidityStrategyParameterBuilder } from \".\";\nimport { SCALE_OFFSET }"
  },
  {
    "path": "ts-client/src/dlmm/helpers/rebalance/liquidity_strategy/curve.ts",
    "chars": 7525,
    "preview": "import BN from \"bn.js\";\nimport { BidAskParameters, LiquidityStrategyParameterBuilder } from \".\";\nimport { SCALE_OFFSET }"
  },
  {
    "path": "ts-client/src/dlmm/helpers/rebalance/liquidity_strategy/index.ts",
    "chars": 8817,
    "preview": "import BN from \"bn.js\";\nimport { StrategyType } from \"../../../types\";\nimport { BidAskStrategyParameterBuilder } from \"."
  },
  {
    "path": "ts-client/src/dlmm/helpers/rebalance/liquidity_strategy/spot.ts",
    "chars": 5261,
    "preview": "import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { BidAskParameters, LiquidityStrategyParameterBuilder }"
  },
  {
    "path": "ts-client/src/dlmm/helpers/rebalance/rebalancePosition.ts",
    "chars": 31354,
    "preview": "import { Program } from \"@coral-xyz/anchor\";\nimport { Connection, PublicKey, SYSVAR_CLOCK_PUBKEY } from \"@solana/web3.js"
  },
  {
    "path": "ts-client/src/dlmm/helpers/rebalance/strategy/balanced.ts",
    "chars": 3184,
    "preview": "import BN from \"bn.js\";\nimport {\n  capBps,\n  MAX_BPS,\n  RebalanceDepositWithdrawParameters,\n  RebalanceStrategyBuilder,\n"
  },
  {
    "path": "ts-client/src/dlmm/helpers/rebalance/strategy/index.ts",
    "chars": 660,
    "preview": "import BN from \"bn.js\";\nimport { BASIS_POINT_MAX } from \"../../../constants\";\nimport {\n  RebalanceWithDeposit,\n  Rebalan"
  },
  {
    "path": "ts-client/src/dlmm/helpers/strategy.ts",
    "chars": 15766,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport { Mint } from \"@solana/spl-token\";\nimport {\n  Clock,\n  ProgramStrategyPar"
  },
  {
    "path": "ts-client/src/dlmm/helpers/token_2022.ts",
    "chars": 6081,
    "preview": "import {\n  addExtraAccountMetasForExecute,\n  calculateFee,\n  createTransferCheckedInstruction,\n  getEpochFee,\n  getTrans"
  },
  {
    "path": "ts-client/src/dlmm/helpers/u64xu64_math.ts",
    "chars": 3860,
    "preview": "import BN from \"bn.js\";\nimport { SCALE_OFFSET } from \"../constants\";\n\nconst MAX_EXPONENTIAL = new BN(0x80000);\n\nexport c"
  },
  {
    "path": "ts-client/src/dlmm/helpers/weight.ts",
    "chars": 17376,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport gaussian, { Gaussian } from \"gaussian\";\nimport { BASIS_POINT_MAX } from \""
  },
  {
    "path": "ts-client/src/dlmm/helpers/weightToAmounts.ts",
    "chars": 14791,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport { Mint } from \"@solana/spl-token\";\nimport Decimal from \"decimal.js\";\nimpo"
  },
  {
    "path": "ts-client/src/dlmm/idl/idl.json",
    "chars": 229125,
    "preview": "{\n  \"address\": \"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo\",\n  \"metadata\": {\n    \"name\": \"lb_clmm\",\n    \"version\": \"0.1"
  },
  {
    "path": "ts-client/src/dlmm/idl/idl.ts",
    "chars": 202113,
    "preview": "/**\n * Program IDL in camelCase format in order to be used in JS/TS.\n *\n * Note that this is only a type helper and is n"
  },
  {
    "path": "ts-client/src/dlmm/index.ts",
    "chars": 256810,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport {\n  AccountLayout,\n  Mint,\n  NATIVE_MINT,\n  TOKEN_PROGRAM_ID,\n  createAss"
  },
  {
    "path": "ts-client/src/dlmm/types/index.ts",
    "chars": 14124,
    "preview": "import {\n  BN,\n  IdlAccounts,\n  IdlTypes,\n  Program,\n  ProgramAccount,\n} from \"@coral-xyz/anchor\";\nimport { LbClmm } fro"
  },
  {
    "path": "ts-client/src/examples/example.ts",
    "chars": 10502,
    "preview": "import {\n  Connection,\n  Keypair,\n  PublicKey,\n  sendAndConfirmTransaction,\n  TransactionMessage,\n  VersionedTransaction"
  },
  {
    "path": "ts-client/src/examples/fetch_lb_pair_lock_info.ts",
    "chars": 602,
    "preview": "import { Connection, Keypair, PublicKey, Transaction } from \"@solana/web3.js\";\nimport { DLMM } from \"../dlmm\";\n\nasync fu"
  },
  {
    "path": "ts-client/src/examples/get_oracle.ts",
    "chars": 3010,
    "preview": "import { Connection, PublicKey, SYSVAR_CLOCK_PUBKEY } from \"@solana/web3.js\";\nimport { DLMM } from \"../dlmm\";\nimport { I"
  },
  {
    "path": "ts-client/src/examples/initialize_bin_arrays.ts",
    "chars": 2136,
    "preview": "import { Connection, Keypair, PublicKey, Transaction } from \"@solana/web3.js\";\nimport { DLMM } from \"../dlmm\";\nimport BN"
  },
  {
    "path": "ts-client/src/examples/swap_quote.ts",
    "chars": 1056,
    "preview": "import { Connection, PublicKey } from \"@solana/web3.js\";\nimport { DLMM } from \"../dlmm\";\nimport BN from \"bn.js\";\n\nasync "
  },
  {
    "path": "ts-client/src/index.ts",
    "chars": 312,
    "preview": "import { DLMM } from \"./dlmm\";\n\nexport default DLMM;\nexport * from \"./dlmm/helpers\";\nexport * from \"./dlmm/types\";\nexpor"
  },
  {
    "path": "ts-client/src/server/index.ts",
    "chars": 18778,
    "preview": "import { Connection, PublicKey } from \"@solana/web3.js\";\nimport express from \"express\";\nimport { DLMM } from \"../dlmm\";\n"
  },
  {
    "path": "ts-client/src/server/utils.ts",
    "chars": 953,
    "preview": "import { PublicKey } from \"@solana/web3.js\";\nimport { LbPosition } from \"../dlmm/types\";\nimport BN from \"bn.js\";\n\nexport"
  },
  {
    "path": "ts-client/src/test/bug_fix.test.ts",
    "chars": 14182,
    "preview": "import {\n  createAssociatedTokenAccountIdempotent,\n  createAssociatedTokenAccountIdempotentInstruction,\n  createMint,\n  "
  },
  {
    "path": "ts-client/src/test/calculate_distribution.test.ts",
    "chars": 26277,
    "preview": "import { BN } from \"@coral-xyz/anchor\";\nimport {\n  createInitializeMintInstruction,\n  createInitializeTransferFeeConfigI"
  },
  {
    "path": "ts-client/src/test/cjs.test.js",
    "chars": 4758,
    "preview": "describe(\"CommonJS require() compatibility tests\", () => {\n    let DLMM;\n\n    beforeAll(() => {\n        // Test actual r"
  },
  {
    "path": "ts-client/src/test/decode.test.ts",
    "chars": 745,
    "preview": "import { Connection, SYSVAR_CLOCK_PUBKEY } from \"@solana/web3.js\";\nimport { Clock, ClockLayout } from \"../dlmm/types\";\n\n"
  },
  {
    "path": "ts-client/src/test/esm_import.test.ts",
    "chars": 4150,
    "preview": "import DLMM from \"../../dist\";\n\ndescribe(\"ESM default import tests\", () => {\n  describe(\"default import structure tests\""
  },
  {
    "path": "ts-client/src/test/esm_module.test.ts",
    "chars": 4429,
    "preview": "import DLMM from \"../../dist\";\n\ndescribe(\"ESM module compatibility tests\", () => {\n  describe(\"esm module resolution tes"
  },
  {
    "path": "ts-client/src/test/external/helper.ts",
    "chars": 1218,
    "preview": "import { Program, web3 } from \"@coral-xyz/anchor\";\nimport { TransferHookCounter } from \"./transfer_hook_counter\";\nimport"
  },
  {
    "path": "ts-client/src/test/external/program.ts",
    "chars": 760,
    "preview": "import { AnchorProvider, Program, Wallet, web3 } from \"@coral-xyz/anchor\";\nimport { TransferHookCounter } from \"./transf"
  },
  {
    "path": "ts-client/src/test/external/transfer_hook_counter.json",
    "chars": 2125,
    "preview": "{\n  \"address\": \"abcSyangMHdGzUGKhBhKoQzSFdJKUdkPGf5cbXVHpEw\",\n  \"metadata\": {\n    \"name\": \"transfer_hook_counter\",\n    \""
  },
  {
    "path": "ts-client/src/test/external/transfer_hook_counter.ts",
    "chars": 2360,
    "preview": "/**\n * Program IDL in camelCase format in order to be used in JS/TS.\n *\n * Note that this is only a type helper and is n"
  },
  {
    "path": "ts-client/src/test/helper.ts",
    "chars": 9091,
    "preview": "import {\n  Connection,\n  Keypair,\n  PublicKey,\n  sendAndConfirmTransaction,\n  SystemProgram,\n} from \"@solana/web3.js\";\ni"
  },
  {
    "path": "ts-client/src/test/ilm.test.ts",
    "chars": 38058,
    "preview": "import { BN, Wallet, web3 } from \"@coral-xyz/anchor\";\nimport {\n  ASSOCIATED_TOKEN_PROGRAM_ID,\n  ExtensionType,\n  TOKEN_2"
  },
  {
    "path": "ts-client/src/test/oracle.test.ts",
    "chars": 11467,
    "preview": "import BN from \"bn.js\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport Decimal from \"decimal.js\";\nimport {\n  Dynami"
  },
  {
    "path": "ts-client/src/test/rebalance.test.ts",
    "chars": 34095,
    "preview": "import { BN, web3 } from \"@coral-xyz/anchor\";\nimport {\n  ASSOCIATED_TOKEN_PROGRAM_ID,\n  createMint,\n  getOrCreateAssocia"
  },
  {
    "path": "ts-client/src/test/rebalance_parameter_builder.test.ts",
    "chars": 30718,
    "preview": "import babar from \"babar\";\nimport BN from \"bn.js\";\nimport { SCALE_OFFSET } from \"../dlmm/constants\";\nimport { getQPriceF"
  },
  {
    "path": "ts-client/src/test/rebalance_with_strategy.test.ts",
    "chars": 40627,
    "preview": "import { BN, web3 } from \"@coral-xyz/anchor\";\nimport {\n  ASSOCIATED_TOKEN_PROGRAM_ID,\n  createMint,\n  getOrCreateAssocia"
  },
  {
    "path": "ts-client/src/test/sdk.test.ts",
    "chars": 66465,
    "preview": "import { BN, web3 } from \"@coral-xyz/anchor\";\nimport {\n  ASSOCIATED_TOKEN_PROGRAM_ID,\n  createMint,\n  getAssociatedToken"
  },
  {
    "path": "ts-client/src/test/sdk_token2022.test.ts",
    "chars": 88399,
    "preview": "import { Wallet } from \"@coral-xyz/anchor\";\nimport { SYSTEM_PROGRAM_ID } from \"@coral-xyz/anchor/dist/cjs/native/system\""
  },
  {
    "path": "ts-client/src/test/single_bin.test.ts",
    "chars": 6073,
    "preview": "import { BN, web3 } from \"@coral-xyz/anchor\";\nimport {\n  ASSOCIATED_TOKEN_PROGRAM_ID,\n  TOKEN_PROGRAM_ID,\n  createMint,\n"
  },
  {
    "path": "ts-client/src/test/token_2022.test.ts",
    "chars": 7998,
    "preview": "import { Wallet } from \"@coral-xyz/anchor\";\nimport {\n  createInitializeMintInstruction,\n  createInitializeTransferFeeCon"
  },
  {
    "path": "ts-client/tsconfig.json",
    "chars": 413,
    "preview": "{\n  \"compilerOptions\": {\n    \"outDir\": \"dist\",\n    \"types\": [\"jest\"],\n    \"typeRoots\": [\"./node_modules/@types\"],\n    \"m"
  },
  {
    "path": "ts-client/tsup.config.ts",
    "chars": 1059,
    "preview": "import type { Options } from \"tsup\";\n\nconst config: Options = {\n  entry: [\"src/index.ts\"],\n  format: [\"esm\", \"cjs\"],\n  s"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the MeteoraAg/dlmm-sdk GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 201 files (2.0 MB), approximately 533.6k tokens, and a symbol index with 1063 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!