Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit df6ad18

Browse files
authored
stake-pool-js: Fix build for downstream users (#6793)
* stake-pool-js: Remove borsh to fix downstream usage * Bump version to 1.1.5
1 parent 48499ec commit df6ad18

File tree

6 files changed

+173
-22
lines changed

6 files changed

+173
-22
lines changed

pnpm-lock.yaml

Lines changed: 0 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

stake-pool/js/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@solana/spl-stake-pool",
3-
"version": "1.1.4",
3+
"version": "1.1.5",
44
"description": "SPL Stake Pool Program JS API",
55
"scripts": {
66
"build": "tsc && cross-env NODE_ENV=production rollup -c",
@@ -43,7 +43,6 @@
4343
],
4444
"license": "ISC",
4545
"dependencies": {
46-
"@coral-xyz/borsh": "^0.30.0",
4746
"@solana/buffer-layout": "^4.0.1",
4847
"@solana/spl-token": "0.4.6",
4948
"@solana/web3.js": "^1.91.8",

stake-pool/js/rollup.config.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ function generateConfig(configType, format) {
6666

6767
// Prevent dependencies from being bundled
6868
config.external = [
69-
'@coral-xyz/borsh',
7069
'@solana/buffer-layout',
7170
'@solana/spl-token',
7271
'@solana/web3.js',
7372
'bn.js',
7473
'buffer',
74+
'buffer-layout',
7575
];
7676
}
7777

@@ -94,12 +94,12 @@ function generateConfig(configType, format) {
9494

9595
// Prevent dependencies from being bundled
9696
config.external = [
97-
'@coral-xyz/borsh',
9897
'@solana/buffer-layout',
9998
'@solana/spl-token',
10099
'@solana/web3.js',
101100
'bn.js',
102101
'buffer',
102+
'buffer-layout',
103103
];
104104
}
105105

stake-pool/js/src/codecs.ts

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
import { blob, Layout as LayoutCls, offset, seq, struct, u32, u8 } from 'buffer-layout';
2+
import { PublicKey } from '@solana/web3.js';
3+
import BN from 'bn.js';
4+
5+
export interface Layout<T> {
6+
span: number;
7+
property?: string;
8+
9+
decode(b: Buffer, offset?: number): T;
10+
11+
encode(src: T, b: Buffer, offset?: number): number;
12+
13+
getSpan(b: Buffer, offset?: number): number;
14+
15+
replicate(name: string): this;
16+
}
17+
18+
class BNLayout extends LayoutCls<BN> {
19+
blob: Layout<Buffer>;
20+
signed: boolean;
21+
22+
constructor(span: number, signed: boolean, property?: string) {
23+
super(span, property);
24+
this.blob = blob(span);
25+
this.signed = signed;
26+
}
27+
28+
decode(b: Buffer, offset = 0) {
29+
const num = new BN(this.blob.decode(b, offset), 10, 'le');
30+
if (this.signed) {
31+
return num.fromTwos(this.span * 8).clone();
32+
}
33+
return num;
34+
}
35+
36+
encode(src: BN, b: Buffer, offset = 0) {
37+
if (this.signed) {
38+
src = src.toTwos(this.span * 8);
39+
}
40+
return this.blob.encode(src.toArrayLike(Buffer, 'le', this.span), b, offset);
41+
}
42+
}
43+
44+
export function u64(property?: string): Layout<BN> {
45+
return new BNLayout(8, false, property);
46+
}
47+
48+
class WrappedLayout<T, U> extends LayoutCls<U> {
49+
layout: Layout<T>;
50+
decoder: (data: T) => U;
51+
encoder: (src: U) => T;
52+
53+
constructor(
54+
layout: Layout<T>,
55+
decoder: (data: T) => U,
56+
encoder: (src: U) => T,
57+
property?: string,
58+
) {
59+
super(layout.span, property);
60+
this.layout = layout;
61+
this.decoder = decoder;
62+
this.encoder = encoder;
63+
}
64+
65+
decode(b: Buffer, offset?: number): U {
66+
return this.decoder(this.layout.decode(b, offset));
67+
}
68+
69+
encode(src: U, b: Buffer, offset?: number): number {
70+
return this.layout.encode(this.encoder(src), b, offset);
71+
}
72+
73+
getSpan(b: Buffer, offset?: number): number {
74+
return this.layout.getSpan(b, offset);
75+
}
76+
}
77+
78+
export function publicKey(property?: string): Layout<PublicKey> {
79+
return new WrappedLayout(
80+
blob(32),
81+
(b: Buffer) => new PublicKey(b),
82+
(key: PublicKey) => key.toBuffer(),
83+
property,
84+
);
85+
}
86+
87+
class OptionLayout<T> extends LayoutCls<T | null> {
88+
layout: Layout<T>;
89+
discriminator: Layout<number>;
90+
91+
constructor(layout: Layout<T>, property?: string) {
92+
super(-1, property);
93+
this.layout = layout;
94+
this.discriminator = u8();
95+
}
96+
97+
encode(src: T | null, b: Buffer, offset = 0): number {
98+
if (src === null || src === undefined) {
99+
return this.discriminator.encode(0, b, offset);
100+
}
101+
this.discriminator.encode(1, b, offset);
102+
return this.layout.encode(src, b, offset + 1) + 1;
103+
}
104+
105+
decode(b: Buffer, offset = 0): T | null {
106+
const discriminator = this.discriminator.decode(b, offset);
107+
if (discriminator === 0) {
108+
return null;
109+
} else if (discriminator === 1) {
110+
return this.layout.decode(b, offset + 1);
111+
}
112+
throw new Error('Invalid option ' + this.property);
113+
}
114+
115+
getSpan(b: Buffer, offset = 0): number {
116+
const discriminator = this.discriminator.decode(b, offset);
117+
if (discriminator === 0) {
118+
return 1;
119+
} else if (discriminator === 1) {
120+
return this.layout.getSpan(b, offset + 1) + 1;
121+
}
122+
throw new Error('Invalid option ' + this.property);
123+
}
124+
}
125+
126+
export function option<T>(layout: Layout<T>, property?: string): Layout<T | null> {
127+
return new OptionLayout<T>(layout, property);
128+
}
129+
130+
export function bool(property?: string): Layout<boolean> {
131+
return new WrappedLayout(u8(), decodeBool, encodeBool, property);
132+
}
133+
134+
function decodeBool(value: number): boolean {
135+
if (value === 0) {
136+
return false;
137+
} else if (value === 1) {
138+
return true;
139+
}
140+
throw new Error('Invalid bool: ' + value);
141+
}
142+
143+
function encodeBool(value: boolean): number {
144+
return value ? 1 : 0;
145+
}
146+
147+
export function vec<T>(elementLayout: Layout<T>, property?: string): Layout<T[]> {
148+
const length = u32('length');
149+
const layout: Layout<{ values: T[] }> = struct([
150+
length,
151+
seq(elementLayout, offset(length, -length.span), 'values'),
152+
]);
153+
return new WrappedLayout(
154+
layout,
155+
({ values }) => values,
156+
(values) => ({ values }),
157+
property,
158+
);
159+
}

stake-pool/js/src/layouts.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Layout, publicKey, struct, u32, u64, u8, option, vec } from '@coral-xyz/borsh';
2-
import { Layout as LayoutCls, u8 as u8Cls } from 'buffer-layout';
1+
import { Layout, publicKey, u64, option, vec } from './codecs';
2+
import { struct, Layout as LayoutCls, u8, u32 } from 'buffer-layout';
33
import { PublicKey } from '@solana/web3.js';
44
import BN from 'bn.js';
55
import {
@@ -45,7 +45,7 @@ export class FutureEpochLayout<T> extends LayoutCls<T | null> {
4545
constructor(layout: Layout<T>, property?: string) {
4646
super(-1, property);
4747
this.layout = layout;
48-
this.discriminator = u8Cls();
48+
this.discriminator = u8();
4949
}
5050

5151
encode(src: T | null, b: Buffer, offset = 0): number {
@@ -78,7 +78,7 @@ export class FutureEpochLayout<T> extends LayoutCls<T | null> {
7878
}
7979
}
8080

81-
export function futureEpoch<T>(layout: Layout<T>, property?: string): Layout<T | null> {
81+
export function futureEpoch<T>(layout: Layout<T>, property?: string): LayoutCls<T | null> {
8282
return new FutureEpochLayout<T>(layout, property);
8383
}
8484

stake-pool/js/src/types/buffer-layout.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ declare module 'buffer-layout' {
1313
property?: string,
1414
decodePrefixes?: boolean,
1515
): Layout<T>;
16+
export function seq<T>(
17+
elementLayout: Layout<T>,
18+
count: number | Layout<number>,
19+
property?: string,
20+
): Layout<T[]>;
21+
export function offset<T>(layout: Layout<T>, offset?: number, property?: string): Layout<T>;
22+
export function blob(length: number | Layout<number>, property?: string): Layout<Buffer>;
1623
export function s32(property?: string): Layout<number>;
1724
export function u32(property?: string): Layout<number>;
1825
export function s16(property?: string): Layout<number>;

0 commit comments

Comments
 (0)