# @metaplex-foundation/beet-solana

> Solana specific extension for beet, the borsh compatible de/serializer

Latest version **0.4.1** (published 2023-12-28) · Apache-2.0 license · 0 weekly downloads

## Install

```sh
npm install @metaplex-foundation/beet-solana
pnpm add @metaplex-foundation/beet-solana
yarn add @metaplex-foundation/beet-solana
bun add @metaplex-foundation/beet-solana
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.4.1 |
| Published | 2023-12-28 |
| First published | 2021-12-29 |
| Weekly downloads | 0 |
| License | Apache-2.0 |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 4 |
| Unpacked size | 36.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Thorsten Lorenz |
| Maintainers | danenbm, nhanphan, blockiosaurus, 0x_febo, svc01-metaplex, brandontulsi |

## Links

- npm: https://www.npmjs.com/package/@metaplex-foundation/beet-solana
- Repository: https://github.com/metaplex-foundation/beet-solana
- Homepage: https://github.com/metaplex-foundation/beet-solana#readme
- Issues: https://github.com/metaplex-foundation/beet-solana/issues
- npm.io page: https://npm.io/package/@metaplex-foundation/beet-solana

## Dependencies (4)

- [bs58](https://npm.io/package/bs58.md) ^5.0.0
- [debug](https://npm.io/package/debug.md) ^4.3.4
- [@solana/web3.js](https://npm.io/package/@solana/web3.js.md) ^1.56.2
- [@metaplex-foundation/beet](https://npm.io/package/@metaplex-foundation/beet.md) >=0.1.0

## Recent versions

- 0.4.1 (latest) — 2023-12-28
- 0.0.0 (0.0.0) — 2021-12-29
- 0.4.0 — 2022-09-21
- 0.3.1 — 2022-09-01
- 0.3.0 — 2022-07-05
- 0.2.0 — 2022-06-14
- 0.1.1 — 2022-03-06
- 0.1.0 — 2022-03-06
- 0.0.6 — 2022-01-22
- 0.0.5 — 2022-01-22
- 0.0.4 — 2022-01-21
- 0.0.3 — 2022-01-21
- 0.0.2 — 2022-01-18
- 0.0.1 — 2022-01-06

## README

# @metaplex-foundation/beet-solana

Solana specific extension for beet, the borsh compatible de/serializer

## API

Please find the [API docs here](https://metaplex-foundation.github.io/beet/docs/beet-solana).

## GPA Builders

solana-beet uses `beet`s knowledge about account layouts to provide `GpaBuilder`s for
them which allow to filter by account data size and content.

1. Create a GPA Builder via `const gpaBuilder = GpaBuilder.fromStruct(programId, accountStruct)`
2. add filters via `gpaBuilder.dataSize`, `gpaBuilder.addFilter` or `gpaBuilder.addInnerFilter`
3. execute `gpaBuilder.run(connection)` which will return all accounts matching the specified
filters

### Examples

#### Simple struct with primitives

```ts
export type ResultsArgs = Pick<Results, 'win' | 'totalWin' | 'losses'>
export class Results {
  constructor(
    readonly win: number,
    readonly totalWin: number,
    readonly losses: number
  ) {}

  static readonly struct = new BeetStruct<Results, ResultsArgs>(
    [
      ['win', u8],
      ['totalWin', u16],
      ['losses', i32],
    ],
    (args: ResultsArgs) => new Results(args.win!, args.totalWin!, args.losses!),
    'Results'
  )
}

const gpaBuilder = GpaBuilder.fromStruct(PROGRAM_ID, Results.struct)
const accounts = await gpaBuilder
  .addFilter('totalWin', 8)
  .addFilter('losses', -7)
  .run()
```

#### Matching on Complete Nested Struct

_Using `Results` struct from above_

```ts
export type TraderArgs = Pick<Trader, 'name' | 'results' | 'age'>
export class Trader {
  constructor(
    readonly name: string,
    readonly results: Results,
    readonly age: number
  ) {}

  static readonly struct = new BeetStruct<Trader, TraderArgs>(
    [
      ['name', fixedSizeUtf8String(4)],
      ['results', Results.struct],
      ['age', u8],
    ],
    (args) => new Trader(args.name!, args.results!, args.age!),
    'Trader'
  )
}

const gpaBuilder = GpaBuilder.fromStruct<Trader>(
  PROGRAM_ID,
  Trader.struct
)

const results = {
  win: 3,
  totalWin: 4,
  losses: -100,
}

const accounts = await gpaBuilder.addFilter('results', results).run()
```

#### Matching on Part of Nested Struct

_Using `Trader` struct from above_

```ts
const gpaBuilder = GpaBuilder.fromStruct<Trader>(
  PROGRAM_ID,
  Trader.struct
)

const account = await gpaBuilder
  .addInnerFilter('results.totalWin', 8)
  .addInnerFilter('results.win', 2)
  .run()
```

## PublicKey

solana-beet provides a de/serializer for solana public keys.
They can either be used directly or as part of a struct.

### Examples

#### Using PublicKey Directly

```ts
import { publicKey } from '@metaplex-foundation/beet-solana'

const generatedKey  = Keypair.generate().publicKey
const buf = Buffer.alloc(publicKey.byteSize)
beet.write(buf, 0, generatedKey)
beet.read(buf, 0) // same as generatedKey
```

#### PublicKey as part of a Struct Configuration

```ts
import * as web3 from '@solana/web3.js'
import * as beet from '@metaplex-foundation/beet'
import * as beetSolana from '@metaplex-foundation/beet-solana'

type InstructionArgs = {
  authority: web3.PublicKey
}

const createStruct = new beet.BeetArgsStruct<InstructionArgs>(
  [
    ['authority', beetSolana.publicKey]
  ],
  'InstructionArgs'
)
```

## LICENSE

Apache-2.0

---
_Source: https://npm.io/package/@metaplex-foundation/beet-solana · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
