All files / src register_delegate.ts

100% Statements 19/19
100% Branches 8/8
100% Functions 2/2
100% Lines 19/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70                            3x   3x 3x   3x                   3x       29x 2x     27x 1x         26x     3x     29x 26x   26x               26x 10x     16x 16x   16x    
/*
 * Copyright © 2019 Lisk Foundation
 *
 * See the LICENSE file at the top-level directory of this distribution
 * for licensing information.
 *
 * Unless otherwise agreed in a custom licensing agreement with the Lisk Foundation,
 * no part of this software, including this file, may be copied, modified,
 * propagated, or distributed except according to the terms contained in the
 * LICENSE file.
 *
 * Removal or modification of this copyright notice is prohibited.
 *
 */
import { validateNetworkIdentifier } from '@liskhq/lisk-validator';
 
import { DelegateTransaction } from './10_delegate_transaction';
import { DELEGATE_FEE, USERNAME_MAX_LENGTH } from './constants';
import { TransactionJSON } from './transaction_types';
import { createBaseTransaction } from './utils';
 
export interface RegisterDelegateInputs {
	readonly passphrase?: string;
	readonly secondPassphrase?: string;
	readonly timeOffset?: number;
	readonly username: string;
	readonly networkIdentifier: string;
}
 
const validateInputs = ({
	username,
	networkIdentifier,
}: RegisterDelegateInputs): void => {
	if (!username || typeof username !== 'string') {
		throw new Error('Please provide a username. Expected string.');
	}
 
	if (username.length > USERNAME_MAX_LENGTH) {
		throw new Error(
			`Username length does not match requirements. Expected to be no more than ${USERNAME_MAX_LENGTH} characters.`,
		);
	}
 
	validateNetworkIdentifier(networkIdentifier);
};
 
export const registerDelegate = (
	inputs: RegisterDelegateInputs,
): Partial<TransactionJSON> => {
	validateInputs(inputs);
	const { username, passphrase, secondPassphrase, networkIdentifier } = inputs;
 
	const transaction = {
		...createBaseTransaction(inputs),
		type: 10,
		fee: DELEGATE_FEE.toString(),
		asset: { username },
		networkIdentifier,
	};
 
	if (!passphrase) {
		return transaction;
	}
 
	const delegateTransaction = new DelegateTransaction(transaction);
	delegateTransaction.sign(passphrase, secondPassphrase);
 
	return delegateTransaction.toJSON();
};