Skip to content

Commit 6fa7eaa

Browse files
authored
Merge pull request #6699 from BitGo/scripts
test: add message builder fromBroadcastString() test cases
2 parents 78580ad + 323fab6 commit 6fa7eaa

File tree

4 files changed

+126
-2
lines changed

4 files changed

+126
-2
lines changed

examples/ts/access-token.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Get Access Token of a BitGo account
3+
*/
4+
5+
import { BitGoAPI } from '@bitgo/sdk-api';
6+
require('dotenv').config({ path: '../../.env' });
7+
8+
const bitgo = new BitGoAPI({
9+
env: 'test', // Change this to env: 'prod' when you are ready for production
10+
});
11+
12+
async function main() {
13+
const auth_res = await bitgo.authenticate({
14+
username: process.env.TEST_EMAIL!,
15+
password: process.env.TEST_PASS!,
16+
otp: '000000',
17+
});
18+
19+
console.log(auth_res);
20+
}
21+
22+
main().catch((e) => console.log(e));

modules/abstract-eth/test/unit/messages/eip191/eip191MessageBuilder.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import 'should';
22
import sinon from 'sinon';
33
import { BroadcastableMessage, MessageStandardType, serializeSignatures } from '@bitgo/sdk-core';
44
import { fixtures } from '../fixtures';
5-
import { EIP191Message, Eip191MessageBuilder } from '../../../../src';
5+
import { EIP191Message, Eip191MessageBuilder, MessageBuilderFactory } from '../../../../src';
6+
import { BaseCoin } from '@bitgo/statics';
67

78
describe('EIP191 Message Builder', () => {
89
const sandbox = sinon.createSandbox();
@@ -114,4 +115,33 @@ describe('EIP191 Message Builder', () => {
114115
.should.be.rejectedWith(`Invalid message type, expected ${MessageStandardType.EIP191}`);
115116
});
116117
});
118+
119+
describe('fromBroadcastString', function () {
120+
it('should parse broadcastable string and return correct builder type', async function () {
121+
const broadcastHex =
122+
'7b2274797065223a22454950313931222c227061796c6f6164223a2253544152203130303020746f20616464725f746573743171727139366830726a68743275366e336667776d7939307837676d6c38686475657774326e6d72327536636d6b707771743477373839776b346534387a6a73616b673237647533683730776d656a756b34386b783465343368767a737566736876362033316136626162353061383462383433396164636662373836626232303230663638303765366538666461363239623432343131306663376262316336623862222c2273657269616c697a65645369676e617475726573223a5b7b227075626c69634b6579223a22222c227369676e6174757265223a2274386c6e725a4b7a757264566c777343355a66422f4b314b5533516d4b5a3970343671576a3155795744307046464577584e6d754f327a4845644e3164372b2b414e5653796f5a3869547737375073546462334b3878773d227d5d2c227369676e657273223a5b22307866613061376634613064396535343463353761656361346533326233623130343862363333636466225d2c226d65746164617461223a7b22656e636f64696e67223a2275746638227d2c227369676e61626c655061796c6f6164223a224d546b304e5463304e6a67324e5463794e6a55334e545a6b4d6a41314d7a59354e6a63325a5459314e6a51794d44526b4e6a55334d7a637a4e6a45324e7a59314d32457759544d784d7a677a4e6a557a4e5451304d5455794d6a417a4d544d774d7a417a4d4449774e7a51325a6a49774e6a45324e4459304e7a49315a6a63304e6a55334d7a63304d7a45334d5463794e7a457a4f544d324e6a677a4d4463794e6d45324f4463304d7a49334e544d324e6d557a4d7a59324e6a63334e7a5a6b4e7a6b7a4f544d774e7a677a4e7a59334e6d5132597a4d344e6a67324e4463314e6a55334e7a63304d7a49325a545a6b4e7a497a4d6a63314d7a59324d7a5a6b4e6d49334d4463334e7a45334e444d304e7a637a4e7a4d344d7a6b334e7a5a694d7a51324e544d304d7a673359545a684e7a4d324d545a694e6a637a4d6a4d334e6a51334e544d7a4e6a677a4e7a4d774e7a63325a4459314e6d45334e545a694d7a517a4f445a694e7a677a4e4459314d7a517a4d7a59344e7a59335954637a4e7a55324e6a637a4e6a67334e6a4d324d6a417a4d7a4d784e6a457a4e6a59794e6a45324d6a4d314d7a41324d544d344d7a51324d6a4d344d7a517a4d7a4d354e6a45324e44597a4e6a59324d6a4d334d7a677a4e6a59794e6a497a4d6a4d774d7a497a4d4459324d7a597a4f444d774d7a63324e544d324e6a557a4f4459324e6a51324d544d324d7a497a4f5459794d7a517a4d6a4d304d7a457a4d544d774e6a59324d7a4d334e6a49324d6a4d784e6a4d7a4e6a59794d7a67324d673d3d227d';
123+
const coinConfig = { name: 'eth' } as BaseCoin;
124+
const factory = new MessageBuilderFactory(coinConfig);
125+
const builder = factory.fromBroadcastString(broadcastHex);
126+
const message = await builder.build();
127+
128+
const payload = message.getPayload();
129+
const payloadParts = payload.split(' ');
130+
const address = message.getSigners()[0];
131+
address.should.equal('0xfa0a7f4a0d9e544c57aeca4e32b3b1048b633cdf');
132+
const destinationAddress = payloadParts[3];
133+
destinationAddress.should.equal(
134+
'addr_test1qrq96h0rjht2u6n3fgwmy90x7gml8hduewt2nmr2u6cmkpwqt4w789wk4e48zjsakg27du3h70wmejuk48kx4e43hvzsufshv6'
135+
);
136+
const amount = Number(payloadParts[1]);
137+
amount.should.equal(1000);
138+
139+
const signature = message.getSignatures()[0].signature.toString('hex');
140+
signature.should.equal(
141+
'b7c967ad92b3bab755970b02e597c1fcad4a537426299f69e3aa968f5532583d291451305cd9ae3b6cc711d37577bfbe00d552ca867c893c3becfb1375bdcaf31c'
142+
);
143+
const publicKeyHex = message.getSignatures()[0].publicKey.pub;
144+
publicKeyHex.should.equal('');
145+
});
146+
});
117147
});

modules/sdk-coin-ada/test/unit/messages/cip8/cip8MessageBuilder.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { Buffer } from 'buffer';
44
import { BroadcastableMessage, MessageStandardType, serializeSignatures, Signature } from '@bitgo/sdk-core';
55
import { BaseCoin } from '@bitgo/statics';
66
import { cip8TestResources } from '../../../resources/cip8Resources';
7-
import { Cip8Message, Cip8MessageBuilder } from '../../../../src';
7+
import { Cip8Message, Cip8MessageBuilder, MessageBuilderFactory } from '../../../../src';
8+
import { bufferToCoseObjectsOutput } from '../../../../src/lib/messages/cip8/utils';
89

910
describe('Cip8MessageBuilder', function () {
1011
let sandbox: sinon.SinonSandbox;
@@ -118,5 +119,41 @@ describe('Cip8MessageBuilder', function () {
118119
messageSignature.signature.should.deepEqual(signatures[0].signature);
119120
messageSignature.publicKey.should.deepEqual(signatures[0].publicKey);
120121
});
122+
123+
describe('fromBroadcastString', function () {
124+
it('should parse broadcastable string and return correct builder type', async function () {
125+
const broadcastHex =
126+
'7b2274797065223a2243495038222c227061796c6f6164223a225354415220373238323535343520746f2061646472317178763965397a70353578763336307767686c3830366430327933353839397a6b6b7132726874667876377836777963746a3279726667766572353775333037776c35363735667267773232396476713538776b6a76657564357571666e6d74657a2033316136626162353061383462383433396164636662373836626232303230663638303765366538666461363239623432343131306663376262316336623862222c2273657269616c697a65645369676e617475726573223a5b7b227075626c69634b6579223a2265633861346630343534303764313134353736663963623033313832663564636163386165626434323232323332313638343332343139306539323737383431222c227369676e6174757265223a226f6e4a74595735315957784462334e6c55326c6e626a46495a586835417034344e4455344e445a684d6a41784d6a63324e7a59784e6a51324e4463794e6a55334d7a637a4e54677a4f5441784e4455784d57526c4d7a5a6d4e544a6959575669593259314e6a4d7a4d7a6b334f574979597a67325a444e6c5a6a49324e4749305a5464684d474934596a6b345a5441784d6a4d32595445304e5445785a47557a4e6d59314d6d4a685a574a6a5a6a55324d7a4d7a4f546335596a4a6a4f445a6b4d32566d4d6a5930596a526c4e324577596a68694f54686c4d4445794d7a5a684d5745784e6a59324f4459784e7a4d324f4459314e6a526d4e445534596a6b314d7a55304e4445314d6a49774d7a637a4d6a4d344d7a497a4e544d314d7a517a4e5449774e7a51325a6a49774e6a45324e4459304e7a497a4d5463784e7a67334e6a4d354e6a557a4f5464684e7a417a4e544d314e7a67334e6a4d7a4d7a597a4d4463334e6a63324f445a6a4d7a677a4d444d324e6a517a4d444d794e7a6b7a4d7a4d314d7a677a4f544d354e324532596a5a694e7a457a4d6a63794e6a67334e4459324e7a67334e6a4d334e7a677a4e6a63334e7a6b324d7a63304e6d457a4d6a63354e7a49324e6a59334e7a59324e5463794d7a557a4e7a63314d7a4d7a4d444d334e7a6332597a4d314d7a597a4e7a4d314e6a59334d6a59334e7a637a4d6a4d794d7a6b324e4463324e7a457a4e544d344e7a6332596a5a684e7a59324e5463314e6a517a4e5463314e7a45324e6a5a6c4e6d51334e4459314e3245794d444d7a4d7a45324d544d324e6a49324d5459794d7a557a4d4459784d7a677a4e4459794d7a677a4e444d7a4d7a6b324d5459304e6a4d324e6a59794d7a637a4f444d324e6a49324d6a4d794d7a417a4d6a4d774e6a597a4e6a4d344d7a417a4e7a59314d7a59324e544d344e6a59324e4459784d7a597a4d6a4d354e6a497a4e444d794d7a517a4d544d784d7a41324e6a597a4d7a63324d6a59794d7a45324d7a4d324e6a497a4f4459794e5467304d44566c5a5467335a4455784f54566859544a6b5a546b344d3251795a546332597a6c6c4f54426a4d475a6c597a59794e32466d4f5449305a47457a4f5451334f44426b596a6c684f445a6d595467354e4463775a6a4a6c595755774d7a4d305a54646b4d6d49344e6a4177596a5a694e4445354e6a686c4d54526c596a4931596a52694f5759314e5451354d544e6a596a4a6a5a5441795a6d55784e4463794e444d345a544d785a6a426d63473168626e566862454e766332564c5a586c495a586834564745304d4445774d54417a4d6a63794d4441324d6a45314f4449775a574d345954526d4d4451314e4441335a4445784e4455334e6d5935593249774d7a45344d6d59315a474e68597a68685a574a6b4e4449794d6a497a4d6a45324f44517a4d6a51784f54426c4f5449334e7a67304d513d3d227d5d2c227369676e657273223a5b22616464723171397a337268336b37353436613038347676656530786576736d663737666a7466656171687a756375716672646732397a38307264616674343637303263656e6a37646a65706b6e61756e796b6e6e36707739653363716a78367373796333737937225d2c226d65746164617461223a7b22656e636f64696e67223a2275746638227d2c227369676e61626c655061796c6f6164223a22684770546157647559585231636d5578574561694153646e5957526b636d567a6331673541555552336a62314b36363839574d7a6c357373687450764a6b744f6567754c6d4f41534e71464645643432395375757650566a4d3565624c49625437795a4c546e6f4c69356a67456a61685146693555315242556941334d6a67794e5455304e534230627942685a4752794d584634646a6c6c4f5870774e545634646a4d324d48646e614777344d445a6b4d444a354d7a55344f546c36613274784d6e4a6f64475a34646a64344e6e6435593352714d6e6c795a6d64325a5849314e33557a4d446433624455324e7a566d636d64334d6a49355a485a784e546833613270325a58566b4e5856785a6d35746447563649444d7859545a69595749314d4745344e4749344e444d355957526a5a6d49334f445a69596a49774d6a426d4e6a67774e3255325a54686d5a4745324d6a6c694e4449304d5445775a6d4d33596d4978597a5a694f47493d227d';
127+
const coinConfig = { name: 'ada' } as BaseCoin;
128+
const factory = new MessageBuilderFactory(coinConfig);
129+
const builder = factory.fromBroadcastString(broadcastHex);
130+
const message = await builder.build();
131+
132+
const payload = message.getPayload();
133+
const payloadParts = payload.split(' ');
134+
const address = message.getSigners()[0];
135+
address.should.equal(
136+
'addr1q9z3rh3k7546a084vvee0xevsmf77fjtfeaqhzucuqfrdg29z80rdaft46702cenj7djepknaunyknn6pw9e3cqjx6ssyc3sy7'
137+
);
138+
const destinationAddress = payloadParts[3];
139+
destinationAddress.should.equal(
140+
'addr1qxv9e9zp55xv360wghl806d02y35899zkkq2rhtfxv7x6wyctj2yrfgver57u307wl5675frgw229dvq58wkjveud5uqfnmtez'
141+
);
142+
const amount = Number(payloadParts[1]);
143+
amount.should.equal(72825545);
144+
145+
const signature = message.getSignatures()[0].signature;
146+
const publicKeyHex = message.getSignatures()[0].publicKey.pub;
147+
publicKeyHex.should.equal('ec8a4f045407d114576f9cb03182f5dcac8aebd42222321684324190e9277841');
148+
149+
const coseObjectsOutput = await bufferToCoseObjectsOutput(signature);
150+
const coseKey = coseObjectsOutput.manualCoseKeyHex;
151+
coseKey.should.equal('a4010103272006215820ec8a4f045407d114576f9cb03182f5dcac8aebd42222321684324190e9277841');
152+
const coseSign1 = coseObjectsOutput.manualCoseSign1Hex;
153+
coseSign1.should.equal(
154+
'845846a2012767616464726573735839014511de36f52baebcf56333979b2c86d3ef264b4e7a0b8b98e01236a14511de36f52baebcf56333979b2c86d3ef264b4e7a0b8b98e01236a1a166686173686564f458b95354415220373238323535343520746f2061646472317178763965397a70353578763336307767686c3830366430327933353839397a6b6b7132726874667876377836777963746a3279726667766572353775333037776c35363735667267773232396476713538776b6a76657564357571666e6d74657a203331613662616235306138346238343339616463666237383662623230323066363830376536653866646136323962343234313130666337626231633662386258405ee87d5195aa2de983d2e76c9e90c0fec627af924da394780db9a86fa89470f2eae0334e7d2b8600b6b41968e14eb25b4b9f554913cb2ce02fe1472438e31f0f'
155+
);
156+
});
157+
});
121158
});
122159
});

modules/sdk-coin-sol/test/unit/messages/simpleMessageBuilder.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { BaseCoin } from '@bitgo/statics';
22
import sinon from 'sinon';
33
import should from 'should';
44
import { BroadcastableMessage, MessageStandardType, SimpleMessage } from '@bitgo/sdk-core';
5+
import * as bs58 from 'bs58';
56
import { MessageBuilderFactory } from '../../../src';
67

78
describe('Solana SimpleMessageBuilder', function () {
@@ -153,4 +154,38 @@ describe('Solana SimpleMessageBuilder', function () {
153154
should.equal(message.getSignatures().length, 1);
154155
});
155156
});
157+
158+
describe('fromBroadcastString', function () {
159+
it('should parse broadcastable string and return correct builder type', async function () {
160+
const broadcastHex =
161+
'7b2274797065223a2253494d504c45222c227061796c6f6164223a2253544152203438373934363720746f2061646472317178763965397a70353578763336307767686c3830366430327933353839397a6b6b7132726874667876377836777963746a3279726667766572353775333037776c35363735667267773232396476713538776b6a76657564357571666e6d74657a2033316136626162353061383462383433396164636662373836626232303230663638303765366538666461363239623432343131306663376262316336623862222c2273657269616c697a65645369676e617475726573223a5b7b227075626c69634b6579223a22475a6d6a57464a543964556e70574e714a61626e524d7134747779714372396b584663337a4d4765506d6139222c227369676e6174757265223a22675235434446464f5242522f6756416b4b624a4635534d6f36495063674a376a6976694f2f7631535a7056514b6a67566e6f414f45695855614472656d6c4735516743775942725a6132486a547739386c65396e44673d3d227d5d2c227369676e657273223a5b22475a6d6a57464a543964556e70574e714a61626e524d7134747779714372396b584663337a4d4765506d6139225d2c226d65746164617461223a7b22656e636f64696e67223a2275746638227d2c227369676e61626c655061796c6f6164223a2255315242556941304f4463354e445933494852764947466b5a484978635868324f575535656e41314e5868324d7a59776432646f624467774e6d51774d6e6b7a4e5467354f58707261334579636d68305a6e68324e33673264336c6a64476f7965584a6d5a335a6c636a553364544d774e3364734e5459334e575a795a3363794d6a6c6b646e45314f486472616e5a6c645751316458466d626d31305a586f674d7a46684e6d4a68596a557759546730596a67304d7a6c685a474e6d596a63344e6d4a694d6a41794d4759324f4441335a545a6c4f475a6b595459794f5749304d6a51784d54426d597a6469596a466a4e6d493459673d3d227d';
162+
const coinConfig = { name: 'sol' } as BaseCoin;
163+
const factory = new MessageBuilderFactory(coinConfig);
164+
const builder = factory.fromBroadcastString(broadcastHex);
165+
const message = await builder.build();
166+
167+
const payload = message.getPayload();
168+
const payloadParts = payload.split(' ');
169+
const address = message.getSigners()[0];
170+
address.should.equal('GZmjWFJT9dUnpWNqJabnRMq4twyqCr9kXFc3zMGePma9');
171+
const destinationAddress = payloadParts[3];
172+
destinationAddress.should.equal(
173+
'addr1qxv9e9zp55xv360wghl806d02y35899zkkq2rhtfxv7x6wyctj2yrfgver57u307wl5675frgw229dvq58wkjveud5uqfnmtez'
174+
);
175+
const amount = Number(payloadParts[1]);
176+
amount.should.equal(4879467);
177+
178+
const signatureBuff = message.getSignatures()[0].signature;
179+
const signatureBase58 = bs58.encode(signatureBuff);
180+
signatureBase58.should.equal(
181+
'3aj7xDGJrFAbNF6GLrWTHpy8UW94i6xFADJ1KdomDLaCDjUyz8Gj5vPc5mZLduFhRAUCU4BUcnBWu5te1DbMXCFf'
182+
);
183+
const signatureHex = signatureBuff.toString('hex');
184+
signatureHex.should.equal(
185+
'811e420c514e44147f81502429b245e52328e883dc809ee38af88efefd526695502a38159e800e1225d4683ade9a51b94200b0601ad96b61e34f0f7c95ef670e'
186+
);
187+
const publicKeyHex = message.getSignatures()[0].publicKey.pub;
188+
publicKeyHex.should.equal('GZmjWFJT9dUnpWNqJabnRMq4twyqCr9kXFc3zMGePma9');
189+
});
190+
});
156191
});

0 commit comments

Comments
 (0)