Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions modules/sdk-coin-canton/src/lib/constant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@ export const SigningAlgorithmSpec = {

export const PUBLIC_KEY_FORMAT = 'CRYPTO_KEY_FORMAT_RAW';
export const PUBLIC_KEY_SPEC = 'SIGNING_KEY_SPEC_EC_CURVE25519';
export const SIGNATURE_FORMAT = 'SIGNATURE_FORMAT_RAW';
export const SIGNATURE_ALGORITHM_SPEC = 'SIGNING_ALGORITHM_SPEC_ED25519';
17 changes: 17 additions & 0 deletions modules/sdk-coin-canton/src/lib/iface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,20 @@ export interface OneStepEnablementRequest {
actAs: string[];
readAs: string[];
}

export interface OnboardingTransaction {
transaction: string;
}

export interface MultiHashSignature {
format: string;
signature: string;
signedBy: string;
signingAlgorithmSpec: string;
}

export interface WalletInitBroadcastData {
preparedParty: PreparedParty;
onboardingTransactions: OnboardingTransaction[];
multiHashSignatures: MultiHashSignature[];
}
20 changes: 19 additions & 1 deletion modules/sdk-coin-canton/src/lib/walletInitBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import BigNumber from 'bignumber.js';

import { BaseAddress, BaseKey, BaseTransactionBuilder, BuildTransactionError } from '@bitgo/sdk-core';
import {
BaseAddress,
BaseKey,
BaseTransactionBuilder,
BuildTransactionError,
InvalidTransactionError,
PublicKey,
Signature,
} from '@bitgo/sdk-core';
import { BaseCoin as CoinConfig } from '@bitgo/statics';

import { KeyPair } from './keyPair';
Expand All @@ -11,6 +19,7 @@ import { PUBLIC_KEY_FORMAT, PUBLIC_KEY_SPEC } from './constant';

export class WalletInitBuilder extends BaseTransactionBuilder {
private _transaction: WalletInitTransaction;
private _signatures: Signature[] = [];

private _publicKey: IPublicKey;
private _partyHint: string;
Expand Down Expand Up @@ -91,6 +100,15 @@ export class WalletInitBuilder extends BaseTransactionBuilder {
throw new Error('Not implemented');
}

/** @inheritDoc */
addSignature(publicKey: PublicKey, signature: Buffer): void {
if (!this.transaction) {
throw new InvalidTransactionError('transaction is empty!');
}
this._signatures.push({ publicKey, signature });
this.transaction.signatures = signature.toString('base64');
}

/**
* Sets the public key used for signing.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import { BaseKey, BaseTransaction, InvalidTransactionError, TransactionType } from '@bitgo/sdk-core';
import { BaseCoin as CoinConfig } from '@bitgo/statics';
import { PreparedParty, WalletInitTxData } from '../iface';
import {
MultiHashSignature,
OnboardingTransaction,
PreparedParty,
WalletInitBroadcastData,
WalletInitTxData,
} from '../iface';
import { SIGNATURE_ALGORITHM_SPEC, SIGNATURE_FORMAT } from '../constant';

export class WalletInitTransaction extends BaseTransaction {
private _preparedParty: PreparedParty;
Expand Down Expand Up @@ -31,7 +38,29 @@ export class WalletInitTransaction extends BaseTransaction {
if (!this._preparedParty) {
throw new InvalidTransactionError('Empty transaction data');
}
return Buffer.from(JSON.stringify(this._preparedParty)).toString('base64');
const multiHashSignatures: MultiHashSignature[] = [];
if (this.signature.length > 0) {
this.signature.map((signature) => {
const multiHashSignature: MultiHashSignature = {
format: SIGNATURE_FORMAT,
signature: signature,
signedBy: this._preparedParty.publicKeyFingerprint,
signingAlgorithmSpec: SIGNATURE_ALGORITHM_SPEC,
};
multiHashSignatures.push(multiHashSignature);
});
}
const walletInitBroadcastData: WalletInitBroadcastData = {
preparedParty: this._preparedParty,
onboardingTransactions: this._preparedParty.topologyTransactions.map((txn) => {
const onboardingTransaction: OnboardingTransaction = {
transaction: txn,
};
return onboardingTransaction;
}),
multiHashSignatures: multiHashSignatures,
};
return Buffer.from(JSON.stringify(walletInitBroadcastData)).toString('base64');
}

toJson(): WalletInitTxData {
Expand All @@ -55,10 +84,15 @@ export class WalletInitTransaction extends BaseTransaction {

fromRawTransaction(rawTx: string): void {
try {
const decoded: PreparedParty = JSON.parse(Buffer.from(rawTx, 'base64').toString('utf8'));
this._preparedParty = decoded;
const decoded: WalletInitBroadcastData = JSON.parse(Buffer.from(rawTx, 'base64').toString('utf8'));
this._preparedParty = decoded.preparedParty;
this._type = TransactionType.WalletInitialization;
this._id = decoded.multiHash;
this._id = decoded.preparedParty.multiHash;
if (decoded.multiHashSignatures.length > 0) {
decoded.multiHashSignatures.map((multiHashSignature: MultiHashSignature) => {
this.signatures = multiHashSignature.signature;
});
}
} catch (e) {
throw new InvalidTransactionError('Unable to parse raw transaction data');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ import should from 'should';

import { coins } from '@bitgo/statics';

import { WalletInitBuilder } from '../../../../src/lib/walletInitBuilder';
import { WalletInitTransaction } from '../../../../src/lib/walletInitialization/walletInitTransaction';
import { WalletInitBuilder, WalletInitTransaction } from '../../../../src';
import { WalletInitRequest } from '../../../../src/lib/iface';

import { GenerateTopologyResponse, InvalidGenerateTopologyResponse, WalletInitRequestData } from '../../../resources';
Expand Down