@@ -5,6 +5,14 @@ import { Idl, IdlDiscriminator } from "../../idl.js";
55import { IdlCoder } from "./idl.js" ;
66import { AccountsCoder } from "../index.js" ;
77
8+ function bytesEqual ( a : Uint8Array , b : Uint8Array ) : boolean {
9+ if ( a . length !== b . length ) return false ;
10+ for ( let i = 0 ; i < a . length ; i += 1 ) {
11+ if ( a [ i ] !== b [ i ] ) return false ;
12+ }
13+ return true ;
14+ }
15+
816/**
917 * Encodes and decodes account objects.
1018 */
@@ -56,22 +64,28 @@ export class BorshAccountsCoder<A extends string = string>
5664 const len = layout . layout . encode ( account , buffer ) ;
5765 const accountData = buffer . slice ( 0 , len ) ;
5866 const discriminator = this . accountDiscriminator ( accountName ) ;
59- return Buffer . concat ( [ discriminator , accountData ] ) ;
67+ return Buffer . from ( [ ... discriminator , ... accountData ] ) ;
6068 }
6169
6270 public decode < T = any > ( accountName : A , data : Buffer ) : T {
6371 // Assert the account discriminator is correct.
6472 const discriminator = this . accountDiscriminator ( accountName ) ;
65- if ( discriminator . compare ( data . slice ( 0 , discriminator . length ) ) ) {
73+ const givenDisc = Uint8Array . from ( data . subarray ( 0 , discriminator . length ) ) ;
74+ if ( ! bytesEqual ( Uint8Array . from ( discriminator ) , givenDisc ) ) {
6675 throw new Error ( "Invalid account discriminator" ) ;
6776 }
6877 return this . decodeUnchecked ( accountName , data ) ;
6978 }
7079
7180 public decodeAny < T = any > ( data : Buffer ) : T {
7281 for ( const [ name , layout ] of this . accountLayouts ) {
73- const givenDisc = data . subarray ( 0 , layout . discriminator . length ) ;
74- const matches = givenDisc . equals ( Buffer . from ( layout . discriminator ) ) ;
82+ const givenDisc = Uint8Array . from (
83+ data . subarray ( 0 , layout . discriminator . length )
84+ ) ;
85+ const matches = bytesEqual (
86+ Uint8Array . from ( layout . discriminator ) ,
87+ givenDisc
88+ ) ;
7589 if ( matches ) return this . decodeUnchecked ( name , data ) ;
7690 }
7791
@@ -91,11 +105,12 @@ export class BorshAccountsCoder<A extends string = string>
91105
92106 public memcmp ( accountName : A , appendData ?: Buffer ) : any {
93107 const discriminator = this . accountDiscriminator ( accountName ) ;
108+ const bytes = appendData
109+ ? Uint8Array . from ( [ ...discriminator , ...appendData ] )
110+ : Uint8Array . from ( discriminator ) ;
94111 return {
95112 offset : 0 ,
96- bytes : bs58 . encode (
97- appendData ? Buffer . concat ( [ discriminator , appendData ] ) : discriminator
98- ) ,
113+ bytes : bs58 . encode ( Buffer . from ( bytes ) ) ,
99114 } ;
100115 }
101116
0 commit comments