Skip to content

Commit 1c9d742

Browse files
committed
Added Buffer to BNLike type, PrefixedHexString in types, use BNLike for ecrecover v and chainId input, added type tests
1 parent db8d736 commit 1c9d742

File tree

4 files changed

+27
-13
lines changed

4 files changed

+27
-13
lines changed

src/bytes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import BN from 'bn.js'
22
import { intToBuffer, stripHexPrefix, padToEven, isHexString, isHexPrefixed } from 'ethjs-util'
3-
import { TransformableToArray, TransformableToBuffer } from './types'
3+
import { PrefixedHexString, TransformableToArray, TransformableToBuffer } from './types'
44
import { assertIsBuffer, assertIsArray, assertIsHexString } from './helpers'
55

66
/**
@@ -112,7 +112,7 @@ export const unpadHexString = function(a: string): string {
112112
*/
113113
export const toBuffer = function(
114114
v:
115-
| string
115+
| PrefixedHexString
116116
| number
117117
| BN
118118
| Buffer

src/signature.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import BN from 'bn.js'
33
import { toBuffer, setLengthLeft, bufferToHex, bufferToInt } from './bytes'
44
import { keccak } from './hash'
55
import { assertIsBuffer } from './helpers'
6+
import { BNLike } from './types'
67

78
export interface ECDSASignature {
89
v: number
@@ -30,7 +31,7 @@ export const ecsign = function(
3031
return ret
3132
}
3233

33-
function calculateSigRecovery(v: number | BN | Buffer, chainId?: number | BN | Buffer): BN {
34+
function calculateSigRecovery(v: BNLike, chainId?: BNLike): BN {
3435
const vBN = new BN(toBuffer(v))
3536
const chainIdBN = chainId ? new BN(toBuffer(chainId)) : undefined
3637
return chainIdBN ? vBN.sub(chainIdBN.muln(2).addn(35)) : vBN.subn(27)
@@ -47,10 +48,10 @@ function isValidSigRecovery(recovery: number | BN): boolean {
4748
*/
4849
export const ecrecover = function(
4950
msgHash: Buffer,
50-
v: number | BN | Buffer,
51+
v: BNLike,
5152
r: Buffer,
5253
s: Buffer,
53-
chainId?: number | BN | Buffer
54+
chainId?: BNLike
5455
): Buffer {
5556
const signature = Buffer.concat([setLengthLeft(r, 32), setLengthLeft(s, 32)], 64)
5657
const recovery = calculateSigRecovery(v, chainId)

src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { unpadBuffer } from './bytes'
55
/*
66
* A type that represents a BNLike input that can be converted to a BN.
77
*/
8-
export type BNLike = BN | string | number
8+
export type BNLike = BN | PrefixedHexString | number | Buffer
99

1010
/*
1111
* A type that represents a BufferLike input that can be converted to a Buffer.
@@ -28,7 +28,7 @@ export type PrefixedHexString = string
2828
* A type that represents an Address-like value.
2929
* To convert to address, use `new Address(toBuffer(value))`
3030
*/
31-
export type AddressLike = Address | Buffer | string
31+
export type AddressLike = Address | Buffer | PrefixedHexString
3232

3333
/*
3434
* A type that represents an object that has a `toArray()` method.

test/signature.spec.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,27 @@ describe('ecrecover', function() {
129129
'8ae8cb685a7a9f29494b07b287c3f6a103b73fa178419d10d1184861a40f6afe',
130130
'hex'
131131
)
132-
const v = Buffer.from('f2ded8deec6714', 'hex')
132+
133133
const r = Buffer.from('ec212841e0b7aaffc3b3e33a08adf32fa07159e856ef23db85175a4f6d71dc0f', 'hex')
134134
const s = Buffer.from('4b8e02b96b94064a5aa2f8d72bd0040616ba8e482a5dd96422e38c9a4611f8d5', 'hex')
135-
const chainID = Buffer.from('796f6c6f763378', 'hex')
136-
const sender = ecrecover(msgHash, v, r, s, chainID)
137-
assert.ok(sender.equals(senderPubKey), 'sender pubkey correct')
138-
const chainIDNumber = parseInt(chainID.toString('hex'), 16)
139-
const vNumber = parseInt(v.toString('hex'), 16)
135+
136+
const vBuffer = Buffer.from('f2ded8deec6714', 'hex')
137+
const chainIDBuffer = Buffer.from('796f6c6f763378', 'hex')
138+
let sender = ecrecover(msgHash, vBuffer, r, s, chainIDBuffer)
139+
assert.ok(sender.equals(senderPubKey), 'sender pubkey correct (Buffer)')
140+
141+
const vBN = new BN(vBuffer)
142+
const chainIDBN = new BN(chainIDBuffer)
143+
sender = ecrecover(msgHash, vBN, r, s, chainIDBN)
144+
assert.ok(sender.equals(senderPubKey), 'sender pubkey correct (BN)')
145+
146+
const vHexString = '0xf2ded8deec6714'
147+
const chainIDHexString = '0x796f6c6f763378'
148+
sender = ecrecover(msgHash, vHexString, r, s, chainIDHexString)
149+
assert.ok(sender.equals(senderPubKey), 'sender pubkey correct (HexString)')
150+
151+
const chainIDNumber = parseInt(chainIDBuffer.toString('hex'), 16)
152+
const vNumber = parseInt(vBuffer.toString('hex'), 16)
140153
assert.throws(() => {
141154
// If we would use numbers for the `v` and `chainId` parameters, then it should throw.
142155
// (The numbers are too high to perform arithmetic on)

0 commit comments

Comments
 (0)