From d167feda9882c799c42606bec3801ebfc7b4e0fe Mon Sep 17 00:00:00 2001 From: Jack May Date: Mon, 31 Aug 2020 15:02:21 -0700 Subject: [PATCH] fix: bn clipping in create_program_address (#11951) --- web3.js/src/publickey.js | 2 +- web3.js/test/publickey.test.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/web3.js/src/publickey.js b/web3.js/src/publickey.js index 1a1903ecab..37537edf5a 100644 --- a/web3.js/src/publickey.js +++ b/web3.js/src/publickey.js @@ -105,7 +105,7 @@ export class PublicKey { Buffer.from('ProgramDerivedAddress'), ]); let hash = await sha256(new Uint8Array(buffer)); - let publicKeyBytes = new BN(hash, 16).toArray(); + let publicKeyBytes = new BN(hash, 16).toArray(null, 32); if (is_on_curve(publicKeyBytes)) { throw new Error(`Invalid seeds, address must fall off the curve`); } diff --git a/web3.js/test/publickey.test.js b/web3.js/test/publickey.test.js index cd861d0cc3..86c680fbdf 100644 --- a/web3.js/test/publickey.test.js +++ b/web3.js/test/publickey.test.js @@ -1,4 +1,6 @@ // @flow +import BN from 'bn.js'; + import {PublicKey} from '../src/publickey'; test('invalid', () => { @@ -276,6 +278,23 @@ test('createProgramAddress', async () => { programId, ); expect(programAddress.equals(programAddress2)).toBe(false); + + // https://github.com/solana-labs/solana/issues/11950 + { + let seeds = [ + new PublicKey('H4snTKK9adiU15gP22ErfZYtro3aqR9BTMXiH3AwiUTQ').toBuffer(), + new BN(2).toArrayLike(Buffer, 'le', 8), + ]; + let programId = new PublicKey( + '4ckmDgGdxQoPDLUkDT3vHgSAkzA3QRdNq5ywwY4sUSJn', + ); + programAddress = await PublicKey.createProgramAddress(seeds, programId); + expect( + programAddress.equals( + new PublicKey('12rqwuEgBYiGhBrDJStCiqEtzQpTTiZbh7teNVLuYcFA'), + ), + ).toBe(true); + } }); test('findProgramAddress', async () => {