@@ -374,8 +374,8 @@ async function trezorProvider(options: {
374
374
if ( addressToPath . size === 0 ) {
375
375
await enable ( )
376
376
}
377
-
378
377
const path = [ ...addressToPath . values ( ) ] [ 0 ]
378
+ const { BN , toBuffer } = ethUtil
379
379
const common = new Common ( {
380
380
chain : customNetwork || networkName ( networkId )
381
381
} )
@@ -386,18 +386,23 @@ async function trezorProvider(options: {
386
386
} ,
387
387
{ common, freeze : false }
388
388
)
389
-
389
+ transaction . v = new BN ( toBuffer ( networkId ) )
390
+ transaction . r = transaction . s = new BN ( toBuffer ( 0 ) )
390
391
const trezorResult = await trezorSignTransaction ( path , transactionData )
391
-
392
392
if ( ! trezorResult . success ) {
393
393
throw new Error ( trezorResult . payload . error )
394
394
}
395
-
396
- const signature = trezorResult . payload
397
- transaction . v = signature . v
398
- transaction . r = signature . r
399
- transaction . s = signature . s
400
-
395
+ let v = trezorResult . payload . v . toString ( 16 )
396
+ // EIP155 support. check/recalc signature v value.
397
+ const rv = parseInt ( v , 16 )
398
+ let cv = networkId * 2 + 35
399
+ if ( rv !== cv && ( rv & cv ) !== rv ) {
400
+ cv += 1 // add signature v bit.
401
+ }
402
+ v = cv . toString ( 16 )
403
+ transaction . v = new BN ( toBuffer ( `0x${ v } ` ) )
404
+ transaction . r = new BN ( toBuffer ( `${ trezorResult . payload . r } ` ) )
405
+ transaction . s = new BN ( toBuffer ( `${ trezorResult . payload . s } ` ) )
401
406
return `0x${ transaction . serialize ( ) . toString ( 'hex' ) } `
402
407
}
403
408
0 commit comments