Skip to content

Commit bea19d2

Browse files
authored
refactor(experimental): errors: addresses package (#2187)
Adds custom `SolanaError` throws to the `@solana/addresses` package.
1 parent 546263e commit bea19d2

File tree

10 files changed

+173
-46
lines changed

10 files changed

+173
-46
lines changed

packages/addresses/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@
6868
"dependencies": {
6969
"@solana/assertions": "workspace:*",
7070
"@solana/codecs-core": "workspace:*",
71-
"@solana/codecs-strings": "workspace:*"
71+
"@solana/codecs-strings": "workspace:*",
72+
"@solana/errors": "workspace:*"
7273
},
7374
"devDependencies": {
7475
"@solana/build-scripts": "workspace:*",

packages/addresses/src/__tests__/coercions-test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS, SolanaError } from '@solana/errors';
2+
13
import { Address, address } from '../address';
24

35
describe('coercions', () => {
@@ -11,7 +13,11 @@ describe('coercions', () => {
1113
});
1214
it('throws on invalid `Address`', () => {
1315
const thisThrows = () => address('3333333333333333');
14-
expect(thisThrows).toThrow('`3333333333333333` is not a base-58 encoded address');
16+
expect(thisThrows).toThrow(
17+
new SolanaError(SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS, {
18+
putativeAddress: '3333333333333333',
19+
}),
20+
);
1521
});
1622
});
1723
});

packages/addresses/src/__tests__/program-derived-address-test.ts

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
import {
2+
SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,
3+
SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED,
4+
SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER,
5+
SolanaError,
6+
} from '@solana/errors';
7+
18
import { Address } from '../address';
29
import { createAddressWithSeed, getProgramDerivedAddress } from '../program-derived-address';
310

@@ -9,21 +16,31 @@ describe('getProgramDerivedAddress()', () => {
916
programAddress: 'FN2R9R724eb4WaxeDmDYrUtmJgoSzkBiQMEHELV3ocyg' as Address,
1017
seeds: Array(17).fill(''),
1118
}),
12-
).rejects.toThrow(/A maximum of 16 seeds/);
13-
});
14-
it.each([
15-
new Uint8Array(Array(33).fill(0)),
16-
'a'.repeat(33),
17-
'\uD83D\uDC68\u200D\uD83D\uDC68\u200D\uD83D\uDC67\u200D\uD83D\uDC66\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC66\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC66',
18-
])('fatals when supplied a seed that is 33 bytes long', async oversizedSeed => {
19-
expect.assertions(1);
20-
await expect(
21-
getProgramDerivedAddress({
22-
programAddress: '5eUi55m4FVaDqKubGH9r6ca1TxjmimmXEU9v1WUZJ47Z' as Address,
23-
seeds: [oversizedSeed],
19+
).rejects.toThrow(
20+
new SolanaError(SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, {
21+
actual: 18, // With bump.
22+
maxSeeds: 16,
2423
}),
25-
).rejects.toThrow(/exceeds the maximum length of 32 bytes/);
24+
);
2625
});
26+
it.each([new Uint8Array(Array(33).fill(0)), 'a'.repeat(33)])(
27+
'fatals when supplied a seed that is 33 bytes long',
28+
async oversizedSeed => {
29+
expect.assertions(1);
30+
await expect(
31+
getProgramDerivedAddress({
32+
programAddress: '5eUi55m4FVaDqKubGH9r6ca1TxjmimmXEU9v1WUZJ47Z' as Address,
33+
seeds: [oversizedSeed],
34+
}),
35+
).rejects.toThrow(
36+
new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {
37+
actual: 33,
38+
index: 0,
39+
maxSeedLength: 32,
40+
}),
41+
);
42+
},
43+
);
2744
it('returns a program derived address given a program address and no seeds', async () => {
2845
expect.assertions(1);
2946
await expect(
@@ -137,7 +154,11 @@ describe('createAddressWithSeed', () => {
137154
const programAddress = 'FGrddpvjBUAG6VdV4fR8Q2hEZTHS6w4SEveVBgfwbfdm' as Address;
138155

139156
await expect(createAddressWithSeed({ baseAddress, programAddress, seed: 'a'.repeat(33) })).rejects.toThrow(
140-
'The seed exceeds the maximum length of 32 bytes',
157+
new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {
158+
actual: 33,
159+
index: 0,
160+
maxSeedLength: 32,
161+
}),
141162
);
142163
});
143164
it('fails with a malicious programAddress meant to produce an address that would collide with a PDA', async () => {
@@ -147,7 +168,7 @@ describe('createAddressWithSeed', () => {
147168
const programAddress = '4vJ9JU1bJJE96FbKdjWme2JfVK1knU936FHTDZV7AC2' as Address;
148169

149170
await expect(createAddressWithSeed({ baseAddress, programAddress, seed: 'seed' })).rejects.toThrow(
150-
'programAddress cannot end with the PDA marker',
171+
new SolanaError(SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER),
151172
);
152173
});
153174
});

packages/addresses/src/address.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ import {
88
mapEncoder,
99
} from '@solana/codecs-core';
1010
import { getBase58Decoder, getBase58Encoder, getStringDecoder, getStringEncoder } from '@solana/codecs-strings';
11+
import {
12+
SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH,
13+
SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH,
14+
SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS,
15+
SolanaError,
16+
} from '@solana/errors';
1117

1218
export type Address<TAddress extends string = string> = TAddress & {
1319
readonly __brand: unique symbol;
@@ -55,19 +61,21 @@ export function assertIsAddress(putativeAddress: string): asserts putativeAddres
5561
// Highest address (32 bytes of 255)
5662
putativeAddress.length > 44
5763
) {
58-
throw new Error('Expected input string to decode to a byte array of length 32.');
64+
throw new SolanaError(SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH, {
65+
actualLength: putativeAddress.length,
66+
});
5967
}
6068
// Slow-path; actually attempt to decode the input string.
6169
const base58Encoder = getMemoizedBase58Encoder();
6270
const bytes = base58Encoder.encode(putativeAddress);
6371
const numBytes = bytes.byteLength;
6472
if (numBytes !== 32) {
65-
throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
73+
throw new SolanaError(SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH, {
74+
actualLength: numBytes,
75+
});
6676
}
6777
} catch (e) {
68-
throw new Error(`\`${putativeAddress}\` is not a base-58 encoded address`, {
69-
cause: e,
70-
});
78+
throw new SolanaError(SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS, { putativeAddress });
7179
}
7280
}
7381

packages/addresses/src/program-derived-address.ts

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
11
import { assertDigestCapabilityIsAvailable } from '@solana/assertions';
2+
import {
3+
isSolanaError,
4+
SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED,
5+
SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE,
6+
SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS,
7+
SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,
8+
SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED,
9+
SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER,
10+
SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE,
11+
SolanaError,
12+
} from '@solana/errors';
213

314
import { Address, assertIsAddress, getAddressCodec, isAddress } from './address';
415
import { compressedPointBytesAreOnCurve } from './curve';
@@ -45,14 +56,12 @@ export function assertIsProgramDerivedAddress<TAddress extends string = string>(
4556
const validFormat =
4657
Array.isArray(value) && value.length === 2 && typeof value[0] === 'string' && typeof value[1] === 'number';
4758
if (!validFormat) {
48-
// TODO: Coded error.
49-
throw new Error(
50-
`Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].`,
51-
);
59+
throw new SolanaError(SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS);
5260
}
5361
if (value[1] < 0 || value[1] > 255) {
54-
// TODO: Coded error.
55-
throw new Error(`Expected program derived address bump to be in the range [0, 255], got: ${value[1]}.`);
62+
throw new SolanaError(SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE, {
63+
bump: value[1],
64+
});
5665
}
5766
assertIsAddress(value[0]);
5867
}
@@ -77,21 +86,23 @@ const PDA_MARKER_BYTES = [
7786
80, 114, 111, 103, 114, 97, 109, 68, 101, 114, 105, 118, 101, 100, 65, 100, 100, 114, 101, 115, 115,
7887
] as const;
7988

80-
// TODO: Coded error.
81-
class PointOnCurveError extends Error {}
82-
8389
async function createProgramDerivedAddress({ programAddress, seeds }: ProgramDerivedAddressInput): Promise<Address> {
8490
await assertDigestCapabilityIsAvailable();
8591
if (seeds.length > MAX_SEEDS) {
86-
// TODO: Coded error.
87-
throw new Error(`A maximum of ${MAX_SEEDS} seeds may be supplied when creating an address`);
92+
throw new SolanaError(SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, {
93+
actual: seeds.length,
94+
maxSeeds: MAX_SEEDS,
95+
});
8896
}
8997
let textEncoder: TextEncoder;
9098
const seedBytes = seeds.reduce((acc, seed, ii) => {
9199
const bytes = typeof seed === 'string' ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;
92100
if (bytes.byteLength > MAX_SEED_LENGTH) {
93-
// TODO: Coded error.
94-
throw new Error(`The seed at index ${ii} exceeds the maximum length of 32 bytes`);
101+
throw new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {
102+
actual: bytes.byteLength,
103+
index: ii,
104+
maxSeedLength: MAX_SEED_LENGTH,
105+
});
95106
}
96107
acc.push(...bytes);
97108
return acc;
@@ -104,8 +115,7 @@ async function createProgramDerivedAddress({ programAddress, seeds }: ProgramDer
104115
);
105116
const addressBytes = new Uint8Array(addressBytesBuffer);
106117
if (await compressedPointBytesAreOnCurve(addressBytes)) {
107-
// TODO: Coded error.
108-
throw new PointOnCurveError('Invalid seeds; point must fall off the Ed25519 curve');
118+
throw new SolanaError(SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE);
109119
}
110120
return base58EncodedAddressCodec.decode(addressBytes);
111121
}
@@ -123,33 +133,34 @@ export async function getProgramDerivedAddress({
123133
});
124134
return [address, bumpSeed as ProgramDerivedAddressBump];
125135
} catch (e) {
126-
if (e instanceof PointOnCurveError) {
136+
if (isSolanaError(e, SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE)) {
127137
bumpSeed--;
128138
} else {
129139
throw e;
130140
}
131141
}
132142
}
133-
// TODO: Coded error.
134-
throw new Error('Unable to find a viable program address bump seed');
143+
throw new SolanaError(SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED);
135144
}
136145

137146
export async function createAddressWithSeed({ baseAddress, programAddress, seed }: SeedInput): Promise<Address> {
138147
const { encode, decode } = getAddressCodec();
139148

140149
const seedBytes = typeof seed === 'string' ? new TextEncoder().encode(seed) : seed;
141150
if (seedBytes.byteLength > MAX_SEED_LENGTH) {
142-
// TODO: Coded error.
143-
throw new Error(`The seed exceeds the maximum length of 32 bytes`);
151+
throw new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {
152+
actual: seedBytes.byteLength,
153+
index: 0,
154+
maxSeedLength: MAX_SEED_LENGTH,
155+
});
144156
}
145157

146158
const programAddressBytes = encode(programAddress);
147159
if (
148160
programAddressBytes.length >= PDA_MARKER_BYTES.length &&
149161
programAddressBytes.slice(-PDA_MARKER_BYTES.length).every((byte, index) => byte === PDA_MARKER_BYTES[index])
150162
) {
151-
// TODO: Coded error.
152-
throw new Error(`programAddress cannot end with the PDA marker`);
163+
throw new SolanaError(SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER);
153164
}
154165

155166
const addressBytesBuffer = await crypto.subtle.digest(

packages/addresses/src/public-key.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { assertKeyExporterIsAvailable } from '@solana/assertions';
2+
import { SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY, SolanaError } from '@solana/errors';
23

34
import { Address, getAddressDecoder } from './address';
45

56
export async function getAddressFromPublicKey(publicKey: CryptoKey): Promise<Address> {
67
await assertKeyExporterIsAvailable();
78
if (publicKey.type !== 'public' || publicKey.algorithm.name !== 'Ed25519') {
8-
// TODO: Coded error.
9-
throw new Error('The `CryptoKey` must be an `Ed25519` public key');
9+
throw new SolanaError(SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY);
1010
}
1111
const publicKeyBytes = await crypto.subtle.exportKey('raw', publicKey);
1212
return getAddressDecoder().decode(new Uint8Array(publicKeyBytes));

packages/errors/src/codes.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ export const SOLANA_ERROR__MULTIPLE_ACCOUNTS_NOT_FOUND = 9 as const;
1616
export const SOLANA_ERROR__FAILED_TO_DECODE_ACCOUNT = 10 as const;
1717
export const SOLANA_ERROR__EXPECTED_DECODED_ACCOUNT = 11 as const;
1818
export const SOLANA_ERROR__NOT_ALL_ACCOUNTS_DECODED = 12 as const;
19+
export const SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH = 13 as const;
20+
export const SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH = 14 as const;
21+
export const SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS = 15 as const;
22+
export const SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY = 16 as const;
23+
export const SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS = 17 as const;
24+
export const SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE = 18 as const;
25+
export const SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED = 19 as const;
26+
export const SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED = 20 as const;
27+
export const SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE = 21 as const;
28+
export const SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED = 22 as const;
29+
export const SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER = 23 as const;
1930
// Reserve error codes starting with [4615000-4615999] for the Rust enum `InstructionError`
2031
export const SOLANA_ERROR__INSTRUCTION_ERROR_UNKNOWN = 4615000 as const;
2132
export const SOLANA_ERROR__INSTRUCTION_ERROR_GENERIC_ERROR = 4615001 as const;
@@ -152,6 +163,17 @@ export type SolanaErrorCode =
152163
| typeof SOLANA_ERROR__FAILED_TO_DECODE_ACCOUNT
153164
| typeof SOLANA_ERROR__EXPECTED_DECODED_ACCOUNT
154165
| typeof SOLANA_ERROR__NOT_ALL_ACCOUNTS_DECODED
166+
| typeof SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH
167+
| typeof SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH
168+
| typeof SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS
169+
| typeof SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY
170+
| typeof SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS
171+
| typeof SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE
172+
| typeof SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED
173+
| typeof SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED
174+
| typeof SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE
175+
| typeof SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED
176+
| typeof SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER
155177
| typeof SOLANA_ERROR__INSTRUCTION_ERROR_UNKNOWN
156178
| typeof SOLANA_ERROR__INSTRUCTION_ERROR_GENERIC_ERROR
157179
| typeof SOLANA_ERROR__INSTRUCTION_ERROR_INVALID_ARGUMENT

packages/errors/src/context.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import {
33
SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,
44
SOLANA_ERROR__EXPECTED_DECODED_ACCOUNT,
55
SOLANA_ERROR__FAILED_TO_DECODE_ACCOUNT,
6+
SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH,
7+
SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH,
68
SOLANA_ERROR__INSTRUCTION_ERROR_ACCOUNT_ALREADY_INITIALIZED,
79
SOLANA_ERROR__INSTRUCTION_ERROR_ACCOUNT_BORROW_FAILED,
810
SOLANA_ERROR__INSTRUCTION_ERROR_ACCOUNT_BORROW_OUTSTANDING,
@@ -59,10 +61,14 @@ import {
5961
SOLANA_ERROR__INSTRUCTION_ERROR_UNSUPPORTED_PROGRAM_ID,
6062
SOLANA_ERROR__INSTRUCTION_ERROR_UNSUPPORTED_SYSVAR,
6163
SOLANA_ERROR__INVALID_KEYPAIR_BYTES,
64+
SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,
65+
SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED,
6266
SOLANA_ERROR__MULTIPLE_ACCOUNTS_NOT_FOUND,
6367
SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,
6468
SOLANA_ERROR__NONCE_INVALID,
69+
SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS,
6570
SOLANA_ERROR__NOT_ALL_ACCOUNTS_DECODED,
71+
SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE,
6672
SOLANA_ERROR__RPC_INTEGER_OVERFLOW,
6773
SOLANA_ERROR__TRANSACTION_ERROR_DUPLICATE_INSTRUCTION,
6874
SOLANA_ERROR__TRANSACTION_ERROR_INSUFFICIENT_FUNDS_FOR_RENT,
@@ -162,6 +168,12 @@ export type SolanaErrorContext = DefaultUnspecifiedErrorContextToUndefined<
162168
[SOLANA_ERROR__FAILED_TO_DECODE_ACCOUNT]: {
163169
address: string;
164170
};
171+
[SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH]: {
172+
actualLength: number;
173+
};
174+
[SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH]: {
175+
actualLength: number;
176+
};
165177
[SOLANA_ERROR__INSTRUCTION_ERROR_BORSH_IO_ERROR]: {
166178
encodedData: string;
167179
index: number;
@@ -178,6 +190,15 @@ export type SolanaErrorContext = DefaultUnspecifiedErrorContextToUndefined<
178190
[SOLANA_ERROR__INVALID_KEYPAIR_BYTES]: {
179191
byteLength: number;
180192
};
193+
[SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED]: {
194+
actual: number;
195+
maxSeeds: number;
196+
};
197+
[SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED]: {
198+
actual: number;
199+
index: number;
200+
maxSeedLength: number;
201+
};
181202
[SOLANA_ERROR__MULTIPLE_ACCOUNTS_NOT_FOUND]: {
182203
addresses: string[];
183204
};
@@ -188,9 +209,15 @@ export type SolanaErrorContext = DefaultUnspecifiedErrorContextToUndefined<
188209
actualNonceValue: string;
189210
expectedNonceValue: string;
190211
};
212+
[SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS]: {
213+
putativeAddress: string;
214+
};
191215
[SOLANA_ERROR__NOT_ALL_ACCOUNTS_DECODED]: {
192216
addresses: string[];
193217
};
218+
[SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE]: {
219+
bump: number;
220+
};
194221
[SOLANA_ERROR__RPC_INTEGER_OVERFLOW]: {
195222
argumentLabel: string;
196223
keyPath: readonly (string | number | symbol)[];

0 commit comments

Comments
 (0)