From c74f27772e10388abde7c2a61a1c7cdb3d883032 Mon Sep 17 00:00:00 2001 From: Daniel Peng Date: Thu, 11 Jun 2026 12:07:25 -0400 Subject: [PATCH 1/2] refactor: wallet generation handler to use new sdk callback Ticket: WCN-684 --- package-lock.json | 404 ++++++++++++------ package.json | 6 +- .../api/master/generateWallet.test.ts | 48 ++- .../keyProviderClient/keyProviderClient.ts | 4 +- .../handlers/handleGenerateWallet.ts | 99 +---- .../handlers/walletGenerationCallbacks.ts | 13 + 6 files changed, 319 insertions(+), 255 deletions(-) create mode 100644 src/masterBitgoExpress/handlers/walletGenerationCallbacks.ts diff --git a/package-lock.json b/package-lock.json index 581a4914..b8351c28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@bitgo-beta/abstract-cosmos": "1.0.1-beta.1741", "@bitgo-beta/abstract-eth": "1.0.2-beta.2004", "@bitgo-beta/abstract-utxo": "1.1.1-beta.2007", - "@bitgo-beta/sdk-api": "1.10.1-beta.1773", + "@bitgo-beta/sdk-api": "1.10.1-beta.1812", "@bitgo-beta/sdk-coin-ada": "2.3.14-beta.1758", "@bitgo-beta/sdk-coin-algo": "2.8.9-beta.238", "@bitgo-beta/sdk-coin-apt": "1.0.1-beta.1200", @@ -84,7 +84,7 @@ "@bitgo-beta/sdk-coin-zec": "1.1.1-beta.1984", "@bitgo-beta/sdk-coin-zeta": "1.0.1-beta.1675", "@bitgo-beta/sdk-coin-zketh": "1.0.1-beta.1540", - "@bitgo-beta/sdk-core": "8.2.1-beta.1775", + "@bitgo-beta/sdk-core": "8.2.1-beta.1815", "@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.1770", "@bitgo-beta/statics": "15.1.1-beta.1782", "@bitgo/wasm-miniscript": "2.0.0-beta.7", @@ -160,7 +160,8 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", - "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==" + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" }, "node_modules/@api-ts/io-ts-http": { "version": "3.2.1", @@ -3267,6 +3268,12 @@ "node": ">=20" } }, + "node_modules/@bitgo-beta/abstract-utxo/node_modules/@bitgo-beta/argon2": { + "version": "0.0.1-beta.86", + "resolved": "https://registry.npmjs.org/@bitgo-beta/argon2/-/argon2-0.0.1-beta.86.tgz", + "integrity": "sha512-6hfQR1+yKIsJGjZ0OaIgzePDPbyOsVfHuUb91qSClSBO+HupQ57bDMfShvJnHSknn76WbOacGnZhNT6XUUQWLQ==", + "license": "MIT" + }, "node_modules/@bitgo-beta/abstract-utxo/node_modules/@bitgo-beta/blake2b": { "version": "3.0.4-beta.2014", "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2014.tgz", @@ -3292,6 +3299,40 @@ "integrity": "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==", "license": "ISC" }, + "node_modules/@bitgo-beta/abstract-utxo/node_modules/@bitgo-beta/sdk-api": { + "version": "1.10.1-beta.1773", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-api/-/sdk-api-1.10.1-beta.1773.tgz", + "integrity": "sha512-uWE8Hmny+lRmZ1UZFVANQutxxWM/WV2fLUTJQ1a6o0NmzzSLTlgtS8i9HsA5bkKm2bG7vG1TjbhuZl4VYkeDLw==", + "license": "MIT", + "dependencies": { + "@bitgo-beta/argon2": "0.0.1-beta.86", + "@bitgo-beta/sdk-core": "8.2.1-beta.1775", + "@bitgo-beta/sdk-hmac": "1.0.1-beta.1146", + "@bitgo-beta/sjcl": "1.0.2-beta.2018", + "@bitgo-beta/unspents": "0.13.2-beta.1776", + "@bitgo-beta/utxo-lib": "8.0.3-beta.1777", + "@types/superagent": "4.1.15", + "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.3", + "debug": "3.1.0", + "eol": "^0.5.0", + "io-ts": "npm:@bitgo-forks/io-ts@2.1.4", + "lodash": "^4.18.0", + "proxy-agent": "6.4.0", + "sanitize-html": "^2.17.4", + "secp256k1": "5.0.1", + "secrets.js-grempe": "^1.1.0", + "superagent": "^9.0.1" + } + }, + "node_modules/@bitgo-beta/abstract-utxo/node_modules/@bitgo-beta/sdk-hmac": { + "version": "1.0.1-beta.1146", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-hmac/-/sdk-hmac-1.0.1-beta.1146.tgz", + "integrity": "sha512-vMTuo1dvLxyKpJHgS1UnK8CMOTBRSGmGx2sqiNR7U4cPcu9tD45bgsd2ZtunC6AUK7hcJOeZgeEmMbKsGQf7Bg==", + "license": "MIT", + "dependencies": { + "@bitgo-beta/sjcl": "1.0.2-beta.2018" + } + }, "node_modules/@bitgo-beta/abstract-utxo/node_modules/@bitgo-beta/secp256k1": { "version": "1.0.2-beta.1805", "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1805.tgz", @@ -3312,6 +3353,24 @@ "npm": ">=3.10.10" } }, + "node_modules/@bitgo-beta/abstract-utxo/node_modules/@bitgo-beta/sjcl": { + "version": "1.0.2-beta.2018", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2018.tgz", + "integrity": "sha512-aAT/SyM+sUT55ZNHaKVw3wmY+S32pMPf7lCPevBQJbfjeFUSz3SxTRv9uydBci2fBRnF+StkBKn8jff/coHqOQ==", + "license": "(BSD-2-Clause OR GPL-2.0-only)" + }, + "node_modules/@bitgo-beta/abstract-utxo/node_modules/@bitgo-beta/unspents": { + "version": "0.13.2-beta.1776", + "resolved": "https://registry.npmjs.org/@bitgo-beta/unspents/-/unspents-0.13.2-beta.1776.tgz", + "integrity": "sha512-jFVicakD2eqXOaHHy88ES9lVUP0+0d0ihO2JuTXCHb24ghKc3Wx8bmhfEtO4XkBL6Hz9Hnyy17ILcTrOeIADsg==", + "license": "Apache-2.0", + "dependencies": { + "@bitgo-beta/utxo-lib": "8.0.3-beta.1777", + "lodash": "^4.18.0", + "tcomb": "~3.2.29", + "varuint-bitcoin": "^1.0.4" + } + }, "node_modules/@bitgo-beta/abstract-utxo/node_modules/@bitgo-beta/utxo-lib": { "version": "8.0.3-beta.1777", "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1777.tgz", @@ -3345,6 +3404,21 @@ "@types/node": "*" } }, + "node_modules/@bitgo-beta/abstract-utxo/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@bitgo-beta/abstract-utxo/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/@bitgo-beta/abstract-utxo/node_modules/formidable": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", @@ -3423,9 +3497,9 @@ } }, "node_modules/@bitgo-beta/argon2": { - "version": "0.0.1-beta.86", - "resolved": "https://registry.npmjs.org/@bitgo-beta/argon2/-/argon2-0.0.1-beta.86.tgz", - "integrity": "sha512-6hfQR1+yKIsJGjZ0OaIgzePDPbyOsVfHuUb91qSClSBO+HupQ57bDMfShvJnHSknn76WbOacGnZhNT6XUUQWLQ==", + "version": "0.0.1-beta.127", + "resolved": "https://registry.npmjs.org/@bitgo-beta/argon2/-/argon2-0.0.1-beta.127.tgz", + "integrity": "sha512-C4UZUKnfRRhRhqt0fJNvpsoz1cSM4Q8eBjvVJzM0FzqrRM47C00coCT+XbUeEECGqYpp4rDKWjqVdnPJW6WKKA==", "license": "MIT" }, "node_modules/@bitgo-beta/blake2b": { @@ -3630,17 +3704,17 @@ "license": "MIT" }, "node_modules/@bitgo-beta/sdk-api": { - "version": "1.10.1-beta.1773", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-api/-/sdk-api-1.10.1-beta.1773.tgz", - "integrity": "sha512-uWE8Hmny+lRmZ1UZFVANQutxxWM/WV2fLUTJQ1a6o0NmzzSLTlgtS8i9HsA5bkKm2bG7vG1TjbhuZl4VYkeDLw==", + "version": "1.10.1-beta.1812", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-api/-/sdk-api-1.10.1-beta.1812.tgz", + "integrity": "sha512-TaHnb3WsqBbPTLVM9y0MEkukEY/OyEnxMnA20cLGdUe5z8ueWrtJGdwHWiq9XexnQZqj7bVF7ECnXZ6+7+rbbg==", "license": "MIT", "dependencies": { - "@bitgo-beta/argon2": "0.0.1-beta.86", - "@bitgo-beta/sdk-core": "8.2.1-beta.1775", - "@bitgo-beta/sdk-hmac": "1.0.1-beta.1146", - "@bitgo-beta/sjcl": "1.0.2-beta.2018", - "@bitgo-beta/unspents": "0.13.2-beta.1776", - "@bitgo-beta/utxo-lib": "8.0.3-beta.1777", + "@bitgo-beta/argon2": "0.0.1-beta.127", + "@bitgo-beta/sdk-core": "8.2.1-beta.1815", + "@bitgo-beta/sdk-hmac": "1.0.1-beta.1188", + "@bitgo-beta/sjcl": "1.0.2-beta.2061", + "@bitgo-beta/unspents": "0.13.2-beta.1816", + "@bitgo-beta/utxo-lib": "8.0.3-beta.1817", "@types/superagent": "4.1.15", "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.3", "debug": "3.1.0", @@ -3655,19 +3729,19 @@ } }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/blake2b": { - "version": "3.0.4-beta.2014", - "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2014.tgz", - "integrity": "sha512-A0muYVraoSSxHKYqJGuw/rIenv68/m75ZCPnSEV98UnnleXCf+J8k5FgzYaaVZ50Em5sdUg9R7tAT2LHsbMECA==", + "version": "3.0.4-beta.2054", + "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2054.tgz", + "integrity": "sha512-Ayasxw96MlDC1wTd79oWZ5JtCKqdtaU6tzmZTzPLc0j+J3ym+LKdnywyoruUvarxWsuvTcb2t8gm0DF2X7J29w==", "license": "ISC", "dependencies": { - "@bitgo-beta/blake2b-wasm": "3.0.4-beta.2019", + "@bitgo-beta/blake2b-wasm": "3.0.4-beta.2060", "nanoassert": "^2.0.0" } }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/blake2b-wasm": { - "version": "3.0.4-beta.2019", - "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b-wasm/-/blake2b-wasm-3.0.4-beta.2019.tgz", - "integrity": "sha512-1brVeE1sf7YwFUdMXknjy8D313zydrr2Tslckx3yiWw/Lnulbm6lAldadSnmoR0EsqmJBjD3XAV9c8owk6Seqw==", + "version": "3.0.4-beta.2060", + "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b-wasm/-/blake2b-wasm-3.0.4-beta.2060.tgz", + "integrity": "sha512-WrmQ8z+8xKVp2Pj8IVr11cw8lQWwEBUTRTx1waXWPuPYH1ziDh9IfvZXa9YOGsbBN1QrVZ6tygYDktYHmyeUNQ==", "license": "MIT", "dependencies": { "nanoassert": "^1.0.0" @@ -3680,9 +3754,9 @@ "license": "ISC" }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/secp256k1": { - "version": "1.0.2-beta.1805", - "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1805.tgz", - "integrity": "sha512-gSroORTk1g2j0iYvA2qCCz9ecjT9w9SRcQ3JJjspM3DJA5FNqOiMjyqD/bFfHmYvAM5T888pKPbBd8KxjEvjEQ==", + "version": "1.0.2-beta.1848", + "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1848.tgz", + "integrity": "sha512-Qv/OuAubHTUrhbr5uPmS4HMcFMtIhOvSql2pcNxC6ffyEHOe4e5h+M0KtGqmM7GIak3D4uJW771BtYFg5KBhDA==", "license": "MIT", "dependencies": { "@brandonblack/musig": "^0.0.1-alpha.0", @@ -3700,31 +3774,31 @@ } }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/sjcl": { - "version": "1.0.2-beta.2018", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2018.tgz", - "integrity": "sha512-aAT/SyM+sUT55ZNHaKVw3wmY+S32pMPf7lCPevBQJbfjeFUSz3SxTRv9uydBci2fBRnF+StkBKn8jff/coHqOQ==", + "version": "1.0.2-beta.2061", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2061.tgz", + "integrity": "sha512-BDlMO+Opn6yJvpoFEHgg3+uzIAiB5wYHk1RTq/FiAmngGLPHOfRcP3piv9c3HnTEKo/K94ZOXPDtENvJ9HzHWA==", "license": "(BSD-2-Clause OR GPL-2.0-only)" }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/unspents": { - "version": "0.13.2-beta.1776", - "resolved": "https://registry.npmjs.org/@bitgo-beta/unspents/-/unspents-0.13.2-beta.1776.tgz", - "integrity": "sha512-jFVicakD2eqXOaHHy88ES9lVUP0+0d0ihO2JuTXCHb24ghKc3Wx8bmhfEtO4XkBL6Hz9Hnyy17ILcTrOeIADsg==", + "version": "0.13.2-beta.1816", + "resolved": "https://registry.npmjs.org/@bitgo-beta/unspents/-/unspents-0.13.2-beta.1816.tgz", + "integrity": "sha512-1UEe7OANugTcey04Ka3WYBcft9x8fUNjHp/v0eFUu1tZe51yr/Ilg2dMAc8ahmv7ry5gGrmjQ9DBL4c6JEcIuQ==", "license": "Apache-2.0", "dependencies": { - "@bitgo-beta/utxo-lib": "8.0.3-beta.1777", + "@bitgo-beta/utxo-lib": "8.0.3-beta.1817", "lodash": "^4.18.0", "tcomb": "~3.2.29", "varuint-bitcoin": "^1.0.4" } }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/utxo-lib": { - "version": "8.0.3-beta.1777", - "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1777.tgz", - "integrity": "sha512-kcJwW71aUq0ai7FUuyPsU1xUpUm76iDIJwlDjZjYnOQzXdkIWo1ASGMen4sUTuq5lbtihJyQEUzGIizE28121g==", + "version": "8.0.3-beta.1817", + "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1817.tgz", + "integrity": "sha512-aHhOBd26mpCi8+oOW14KUY24o3wGBcdr+N/tJBx5eOBXSFUucUsu6nd2cYzbwlZ4EC7UXgyS5NUdXiLXrV/IWA==", "license": "MIT", "dependencies": { - "@bitgo-beta/blake2b": "3.0.4-beta.2014", - "@bitgo-beta/secp256k1": "1.0.2-beta.1805", + "@bitgo-beta/blake2b": "3.0.4-beta.2054", + "@bitgo-beta/secp256k1": "1.0.2-beta.1848", "@brandonblack/musig": "^0.0.1-alpha.0", "bech32": "^2.0.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", @@ -14069,17 +14143,17 @@ } }, "node_modules/@bitgo-beta/sdk-core": { - "version": "8.2.1-beta.1775", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-core/-/sdk-core-8.2.1-beta.1775.tgz", - "integrity": "sha512-WvMcu20H7JGT3pe8QeQiJIma6iHpQURuONvyEXAKLdtudR55uPliBEDGfbn0faPDAfoQU55gdb66moQDUh6Yrw==", + "version": "8.2.1-beta.1815", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-core/-/sdk-core-8.2.1-beta.1815.tgz", + "integrity": "sha512-0VRwvCFJrBisdepC2HB7vQymkXb1pLBLrYo3DVSEk0bq7Br9klEvHSv7YmFxh+6xmvrnh2ZaVK6HoKRGcdlrqA==", "license": "MIT", "dependencies": { - "@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.1770", - "@bitgo-beta/secp256k1": "1.0.2-beta.1805", - "@bitgo-beta/sjcl": "1.0.2-beta.2018", - "@bitgo-beta/statics": "15.1.1-beta.1782", - "@bitgo-beta/utxo-lib": "8.0.3-beta.1777", - "@bitgo/public-types": "6.9.0", + "@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.1811", + "@bitgo-beta/secp256k1": "1.0.2-beta.1848", + "@bitgo-beta/sjcl": "1.0.2-beta.2061", + "@bitgo-beta/statics": "15.1.1-beta.1825", + "@bitgo-beta/utxo-lib": "8.0.3-beta.1817", + "@bitgo/public-types": "6.22.0", "@noble/curves": "1.8.1", "@stablelib/hex": "^1.0.0", "@types/superagent": "4.1.15", @@ -14107,19 +14181,19 @@ } }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/blake2b": { - "version": "3.0.4-beta.2014", - "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2014.tgz", - "integrity": "sha512-A0muYVraoSSxHKYqJGuw/rIenv68/m75ZCPnSEV98UnnleXCf+J8k5FgzYaaVZ50Em5sdUg9R7tAT2LHsbMECA==", + "version": "3.0.4-beta.2054", + "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2054.tgz", + "integrity": "sha512-Ayasxw96MlDC1wTd79oWZ5JtCKqdtaU6tzmZTzPLc0j+J3ym+LKdnywyoruUvarxWsuvTcb2t8gm0DF2X7J29w==", "license": "ISC", "dependencies": { - "@bitgo-beta/blake2b-wasm": "3.0.4-beta.2019", + "@bitgo-beta/blake2b-wasm": "3.0.4-beta.2060", "nanoassert": "^2.0.0" } }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/blake2b-wasm": { - "version": "3.0.4-beta.2019", - "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b-wasm/-/blake2b-wasm-3.0.4-beta.2019.tgz", - "integrity": "sha512-1brVeE1sf7YwFUdMXknjy8D313zydrr2Tslckx3yiWw/Lnulbm6lAldadSnmoR0EsqmJBjD3XAV9c8owk6Seqw==", + "version": "3.0.4-beta.2060", + "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b-wasm/-/blake2b-wasm-3.0.4-beta.2060.tgz", + "integrity": "sha512-WrmQ8z+8xKVp2Pj8IVr11cw8lQWwEBUTRTx1waXWPuPYH1ziDh9IfvZXa9YOGsbBN1QrVZ6tygYDktYHmyeUNQ==", "license": "MIT", "dependencies": { "nanoassert": "^1.0.0" @@ -14131,10 +14205,41 @@ "integrity": "sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==", "license": "ISC" }, + "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/sdk-lib-mpc": { + "version": "8.2.0-beta.1811", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-lib-mpc/-/sdk-lib-mpc-8.2.0-beta.1811.tgz", + "integrity": "sha512-Y3mycCnnAArDxikvoECceI/KnUXZCLnvXxaZfoTs5F2GH9KJeEvArtPYvunesXLJmjf1OTTe5VY2JDvhSeEdEA==", + "license": "MIT", + "dependencies": { + "@bitgo/wasm-mps": "1.8.1", + "@noble/curves": "1.8.1", + "@silencelaboratories/dkls-wasm-ll-node": "1.2.0-pre.4", + "@silencelaboratories/dkls-wasm-ll-web": "1.2.0-pre.4", + "@types/superagent": "4.1.15", + "@wasmer/wasi": "^1.2.2", + "bigint-crypto-utils": "3.1.4", + "bigint-mod-arith": "3.1.2", + "cbor-x": "1.5.9", + "fp-ts": "2.16.2", + "io-ts": "npm:@bitgo-forks/io-ts@2.1.4", + "libsodium-wrappers-sumo": "^0.7.9", + "openpgp": "5.11.3", + "paillier-bigint": "3.3.0", + "secp256k1": "5.0.1" + }, + "peerDependencies": { + "@silencelaboratories/dkls-wasm-ll-bundler": "1.2.0-pre.4" + }, + "peerDependenciesMeta": { + "@silencelaboratories/dkls-wasm-ll-bundler": { + "optional": true + } + } + }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/secp256k1": { - "version": "1.0.2-beta.1805", - "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1805.tgz", - "integrity": "sha512-gSroORTk1g2j0iYvA2qCCz9ecjT9w9SRcQ3JJjspM3DJA5FNqOiMjyqD/bFfHmYvAM5T888pKPbBd8KxjEvjEQ==", + "version": "1.0.2-beta.1848", + "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1848.tgz", + "integrity": "sha512-Qv/OuAubHTUrhbr5uPmS4HMcFMtIhOvSql2pcNxC6ffyEHOe4e5h+M0KtGqmM7GIak3D4uJW771BtYFg5KBhDA==", "license": "MIT", "dependencies": { "@brandonblack/musig": "^0.0.1-alpha.0", @@ -14152,19 +14257,19 @@ } }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/sjcl": { - "version": "1.0.2-beta.2018", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2018.tgz", - "integrity": "sha512-aAT/SyM+sUT55ZNHaKVw3wmY+S32pMPf7lCPevBQJbfjeFUSz3SxTRv9uydBci2fBRnF+StkBKn8jff/coHqOQ==", + "version": "1.0.2-beta.2061", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2061.tgz", + "integrity": "sha512-BDlMO+Opn6yJvpoFEHgg3+uzIAiB5wYHk1RTq/FiAmngGLPHOfRcP3piv9c3HnTEKo/K94ZOXPDtENvJ9HzHWA==", "license": "(BSD-2-Clause OR GPL-2.0-only)" }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/utxo-lib": { - "version": "8.0.3-beta.1777", - "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1777.tgz", - "integrity": "sha512-kcJwW71aUq0ai7FUuyPsU1xUpUm76iDIJwlDjZjYnOQzXdkIWo1ASGMen4sUTuq5lbtihJyQEUzGIizE28121g==", + "version": "8.0.3-beta.1817", + "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1817.tgz", + "integrity": "sha512-aHhOBd26mpCi8+oOW14KUY24o3wGBcdr+N/tJBx5eOBXSFUucUsu6nd2cYzbwlZ4EC7UXgyS5NUdXiLXrV/IWA==", "license": "MIT", "dependencies": { - "@bitgo-beta/blake2b": "3.0.4-beta.2014", - "@bitgo-beta/secp256k1": "1.0.2-beta.1805", + "@bitgo-beta/blake2b": "3.0.4-beta.2054", + "@bitgo-beta/secp256k1": "1.0.2-beta.1848", "@brandonblack/musig": "^0.0.1-alpha.0", "bech32": "^2.0.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", @@ -14181,6 +14286,19 @@ "npm": ">=3.10.10" } }, + "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo/public-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/@bitgo/public-types/-/public-types-6.22.0.tgz", + "integrity": "sha512-FueZVrrAKfevkoC9/TtKQLq5S19PzKfsNSj+0uHt1rEoKJ5vS1Icf/M/8pIwYVR11Kn3mjWzqbYJrJUZI/3FHQ==", + "license": "UNLICENSED", + "dependencies": { + "fp-ts": "^2.0.0", + "io-ts": "npm:@bitgo-forks/io-ts@2.1.4", + "io-ts-types": "^0.5.16", + "monocle-ts": "^2.3.13", + "newtype-ts": "^0.3.5" + } + }, "node_modules/@bitgo-beta/sdk-core/node_modules/@noble/curves": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", @@ -14236,6 +14354,15 @@ "base-x": "^3.0.2" } }, + "node_modules/@bitgo-beta/sdk-core/node_modules/cbor-x": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.5.9.tgz", + "integrity": "sha512-OEI5rEu3MeR0WWNUXuIGkxmbXVhABP+VtgAXzm48c9ulkrsvxshjjk94XSOGphyAKeNGLPfAxxzEtgQ6rEVpYQ==", + "license": "MIT", + "optionalDependencies": { + "cbor-extract": "^2.2.0" + } + }, "node_modules/@bitgo-beta/sdk-core/node_modules/formidable": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", @@ -14253,6 +14380,12 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/@bitgo-beta/sdk-core/node_modules/fp-ts": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.2.tgz", + "integrity": "sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==", + "license": "MIT" + }, "node_modules/@bitgo-beta/sdk-core/node_modules/io-ts": { "name": "@bitgo-forks/io-ts", "version": "2.1.4", @@ -14335,18 +14468,18 @@ } }, "node_modules/@bitgo-beta/sdk-hmac": { - "version": "1.0.1-beta.1146", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-hmac/-/sdk-hmac-1.0.1-beta.1146.tgz", - "integrity": "sha512-vMTuo1dvLxyKpJHgS1UnK8CMOTBRSGmGx2sqiNR7U4cPcu9tD45bgsd2ZtunC6AUK7hcJOeZgeEmMbKsGQf7Bg==", + "version": "1.0.1-beta.1188", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-hmac/-/sdk-hmac-1.0.1-beta.1188.tgz", + "integrity": "sha512-MO4P+S251Ni0CAQGO/x+J0Wg5CJW1sIgbhNp+7e4wtju++HB13KxV4u2trcK84JdMfdOnxBhPC5GP+zoiplygQ==", "license": "MIT", "dependencies": { - "@bitgo-beta/sjcl": "1.0.2-beta.2018" + "@bitgo-beta/sjcl": "1.0.2-beta.2061" } }, "node_modules/@bitgo-beta/sdk-hmac/node_modules/@bitgo-beta/sjcl": { - "version": "1.0.2-beta.2018", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2018.tgz", - "integrity": "sha512-aAT/SyM+sUT55ZNHaKVw3wmY+S32pMPf7lCPevBQJbfjeFUSz3SxTRv9uydBci2fBRnF+StkBKn8jff/coHqOQ==", + "version": "1.0.2-beta.2061", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2061.tgz", + "integrity": "sha512-BDlMO+Opn6yJvpoFEHgg3+uzIAiB5wYHk1RTq/FiAmngGLPHOfRcP3piv9c3HnTEKo/K94ZOXPDtENvJ9HzHWA==", "license": "(BSD-2-Clause OR GPL-2.0-only)" }, "node_modules/@bitgo-beta/sdk-lib-mpc": { @@ -16417,9 +16550,9 @@ } }, "node_modules/@expo/cli/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "peer": true, "dependencies": { @@ -17831,9 +17964,10 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.0.tgz", - "integrity": "sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==", + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", + "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", + "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" @@ -24342,9 +24476,10 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abitype": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.1.1.tgz", - "integrity": "sha512-Loe5/6tAgsBukY95eGaPSDmQHIjRZYQq8PB1MpsNccDIK8WiV+Uw6WzaIXipvaxTEL2yEB0OpEaQv3gs8pkS9Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" }, @@ -26353,9 +26488,10 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -26434,12 +26570,12 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", - "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.6.tgz", + "integrity": "sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==", "license": "ISC", "dependencies": { - "bn.js": "^5.2.2", + "bn.js": "^5.2.3", "browserify-rsa": "^4.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", @@ -31723,9 +31859,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -32619,9 +32755,10 @@ } }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", "engines": { "node": ">= 12" } @@ -33292,9 +33429,10 @@ } }, "node_modules/jayson": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.2.0.tgz", - "integrity": "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.3.0.tgz", + "integrity": "sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==", + "license": "MIT", "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -35040,9 +35178,9 @@ "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "dev": true, "license": "MIT" }, @@ -36250,9 +36388,9 @@ } }, "node_modules/mocha": { - "version": "11.7.5", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", - "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "version": "11.7.6", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.6.tgz", + "integrity": "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==", "dev": true, "license": "MIT", "dependencies": { @@ -40318,15 +40456,16 @@ } }, "node_modules/ox": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.6.tgz", - "integrity": "sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==", + "version": "0.14.29", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.29.tgz", + "integrity": "sha512-M5j87Ec4V99MQdRct/g09eWXW60g6zhHTUs1lr4deUtrPDnezBdCJTgKd7pxqTpSZBFveV0ALi9jMMuT1qKyNg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", @@ -40334,7 +40473,7 @@ "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", - "abitype": "^1.0.9", + "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { @@ -40350,6 +40489,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" }, @@ -42314,9 +42454,9 @@ } }, "node_modules/rpc-websockets/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -43341,9 +43481,10 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -45760,24 +45901,25 @@ } }, "node_modules/viem": { - "version": "2.38.2", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.38.2.tgz", - "integrity": "sha512-MJDiTDD9gfOT7lPQRimdmw+g46hU/aWJ3loqb+tN6UBOO00XEd0O4LJx+Kp5/uCRnMlJr8zJ1bNzCK7eG6gMjg==", + "version": "2.52.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.52.2.tgz", + "integrity": "sha512-HSU12p5aD/kAPZfrlbCUqdiP4P/c6hQ9AhfTS51VbLUQIjkWd1d5EjrCx/SCxZ0zhZVRn4Iv5X5WDqXPG8Ubew==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", - "abitype": "1.1.0", + "abitype": "1.2.3", "isows": "1.0.7", - "ox": "0.9.6", - "ws": "8.18.3" + "ox": "0.14.29", + "ws": "8.20.1" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -45802,26 +45944,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/viem/node_modules/abitype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.1.0.tgz", - "integrity": "sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3.22.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/vlq": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", @@ -46213,9 +46335,9 @@ } }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 2a014720..8790480f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@bitgo-beta/abstract-cosmos": "1.0.1-beta.1741", "@bitgo-beta/abstract-eth": "1.0.2-beta.2004", "@bitgo-beta/abstract-utxo": "1.1.1-beta.2007", - "@bitgo-beta/sdk-api": "1.10.1-beta.1773", + "@bitgo-beta/sdk-api": "1.10.1-beta.1812", "@bitgo-beta/sdk-coin-ada": "2.3.14-beta.1758", "@bitgo-beta/sdk-coin-algo": "2.8.9-beta.238", "@bitgo-beta/sdk-coin-apt": "1.0.1-beta.1200", @@ -101,7 +101,7 @@ "@bitgo-beta/sdk-coin-zec": "1.1.1-beta.1984", "@bitgo-beta/sdk-coin-zeta": "1.0.1-beta.1675", "@bitgo-beta/sdk-coin-zketh": "1.0.1-beta.1540", - "@bitgo-beta/sdk-core": "8.2.1-beta.1775", + "@bitgo-beta/sdk-core": "8.2.1-beta.1815", "@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.1770", "@bitgo-beta/statics": "15.1.1-beta.1782", "@bitgo/wasm-miniscript": "2.0.0-beta.7", @@ -122,7 +122,7 @@ "zod": "^3.25.48" }, "overrides": { - "@bitgo-beta/sdk-core": "8.2.1-beta.1775", + "@bitgo-beta/sdk-core": "8.2.1-beta.1815", "@bitgo-beta/statics": "15.1.1-beta.1782", "elliptic": "^6.6.1", "expo": "^48.0.0", diff --git a/src/__tests__/api/master/generateWallet.test.ts b/src/__tests__/api/master/generateWallet.test.ts index 4f0619e2..459a24d2 100644 --- a/src/__tests__/api/master/generateWallet.test.ts +++ b/src/__tests__/api/master/generateWallet.test.ts @@ -64,6 +64,12 @@ describe('POST /api/v1/:coin/advancedwallet/generate', () => { const ecdsaCoin = 'hteth'; const accessToken = 'test-token'; + // Valid BIP32 extended public keys required by the SDK's isValidPub check + const validUserPub = + 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8'; + const validBackupPub = + 'xpub661MyMwAqRbcGczjuMoRm6dXaLDEhW1u34gKenbeYqAix21mdUKJyuyu5F1rzYGVxyL6tmgBUAEPrEz92mBXjByMRiJdba9wpnN37RLLAXa'; + let bitgo: BitGoAPI; function makeConfig(overrides: Partial = {}): MasterExpressConfig { @@ -132,7 +138,7 @@ describe('POST /api/v1/:coin/advancedwallet/generate', () => { source: 'user', }) .reply(200, { - pub: 'xpub_user', + pub: validUserPub, source: 'user', type: 'independent', }); @@ -143,33 +149,37 @@ describe('POST /api/v1/:coin/advancedwallet/generate', () => { source: 'backup', }) .reply(200, { - pub: 'xpub_backup', + pub: validBackupPub, source: 'backup', type: 'independent', }); const bitgoAddUserKeyNock = nock(bitgoApiUrl) .post(`/api/v2/${coin}/key`, { - pub: 'xpub_user', + pub: validUserPub, keyType: 'independent', source: 'user', }) .matchHeader('any', () => true) - .reply(200, { id: 'user-key-id', pub: 'xpub_user' }); + .reply(200, { id: 'user-key-id', pub: validUserPub, source: 'user', type: 'independent' }); const bitgoAddBackupKeyNock = nock(bitgoApiUrl) .post(`/api/v2/${coin}/key`, { - pub: 'xpub_backup', + pub: validBackupPub, keyType: 'independent', source: 'backup', }) .matchHeader('any', () => true) - .reply(200, { id: 'backup-key-id', pub: 'xpub_backup' }); + .reply(200, { + id: 'backup-key-id', + pub: validBackupPub, + source: 'backup', + type: 'independent', + }); const bitgoAddBitGoKeyNock = nock(bitgoApiUrl) .post(`/api/v2/${coin}/key`, { source: 'bitgo', - keyType: 'independent', enterprise: 'test_enterprise', }) .reply(200, { @@ -223,7 +233,7 @@ describe('POST /api/v1/:coin/advancedwallet/generate', () => { source: 'user', }) .reply(200, { - pub: 'xpub_user', + pub: validUserPub, source: 'user', type: 'independent', }); @@ -233,33 +243,37 @@ describe('POST /api/v1/:coin/advancedwallet/generate', () => { source: 'backup', }) .reply(200, { - pub: 'xpub_backup', + pub: validBackupPub, source: 'backup', type: 'independent', }); const bitgoAddUserKeyNock = nock(bitgoApiUrl) .post(`/api/v2/${coin}/key`, { - pub: 'xpub_user', + pub: validUserPub, keyType: 'independent', source: 'user', }) .matchHeader('any', () => true) - .reply(200, { id: 'user-key-id', pub: 'xpub_user' }); + .reply(200, { id: 'user-key-id', pub: validUserPub, source: 'user', type: 'independent' }); const bitgoAddBackupKeyNock = nock(bitgoApiUrl) .post(`/api/v2/${coin}/key`, { - pub: 'xpub_backup', + pub: validBackupPub, keyType: 'independent', source: 'backup', }) .matchHeader('any', () => true) - .reply(200, { id: 'backup-key-id', pub: 'xpub_backup' }); + .reply(200, { + id: 'backup-key-id', + pub: validBackupPub, + source: 'backup', + type: 'independent', + }); const bitgoAddBitGoKeyNock = nock(bitgoApiUrl) .post(`/api/v2/${coin}/key`, { source: 'bitgo', - keyType: 'independent', enterprise: 'test_enterprise', }) .reply(200, { @@ -276,8 +290,6 @@ describe('POST /api/v1/:coin/advancedwallet/generate', () => { .post(`/api/v2/${coin}/wallet/add`, { label: 'test_wallet', enterprise: 'test_enterprise', - multisigType: 'onchain', - coin: coin, m: 2, n: 3, keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'], @@ -319,8 +331,8 @@ describe('POST /api/v1/:coin/advancedwallet/generate', () => { multisigType: 'onchain', type: 'advanced', }); - response.body.should.have.propertyByPath('userKeychain', 'pub').eql('xpub_user'); - response.body.should.have.propertyByPath('backupKeychain', 'pub').eql('xpub_backup'); + response.body.should.have.propertyByPath('userKeychain', 'pub').eql(validUserPub); + response.body.should.have.propertyByPath('backupKeychain', 'pub').eql(validBackupPub); response.body.should.have.propertyByPath('bitgoKeychain', 'pub').eql('xpub_bitgo'); userKeychainNock.done(); diff --git a/src/advancedWalletManager/keyProviderClient/keyProviderClient.ts b/src/advancedWalletManager/keyProviderClient/keyProviderClient.ts index d944289a..5ac51884 100644 --- a/src/advancedWalletManager/keyProviderClient/keyProviderClient.ts +++ b/src/advancedWalletManager/keyProviderClient/keyProviderClient.ts @@ -77,8 +77,8 @@ export class KeyProviderClient extends BaseHttpClient { ); } - const { pub, coin, source } = response.body; - return { pub, coin, source } as PostKeyResponse; + const { pub, coin, source, type } = response.body; + return { pub, coin, source, type } as PostKeyResponse; } async getKey(params: GetKeyParams): Promise { diff --git a/src/masterBitgoExpress/handlers/handleGenerateWallet.ts b/src/masterBitgoExpress/handlers/handleGenerateWallet.ts index 360c1326..69a8c59e 100644 --- a/src/masterBitgoExpress/handlers/handleGenerateWallet.ts +++ b/src/masterBitgoExpress/handlers/handleGenerateWallet.ts @@ -1,8 +1,4 @@ import { - AddKeychainOptions, - Keychain, - KeychainsTriplet, - promiseProps, RequestTracer, SupplementGenerateWalletOptions, Wallet, @@ -16,6 +12,7 @@ import coinFactory from '../../shared/coinFactory'; import { BadRequestError } from '../../shared/errors'; import { KeySource } from '../../shared/types'; import { submitJobViaBridgeClient } from './utils/asyncUtils'; +import { createOnchainKeyGenCallback } from './walletGenerationCallbacks'; /** * Request handler for generating an advanced wallet. @@ -55,98 +52,18 @@ async function handleGenerateOnChainWallet( const bitgo = req.bitgo; const baseCoin = await coinFactory.getCoin(req.params.coin, bitgo); - // The awmClient is now available from the request - const awmClient = req.awmUserClient; - const awmBackupClient = req.awmBackupClient; + const createKeychainCallback = createOnchainKeyGenCallback( + req.awmUserClient, + req.awmBackupClient, + ); - const reqId = new RequestTracer(); - - const { label, enterprise } = req.decoded; - - // Create wallet parameters - const walletParams = { + const result = await baseCoin.wallets().generateWallet({ ...req.decoded, - label: label, - m: 2, - n: 3, - keys: [], - type: 'advanced', + type: 'advanced' as 'cold', multisigType: 'onchain', - } as SupplementGenerateWalletOptions; - - if (!_.isUndefined(enterprise)) { - if (!_.isString(enterprise)) { - throw new Error('invalid enterprise argument, expecting string'); - } - walletParams.enterprise = enterprise; - } - - const userKeychainPromise = async (): Promise => { - const userKeychain = await awmClient.createIndependentKeychain({ - source: 'user', - coin: req.params.coin, - type: 'independent', - }); - const userKeychainParams: AddKeychainOptions = { - pub: userKeychain.pub, - keyType: userKeychain.type, - source: userKeychain.source, - reqId, - }; - - const newUserKeychain = await baseCoin.keychains().add(userKeychainParams); - return _.extend({}, newUserKeychain, userKeychain); - }; - - const backupKeychainPromise = async (): Promise => { - const backupKeychain = await awmBackupClient.createIndependentKeychain({ - source: 'backup', - coin: req.params.coin, - type: 'independent', - }); - const backupKeychainParams: AddKeychainOptions = { - pub: backupKeychain.pub, - keyType: backupKeychain.type, - source: backupKeychain.source, - reqId, - }; - - const newBackupKeychain = await baseCoin.keychains().add(backupKeychainParams); - return _.extend({}, newBackupKeychain, backupKeychain); - }; - - const { userKeychain, backupKeychain, bitgoKeychain }: KeychainsTriplet = await promiseProps({ - userKeychain: userKeychainPromise(), - backupKeychain: backupKeychainPromise(), - bitgoKeychain: baseCoin.keychains().createBitGo({ - enterprise: req.decoded.enterprise, - keyType: 'independent', - reqId, - isDistributedCustody: req.decoded.isDistributedCustody, - }), + createKeychainCallback, }); - walletParams.keys = [userKeychain.id, backupKeychain.id, bitgoKeychain.id]; - - const keychains = { - userKeychain, - backupKeychain, - bitgoKeychain, - }; - - const finalWalletParams = await baseCoin.supplementGenerateWallet(walletParams, keychains); - - bitgo.setRequestTracer(reqId); - const newWallet = await bitgo.post(baseCoin.url('/wallet/add')).send(finalWalletParams).result(); - - const result: WalletWithKeychains = { - wallet: new Wallet(bitgo, baseCoin, newWallet), - userKeychain: userKeychain, - backupKeychain: backupKeychain, - bitgoKeychain: bitgoKeychain, - responseType: 'WalletWithKeychains', - }; - return { ...result, wallet: result.wallet.toJSON() }; } diff --git a/src/masterBitgoExpress/handlers/walletGenerationCallbacks.ts b/src/masterBitgoExpress/handlers/walletGenerationCallbacks.ts new file mode 100644 index 00000000..9dd0e9c8 --- /dev/null +++ b/src/masterBitgoExpress/handlers/walletGenerationCallbacks.ts @@ -0,0 +1,13 @@ +import { CreateKeychainCallback } from '@bitgo-beta/sdk-core'; +import { AdvancedWalletManagerClient } from '../clients/advancedWalletManagerClient'; + +export function createOnchainKeyGenCallback( + awmUserClient: AdvancedWalletManagerClient, + awmBackupClient: AdvancedWalletManagerClient, +): CreateKeychainCallback { + return async ({ source, coin }) => { + const client = source === 'user' ? awmUserClient : awmBackupClient; + const keychain = await client.createIndependentKeychain({ source, coin, type: 'independent' }); + return keychain as { pub: string; type: 'independent'; source: typeof source }; + }; +} From 963a0a8ad43ce3e27174ece338e48aba28b1aa00 Mon Sep 17 00:00:00 2001 From: Daniel Peng Date: Fri, 12 Jun 2026 09:32:54 -0400 Subject: [PATCH 2/2] refactor: update and test wallet generation callback Ticket: WCN-684 --- package-lock.json | 153 +++++++++--------- package.json | 6 +- .../master/walletGenerationCallbacks.test.ts | 153 ++++++++++++++++++ .../handlers/handleGenerateWallet.ts | 2 +- .../handlers/walletGenerationCallbacks.ts | 11 +- 5 files changed, 244 insertions(+), 81 deletions(-) create mode 100644 src/__tests__/api/master/walletGenerationCallbacks.test.ts diff --git a/package-lock.json b/package-lock.json index b8351c28..ebcb1ffb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@bitgo-beta/abstract-cosmos": "1.0.1-beta.1741", "@bitgo-beta/abstract-eth": "1.0.2-beta.2004", "@bitgo-beta/abstract-utxo": "1.1.1-beta.2007", - "@bitgo-beta/sdk-api": "1.10.1-beta.1812", + "@bitgo-beta/sdk-api": "1.10.1-beta.1816", "@bitgo-beta/sdk-coin-ada": "2.3.14-beta.1758", "@bitgo-beta/sdk-coin-algo": "2.8.9-beta.238", "@bitgo-beta/sdk-coin-apt": "1.0.1-beta.1200", @@ -84,7 +84,7 @@ "@bitgo-beta/sdk-coin-zec": "1.1.1-beta.1984", "@bitgo-beta/sdk-coin-zeta": "1.0.1-beta.1675", "@bitgo-beta/sdk-coin-zketh": "1.0.1-beta.1540", - "@bitgo-beta/sdk-core": "8.2.1-beta.1815", + "@bitgo-beta/sdk-core": "8.2.1-beta.1820", "@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.1770", "@bitgo-beta/statics": "15.1.1-beta.1782", "@bitgo/wasm-miniscript": "2.0.0-beta.7", @@ -3497,9 +3497,9 @@ } }, "node_modules/@bitgo-beta/argon2": { - "version": "0.0.1-beta.127", - "resolved": "https://registry.npmjs.org/@bitgo-beta/argon2/-/argon2-0.0.1-beta.127.tgz", - "integrity": "sha512-C4UZUKnfRRhRhqt0fJNvpsoz1cSM4Q8eBjvVJzM0FzqrRM47C00coCT+XbUeEECGqYpp4rDKWjqVdnPJW6WKKA==", + "version": "0.0.1-beta.133", + "resolved": "https://registry.npmjs.org/@bitgo-beta/argon2/-/argon2-0.0.1-beta.133.tgz", + "integrity": "sha512-LmBbUMg8ckF2Yzr7Oc0t8zYo/glif+ShKjANWBPJTzo1lnsVGIYKU4u56Oo4l6mMsRnv5TYp2JKej8P0ASOoFQ==", "license": "MIT" }, "node_modules/@bitgo-beta/blake2b": { @@ -3704,17 +3704,17 @@ "license": "MIT" }, "node_modules/@bitgo-beta/sdk-api": { - "version": "1.10.1-beta.1812", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-api/-/sdk-api-1.10.1-beta.1812.tgz", - "integrity": "sha512-TaHnb3WsqBbPTLVM9y0MEkukEY/OyEnxMnA20cLGdUe5z8ueWrtJGdwHWiq9XexnQZqj7bVF7ECnXZ6+7+rbbg==", + "version": "1.10.1-beta.1816", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-api/-/sdk-api-1.10.1-beta.1816.tgz", + "integrity": "sha512-akQVxN2ekSL0fiMmX7QOQ20vVUF5OnvjvPNGmHepaS5uYiIRY3Ya9tLcESZJsexgXCnYOepgdOeucNMzJ9esIQ==", "license": "MIT", "dependencies": { - "@bitgo-beta/argon2": "0.0.1-beta.127", - "@bitgo-beta/sdk-core": "8.2.1-beta.1815", - "@bitgo-beta/sdk-hmac": "1.0.1-beta.1188", - "@bitgo-beta/sjcl": "1.0.2-beta.2061", - "@bitgo-beta/unspents": "0.13.2-beta.1816", - "@bitgo-beta/utxo-lib": "8.0.3-beta.1817", + "@bitgo-beta/argon2": "0.0.1-beta.133", + "@bitgo-beta/sdk-core": "8.2.1-beta.1820", + "@bitgo-beta/sdk-hmac": "1.0.1-beta.1194", + "@bitgo-beta/sjcl": "1.0.2-beta.2067", + "@bitgo-beta/unspents": "0.13.2-beta.1822", + "@bitgo-beta/utxo-lib": "8.0.3-beta.1823", "@types/superagent": "4.1.15", "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.3", "debug": "3.1.0", @@ -3729,19 +3729,19 @@ } }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/blake2b": { - "version": "3.0.4-beta.2054", - "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2054.tgz", - "integrity": "sha512-Ayasxw96MlDC1wTd79oWZ5JtCKqdtaU6tzmZTzPLc0j+J3ym+LKdnywyoruUvarxWsuvTcb2t8gm0DF2X7J29w==", + "version": "3.0.4-beta.2060", + "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2060.tgz", + "integrity": "sha512-Mg5DV49GJc9hhZw18p6yl63WKMEXAdl2FXvdEEWu+k0DcJBs6ttnKCSW4x5KIwGxhOHBl1GFLDUbrkyt9az7tw==", "license": "ISC", "dependencies": { - "@bitgo-beta/blake2b-wasm": "3.0.4-beta.2060", + "@bitgo-beta/blake2b-wasm": "3.0.4-beta.2066", "nanoassert": "^2.0.0" } }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/blake2b-wasm": { - "version": "3.0.4-beta.2060", - "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b-wasm/-/blake2b-wasm-3.0.4-beta.2060.tgz", - "integrity": "sha512-WrmQ8z+8xKVp2Pj8IVr11cw8lQWwEBUTRTx1waXWPuPYH1ziDh9IfvZXa9YOGsbBN1QrVZ6tygYDktYHmyeUNQ==", + "version": "3.0.4-beta.2066", + "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b-wasm/-/blake2b-wasm-3.0.4-beta.2066.tgz", + "integrity": "sha512-ax51H+PgMEvkHFEm2+2DO7WQMa6pZ6bYKAfLBweK9+ep20Zc9yqC2Q5vGp6KSb/Wfsmy+5Q4m+mjZ0VpxExorQ==", "license": "MIT", "dependencies": { "nanoassert": "^1.0.0" @@ -3754,9 +3754,9 @@ "license": "ISC" }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/secp256k1": { - "version": "1.0.2-beta.1848", - "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1848.tgz", - "integrity": "sha512-Qv/OuAubHTUrhbr5uPmS4HMcFMtIhOvSql2pcNxC6ffyEHOe4e5h+M0KtGqmM7GIak3D4uJW771BtYFg5KBhDA==", + "version": "1.0.2-beta.1854", + "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1854.tgz", + "integrity": "sha512-O9zK2+q49UmCjcySL+2PxJRc991PjPxKfVkCnh8LOsqZqWoOk3fD0rZ1ll6bV3hP8ysKuhPWhLGxEjZg183Deg==", "license": "MIT", "dependencies": { "@brandonblack/musig": "^0.0.1-alpha.0", @@ -3774,31 +3774,31 @@ } }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/sjcl": { - "version": "1.0.2-beta.2061", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2061.tgz", - "integrity": "sha512-BDlMO+Opn6yJvpoFEHgg3+uzIAiB5wYHk1RTq/FiAmngGLPHOfRcP3piv9c3HnTEKo/K94ZOXPDtENvJ9HzHWA==", + "version": "1.0.2-beta.2067", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2067.tgz", + "integrity": "sha512-auqcY6SNUK1TbAwPs7UA/q8pfc/r4G1AwfSmRNBsy/mfig1wgtYOsfed/yfwo7s/5/+XCmaNo4yGMG3LDd7g2A==", "license": "(BSD-2-Clause OR GPL-2.0-only)" }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/unspents": { - "version": "0.13.2-beta.1816", - "resolved": "https://registry.npmjs.org/@bitgo-beta/unspents/-/unspents-0.13.2-beta.1816.tgz", - "integrity": "sha512-1UEe7OANugTcey04Ka3WYBcft9x8fUNjHp/v0eFUu1tZe51yr/Ilg2dMAc8ahmv7ry5gGrmjQ9DBL4c6JEcIuQ==", + "version": "0.13.2-beta.1822", + "resolved": "https://registry.npmjs.org/@bitgo-beta/unspents/-/unspents-0.13.2-beta.1822.tgz", + "integrity": "sha512-2TG5XoSTHegSMzW5avTPZzEBOM1iXq3d2BRZKiCq9k05KdEcgfsAFucAvIw1RknjBuCMjC8pMwZpI2XcF/iWTw==", "license": "Apache-2.0", "dependencies": { - "@bitgo-beta/utxo-lib": "8.0.3-beta.1817", + "@bitgo-beta/utxo-lib": "8.0.3-beta.1823", "lodash": "^4.18.0", "tcomb": "~3.2.29", "varuint-bitcoin": "^1.0.4" } }, "node_modules/@bitgo-beta/sdk-api/node_modules/@bitgo-beta/utxo-lib": { - "version": "8.0.3-beta.1817", - "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1817.tgz", - "integrity": "sha512-aHhOBd26mpCi8+oOW14KUY24o3wGBcdr+N/tJBx5eOBXSFUucUsu6nd2cYzbwlZ4EC7UXgyS5NUdXiLXrV/IWA==", + "version": "8.0.3-beta.1823", + "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1823.tgz", + "integrity": "sha512-77G621iNPuMmaIO4S3+45ggoLUKKvis7+86h/avM8Iy/GVXc4kzuIWoz26winCwmC3W7iq1aVOH3ogHR+7wUGQ==", "license": "MIT", "dependencies": { - "@bitgo-beta/blake2b": "3.0.4-beta.2054", - "@bitgo-beta/secp256k1": "1.0.2-beta.1848", + "@bitgo-beta/blake2b": "3.0.4-beta.2060", + "@bitgo-beta/secp256k1": "1.0.2-beta.1854", "@brandonblack/musig": "^0.0.1-alpha.0", "bech32": "^2.0.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", @@ -14143,16 +14143,16 @@ } }, "node_modules/@bitgo-beta/sdk-core": { - "version": "8.2.1-beta.1815", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-core/-/sdk-core-8.2.1-beta.1815.tgz", - "integrity": "sha512-0VRwvCFJrBisdepC2HB7vQymkXb1pLBLrYo3DVSEk0bq7Br9klEvHSv7YmFxh+6xmvrnh2ZaVK6HoKRGcdlrqA==", + "version": "8.2.1-beta.1820", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-core/-/sdk-core-8.2.1-beta.1820.tgz", + "integrity": "sha512-8NksKkiFjgKjctYcbYiIuqo5Sw5JHB+MoiIpLndxKbkX/XIyAoGgneJrkKFhrV+qjp8EQzcdIJh4FXx5kiCUmQ==", "license": "MIT", "dependencies": { - "@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.1811", - "@bitgo-beta/secp256k1": "1.0.2-beta.1848", - "@bitgo-beta/sjcl": "1.0.2-beta.2061", - "@bitgo-beta/statics": "15.1.1-beta.1825", - "@bitgo-beta/utxo-lib": "8.0.3-beta.1817", + "@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.1817", + "@bitgo-beta/secp256k1": "1.0.2-beta.1854", + "@bitgo-beta/sjcl": "1.0.2-beta.2067", + "@bitgo-beta/statics": "15.1.1-beta.1831", + "@bitgo-beta/utxo-lib": "8.0.3-beta.1823", "@bitgo/public-types": "6.22.0", "@noble/curves": "1.8.1", "@stablelib/hex": "^1.0.0", @@ -14181,19 +14181,19 @@ } }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/blake2b": { - "version": "3.0.4-beta.2054", - "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2054.tgz", - "integrity": "sha512-Ayasxw96MlDC1wTd79oWZ5JtCKqdtaU6tzmZTzPLc0j+J3ym+LKdnywyoruUvarxWsuvTcb2t8gm0DF2X7J29w==", + "version": "3.0.4-beta.2060", + "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b/-/blake2b-3.0.4-beta.2060.tgz", + "integrity": "sha512-Mg5DV49GJc9hhZw18p6yl63WKMEXAdl2FXvdEEWu+k0DcJBs6ttnKCSW4x5KIwGxhOHBl1GFLDUbrkyt9az7tw==", "license": "ISC", "dependencies": { - "@bitgo-beta/blake2b-wasm": "3.0.4-beta.2060", + "@bitgo-beta/blake2b-wasm": "3.0.4-beta.2066", "nanoassert": "^2.0.0" } }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/blake2b-wasm": { - "version": "3.0.4-beta.2060", - "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b-wasm/-/blake2b-wasm-3.0.4-beta.2060.tgz", - "integrity": "sha512-WrmQ8z+8xKVp2Pj8IVr11cw8lQWwEBUTRTx1waXWPuPYH1ziDh9IfvZXa9YOGsbBN1QrVZ6tygYDktYHmyeUNQ==", + "version": "3.0.4-beta.2066", + "resolved": "https://registry.npmjs.org/@bitgo-beta/blake2b-wasm/-/blake2b-wasm-3.0.4-beta.2066.tgz", + "integrity": "sha512-ax51H+PgMEvkHFEm2+2DO7WQMa6pZ6bYKAfLBweK9+ep20Zc9yqC2Q5vGp6KSb/Wfsmy+5Q4m+mjZ0VpxExorQ==", "license": "MIT", "dependencies": { "nanoassert": "^1.0.0" @@ -14206,9 +14206,9 @@ "license": "ISC" }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/sdk-lib-mpc": { - "version": "8.2.0-beta.1811", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-lib-mpc/-/sdk-lib-mpc-8.2.0-beta.1811.tgz", - "integrity": "sha512-Y3mycCnnAArDxikvoECceI/KnUXZCLnvXxaZfoTs5F2GH9KJeEvArtPYvunesXLJmjf1OTTe5VY2JDvhSeEdEA==", + "version": "8.2.0-beta.1817", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-lib-mpc/-/sdk-lib-mpc-8.2.0-beta.1817.tgz", + "integrity": "sha512-o7vosgAaVUDbZuxKt/LuK0ARgig+ZGOHZXtFNSDnsSvXHoKdXO9CC7XQw+vZ2KPhC15Rq3pTXiTSJX2SfimF6w==", "license": "MIT", "dependencies": { "@bitgo/wasm-mps": "1.8.1", @@ -14237,9 +14237,9 @@ } }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/secp256k1": { - "version": "1.0.2-beta.1848", - "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1848.tgz", - "integrity": "sha512-Qv/OuAubHTUrhbr5uPmS4HMcFMtIhOvSql2pcNxC6ffyEHOe4e5h+M0KtGqmM7GIak3D4uJW771BtYFg5KBhDA==", + "version": "1.0.2-beta.1854", + "resolved": "https://registry.npmjs.org/@bitgo-beta/secp256k1/-/secp256k1-1.0.2-beta.1854.tgz", + "integrity": "sha512-O9zK2+q49UmCjcySL+2PxJRc991PjPxKfVkCnh8LOsqZqWoOk3fD0rZ1ll6bV3hP8ysKuhPWhLGxEjZg183Deg==", "license": "MIT", "dependencies": { "@brandonblack/musig": "^0.0.1-alpha.0", @@ -14257,19 +14257,19 @@ } }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/sjcl": { - "version": "1.0.2-beta.2061", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2061.tgz", - "integrity": "sha512-BDlMO+Opn6yJvpoFEHgg3+uzIAiB5wYHk1RTq/FiAmngGLPHOfRcP3piv9c3HnTEKo/K94ZOXPDtENvJ9HzHWA==", + "version": "1.0.2-beta.2067", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2067.tgz", + "integrity": "sha512-auqcY6SNUK1TbAwPs7UA/q8pfc/r4G1AwfSmRNBsy/mfig1wgtYOsfed/yfwo7s/5/+XCmaNo4yGMG3LDd7g2A==", "license": "(BSD-2-Clause OR GPL-2.0-only)" }, "node_modules/@bitgo-beta/sdk-core/node_modules/@bitgo-beta/utxo-lib": { - "version": "8.0.3-beta.1817", - "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1817.tgz", - "integrity": "sha512-aHhOBd26mpCi8+oOW14KUY24o3wGBcdr+N/tJBx5eOBXSFUucUsu6nd2cYzbwlZ4EC7UXgyS5NUdXiLXrV/IWA==", + "version": "8.0.3-beta.1823", + "resolved": "https://registry.npmjs.org/@bitgo-beta/utxo-lib/-/utxo-lib-8.0.3-beta.1823.tgz", + "integrity": "sha512-77G621iNPuMmaIO4S3+45ggoLUKKvis7+86h/avM8Iy/GVXc4kzuIWoz26winCwmC3W7iq1aVOH3ogHR+7wUGQ==", "license": "MIT", "dependencies": { - "@bitgo-beta/blake2b": "3.0.4-beta.2054", - "@bitgo-beta/secp256k1": "1.0.2-beta.1848", + "@bitgo-beta/blake2b": "3.0.4-beta.2060", + "@bitgo-beta/secp256k1": "1.0.2-beta.1854", "@brandonblack/musig": "^0.0.1-alpha.0", "bech32": "^2.0.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", @@ -14468,18 +14468,18 @@ } }, "node_modules/@bitgo-beta/sdk-hmac": { - "version": "1.0.1-beta.1188", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-hmac/-/sdk-hmac-1.0.1-beta.1188.tgz", - "integrity": "sha512-MO4P+S251Ni0CAQGO/x+J0Wg5CJW1sIgbhNp+7e4wtju++HB13KxV4u2trcK84JdMfdOnxBhPC5GP+zoiplygQ==", + "version": "1.0.1-beta.1194", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sdk-hmac/-/sdk-hmac-1.0.1-beta.1194.tgz", + "integrity": "sha512-EsN2KNb17ZEFRxqZS8POn1OFYrPT0FrD7oJKFMMdQYpH59efAI29oq19MHvosVFB3MUeQ7CxuJtZIz8qyX42kQ==", "license": "MIT", "dependencies": { - "@bitgo-beta/sjcl": "1.0.2-beta.2061" + "@bitgo-beta/sjcl": "1.0.2-beta.2067" } }, "node_modules/@bitgo-beta/sdk-hmac/node_modules/@bitgo-beta/sjcl": { - "version": "1.0.2-beta.2061", - "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2061.tgz", - "integrity": "sha512-BDlMO+Opn6yJvpoFEHgg3+uzIAiB5wYHk1RTq/FiAmngGLPHOfRcP3piv9c3HnTEKo/K94ZOXPDtENvJ9HzHWA==", + "version": "1.0.2-beta.2067", + "resolved": "https://registry.npmjs.org/@bitgo-beta/sjcl/-/sjcl-1.0.2-beta.2067.tgz", + "integrity": "sha512-auqcY6SNUK1TbAwPs7UA/q8pfc/r4G1AwfSmRNBsy/mfig1wgtYOsfed/yfwo7s/5/+XCmaNo4yGMG3LDd7g2A==", "license": "(BSD-2-Clause OR GPL-2.0-only)" }, "node_modules/@bitgo-beta/sdk-lib-mpc": { @@ -34720,9 +34720,10 @@ } }, "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "version": "17.13.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.4.tgz", + "integrity": "sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -36969,7 +36970,7 @@ "version": "0.7.2", "resolved": "https://registry.npmjs.org/noble-bls12-381/-/noble-bls12-381-0.7.2.tgz", "integrity": "sha512-Z5isbU6opuWPL3dxsGqO5BdOE8WP1XUM7HFIn/xeE5pATTnml/PEIy4MFQQrktHiitkuJdsCDtzEOnS9eIpC3Q==", - "deprecated": "Switch to @noble/curves for security updates", + "deprecated": "Switch to \"@noble/curves\" for security updates", "license": "MIT" }, "node_modules/nock": { diff --git a/package.json b/package.json index 8790480f..c31fae82 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@bitgo-beta/abstract-cosmos": "1.0.1-beta.1741", "@bitgo-beta/abstract-eth": "1.0.2-beta.2004", "@bitgo-beta/abstract-utxo": "1.1.1-beta.2007", - "@bitgo-beta/sdk-api": "1.10.1-beta.1812", + "@bitgo-beta/sdk-api": "1.10.1-beta.1816", "@bitgo-beta/sdk-coin-ada": "2.3.14-beta.1758", "@bitgo-beta/sdk-coin-algo": "2.8.9-beta.238", "@bitgo-beta/sdk-coin-apt": "1.0.1-beta.1200", @@ -101,7 +101,7 @@ "@bitgo-beta/sdk-coin-zec": "1.1.1-beta.1984", "@bitgo-beta/sdk-coin-zeta": "1.0.1-beta.1675", "@bitgo-beta/sdk-coin-zketh": "1.0.1-beta.1540", - "@bitgo-beta/sdk-core": "8.2.1-beta.1815", + "@bitgo-beta/sdk-core": "8.2.1-beta.1820", "@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.1770", "@bitgo-beta/statics": "15.1.1-beta.1782", "@bitgo/wasm-miniscript": "2.0.0-beta.7", @@ -122,7 +122,7 @@ "zod": "^3.25.48" }, "overrides": { - "@bitgo-beta/sdk-core": "8.2.1-beta.1815", + "@bitgo-beta/sdk-core": "8.2.1-beta.1820", "@bitgo-beta/statics": "15.1.1-beta.1782", "elliptic": "^6.6.1", "expo": "^48.0.0", diff --git a/src/__tests__/api/master/walletGenerationCallbacks.test.ts b/src/__tests__/api/master/walletGenerationCallbacks.test.ts new file mode 100644 index 00000000..5f81aaca --- /dev/null +++ b/src/__tests__/api/master/walletGenerationCallbacks.test.ts @@ -0,0 +1,153 @@ +import 'should'; +import assert from 'assert'; +import nock from 'nock'; +import { + createAwmBackupClient, + createAwmClient, + AdvancedWalletManagerClient, +} from '../../../masterBitgoExpress/clients/advancedWalletManagerClient'; +import { createOnchainKeyGenCallback } from '../../../masterBitgoExpress/handlers/walletGenerationCallbacks'; +import { AppMode, KeySource, MasterExpressConfig, TlsMode } from '../../../shared/types'; +import { DEFAULT_ASYNC_MODE_CONFIG } from './testUtils'; + +describe('walletGenerationCallbacks', () => { + const advancedWalletManagerUrl = 'http://advancedwalletmanager.invalid'; + const backupAwmUrl = 'http://backup-awm.invalid'; + const coin = 'tbtc'; + + // Valid BIP32 extended public keys required by the SDK's isValidPub check + const validUserPub = + 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8'; + const validBackupPub = + 'xpub661MyMwAqRbcGczjuMoRm6dXaLDEhW1u34gKenbeYqAix21mdUKJyuyu5F1rzYGVxyL6tmgBUAEPrEz92mBXjByMRiJdba9wpnN37RLLAXa'; + + let awmUserClient: AdvancedWalletManagerClient; + let awmBackupClient: AdvancedWalletManagerClient; + + function makeConfig(overrides: Partial = {}): MasterExpressConfig { + return { + appMode: AppMode.MASTER_EXPRESS, + port: 0, + bind: 'localhost', + timeout: 60000, + httpLoggerFile: '', + env: 'test', + disableEnvCheck: true, + authVersion: 2, + advancedWalletManagerUrl, + awmServerCaCert: 'dummy-cert', + tlsMode: TlsMode.DISABLED, + clientCertAllowSelfSigned: true, + asyncModeConfig: DEFAULT_ASYNC_MODE_CONFIG, + ...overrides, + }; + } + + before(() => { + nock.disableNetConnect(); + }); + + afterEach(() => { + nock.cleanAll(); + }); + + after(() => { + nock.enableNetConnect(); + }); + + describe('createOnchainKeyGenCallback', () => { + describe('with separate backup AWM (separate-HSM mode)', () => { + beforeEach(() => { + const config = makeConfig({ advancedWalletManagerBackupUrl: backupAwmUrl }); + awmUserClient = createAwmClient(config, coin)!; + awmBackupClient = createAwmBackupClient(config, coin)!; + assert(awmUserClient); + assert(awmBackupClient); + }); + + it('should route user source to the primary AWM client', async () => { + const userKeychainNock = nock(advancedWalletManagerUrl) + .post(`/api/${coin}/key/independent`, { + source: KeySource.USER, + }) + .reply(200, { + pub: validUserPub, + source: KeySource.USER, + type: 'independent', + }); + + const callback = createOnchainKeyGenCallback(awmUserClient, awmBackupClient); + const result = await callback({ source: KeySource.USER, coin }); + + result.pub.should.equal(validUserPub); + result.source.should.equal(KeySource.USER); + result.type.should.equal('independent'); + userKeychainNock.done(); + }); + + it('should route backup source to the backup AWM client', async () => { + const backupKeychainNock = nock(backupAwmUrl) + .post(`/api/${coin}/key/independent`, { + source: KeySource.BACKUP, + }) + .reply(200, { + pub: validBackupPub, + source: KeySource.BACKUP, + type: 'independent', + }); + + const callback = createOnchainKeyGenCallback(awmUserClient, awmBackupClient); + const result = await callback({ source: KeySource.BACKUP, coin }); + + result.pub.should.equal(validBackupPub); + result.source.should.equal(KeySource.BACKUP); + result.type.should.equal('independent'); + backupKeychainNock.done(); + }); + }); + + describe('without separate backup AWM (same-HSM mode)', () => { + beforeEach(() => { + const config = makeConfig(); + awmUserClient = createAwmClient(config, coin)!; + awmBackupClient = createAwmBackupClient(config, coin) ?? awmUserClient; + assert(awmUserClient); + }); + + it('should route backup source to the primary AWM client', async () => { + const backupKeychainNock = nock(advancedWalletManagerUrl) + .post(`/api/${coin}/key/independent`, { + source: KeySource.BACKUP, + }) + .reply(200, { + pub: validBackupPub, + source: KeySource.BACKUP, + type: 'independent', + }); + + const callback = createOnchainKeyGenCallback(awmUserClient, awmBackupClient); + const result = await callback({ source: KeySource.BACKUP, coin }); + + result.pub.should.equal(validBackupPub); + result.source.should.equal(KeySource.BACKUP); + result.type.should.equal('independent'); + backupKeychainNock.done(); + }); + }); + + it('should throw for unexpected key sources', async () => { + const config = makeConfig({ advancedWalletManagerBackupUrl: backupAwmUrl }); + awmUserClient = createAwmClient(config, coin)!; + awmBackupClient = createAwmBackupClient(config, coin)!; + assert(awmUserClient); + assert(awmBackupClient); + + const callback = createOnchainKeyGenCallback(awmUserClient, awmBackupClient); + + await callback({ + source: KeySource.BITGO as 'user', + coin, + }).should.be.rejectedWith('Unexpected key source for onchain key generation: bitgo'); + }); + }); +}); diff --git a/src/masterBitgoExpress/handlers/handleGenerateWallet.ts b/src/masterBitgoExpress/handlers/handleGenerateWallet.ts index 69a8c59e..da6d866c 100644 --- a/src/masterBitgoExpress/handlers/handleGenerateWallet.ts +++ b/src/masterBitgoExpress/handlers/handleGenerateWallet.ts @@ -59,7 +59,7 @@ async function handleGenerateOnChainWallet( const result = await baseCoin.wallets().generateWallet({ ...req.decoded, - type: 'advanced' as 'cold', + type: 'advanced', multisigType: 'onchain', createKeychainCallback, }); diff --git a/src/masterBitgoExpress/handlers/walletGenerationCallbacks.ts b/src/masterBitgoExpress/handlers/walletGenerationCallbacks.ts index 9dd0e9c8..94a2faaf 100644 --- a/src/masterBitgoExpress/handlers/walletGenerationCallbacks.ts +++ b/src/masterBitgoExpress/handlers/walletGenerationCallbacks.ts @@ -1,4 +1,5 @@ import { CreateKeychainCallback } from '@bitgo-beta/sdk-core'; +import { KeySource } from '../../shared/types'; import { AdvancedWalletManagerClient } from '../clients/advancedWalletManagerClient'; export function createOnchainKeyGenCallback( @@ -6,7 +7,15 @@ export function createOnchainKeyGenCallback( awmBackupClient: AdvancedWalletManagerClient, ): CreateKeychainCallback { return async ({ source, coin }) => { - const client = source === 'user' ? awmUserClient : awmBackupClient; + let client: AdvancedWalletManagerClient; + if (source === KeySource.USER) { + client = awmUserClient; + } else if (source === KeySource.BACKUP) { + client = awmBackupClient; + } else { + throw new Error(`Unexpected key source for onchain key generation: ${source}`); + } + const keychain = await client.createIndependentKeychain({ source, coin, type: 'independent' }); return keychain as { pub: string; type: 'independent'; source: typeof source }; };