BN manipulation via in-place shifts (as applicable) (#955)

* BN manipulation via in-place shifts (as applicable)

* Adjust tests
This commit is contained in:
Jaco
2021-04-22 13:42:20 +02:00
committed by GitHub
parent 50b10e214c
commit 0fb52a929d
4 changed files with 14 additions and 9 deletions
+1
View File
@@ -8,6 +8,7 @@ Changes:
- Additional input asserts for non-convertable values in `u8aToU8a`
- Adapt `@polkadot/x-global` to return `globalThis` as available
- Minor readability cleanups
- BN manipulation via in-place shifts (as applicable)
## 6.2.1 Apr 18, 2021
+4 -1
View File
@@ -22,7 +22,10 @@ describe('compactFromU8a', (): void => {
it('decodes from same u32 encoded value (short)', (): void => {
expect(
compactFromU8a(new Uint8Array([254, 255, 3, 0]))
).toEqual([4, new BN(0xffff)]);
).toEqual(
// since we use in-place, the words are different... HACK it
[4, new BN(0xffff).ishln(16).ishrn(16)]
);
});
it('decodes from same u32 encoded value (full)', (): void => {
+6 -5
View File
@@ -3,6 +3,7 @@
import BN from 'bn.js';
import { BN_FOUR } from '../bn';
import { u8aToBn, u8aToU8a } from '../u8a';
/**
@@ -24,17 +25,17 @@ export function compactFromU8a (_input: Buffer | Uint8Array | string | number[])
const flag = input[0] & 0b11;
if (flag === 0b00) {
return [1, new BN(input[0]).shrn(2)];
return [1, new BN(input[0]).ishrn(2)];
} else if (flag === 0b01) {
return [2, u8aToBn(input.slice(0, 2), true).shrn(2)];
return [2, u8aToBn(input.slice(0, 2), true).ishrn(2)];
} else if (flag === 0b10) {
return [4, u8aToBn(input.slice(0, 4), true).shrn(2)];
return [4, u8aToBn(input.slice(0, 4), true).ishrn(2)];
}
const offset = 1 + (
new BN(input[0])
.shrn(2) // clear flag
.addn(4) // add 4 for base length
.ishrn(2) // clear flag
.iadd(BN_FOUR) // add 4 for base length
.toNumber()
);
+3 -3
View File
@@ -4,7 +4,7 @@
import BN from 'bn.js';
import { assert } from '../assert';
import { bnToBn, bnToU8a } from '../bn';
import { BN_ONE, BN_TWO, bnToBn, bnToU8a } from '../bn';
import { u8aConcat } from '../u8a';
const MAX_U8 = new BN(2).pow(new BN(8 - 2)).subn(1);
@@ -29,9 +29,9 @@ export function compactToU8a (_value: BN | BigInt | number): Uint8Array {
if (value.lte(MAX_U8)) {
return new Uint8Array([value.toNumber() << 2]);
} else if (value.lte(MAX_U16)) {
return bnToU8a(value.shln(2).addn(0b01), 16, true);
return bnToU8a(value.ishln(2).iadd(BN_ONE), 16, true);
} else if (value.lte(MAX_U32)) {
return bnToU8a(value.shln(2).addn(0b10), 32, true);
return bnToU8a(value.ishln(2).iadd(BN_TWO), 32, true);
}
const u8a = bnToU8a(value);