diff --git a/web3.js/module.d.ts b/web3.js/module.d.ts index 972b79749a..8c46895cbc 100644 --- a/web3.js/module.d.ts +++ b/web3.js/module.d.ts @@ -3,6 +3,7 @@ declare module '@solana/web3.js' { import * as BufferLayout from 'buffer-layout'; // === src/publickey.js === + export const MAX_SEED_LENGTH: number; export type PublicKeyNonce = [PublicKey, number]; export class PublicKey { constructor(value: number | string | Buffer | Uint8Array | Array); diff --git a/web3.js/module.flow.js b/web3.js/module.flow.js index 5ae303db6c..e4ae94d7ca 100644 --- a/web3.js/module.flow.js +++ b/web3.js/module.flow.js @@ -16,6 +16,7 @@ import {PublicKey} from './src/publickey'; declare module '@solana/web3.js' { // === src/publickey.js === + declare export var MAX_SEED_LENGTH: number; declare export type PublicKeyNonce = [PublicKey, number]; declare export class PublicKey { constructor( diff --git a/web3.js/src/index.js b/web3.js/src/index.js index acc0b7d96c..78947b7066 100644 --- a/web3.js/src/index.js +++ b/web3.js/src/index.js @@ -6,7 +6,7 @@ export {Connection} from './connection'; export {Loader} from './loader'; export {Message} from './message'; export {NonceAccount, NONCE_ACCOUNT_LENGTH} from './nonce-account'; -export {PublicKey} from './publickey'; +export {MAX_SEED_LENGTH, PublicKey} from './publickey'; export { STAKE_CONFIG_ID, Authorized, diff --git a/web3.js/src/publickey.js b/web3.js/src/publickey.js index 37537edf5a..c5bf0c30b0 100644 --- a/web3.js/src/publickey.js +++ b/web3.js/src/publickey.js @@ -10,6 +10,11 @@ let naclLowLevel = nacl.lowlevel; type PublicKeyNonce = [PublicKey, number]; // This type exists to workaround an esdoc parse error +/** + * Maximum length of derived pubkey seed + */ +export const MAX_SEED_LENGTH = 32; + /** * A public key */ @@ -97,6 +102,9 @@ export class PublicKey { ): Promise { let buffer = Buffer.alloc(0); seeds.forEach(function (seed) { + if (seed.length > MAX_SEED_LENGTH) { + throw new Error(`Max seed length exceeded`); + } buffer = Buffer.concat([buffer, Buffer.from(seed)]); }); buffer = Buffer.concat([ diff --git a/web3.js/test/publickey.test.js b/web3.js/test/publickey.test.js index 86c680fbdf..61cf897d6d 100644 --- a/web3.js/test/publickey.test.js +++ b/web3.js/test/publickey.test.js @@ -1,7 +1,7 @@ // @flow import BN from 'bn.js'; -import {PublicKey} from '../src/publickey'; +import {PublicKey, MAX_SEED_LENGTH} from '../src/publickey'; test('invalid', () => { expect(() => { @@ -279,6 +279,13 @@ test('createProgramAddress', async () => { ); expect(programAddress.equals(programAddress2)).toBe(false); + await expect( + PublicKey.createProgramAddress( + [Buffer.alloc(MAX_SEED_LENGTH + 1)], + programId, + ), + ).rejects.toThrow('Max seed length exceeded'); + // https://github.com/solana-labs/solana/issues/11950 { let seeds = [