Cleanup nonce encoding

This commit is contained in:
Ethan Frey 2020-01-23 15:10:53 +01:00
parent 5074a8c8d3
commit b3c7a6a478
3 changed files with 30 additions and 6 deletions

View File

@ -3,13 +3,26 @@ import { accountToNonce, nonceToAccountNumber, nonceToSequence } from "./types";
describe("nonceEncoding", () => {
it("works for input in range", () => {
const nonce = accountToNonce("1234", "7890");
const nonce = accountToNonce({
accountNumber: "1234",
sequence: "7890",
});
expect(nonceToAccountNumber(nonce)).toEqual("1234");
expect(nonceToSequence(nonce)).toEqual("7890");
});
it("errors on input too large", () => {
expect(() => accountToNonce("1234567890", "7890")).toThrow();
expect(() => accountToNonce("178", "97320247923")).toThrow();
expect(() =>
accountToNonce({
accountNumber: "1234567890",
sequence: "7890",
}),
).toThrow();
expect(() =>
accountToNonce({
accountNumber: "178",
sequence: "97320247923",
}),
).toThrow();
});
});

View File

@ -46,9 +46,16 @@ const maxAcct = 1 << 23;
// tslint:disable-next-line:no-bitwise
const maxSeq = 1 << 20;
// NonceInfo is the data we need from account to create a nonce
// Use this so no confusion about order of arguments
export interface NonceInfo {
readonly accountNumber: string;
readonly sequence: string;
}
// this (lossily) encodes the two pieces of info (uint64) needed to sign into
// one (53-bit) number. Cross your fingers.
export function accountToNonce(accountNumber: string, sequence: string): Nonce {
export function accountToNonce({ accountNumber, sequence }: NonceInfo): Nonce {
const acct = parseInt(accountNumber, 10);
const seq = parseInt(sequence, 10);

8
types/types.d.ts vendored
View File

@ -1,4 +1,4 @@
import { Amount, Token, Nonce } from "@iov/bcp";
import { Amount, Nonce, Token } from "@iov/bcp";
import amino from "@tendermint/amino-js";
export declare type AminoTx = amino.Tx & {
readonly value: amino.StdTx;
@ -10,6 +10,10 @@ export interface TokenInfo extends Token {
export declare type TokenInfos = ReadonlyArray<TokenInfo>;
export declare function amountToCoin(lookup: ReadonlyArray<TokenInfo>, amount: Amount): amino.Coin;
export declare function coinToAmount(tokens: TokenInfos, coin: amino.Coin): Amount;
export declare function accountToNonce(accountNumber: string, sequence: string): Nonce;
export interface NonceInfo {
readonly accountNumber: string;
readonly sequence: string;
}
export declare function accountToNonce({ accountNumber, sequence }: NonceInfo): Nonce;
export declare function nonceToAccountNumber(nonce: Nonce): string;
export declare function nonceToSequence(nonce: Nonce): string;