diff --git a/CLAUDE.md b/CLAUDE.md index f5e7382..31c587e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -139,15 +139,17 @@ API responses follow a standard error format with `error` and `details` fields. #### Wallet Management -- `POST /api/:coin/wallet/generate` - Generate wallet (supports onchain and TSS multisig types) +- `POST /api/v1/:coin/advancedwallet/generate` - Generate wallet (supports onchain and TSS multisig types) #### Transaction Operations -- `POST /api/:coin/wallet/:walletId/sendMany` - Send transaction with multiple recipients -- `POST /api/:coin/wallet/:walletId/accelerate` - Accelerate pending transactions (CPFP/RBF) -- `POST /api/:coin/wallet/:walletId/consolidate` - Consolidate wallet addresses -- `POST /api/:coin/wallet/:walletId/consolidateunspents` - Consolidate unspent transaction outputs +- `POST /api/v1/:coin/advancedwallet/:walletId/sendMany` - Send transaction with multiple recipients +- `POST /api/v1/:coin/advancedwallet/:walletId/accelerate` - Accelerate pending transactions (CPFP/RBF) +- `POST /api/v1/:coin/advancedwallet/:walletId/consolidate` - Consolidate wallet addresses +- `POST /api/v1/:coin/advancedwallet/:walletId/consolidateunspents` - Consolidate unspent transaction outputs +- `POST /api/v1/:coin/advancedwallet/:walletId/txrequest/:txRequestId/signAndSend` - Sign a TxRequest and broadcast it (MPC wallets only) #### Recovery -- `POST /api/:coin/wallet/recovery` - Recover wallet funds +- `POST /api/v1/:coin/advancedwallet/recovery` - Recover wallet funds +- `POST /api/v1/:coin/advancedwallet/recoveryconsolidations` - Consolidate and recover funds from multiple addresses diff --git a/README.md b/README.md index edb5dc4..77502cc 100644 --- a/README.md +++ b/README.md @@ -385,7 +385,14 @@ docker-compose down - `POST /ping` - Health check. - `GET /version` - Version information. - `POST /ping/advancedWalletManager` - Test connection to Advanced Wallet Manager. -- `POST /api/:coin/wallet/generate` - Generate wallet (with Advanced Wallet Manager integration). +- `POST /api/v1/:coin/advancedwallet/generate` - Generate wallet (with Advanced Wallet Manager integration). +- `POST /api/v1/:coin/advancedwallet/:walletId/sendMany` - Send transaction with multiple recipients. +- `POST /api/v1/:coin/advancedwallet/:walletId/accelerate` - Accelerate pending transactions (CPFP/RBF). +- `POST /api/v1/:coin/advancedwallet/:walletId/consolidate` - Consolidate wallet addresses. +- `POST /api/v1/:coin/advancedwallet/:walletId/consolidateunspents` - Consolidate unspent transaction outputs. +- `POST /api/v1/:coin/advancedwallet/:walletId/txrequest/:txRequestId/signAndSend` - Sign a TxRequest and broadcast it (MPC wallets only). +- `POST /api/v1/:coin/advancedwallet/recovery` - Recover wallet funds. +- `POST /api/v1/:coin/advancedwallet/recoveryconsolidations` - Consolidate and recover funds from multiple addresses. ### API Documentation diff --git a/masterBitgoExpress.json b/masterBitgoExpress.json index c7bb47e..190add7 100644 --- a/masterBitgoExpress.json +++ b/masterBitgoExpress.json @@ -6,7 +6,7 @@ "description": "Advanced Wallets - On-Premises Key Management with BitGo Express" }, "paths": { - "/api/{coin}/wallet/{walletId}/accelerate": { + "/api/v1/{coin}/advancedwallet/{walletId}/accelerate": { "post": { "summary": "Accelerate unconfirmed transactions on UTXO-based blockchains.", "description": "Supports Child-Pays-For-Parent (CPFP) and Replace-By-Fee (RBF) acceleration methods.", @@ -188,7 +188,7 @@ } } }, - "/api/{coin}/wallet/{walletId}/consolidate": { + "/api/v1/{coin}/advancedwallet/{walletId}/consolidate": { "post": { "summary": "Build, sign, and send a consolidation transaction for an account-based asset all in 1 call.", "description": "For account-based assets, consolidating the balances in the receive addresses to the base address maximizes the spendable balance of a wallet.", @@ -327,7 +327,7 @@ } } }, - "/api/{coin}/wallet/{walletId}/consolidateunspents": { + "/api/v1/{coin}/advancedwallet/{walletId}/consolidateunspents": { "post": { "summary": "Build and send a transaction to consolidate unspents in a wallet.", "description": "Consolidating unspents is only for UTXO-based assets.", @@ -528,7 +528,7 @@ } } }, - "/api/{coin}/wallet/{walletId}/sendMany": { + "/api/v1/{coin}/advancedwallet/{walletId}/sendMany": { "post": { "parameters": [ { @@ -821,7 +821,7 @@ } } }, - "/api/{coin}/wallet/{walletId}/txrequest/{txRequestId}/signAndSend": { + "/api/v1/{coin}/advancedwallet/{walletId}/txrequest/{txRequestId}/signAndSend": { "post": { "summary": "Sign a TxRequest and Broadcast it (MPC wallets only)", "description": "This is usually needed after resolving a pending approval for a MPC wallet", @@ -950,7 +950,7 @@ } } }, - "/api/{coin}/wallet/generate": { + "/api/v1/{coin}/advancedwallet/generate": { "post": { "summary": "Generates a new advanced wallet.", "description": "The wallet creation process involves several steps that happen automatically:\n1. User Keychain Creation: Creates the user keychain in the advanced wallet manager and encrypts it with the respective KMS.\n2. Backup Keychain Creation: Creates the backup keychain in the advanced wallet manager and encrypts it with the respective KMS.\n3. Keychain Upload: Uploads the user/backup public keys to BitGo.\n4. BitGo Key Creation: Creates the BitGo key on the BitGo service.\n5. Wallet Creation: Creates the wallet on BitGo with the 3 keys.", @@ -1115,7 +1115,7 @@ } } }, - "/api/{coin}/wallet/recovery": { + "/api/v1/{coin}/advancedwallet/recovery": { "post": { "summary": "Recover funds from an existing wallet using user and backup keys.", "description": "This endpoint allows for both standard multisig and TSS wallet recovery.", @@ -1470,7 +1470,7 @@ } } }, - "/api/{coin}/wallet/recoveryconsolidations": { + "/api/v1/{coin}/advancedwallet/recoveryconsolidations": { "post": { "summary": "Consolidate funds from multiple addresses in a wallet and sign with user & backup keys in a recovery situation.", "description": "Used for both standard multisig wallets and TSS wallets to consolidate funds from various addresses.", diff --git a/package-lock.json b/package-lock.json index 0462bbe..735fa3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28763,9 +28763,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "license": "(BSD-3-Clause OR GPL-2.0)", "peer": true, "engines": { @@ -37785,9 +37785,10 @@ } }, "node_modules/validator": { - "version": "13.15.15", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", - "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", + "version": "13.15.23", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz", + "integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", + "license": "MIT", "engines": { "node": ">= 0.10" } diff --git a/package.json b/package.json index 1baa157..58f69d8 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,8 @@ "store2": "^2.14.4", "tar": "^6.2.1", "tough-cookie": "^4.1.3", - "validator": "^13.15.15", + "validator": "^13.15.22", + "node-forge": "^1.3.2", "xml2js": "^0.5.0", "glob": "^11.1.0" }, diff --git a/src/__tests__/api/master/accelerate.test.ts b/src/__tests__/api/master/accelerate.test.ts index e94b7d4..728c311 100644 --- a/src/__tests__/api/master/accelerate.test.ts +++ b/src/__tests__/api/master/accelerate.test.ts @@ -6,7 +6,7 @@ import { app as expressApp } from '../../../masterBitGoExpressApp'; import { AppMode, MasterExpressConfig, TlsMode } from '../../../shared/types'; import { Environments, Wallet } from '@bitgo-beta/sdk-core'; -describe('POST /api/:coin/wallet/:walletId/accelerate', () => { +describe('POST /api/v1/:coin/advancedwallet/:walletId/accelerate', () => { let agent: request.SuperAgentTest; const coin = 'tbtc'; const walletId = 'test-wallet-id'; @@ -91,7 +91,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -138,7 +138,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -180,7 +180,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -200,7 +200,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { .reply(404, { error: 'Wallet not found', name: 'WalletNotFoundError' }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -225,7 +225,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { .reply(404, { error: 'Keychain not found', name: 'KeychainNotFoundError' }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -250,7 +250,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { .reply(200, mockUserKeychain); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: 'xpub661MyMwAqRbcWRONG_PUBKEY_THAT_DOES_NOT_MATCH', @@ -266,7 +266,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { it('should fail when required pubkey parameter is missing', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ source: 'user', @@ -279,7 +279,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { it('should fail when required source parameter is missing', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -292,7 +292,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { it('should fail when source parameter has invalid value', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -305,11 +305,13 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { }); it('should fail when authorization header is missing', async () => { - const response = await agent.post(`/api/${coin}/wallet/${walletId}/accelerate`).send({ - pubkey: mockUserKeychain.pub, - source: 'user', - cpfpTxIds: ['test-tx-id'], - }); + const response = await agent + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) + .send({ + pubkey: mockUserKeychain.pub, + source: 'user', + cpfpTxIds: ['test-tx-id'], + }); response.status.should.equal(500); response.body.should.have.property('error', 'Internal Server Error'); @@ -332,7 +334,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { .rejects(new Error('Insufficient funds for acceleration')); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -353,7 +355,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { it('should fail when cpfpTxIds parameter is not an array', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -367,7 +369,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { it('should fail when rbfTxIds parameter is not an array', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -381,7 +383,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { it('should fail when pubkey parameter is not a string', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: 12345, @@ -395,7 +397,7 @@ describe('POST /api/:coin/wallet/:walletId/accelerate', () => { it('should fail when both cpfpTxIds and rbfTxIds are missing', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/accelerate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/accelerate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, diff --git a/src/__tests__/api/master/consolidate.test.ts b/src/__tests__/api/master/consolidate.test.ts index c9035af..f86e550 100644 --- a/src/__tests__/api/master/consolidate.test.ts +++ b/src/__tests__/api/master/consolidate.test.ts @@ -9,7 +9,7 @@ import { Hteth } from '@bitgo-beta/sdk-coin-eth'; import * as transactionRequests from '../../../masterBitgoExpress/handlers/transactionRequests'; import * as handlerUtils from '../../../masterBitgoExpress/handlers/utils/utils'; -describe('POST /api/:coin/wallet/:walletId/consolidate', () => { +describe('POST /api/v1/:coin/advancedwallet/:walletId/consolidate', () => { let agent: request.SuperAgentTest; const coin = 'hteth'; const walletId = 'test-wallet-id'; @@ -118,7 +118,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -204,7 +204,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -267,7 +267,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -290,7 +290,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { .reply(404, { error: 'Wallet not found', name: 'WalletNotFoundError' }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -315,7 +315,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { .reply(404, { error: 'Keychain not found', name: 'KeychainNotFoundError' }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -340,7 +340,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { .reply(200, mockUserKeychain); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: 'xpub661MyMwAqRbcWRONG_PUBKEY_THAT_DOES_NOT_MATCH', @@ -370,7 +370,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { .returns(false); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -392,7 +392,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { it('should fail when required pubkey parameter is missing', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ source: 'user', @@ -406,7 +406,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { it('should fail when required source parameter is missing', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -420,7 +420,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { it('should fail when source parameter has invalid value', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -434,11 +434,13 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { }); it('should fail when authorization header is missing', async () => { - const response = await agent.post(`/api/${coin}/wallet/${walletId}/consolidate`).send({ - pubkey: mockUserKeychain.pub, - source: 'user', - consolidateAddresses: ['0x1234567890abcdef'], - }); + const response = await agent + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) + .send({ + pubkey: mockUserKeychain.pub, + source: 'user', + consolidateAddresses: ['0x1234567890abcdef'], + }); response.status.should.equal(500); response.body.should.have.property('error', 'Internal Server Error'); @@ -481,7 +483,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { .returns(true); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -536,7 +538,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { .returns(true); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -558,7 +560,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { it('should fail when consolidateAddresses parameter is not an array', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -573,7 +575,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidate', () => { it('should fail when apiVersion parameter has invalid value', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidate`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidate`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, diff --git a/src/__tests__/api/master/consolidateUnspents.test.ts b/src/__tests__/api/master/consolidateUnspents.test.ts index 5e4a31e..9ee75e5 100644 --- a/src/__tests__/api/master/consolidateUnspents.test.ts +++ b/src/__tests__/api/master/consolidateUnspents.test.ts @@ -6,7 +6,7 @@ import { app as expressApp } from '../../../masterBitGoExpressApp'; import { AppMode, MasterExpressConfig, TlsMode } from '../../../shared/types'; import { Environments, Wallet } from '@bitgo-beta/sdk-core'; -describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { +describe('POST /api/v1/:coin/advancedwallet/:walletId/consolidateunspents', () => { let agent: request.SuperAgentTest; const coin = 'btc'; const walletId = 'test-wallet-id'; @@ -104,7 +104,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -158,7 +158,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -215,7 +215,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -270,7 +270,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -327,7 +327,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { }; const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -348,7 +348,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { .reply(404, { error: 'Wallet not found', name: 'WalletNotFoundError' }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -373,7 +373,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { .reply(404, { error: 'Keychain not found', name: 'KeychainNotFoundError' }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -398,7 +398,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { .reply(200, mockUserKeychain); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: 'xpub661MyMwAqRbcWRONG_PUBKEY_THAT_DOES_NOT_MATCH', @@ -414,7 +414,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { it('should fail when required pubkey parameter is missing', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send({ source: 'user', @@ -427,7 +427,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { it('should fail when required source parameter is missing', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -440,7 +440,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { it('should fail when source parameter has invalid value', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -453,11 +453,13 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { }); it('should fail when authorization header is missing', async () => { - const response = await agent.post(`/api/${coin}/wallet/${walletId}/consolidateunspents`).send({ - pubkey: mockUserKeychain.pub, - source: 'user', - feeRate: 1000, - }); + const response = await agent + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) + .send({ + pubkey: mockUserKeychain.pub, + source: 'user', + feeRate: 1000, + }); response.status.should.equal(500); response.body.should.have.property('error', 'Internal Server Error'); @@ -480,7 +482,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { .rejects(new Error('No unspents available for consolidation')); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: mockUserKeychain.pub, @@ -500,7 +502,7 @@ describe('POST /api/:coin/wallet/:walletId/consolidateunspents', () => { it('should fail when pubkey parameter is not a string', async () => { const response = await agent - .post(`/api/${coin}/wallet/${walletId}/consolidateunspents`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/consolidateunspents`) .set('Authorization', `Bearer ${accessToken}`) .send({ pubkey: 12345, diff --git a/src/__tests__/api/master/generateWallet.test.ts b/src/__tests__/api/master/generateWallet.test.ts index 929c326..2beb5d2 100644 --- a/src/__tests__/api/master/generateWallet.test.ts +++ b/src/__tests__/api/master/generateWallet.test.ts @@ -20,7 +20,7 @@ import { BitGoRequest } from '../../../types/request'; * in how the constants are fetched. */ -describe('POST /api/:coin/wallet/generate', () => { +describe('POST /api/v1/:coin/advancedwallet/generate', () => { let agent: request.SuperAgentTest; const advancedWalletManagerUrl = 'http://advancedwalletmanager.invalid'; const bitgoApiUrl = Environments.test.uri; @@ -186,7 +186,7 @@ describe('POST /api/:coin/wallet/generate', () => { }); const response = await agent - .post(`/api/${coin}/wallet/generate`) + .post(`/api/v1/${coin}/advancedwallet/generate`) .set('Authorization', `Bearer ${accessToken}`) .send({ label: 'test_wallet', @@ -530,7 +530,7 @@ describe('POST /api/:coin/wallet/generate', () => { }); const response = await agent - .post(`/api/${eddsaCoin}/wallet/generate`) + .post(`/api/v1/${eddsaCoin}/advancedwallet/generate`) .set('Authorization', `Bearer ${accessToken}`) .send({ label: 'test_wallet', @@ -1181,7 +1181,7 @@ describe('POST /api/:coin/wallet/generate', () => { }); const response = await agent - .post(`/api/${ecdsaCoin}/wallet/generate`) + .post(`/api/v1/${ecdsaCoin}/advancedwallet/generate`) .set('Authorization', `Bearer ${accessToken}`) .send({ label: 'test-wallet', @@ -1249,7 +1249,7 @@ describe('POST /api/:coin/wallet/generate', () => { it('should fail when multisig type is invalid / not provided', async () => { const response = await agent - .post(`/api/${coin}/wallet/generate`) + .post(`/api/v1/${coin}/advancedwallet/generate`) .set('Authorization', `Bearer ${accessToken}`) .send({ label: 'test_wallet', @@ -1260,7 +1260,7 @@ describe('POST /api/:coin/wallet/generate', () => { response.status.should.equal(400); const response2 = await agent - .post(`/api/${coin}/wallet/generate`) + .post(`/api/v1/${coin}/advancedwallet/generate`) .set('Authorization', `Bearer ${accessToken}`) .send({ label: 'test_wallet', @@ -1272,7 +1272,7 @@ describe('POST /api/:coin/wallet/generate', () => { it('should fail when coin does not support TSS', async () => { const response = await agent - .post(`/api/tbtc/wallet/generate`) + .post(`/api/v1/tbtc/advancedwallet/generate`) .set('Authorization', `Bearer ${accessToken}`) .send({ label: 'test_wallet', diff --git a/src/__tests__/api/master/musigRecovery.test.ts b/src/__tests__/api/master/musigRecovery.test.ts index fdf7332..70647e7 100644 --- a/src/__tests__/api/master/musigRecovery.test.ts +++ b/src/__tests__/api/master/musigRecovery.test.ts @@ -8,7 +8,7 @@ import { app as expressApp } from '../../../masterBitGoExpressApp'; import { AppMode, MasterExpressConfig, TlsMode } from '../../../shared/types'; import { data as ethRecoveryData } from '../../mocks/ethRecoveryMusigMockData'; -describe('POST /api/:coin/wallet/recovery', () => { +describe('POST /api/v1/:coin/advancedwallet/recovery', () => { let agent: request.SuperAgentTest; const advancedWalletManagerUrl = 'http://advancedwalletmanager.invalid'; const coin = 'hteth'; @@ -65,7 +65,7 @@ describe('POST /api/:coin/wallet/recovery', () => { // the call to our own master api express endpoint const response = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -86,7 +86,7 @@ describe('POST /api/:coin/wallet/recovery', () => { it('should fail when walletContractAddress (origin) not provided', async () => { const response = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -105,7 +105,7 @@ describe('POST /api/:coin/wallet/recovery', () => { }); it('should fail when recoveryDestinationAddress (destiny) not provided', async () => { const response = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -123,7 +123,7 @@ describe('POST /api/:coin/wallet/recovery', () => { }); it('should fail when userPub or backupPub not provided', async () => { const responseNoUserKey = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -135,7 +135,7 @@ describe('POST /api/:coin/wallet/recovery', () => { }); const responseNoBackupKey = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { diff --git a/src/__tests__/api/master/nonRecovery.test.ts b/src/__tests__/api/master/nonRecovery.test.ts index c5d5264..c870607 100644 --- a/src/__tests__/api/master/nonRecovery.test.ts +++ b/src/__tests__/api/master/nonRecovery.test.ts @@ -77,7 +77,7 @@ describe('Non Recovery Tests', () => { const bitgoPub = 'xpub_bitgo'; const recoveryDestination = 'tb1qprdy6jwxrrr2qrwgd2tzl8z99hqp29jn6f3sguxulqm448myj6jsy2nwsu'; const response = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -108,7 +108,7 @@ describe('Non Recovery Tests', () => { describe('Recovery Consolidation', () => { it('should fail to run mbe recovery consolidation if not in recovery mode', async () => { const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'onchain', diff --git a/src/__tests__/api/master/recoveryConsolidationsWallet.test.ts b/src/__tests__/api/master/recoveryConsolidationsWallet.test.ts index ef7a29f..abc5bb8 100644 --- a/src/__tests__/api/master/recoveryConsolidationsWallet.test.ts +++ b/src/__tests__/api/master/recoveryConsolidationsWallet.test.ts @@ -9,7 +9,7 @@ import { Sol } from '@bitgo-beta/sdk-coin-sol'; import { Sui } from '@bitgo-beta/sdk-coin-sui'; import { AdvancedWalletManagerClient } from '../../../masterBitgoExpress/clients/advancedWalletManagerClient'; -describe('POST /api/:coin/wallet/recoveryconsolidations', () => { +describe('POST /api/v1/:coin/advancedwallet/recoveryconsolidations', () => { let agent: request.SuperAgentTest; const advancedWalletManagerUrl = 'https://test-advanced-wallet-manager.com'; const accessToken = 'test-access-token'; @@ -74,7 +74,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { }; const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -115,7 +115,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { }; const response = await agent - .post(`/api/sol/wallet/recoveryconsolidations`) + .post(`/api/v1/sol/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -168,7 +168,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { }; const response = await agent - .post(`/api/tsui/wallet/recoveryconsolidations`) + .post(`/api/v1/tsui/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -212,7 +212,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { }; const response = await agent - .post(`/api/sol/wallet/recoveryconsolidations`) + .post(`/api/v1/sol/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -254,7 +254,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { }; const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send(requestPayload); @@ -268,7 +268,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { it('should fail when commonKeychain is missing for MPC wallet', async () => { const response = await agent - .post(`/api/tsui/wallet/recoveryconsolidations`) + .post(`/api/v1/tsui/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'tss', @@ -282,7 +282,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { it('should fail when required keys are missing for onchain wallet', async () => { const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'onchain', @@ -299,7 +299,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { it('should fail when required multisigType parameter is missing', async () => { const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ userPub: mockUserPub, @@ -313,7 +313,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { it('should fail when multisigType parameter has invalid value', async () => { const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'invalid_type', @@ -327,7 +327,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { }); it('should fail when authorization header is missing', async () => { - const response = await agent.post(`/api/trx/wallet/recoveryconsolidations`).send({ + const response = await agent.post(`/api/v1/trx/advancedwallet/recoveryconsolidations`).send({ multisigType: 'onchain', userPub: mockUserPub, backupPub: mockBackupPub, @@ -345,7 +345,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { } as any); const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'onchain', @@ -367,7 +367,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { } as any); const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'onchain', @@ -392,7 +392,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { .rejects(new Error('Failed to recover consolidations')); const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'onchain', @@ -420,7 +420,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { .rejects(new Error('Advanced Wallet Manager signing failed')); const response = await agent - .post(`/api/trx/wallet/recoveryconsolidations`) + .post(`/api/v1/trx/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'onchain', @@ -439,7 +439,7 @@ describe('POST /api/:coin/wallet/recoveryconsolidations', () => { it('should fail when durableNonces parameter is not correctly structured', async () => { const response = await agent - .post(`/api/sol/wallet/recoveryconsolidations`) + .post(`/api/v1/sol/advancedwallet/recoveryconsolidations`) .set('Authorization', `Bearer ${accessToken}`) .send({ multisigType: 'onchain', diff --git a/src/__tests__/api/master/recoveryWallet.test.ts b/src/__tests__/api/master/recoveryWallet.test.ts index 686f81d..f2de436 100644 --- a/src/__tests__/api/master/recoveryWallet.test.ts +++ b/src/__tests__/api/master/recoveryWallet.test.ts @@ -129,7 +129,7 @@ describe('Recovery Tests', () => { }); const response = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -182,7 +182,7 @@ describe('Recovery Tests', () => { const recoveryDestination = 'tb1qprdy6jwxrrr2qrwgd2tzl8z99hqp29jn6f3sguxulqm448myj6jsy2nwsu'; const response = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -217,7 +217,7 @@ describe('Recovery Tests', () => { const recoveryDestination = 'tb1qprdy6jwxrrr2qrwgd2tzl8z99hqp29jn6f3sguxulqm448myj6jsy2nwsu'; const response = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -254,7 +254,7 @@ describe('Recovery Tests', () => { const recoveryDestination = 'tb1qprdy6jwxrrr2qrwgd2tzl8z99hqp29jn6f3sguxulqm448myj6jsy2nwsu'; const response = await agent - .post(`/api/${coin}/wallet/recovery`) + .post(`/api/v1/${coin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -305,7 +305,7 @@ describe('Recovery Tests', () => { const walletContractAddress = '0x0987654321098765432109876543210987654321'; const response = await agent - .post(`/api/${ethCoinId}/wallet/recovery`) + .post(`/api/v1/${ethCoinId}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -341,7 +341,7 @@ describe('Recovery Tests', () => { const walletContractAddress = '0x0987654321098765432109876543210987654321'; const response = await agent - .post(`/api/${ethCoinId}/wallet/recovery`) + .post(`/api/v1/${ethCoinId}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ multiSigRecoveryParams: { @@ -432,7 +432,7 @@ describe('Recovery Tests', () => { }); const response = await agent - .post(`/api/${solCoinId}/wallet/recovery`) + .post(`/api/v1/${solCoinId}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ isTssRecovery: true, @@ -460,7 +460,7 @@ describe('Recovery Tests', () => { const recoveryDestination = 'solanaRecoveryAddress123456789012345678901234'; const response = await agent - .post(`/api/${solCoinId}/wallet/recovery`) + .post(`/api/v1/${solCoinId}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ isTssRecovery: true, @@ -491,7 +491,7 @@ describe('Recovery Tests', () => { const recoveryDestination = 'solanaRecoveryAddress123456789012345678901234'; const response = await agent - .post(`/api/${solCoinId}/wallet/recovery`) + .post(`/api/v1/${solCoinId}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ isTssRecovery: true, @@ -605,7 +605,7 @@ describe('Recovery Tests', () => { }); const response = await agent - .post(`/api/${suiCoinId}/wallet/recovery`) + .post(`/api/v1/${suiCoinId}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ isTssRecovery: true, diff --git a/src/__tests__/api/master/recoveryWalletMpcV2.test.ts b/src/__tests__/api/master/recoveryWalletMpcV2.test.ts index 23b55f7..057b9cd 100644 --- a/src/__tests__/api/master/recoveryWalletMpcV2.test.ts +++ b/src/__tests__/api/master/recoveryWalletMpcV2.test.ts @@ -92,7 +92,7 @@ describe('MBE mpcv2 recovery', () => { }); const response = await agent - .post(`/api/${ethLikeCoin}/wallet/recovery`) + .post(`/api/v1/${ethLikeCoin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ isTssRecovery: true, @@ -161,7 +161,7 @@ describe('MBE mpcv2 recovery', () => { }); const response = await agent - .post(`/api/${cosmosLikeCoin}/wallet/recovery`) + .post(`/api/v1/${cosmosLikeCoin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ isTssRecovery: true, @@ -188,7 +188,7 @@ describe('MBE mpcv2 recovery', () => { it('should throw 422 Unprocessable Entity for missing coin specific params', async () => { const response = await agent - .post(`/api/${ethLikeCoin}/wallet/recovery`) + .post(`/api/v1/${ethLikeCoin}/advancedwallet/recovery`) .set('Authorization', `Bearer ${accessToken}`) .send({ isTssRecovery: true, diff --git a/src/__tests__/api/master/sendMany.test.ts b/src/__tests__/api/master/sendMany.test.ts index 8e09f24..0218baf 100644 --- a/src/__tests__/api/master/sendMany.test.ts +++ b/src/__tests__/api/master/sendMany.test.ts @@ -9,7 +9,7 @@ import { Environments, Wallet } from '@bitgo-beta/sdk-core'; import { Tbtc } from '@bitgo-beta/sdk-coin-btc'; import assert from 'assert'; -describe('POST /api/:coin/wallet/:walletId/sendmany', () => { +describe('POST /api/v1/:coin/advancedwallet/:walletId/sendMany', () => { let agent: request.SuperAgentTest; const advancedWalletManagerUrl = 'http://advancedwalletmanager.invalid'; const bitgoApiUrl = Environments.test.uri; @@ -107,7 +107,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -195,7 +195,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -276,7 +276,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { const multisigTypeStub = sinon.stub(Wallet.prototype, 'multisigType').returns('tss'); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -361,7 +361,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { const multisigTypeStub = sinon.stub(Wallet.prototype, 'multisigType').returns('tss'); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -443,7 +443,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { const multisigTypeStub = sinon.stub(Wallet.prototype, 'multisigType').returns('tss'); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ type: 'fillNonce', @@ -502,7 +502,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { const multisigTypeStub = sinon.stub(Wallet.prototype, 'multisigType').returns('tss'); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -546,7 +546,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -627,7 +627,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { const verifyStub = sinon.stub(Tbtc.prototype, 'verifyTransaction').resolves(false); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -684,7 +684,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { .rejects(new Error('Invalid transaction')); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -744,7 +744,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ @@ -791,7 +791,7 @@ describe('POST /api/:coin/wallet/:walletId/sendmany', () => { }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/sendMany`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/sendMany`) .set('Authorization', `Bearer ${accessToken}`) .send({ recipients: [ diff --git a/src/__tests__/api/master/signAndSendTxRequest.test.ts b/src/__tests__/api/master/signAndSendTxRequest.test.ts index 71284d7..202567e 100644 --- a/src/__tests__/api/master/signAndSendTxRequest.test.ts +++ b/src/__tests__/api/master/signAndSendTxRequest.test.ts @@ -20,7 +20,7 @@ import * as mpcv2 from '../../../masterBitgoExpress/handlers/ecdsa'; import * as eddsa from '../../../masterBitgoExpress/handlers/eddsa'; import coinFactory from '../../../shared/coinFactory'; -describe('POST /api/:coin/wallet/:walletId/txrequest/:txRequestId/signAndSend', () => { +describe('POST /api/v1/:coin/advancedwallet/:walletId/txrequest/:txRequestId/signAndSend', () => { let agent: request.SuperAgentTest; let bitgo: BitGoBase; let baseCoin: IBaseCoin; @@ -149,7 +149,7 @@ describe('POST /api/:coin/wallet/:walletId/txrequest/:txRequestId/signAndSend', }); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/txrequest/${txRequestId}/signAndSend`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/txrequest/${txRequestId}/signAndSend`) .set('Authorization', `Bearer ${accessToken}`) .send({ source: 'user', @@ -242,7 +242,7 @@ describe('POST /api/:coin/wallet/:walletId/txrequest/:txRequestId/signAndSend', sinon.stub(PendingApprovals.prototype, 'get').resolves(mockPendingApproval); const response = await agent - .post(`/api/${coin}/wallet/${walletId}/txrequest/${txRequestId}/signAndSend`) + .post(`/api/v1/${coin}/advancedwallet/${walletId}/txrequest/${txRequestId}/signAndSend`) .set('Authorization', `Bearer ${accessToken}`) .send({ source: 'user', @@ -341,7 +341,9 @@ describe('POST /api/:coin/wallet/:walletId/txrequest/:txRequestId/signAndSend', }); const response = await agent - .post(`/api/${eddsaCoin}/wallet/${walletId}/txrequest/${txRequestId}/signAndSend`) + .post( + `/api/v1/${eddsaCoin}/advancedwallet/${walletId}/txrequest/${txRequestId}/signAndSend`, + ) .set('Authorization', `Bearer ${accessToken}`) .send({ source: 'user', diff --git a/src/masterBitgoExpress/routers/accelerateRoute.ts b/src/masterBitgoExpress/routers/accelerateRoute.ts index 47ef3f2..1d494aa 100644 --- a/src/masterBitgoExpress/routers/accelerateRoute.ts +++ b/src/masterBitgoExpress/routers/accelerateRoute.ts @@ -6,7 +6,7 @@ import { ErrorResponses } from '../../shared/errors'; * Request type for the transaction acceleration endpoint. * Used to accelerate unconfirmed transactions on UTXO-based blockchains using CPFP or RBF. * - * @endpoint POST /api/{coin}/wallet/{walletId}/accelerate + * @endpoint POST /api/v1/{coin}/advancedwallet/{walletId}/accelerate * @description Speeds up unconfirmed transactions by creating a child transaction (CPFP) or replacing the original transaction (RBF) */ export const AccelerateRequest = { @@ -62,7 +62,7 @@ export const AccelerateRequest = { /** * Response type for the transaction acceleration endpoint. * - * @endpoint POST /api/{coin}/wallet/{walletId}/accelerate + * @endpoint POST /api/v1/{coin}/advancedwallet/{walletId}/accelerate * @description Sign an acceleration transaction and send to BitGo to sign and broadcast */ const AccelerateResponse: HttpResponse = { @@ -94,7 +94,7 @@ const AccelerateResponse: HttpResponse = { */ export const AccelerateRoute = httpRoute({ method: 'POST', - path: '/api/{coin}/wallet/{walletId}/accelerate', + path: '/api/v1/{coin}/advancedwallet/{walletId}/accelerate', request: httpRequest({ params: { walletId: t.string, diff --git a/src/masterBitgoExpress/routers/consolidateRoute.ts b/src/masterBitgoExpress/routers/consolidateRoute.ts index a43b85d..57a1873 100644 --- a/src/masterBitgoExpress/routers/consolidateRoute.ts +++ b/src/masterBitgoExpress/routers/consolidateRoute.ts @@ -40,7 +40,7 @@ export const ConsolidateResponse: HttpResponse = { */ export const ConsolidateRoute = httpRoute({ method: 'POST', - path: '/api/{coin}/wallet/{walletId}/consolidate', + path: '/api/v1/{coin}/advancedwallet/{walletId}/consolidate', request: httpRequest({ params: { walletId: t.string, diff --git a/src/masterBitgoExpress/routers/consolidateUnspentsRoute.ts b/src/masterBitgoExpress/routers/consolidateUnspentsRoute.ts index e5ba484..1a2b801 100644 --- a/src/masterBitgoExpress/routers/consolidateUnspentsRoute.ts +++ b/src/masterBitgoExpress/routers/consolidateUnspentsRoute.ts @@ -79,7 +79,7 @@ export const ConsolidateUnspentsResponse: HttpResponse = { */ export const ConsolidateUnspentsRoute = httpRoute({ method: 'POST', - path: '/api/{coin}/wallet/{walletId}/consolidateunspents', + path: '/api/v1/{coin}/advancedwallet/{walletId}/consolidateunspents', request: httpRequest({ params: { walletId: t.string, diff --git a/src/masterBitgoExpress/routers/generateWalletRoute.ts b/src/masterBitgoExpress/routers/generateWalletRoute.ts index 64be731..9c0b032 100644 --- a/src/masterBitgoExpress/routers/generateWalletRoute.ts +++ b/src/masterBitgoExpress/routers/generateWalletRoute.ts @@ -342,7 +342,7 @@ const GenerateWalletRequest = { */ export const WalletGenerateRoute = httpRoute({ method: 'POST', - path: '/api/{coin}/wallet/generate', + path: '/api/v1/{coin}/advancedwallet/generate', request: httpRequest({ params: { coin: t.string }, body: GenerateWalletRequest, diff --git a/src/masterBitgoExpress/routers/recoveryConsolidationsRoute.ts b/src/masterBitgoExpress/routers/recoveryConsolidationsRoute.ts index a392e9a..751358e 100644 --- a/src/masterBitgoExpress/routers/recoveryConsolidationsRoute.ts +++ b/src/masterBitgoExpress/routers/recoveryConsolidationsRoute.ts @@ -6,7 +6,7 @@ import { ErrorResponses } from '../../shared/errors'; * Request type for wallet recovery consolidations endpoint. * Used to consolidate and recover funds from multiple addresses in a wallet, via signing with user and backup keys. * - * @endpoint POST /api/{coin}/wallet/recoveryconsolidations + * @endpoint POST /api/v1/{coin}/advancedwallet/recoveryconsolidations * @description Consolidates and recovers funds from multiple addresses in a wallet */ const RecoveryConsolidationsWalletRequest = { @@ -101,7 +101,7 @@ const RecoveryConsolidationsWalletRequest = { /** * Response type for the wallet recovery consolidations endpoint * - * @endpoint POST /api/{coin}/wallet/recoveryconsolidations + * @endpoint POST /api/v1/{coin}/advancedwallet/recoveryconsolidations * @description Returns the signed consolidation transactions */ const RecoveryConsolidationsWalletResponse: HttpResponse = { @@ -120,7 +120,7 @@ const RecoveryConsolidationsWalletResponse: HttpResponse = { */ export const RecoveryConsolidationsRoute = httpRoute({ method: 'POST', - path: '/api/{coin}/wallet/recoveryconsolidations', + path: '/api/v1/{coin}/advancedwallet/recoveryconsolidations', request: httpRequest({ params: { coin: t.string, diff --git a/src/masterBitgoExpress/routers/recoveryRoute.ts b/src/masterBitgoExpress/routers/recoveryRoute.ts index a413dd2..89558f3 100644 --- a/src/masterBitgoExpress/routers/recoveryRoute.ts +++ b/src/masterBitgoExpress/routers/recoveryRoute.ts @@ -191,7 +191,7 @@ export type CoinSpecificParamsUnion = /** * Response type for the wallet recovery endpoint. * - * @endpoint POST /api/{coin}/wallet/recovery + * @endpoint POST /api/v1/{coin}/advancedwallet/recovery * @description Returns the signed recovery transaction that can be broadcast to the network */ const RecoveryWalletResponse: HttpResponse = { @@ -214,7 +214,7 @@ const RecoveryWalletResponse: HttpResponse = { * Request type for the wallet recovery endpoint. * Used to recover funds from both standard multisig and TSS wallets. * - * @endpoint POST /api/{coin}/wallet/recovery + * @endpoint POST /api/v1/{coin}/advancedwallet/recovery * @description Recover funds from a wallet by building a transaction with user and backup keys */ const RecoveryWalletRequest = { @@ -296,7 +296,7 @@ const RecoveryWalletRequest = { */ export const RecoveryRoute = httpRoute({ method: 'POST', - path: '/api/{coin}/wallet/recovery', + path: '/api/v1/{coin}/advancedwallet/recovery', request: httpRequest({ params: { coin: t.string, diff --git a/src/masterBitgoExpress/routers/sendManyRoute.ts b/src/masterBitgoExpress/routers/sendManyRoute.ts index 3051bfc..27b5105 100644 --- a/src/masterBitgoExpress/routers/sendManyRoute.ts +++ b/src/masterBitgoExpress/routers/sendManyRoute.ts @@ -209,7 +209,7 @@ export const SendManyResponse: HttpResponse = { export const SendManyRoute = httpRoute({ method: 'POST', - path: '/api/{coin}/wallet/{walletId}/sendMany', + path: '/api/v1/{coin}/advancedwallet/{walletId}/sendMany', request: httpRequest({ params: { walletId: t.string, diff --git a/src/masterBitgoExpress/routers/signAndSendMpcRoute.ts b/src/masterBitgoExpress/routers/signAndSendMpcRoute.ts index 2d6a74b..1c7eb4f 100644 --- a/src/masterBitgoExpress/routers/signAndSendMpcRoute.ts +++ b/src/masterBitgoExpress/routers/signAndSendMpcRoute.ts @@ -24,7 +24,7 @@ export const SignMpcResponse: HttpResponse = { */ export const SignAndSendMpcRoute = httpRoute({ method: 'POST', - path: '/api/{coin}/wallet/{walletId}/txrequest/{txRequestId}/signAndSend', + path: '/api/v1/{coin}/advancedwallet/{walletId}/txrequest/{txRequestId}/signAndSend', request: httpRequest({ params: { walletId: t.string,