BN manipulation via in-place shifts (as applicable) (#955)
* BN manipulation via in-place shifts (as applicable) * Adjust tests
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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()
|
||||
);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user