Skip to content

Commit 37d1bb4

Browse files
authored
Merge pull request #7275 from BitGo/COIN-6105
feat(sdk-coin-canton): modified the toBroadcastFormat for the wallet init transaction
2 parents 7313851 + 2e5d25c commit 37d1bb4

File tree

5 files changed

+78
-8
lines changed

5 files changed

+78
-8
lines changed

modules/sdk-coin-canton/src/lib/constant.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ export const SigningAlgorithmSpec = {
1212

1313
export const PUBLIC_KEY_FORMAT = 'CRYPTO_KEY_FORMAT_RAW';
1414
export const PUBLIC_KEY_SPEC = 'SIGNING_KEY_SPEC_EC_CURVE25519';
15+
export const SIGNATURE_FORMAT = 'SIGNATURE_FORMAT_RAW';
16+
export const SIGNATURE_ALGORITHM_SPEC = 'SIGNING_ALGORITHM_SPEC_ED25519';

modules/sdk-coin-canton/src/lib/iface.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,20 @@ export interface OneStepEnablementRequest {
6464
actAs: string[];
6565
readAs: string[];
6666
}
67+
68+
export interface OnboardingTransaction {
69+
transaction: string;
70+
}
71+
72+
export interface MultiHashSignature {
73+
format: string;
74+
signature: string;
75+
signedBy: string;
76+
signingAlgorithmSpec: string;
77+
}
78+
79+
export interface WalletInitBroadcastData {
80+
preparedParty: PreparedParty;
81+
onboardingTransactions: OnboardingTransaction[];
82+
multiHashSignatures: MultiHashSignature[];
83+
}

modules/sdk-coin-canton/src/lib/walletInitBuilder.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import BigNumber from 'bignumber.js';
22

3-
import { BaseAddress, BaseKey, BaseTransactionBuilder, BuildTransactionError } from '@bitgo/sdk-core';
3+
import {
4+
BaseAddress,
5+
BaseKey,
6+
BaseTransactionBuilder,
7+
BuildTransactionError,
8+
InvalidTransactionError,
9+
PublicKey,
10+
Signature,
11+
} from '@bitgo/sdk-core';
412
import { BaseCoin as CoinConfig } from '@bitgo/statics';
513

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

1220
export class WalletInitBuilder extends BaseTransactionBuilder {
1321
private _transaction: WalletInitTransaction;
22+
private _signatures: Signature[] = [];
1423

1524
private _publicKey: IPublicKey;
1625
private _partyHint: string;
@@ -91,6 +100,15 @@ export class WalletInitBuilder extends BaseTransactionBuilder {
91100
throw new Error('Not implemented');
92101
}
93102

103+
/** @inheritDoc */
104+
addSignature(publicKey: PublicKey, signature: Buffer): void {
105+
if (!this.transaction) {
106+
throw new InvalidTransactionError('transaction is empty!');
107+
}
108+
this._signatures.push({ publicKey, signature });
109+
this.transaction.signatures = signature.toString('base64');
110+
}
111+
94112
/**
95113
* Sets the public key used for signing.
96114
*

modules/sdk-coin-canton/src/lib/walletInitialization/walletInitTransaction.ts

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import { BaseKey, BaseTransaction, InvalidTransactionError, TransactionType } from '@bitgo/sdk-core';
22
import { BaseCoin as CoinConfig } from '@bitgo/statics';
3-
import { PreparedParty, WalletInitTxData } from '../iface';
3+
import {
4+
MultiHashSignature,
5+
OnboardingTransaction,
6+
PreparedParty,
7+
WalletInitBroadcastData,
8+
WalletInitTxData,
9+
} from '../iface';
10+
import { SIGNATURE_ALGORITHM_SPEC, SIGNATURE_FORMAT } from '../constant';
411

512
export class WalletInitTransaction extends BaseTransaction {
613
private _preparedParty: PreparedParty;
@@ -31,7 +38,29 @@ export class WalletInitTransaction extends BaseTransaction {
3138
if (!this._preparedParty) {
3239
throw new InvalidTransactionError('Empty transaction data');
3340
}
34-
return Buffer.from(JSON.stringify(this._preparedParty)).toString('base64');
41+
const multiHashSignatures: MultiHashSignature[] = [];
42+
if (this.signature.length > 0) {
43+
this.signature.map((signature) => {
44+
const multiHashSignature: MultiHashSignature = {
45+
format: SIGNATURE_FORMAT,
46+
signature: signature,
47+
signedBy: this._preparedParty.publicKeyFingerprint,
48+
signingAlgorithmSpec: SIGNATURE_ALGORITHM_SPEC,
49+
};
50+
multiHashSignatures.push(multiHashSignature);
51+
});
52+
}
53+
const walletInitBroadcastData: WalletInitBroadcastData = {
54+
preparedParty: this._preparedParty,
55+
onboardingTransactions: this._preparedParty.topologyTransactions.map((txn) => {
56+
const onboardingTransaction: OnboardingTransaction = {
57+
transaction: txn,
58+
};
59+
return onboardingTransaction;
60+
}),
61+
multiHashSignatures: multiHashSignatures,
62+
};
63+
return Buffer.from(JSON.stringify(walletInitBroadcastData)).toString('base64');
3564
}
3665

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

5685
fromRawTransaction(rawTx: string): void {
5786
try {
58-
const decoded: PreparedParty = JSON.parse(Buffer.from(rawTx, 'base64').toString('utf8'));
59-
this._preparedParty = decoded;
87+
const decoded: WalletInitBroadcastData = JSON.parse(Buffer.from(rawTx, 'base64').toString('utf8'));
88+
this._preparedParty = decoded.preparedParty;
6089
this._type = TransactionType.WalletInitialization;
61-
this._id = decoded.multiHash;
90+
this._id = decoded.preparedParty.multiHash;
91+
if (decoded.multiHashSignatures.length > 0) {
92+
decoded.multiHashSignatures.map((multiHashSignature: MultiHashSignature) => {
93+
this.signatures = multiHashSignature.signature;
94+
});
95+
}
6296
} catch (e) {
6397
throw new InvalidTransactionError('Unable to parse raw transaction data');
6498
}

modules/sdk-coin-canton/test/unit/builder/walletInit/walletInitBuilder.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import should from 'should';
33

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

6-
import { WalletInitBuilder } from '../../../../src/lib/walletInitBuilder';
7-
import { WalletInitTransaction } from '../../../../src/lib/walletInitialization/walletInitTransaction';
6+
import { WalletInitBuilder, WalletInitTransaction } from '../../../../src';
87
import { WalletInitRequest } from '../../../../src/lib/iface';
98

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

0 commit comments

Comments
 (0)