diff --git a/examples/ts/access-token.ts b/examples/ts/access-token.ts new file mode 100644 index 0000000000..97517161ed --- /dev/null +++ b/examples/ts/access-token.ts @@ -0,0 +1,22 @@ +/** + * Get Access Token of a BitGo account + */ + +import { BitGoAPI } from '@bitgo/sdk-api'; +require('dotenv').config({ path: '../../.env' }); + +const bitgo = new BitGoAPI({ + env: 'test', // Change this to env: 'prod' when you are ready for production +}); + +async function main() { + const auth_res = await bitgo.authenticate({ + username: process.env.TEST_EMAIL!, + password: process.env.TEST_PASS!, + otp: '000000', + }); + + console.log(auth_res); +} + +main().catch((e) => console.log(e)); \ No newline at end of file diff --git a/modules/abstract-eth/test/unit/messages/eip191/eip191MessageBuilder.ts b/modules/abstract-eth/test/unit/messages/eip191/eip191MessageBuilder.ts index 231f98df4b..b47f8c23bb 100644 --- a/modules/abstract-eth/test/unit/messages/eip191/eip191MessageBuilder.ts +++ b/modules/abstract-eth/test/unit/messages/eip191/eip191MessageBuilder.ts @@ -2,7 +2,8 @@ import 'should'; import sinon from 'sinon'; import { BroadcastableMessage, MessageStandardType, serializeSignatures } from '@bitgo/sdk-core'; import { fixtures } from '../fixtures'; -import { EIP191Message, Eip191MessageBuilder } from '../../../../src'; +import { EIP191Message, Eip191MessageBuilder, MessageBuilderFactory } from '../../../../src'; +import { BaseCoin } from '@bitgo/statics'; describe('EIP191 Message Builder', () => { const sandbox = sinon.createSandbox(); @@ -114,4 +115,33 @@ describe('EIP191 Message Builder', () => { .should.be.rejectedWith(`Invalid message type, expected ${MessageStandardType.EIP191}`); }); }); + + describe('fromBroadcastString', function () { + it('should parse broadcastable string and return correct builder type', async function () { + const broadcastHex = + '7b2274797065223a22454950313931222c227061796c6f6164223a2253544152203130303020746f20616464725f746573743171727139366830726a68743275366e336667776d7939307837676d6c38686475657774326e6d72327536636d6b707771743477373839776b346534387a6a73616b673237647533683730776d656a756b34386b783465343368767a737566736876362033316136626162353061383462383433396164636662373836626232303230663638303765366538666461363239623432343131306663376262316336623862222c2273657269616c697a65645369676e617475726573223a5b7b227075626c69634b6579223a22222c227369676e6174757265223a2274386c6e725a4b7a757264566c777343355a66422f4b314b5533516d4b5a3970343671576a3155795744307046464577584e6d754f327a4845644e3164372b2b414e5653796f5a3869547737375073546462334b3878773d227d5d2c227369676e657273223a5b22307866613061376634613064396535343463353761656361346533326233623130343862363333636466225d2c226d65746164617461223a7b22656e636f64696e67223a2275746638227d2c227369676e61626c655061796c6f6164223a224d546b304e5463304e6a67324e5463794e6a55334e545a6b4d6a41314d7a59354e6a63325a5459314e6a51794d44526b4e6a55334d7a637a4e6a45324e7a59314d32457759544d784d7a677a4e6a557a4e5451304d5455794d6a417a4d544d774d7a417a4d4449774e7a51325a6a49774e6a45324e4459304e7a49315a6a63304e6a55334d7a63304d7a45334d5463794e7a457a4f544d324e6a677a4d4463794e6d45324f4463304d7a49334e544d324e6d557a4d7a59324e6a63334e7a5a6b4e7a6b7a4f544d774e7a677a4e7a59334e6d5132597a4d344e6a67324e4463314e6a55334e7a63304d7a49325a545a6b4e7a497a4d6a63314d7a59324d7a5a6b4e6d49334d4463334e7a45334e444d304e7a637a4e7a4d344d7a6b334e7a5a694d7a51324e544d304d7a673359545a684e7a4d324d545a694e6a637a4d6a4d334e6a51334e544d7a4e6a677a4e7a4d774e7a63325a4459314e6d45334e545a694d7a517a4f445a694e7a677a4e4459314d7a517a4d7a59344e7a59335954637a4e7a55324e6a637a4e6a67334e6a4d324d6a417a4d7a4d784e6a457a4e6a59794e6a45324d6a4d314d7a41324d544d344d7a51324d6a4d344d7a517a4d7a4d354e6a45324e44597a4e6a59324d6a4d334d7a677a4e6a59794e6a497a4d6a4d774d7a497a4d4459324d7a597a4f444d774d7a63324e544d324e6a557a4f4459324e6a51324d544d324d7a497a4f5459794d7a517a4d6a4d304d7a457a4d544d774e6a59324d7a4d334e6a49324d6a4d784e6a4d7a4e6a59794d7a67324d673d3d227d'; + const coinConfig = { name: 'eth' } as BaseCoin; + const factory = new MessageBuilderFactory(coinConfig); + const builder = factory.fromBroadcastString(broadcastHex); + const message = await builder.build(); + + const payload = message.getPayload(); + const payloadParts = payload.split(' '); + const address = message.getSigners()[0]; + address.should.equal('0xfa0a7f4a0d9e544c57aeca4e32b3b1048b633cdf'); + const destinationAddress = payloadParts[3]; + destinationAddress.should.equal( + 'addr_test1qrq96h0rjht2u6n3fgwmy90x7gml8hduewt2nmr2u6cmkpwqt4w789wk4e48zjsakg27du3h70wmejuk48kx4e43hvzsufshv6' + ); + const amount = Number(payloadParts[1]); + amount.should.equal(1000); + + const signature = message.getSignatures()[0].signature.toString('hex'); + signature.should.equal( + 'b7c967ad92b3bab755970b02e597c1fcad4a537426299f69e3aa968f5532583d291451305cd9ae3b6cc711d37577bfbe00d552ca867c893c3becfb1375bdcaf31c' + ); + const publicKeyHex = message.getSignatures()[0].publicKey.pub; + publicKeyHex.should.equal(''); + }); + }); }); diff --git a/modules/sdk-coin-ada/test/unit/messages/cip8/cip8MessageBuilder.ts b/modules/sdk-coin-ada/test/unit/messages/cip8/cip8MessageBuilder.ts index 403db843d3..02eff06447 100644 --- a/modules/sdk-coin-ada/test/unit/messages/cip8/cip8MessageBuilder.ts +++ b/modules/sdk-coin-ada/test/unit/messages/cip8/cip8MessageBuilder.ts @@ -4,7 +4,8 @@ import { Buffer } from 'buffer'; import { BroadcastableMessage, MessageStandardType, serializeSignatures, Signature } from '@bitgo/sdk-core'; import { BaseCoin } from '@bitgo/statics'; import { cip8TestResources } from '../../../resources/cip8Resources'; -import { Cip8Message, Cip8MessageBuilder } from '../../../../src'; +import { Cip8Message, Cip8MessageBuilder, MessageBuilderFactory } from '../../../../src'; +import { bufferToCoseObjectsOutput } from '../../../../src/lib/messages/cip8/utils'; describe('Cip8MessageBuilder', function () { let sandbox: sinon.SinonSandbox; @@ -118,5 +119,41 @@ describe('Cip8MessageBuilder', function () { messageSignature.signature.should.deepEqual(signatures[0].signature); messageSignature.publicKey.should.deepEqual(signatures[0].publicKey); }); + + describe('fromBroadcastString', function () { + it('should parse broadcastable string and return correct builder type', async function () { + const broadcastHex = + '7b2274797065223a2243495038222c227061796c6f6164223a225354415220373238323535343520746f2061646472317178763965397a70353578763336307767686c3830366430327933353839397a6b6b7132726874667876377836777963746a3279726667766572353775333037776c35363735667267773232396476713538776b6a76657564357571666e6d74657a2033316136626162353061383462383433396164636662373836626232303230663638303765366538666461363239623432343131306663376262316336623862222c2273657269616c697a65645369676e617475726573223a5b7b227075626c69634b6579223a2265633861346630343534303764313134353736663963623033313832663564636163386165626434323232323332313638343332343139306539323737383431222c227369676e6174757265223a226f6e4a74595735315957784462334e6c55326c6e626a46495a586835417034344e4455344e445a684d6a41784d6a63324e7a59784e6a51324e4463794e6a55334d7a637a4e54677a4f5441784e4455784d57526c4d7a5a6d4e544a6959575669593259314e6a4d7a4d7a6b334f574979597a67325a444e6c5a6a49324e4749305a5464684d474934596a6b345a5441784d6a4d32595445304e5445785a47557a4e6d59314d6d4a685a574a6a5a6a55324d7a4d7a4f546335596a4a6a4f445a6b4d32566d4d6a5930596a526c4e324577596a68694f54686c4d4445794d7a5a684d5745784e6a59324f4459784e7a4d324f4459314e6a526d4e445534596a6b314d7a55304e4445314d6a49774d7a637a4d6a4d344d7a497a4e544d314d7a517a4e5449774e7a51325a6a49774e6a45324e4459304e7a497a4d5463784e7a67334e6a4d354e6a557a4f5464684e7a417a4e544d314e7a67334e6a4d7a4d7a597a4d4463334e6a63324f445a6a4d7a677a4d444d324e6a517a4d444d794e7a6b7a4d7a4d314d7a677a4f544d354e324532596a5a694e7a457a4d6a63794e6a67334e4459324e7a67334e6a4d334e7a677a4e6a63334e7a6b324d7a63304e6d457a4d6a63354e7a49324e6a59334e7a59324e5463794d7a557a4e7a63314d7a4d7a4d444d334e7a6332597a4d314d7a597a4e7a4d314e6a59334d6a59334e7a637a4d6a4d794d7a6b324e4463324e7a457a4e544d344e7a6332596a5a684e7a59324e5463314e6a517a4e5463314e7a45324e6a5a6c4e6d51334e4459314e3245794d444d7a4d7a45324d544d324e6a49324d5459794d7a557a4d4459784d7a677a4e4459794d7a677a4e444d7a4d7a6b324d5459304e6a4d324e6a59794d7a637a4f444d324e6a49324d6a4d794d7a417a4d6a4d774e6a597a4e6a4d344d7a417a4e7a59314d7a59324e544d344e6a59324e4459784d7a597a4d6a4d354e6a497a4e444d794d7a517a4d544d784d7a41324e6a597a4d7a63324d6a59794d7a45324d7a4d324e6a497a4f4459794e5467304d44566c5a5467335a4455784f54566859544a6b5a546b344d3251795a546332597a6c6c4f54426a4d475a6c597a59794e32466d4f5449305a47457a4f5451334f44426b596a6c684f445a6d595467354e4463775a6a4a6c595755774d7a4d305a54646b4d6d49344e6a4177596a5a694e4445354e6a686c4d54526c596a4931596a52694f5759314e5451354d544e6a596a4a6a5a5441795a6d55784e4463794e444d345a544d785a6a426d63473168626e566862454e766332564c5a586c495a586834564745304d4445774d54417a4d6a63794d4441324d6a45314f4449775a574d345954526d4d4451314e4441335a4445784e4455334e6d5935593249774d7a45344d6d59315a474e68597a68685a574a6b4e4449794d6a497a4d6a45324f44517a4d6a51784f54426c4f5449334e7a67304d513d3d227d5d2c227369676e657273223a5b22616464723171397a337268336b37353436613038347676656530786576736d663737666a7466656171687a756375716672646732397a38307264616674343637303263656e6a37646a65706b6e61756e796b6e6e36707739653363716a78367373796333737937225d2c226d65746164617461223a7b22656e636f64696e67223a2275746638227d2c227369676e61626c655061796c6f6164223a22684770546157647559585231636d5578574561694153646e5957526b636d567a6331673541555552336a62314b36363839574d7a6c357373687450764a6b744f6567754c6d4f41534e71464645643432395375757650566a4d3565624c49625437795a4c546e6f4c69356a67456a61685146693555315242556941334d6a67794e5455304e534230627942685a4752794d584634646a6c6c4f5870774e545634646a4d324d48646e614777344d445a6b4d444a354d7a55344f546c36613274784d6e4a6f64475a34646a64344e6e6435593352714d6e6c795a6d64325a5849314e33557a4d446433624455324e7a566d636d64334d6a49355a485a784e546833613270325a58566b4e5856785a6d35746447563649444d7859545a69595749314d4745344e4749344e444d355957526a5a6d49334f445a69596a49774d6a426d4e6a67774e3255325a54686d5a4745324d6a6c694e4449304d5445775a6d4d33596d4978597a5a694f47493d227d'; + const coinConfig = { name: 'ada' } as BaseCoin; + const factory = new MessageBuilderFactory(coinConfig); + const builder = factory.fromBroadcastString(broadcastHex); + const message = await builder.build(); + + const payload = message.getPayload(); + const payloadParts = payload.split(' '); + const address = message.getSigners()[0]; + address.should.equal( + 'addr1q9z3rh3k7546a084vvee0xevsmf77fjtfeaqhzucuqfrdg29z80rdaft46702cenj7djepknaunyknn6pw9e3cqjx6ssyc3sy7' + ); + const destinationAddress = payloadParts[3]; + destinationAddress.should.equal( + 'addr1qxv9e9zp55xv360wghl806d02y35899zkkq2rhtfxv7x6wyctj2yrfgver57u307wl5675frgw229dvq58wkjveud5uqfnmtez' + ); + const amount = Number(payloadParts[1]); + amount.should.equal(72825545); + + const signature = message.getSignatures()[0].signature; + const publicKeyHex = message.getSignatures()[0].publicKey.pub; + publicKeyHex.should.equal('ec8a4f045407d114576f9cb03182f5dcac8aebd42222321684324190e9277841'); + + const coseObjectsOutput = await bufferToCoseObjectsOutput(signature); + const coseKey = coseObjectsOutput.manualCoseKeyHex; + coseKey.should.equal('a4010103272006215820ec8a4f045407d114576f9cb03182f5dcac8aebd42222321684324190e9277841'); + const coseSign1 = coseObjectsOutput.manualCoseSign1Hex; + coseSign1.should.equal( + '845846a2012767616464726573735839014511de36f52baebcf56333979b2c86d3ef264b4e7a0b8b98e01236a14511de36f52baebcf56333979b2c86d3ef264b4e7a0b8b98e01236a1a166686173686564f458b95354415220373238323535343520746f2061646472317178763965397a70353578763336307767686c3830366430327933353839397a6b6b7132726874667876377836777963746a3279726667766572353775333037776c35363735667267773232396476713538776b6a76657564357571666e6d74657a203331613662616235306138346238343339616463666237383662623230323066363830376536653866646136323962343234313130666337626231633662386258405ee87d5195aa2de983d2e76c9e90c0fec627af924da394780db9a86fa89470f2eae0334e7d2b8600b6b41968e14eb25b4b9f554913cb2ce02fe1472438e31f0f' + ); + }); + }); }); }); diff --git a/modules/sdk-coin-sol/test/unit/messages/simpleMessageBuilder.ts b/modules/sdk-coin-sol/test/unit/messages/simpleMessageBuilder.ts index 56f2cb8340..b054a106d8 100644 --- a/modules/sdk-coin-sol/test/unit/messages/simpleMessageBuilder.ts +++ b/modules/sdk-coin-sol/test/unit/messages/simpleMessageBuilder.ts @@ -2,6 +2,7 @@ import { BaseCoin } from '@bitgo/statics'; import sinon from 'sinon'; import should from 'should'; import { BroadcastableMessage, MessageStandardType, SimpleMessage } from '@bitgo/sdk-core'; +import * as bs58 from 'bs58'; import { MessageBuilderFactory } from '../../../src'; describe('Solana SimpleMessageBuilder', function () { @@ -153,4 +154,38 @@ describe('Solana SimpleMessageBuilder', function () { should.equal(message.getSignatures().length, 1); }); }); + + describe('fromBroadcastString', function () { + it('should parse broadcastable string and return correct builder type', async function () { + const broadcastHex = + '7b2274797065223a2253494d504c45222c227061796c6f6164223a2253544152203438373934363720746f2061646472317178763965397a70353578763336307767686c3830366430327933353839397a6b6b7132726874667876377836777963746a3279726667766572353775333037776c35363735667267773232396476713538776b6a76657564357571666e6d74657a2033316136626162353061383462383433396164636662373836626232303230663638303765366538666461363239623432343131306663376262316336623862222c2273657269616c697a65645369676e617475726573223a5b7b227075626c69634b6579223a22475a6d6a57464a543964556e70574e714a61626e524d7134747779714372396b584663337a4d4765506d6139222c227369676e6174757265223a22675235434446464f5242522f6756416b4b624a4635534d6f36495063674a376a6976694f2f7631535a7056514b6a67566e6f414f45695855614472656d6c4735516743775942725a6132486a547739386c65396e44673d3d227d5d2c227369676e657273223a5b22475a6d6a57464a543964556e70574e714a61626e524d7134747779714372396b584663337a4d4765506d6139225d2c226d65746164617461223a7b22656e636f64696e67223a2275746638227d2c227369676e61626c655061796c6f6164223a2255315242556941304f4463354e445933494852764947466b5a484978635868324f575535656e41314e5868324d7a59776432646f624467774e6d51774d6e6b7a4e5467354f58707261334579636d68305a6e68324e33673264336c6a64476f7965584a6d5a335a6c636a553364544d774e3364734e5459334e575a795a3363794d6a6c6b646e45314f486472616e5a6c645751316458466d626d31305a586f674d7a46684e6d4a68596a557759546730596a67304d7a6c685a474e6d596a63344e6d4a694d6a41794d4759324f4441335a545a6c4f475a6b595459794f5749304d6a51784d54426d597a6469596a466a4e6d493459673d3d227d'; + const coinConfig = { name: 'sol' } as BaseCoin; + const factory = new MessageBuilderFactory(coinConfig); + const builder = factory.fromBroadcastString(broadcastHex); + const message = await builder.build(); + + const payload = message.getPayload(); + const payloadParts = payload.split(' '); + const address = message.getSigners()[0]; + address.should.equal('GZmjWFJT9dUnpWNqJabnRMq4twyqCr9kXFc3zMGePma9'); + const destinationAddress = payloadParts[3]; + destinationAddress.should.equal( + 'addr1qxv9e9zp55xv360wghl806d02y35899zkkq2rhtfxv7x6wyctj2yrfgver57u307wl5675frgw229dvq58wkjveud5uqfnmtez' + ); + const amount = Number(payloadParts[1]); + amount.should.equal(4879467); + + const signatureBuff = message.getSignatures()[0].signature; + const signatureBase58 = bs58.encode(signatureBuff); + signatureBase58.should.equal( + '3aj7xDGJrFAbNF6GLrWTHpy8UW94i6xFADJ1KdomDLaCDjUyz8Gj5vPc5mZLduFhRAUCU4BUcnBWu5te1DbMXCFf' + ); + const signatureHex = signatureBuff.toString('hex'); + signatureHex.should.equal( + '811e420c514e44147f81502429b245e52328e883dc809ee38af88efefd526695502a38159e800e1225d4683ade9a51b94200b0601ad96b61e34f0f7c95ef670e' + ); + const publicKeyHex = message.getSignatures()[0].publicKey.pub; + publicKeyHex.should.equal('GZmjWFJT9dUnpWNqJabnRMq4twyqCr9kXFc3zMGePma9'); + }); + }); });