@@ -4,13 +4,14 @@ import { BitGoAPI, encrypt } from '@bitgo/sdk-api';
44import * as AlgoResources from '../fixtures/algo' ;
55import { randomBytes } from 'crypto' ;
66import { coins } from '@bitgo/statics' ;
7- import Sinon , { SinonStub } from 'sinon' ;
7+ import Sinon , { SinonStub , spy , stub } from 'sinon' ;
88import assert from 'assert' ;
99import { Algo } from '../../src/algo' ;
1010import BigNumber from 'bignumber.js' ;
1111import { TransactionBuilderFactory } from '../../src/lib' ;
12- import { KeyPair } from '@bitgo/sdk-core' ;
12+ import { common , KeyPair , Wallet } from '@bitgo/sdk-core' ;
1313import { algoBackupKey } from './fixtures/algoBackupKey' ;
14+ import nock from 'nock' ;
1415
1516describe ( 'ALGO:' , function ( ) {
1617 let bitgo : TestBitGoAPI ;
@@ -1180,4 +1181,141 @@ describe('ALGO:', function () {
11801181 ) ;
11811182 } ) ;
11821183 } ) ;
1184+
1185+ describe ( 'blind signing token enablement protection' , ( ) => {
1186+ let wallet : Wallet ;
1187+ const bgUrl = common . Environments [ 'mock' ] . uri ;
1188+
1189+ before ( ( ) => {
1190+ bitgo = TestBitGo . decorate ( BitGoAPI , { env : 'mock' } ) ;
1191+ bitgo . safeRegister ( 'talgo' , Talgo . createInstance ) ;
1192+ bitgo . initializeTestVars ( ) ;
1193+ basecoin = bitgo . coin ( 'talgo' ) ;
1194+
1195+ wallet = new Wallet ( bitgo , basecoin , {
1196+ id : '123' ,
1197+ coin : 'talgo' ,
1198+ keys : [ '1' , '2' , '3' ] ,
1199+ coinSpecific : {
1200+ rootAddress : '123' ,
1201+ } ,
1202+ type : 'hot' ,
1203+ } ) ;
1204+ } ) ;
1205+ it ( 'should verify a valid token enablement transaction' , async function ( ) {
1206+ const verifyTransactionStub = spy ( basecoin , 'verifyTransaction' ) ;
1207+ nock ( bgUrl )
1208+ . post ( `/api/v2/talgo/wallet/${ wallet . id ( ) } /tx/build` )
1209+ . reply ( 200 , {
1210+ txHex :
1211+ 'iaRhcmN2xCBfnMgYtbyG4RL1DspYhxQeyn9QrJ+s2ZcDTcxK+yOH+KNmZWXNA+iiZnbOA2tlJKNnZW6sdGVzdG5ldC12MS4womdoxCBIY7UYpLPITsgQ8i1PEIHLD3HwWaesIN7GL39w5Qk6IqJsds4Da2kMo3NuZMQgX5zIGLW8huES9Q7KWIcUHsp/UKyfrNmXA03MSvsjh/ikdHlwZaVheGZlcqR4YWlkzgmpOkY=' ,
1212+ txHash : 'ARYMOXMKZWM372JBFBTADZNJZU7S5HK44NZDZLVX5UR5UPIWT7FA' ,
1213+ txInfo : {
1214+ id : 'ARYMOXMKZWM372JBFBTADZNJZU7S5HK44NZDZLVX5UR5UPIWT7FA' ,
1215+ type : 'axfer' ,
1216+ from : 'L6OMQGFVXSDOCEXVB3FFRBYUD3FH6UFMT6WNTFYDJXGEV6ZDQ74EXGF6BE' ,
1217+ fee : 1000 ,
1218+ firstRound : 57369892 ,
1219+ lastRound : 57370892 ,
1220+ note : { } ,
1221+ tokenId : 162085446 ,
1222+ genesisID : 'testnet-v1.0' ,
1223+ genesisHash : 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=' ,
1224+ to : 'L6OMQGFVXSDOCEXVB3FFRBYUD3FH6UFMT6WNTFYDJXGEV6ZDQ74EXGF6BE' ,
1225+ amount : '0' ,
1226+ txType : 'enableToken' ,
1227+ tokenName : 'TALGO' ,
1228+ } ,
1229+ feeInfo : {
1230+ size : 251 ,
1231+ fee : 1000 ,
1232+ feeRate : 4 ,
1233+ feeString : '1000' ,
1234+ } ,
1235+ keys : [
1236+ '42MIYL2KBISV6WJRALTTSXHBEGLNF7MMQ74FGSYUCT5YP3V2KENJGRFVVQ' ,
1237+ 'MAGXZTDFW5QEXUKOUDIGHTXOKDW7TNQEDLWPBEZEL3VFU3YAA2PGYRS65M' ,
1238+ 'TMEJTI7XNCACDG3BTODINW6CMR6ARYIKTCFPA2GMIXL4X5Q4BCE6VHMWAM' ,
1239+ ] ,
1240+ addressVersion : 1 ,
1241+ coin : 'talgo' ,
1242+ } ) ;
1243+ const validatePwdStub = stub ( wallet , 'getKeychainsAndValidatePassphrase' as keyof Wallet ) . resolves ( [ ] ) ;
1244+ const signTxStub = stub ( wallet , 'signTransaction' ) . resolves ( { } ) ;
1245+
1246+ await wallet . sendTokenEnablements ( {
1247+ verification : { verifyTokenEnablement : true } ,
1248+ enableTokens : [
1249+ {
1250+ name : 'talgo:JPT-162085446' ,
1251+ address : 'L6OMQGFVXSDOCEXVB3FFRBYUD3FH6UFMT6WNTFYDJXGEV6ZDQ74EXGF6BE' ,
1252+ } ,
1253+ ] ,
1254+ } ) ;
1255+
1256+ verifyTransactionStub . called . should . be . true ( ) ;
1257+ verifyTransactionStub . restore ( ) ;
1258+ validatePwdStub . restore ( ) ;
1259+ signTxStub . restore ( ) ;
1260+ } ) ;
1261+
1262+ it ( 'should throw error when invalid token enablement transaction is returned' , async ( ) => {
1263+ const verifyTransactionStub = spy ( basecoin , 'verifyTransaction' ) ;
1264+ nock ( bgUrl )
1265+ . post ( `/api/v2/talgo/wallet/${ wallet . id ( ) } /tx/build` )
1266+ . reply ( 200 , {
1267+ txHex :
1268+ 'iaRhcmN2xCBfnMgYtbyG4RL1DspYhxQeyn9QrJ+s2ZcDTcxK+yOH+KNmZWXNA+iiZnbOA2tpeqNnZW6sdGVzdG5ldC12MS4womdoxCBIY7UYpLPITsgQ8i1PEIHLD3HwWaesIN7GL39w5Qk6IqJsds4Da21io3NuZMQgX5zIGLW8huES9Q7KWIcUHsp/UKyfrNmXA03MSvsjh/ikdHlwZaVheGZlcqR4YWlkzgACwN8=' ,
1269+ txHash : 'YPQGYNBOCPXMBFTBZH2AQGCDZ3C2762T6EYQY46F7LRG2URX6DLA' ,
1270+ txInfo : {
1271+ id : 'YPQGYNBOCPXMBFTBZH2AQGCDZ3C2762T6EYQY46F7LRG2URX6DLA' ,
1272+ type : 'axfer' ,
1273+ from : 'L6OMQGFVXSDOCEXVB3FFRBYUD3FH6UFMT6WNTFYDJXGEV6ZDQ74EXGF6BE' ,
1274+ fee : 1000 ,
1275+ firstRound : 57371002 ,
1276+ lastRound : 57372002 ,
1277+ note : { } ,
1278+ tokenId : 180447 ,
1279+ genesisID : 'testnet-v1.0' ,
1280+ genesisHash : 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=' ,
1281+ to : 'L6OMQGFVXSDOCEXVB3FFRBYUD3FH6UFMT6WNTFYDJXGEV6ZDQ74EXGF6BE' ,
1282+ amount : '0' ,
1283+ txType : 'enableToken' ,
1284+ tokenName : 'TALGO' ,
1285+ } ,
1286+ feeInfo : {
1287+ size : 251 ,
1288+ fee : 1000 ,
1289+ feeRate : 4 ,
1290+ feeString : '1000' ,
1291+ } ,
1292+ keys : [
1293+ '42MIYL2KBISV6WJRALTTSXHBEGLNF7MMQ74FGSYUCT5YP3V2KENJGRFVVQ' ,
1294+ 'MAGXZTDFW5QEXUKOUDIGHTXOKDW7TNQEDLWPBEZEL3VFU3YAA2PGYRS65M' ,
1295+ 'TMEJTI7XNCACDG3BTODINW6CMR6ARYIKTCFPA2GMIXL4X5Q4BCE6VHMWAM' ,
1296+ ] ,
1297+ addressVersion : 1 ,
1298+ coin : 'talgo' ,
1299+ } ) ;
1300+ stub ( wallet , 'getKeychainsAndValidatePassphrase' as keyof Wallet ) . resolves ( [ ] ) ;
1301+ stub ( wallet , 'signTransaction' ) . resolves ( { } ) ;
1302+
1303+ const { success, failure } = await wallet . sendTokenEnablements ( {
1304+ verification : { verifyTokenEnablement : true } ,
1305+ enableTokens : [
1306+ {
1307+ name : 'talgo:JPT-162085446' ,
1308+ address : 'L6OMQGFVXSDOCEXVB3FFRBYUD3FH6UFMT6WNTFYDJXGEV6ZDQ74EXGF6BE' ,
1309+ } ,
1310+ ] ,
1311+ } ) ;
1312+
1313+ verifyTransactionStub . called . should . be . true ( ) ;
1314+ success . length . should . equal ( 0 ) ;
1315+ failure . length . should . equal ( 1 ) ;
1316+ failure [ 0 ] . message . should . equal (
1317+ 'Token enablement verification failed: expected token ID 162085446 but transaction has token ID 180447'
1318+ ) ;
1319+ } ) ;
1320+ } ) ;
11831321} ) ;
0 commit comments