diff --git a/catalog-info.yaml b/catalog-info.yaml new file mode 100644 index 0000000000..485b94acc8 --- /dev/null +++ b/catalog-info.yaml @@ -0,0 +1,15 @@ +# Backstage catalog descriptor. Update this file to enrich your service's entry in the developer portal. +# Full field reference: https://backstage.io/docs/features/software-catalog/descriptor-format/ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: BitGoJS + annotations: + github.com/project-slug: BitGo/BitGoJS +spec: + # The primary purpose of this component. If this repo serves multiple purposes + # (e.g. both a deployable service and a published library), set this to whichever + # role is most significant. Valid values: service, library, website, documentation, other. + type: other + lifecycle: production + owner: group:coins diff --git a/modules/abstract-utxo/package.json b/modules/abstract-utxo/package.json index 3208f0e785..aeb240e4d5 100644 --- a/modules/abstract-utxo/package.json +++ b/modules/abstract-utxo/package.json @@ -67,7 +67,7 @@ "@bitgo/utxo-descriptors": "^1.3.1", "@bitgo/utxo-lib": "^11.23.0", "@bitgo/utxo-ord": "^1.32.1", - "@bitgo/wasm-utxo": "^4.14.1", + "@bitgo/wasm-utxo": "^4.16.0", "@types/lodash": "^4.14.121", "@types/superagent": "4.1.15", "bignumber.js": "^9.0.2", diff --git a/modules/express/src/clientRoutes.ts b/modules/express/src/clientRoutes.ts index c57235067a..e746474b7b 100755 --- a/modules/express/src/clientRoutes.ts +++ b/modules/express/src/clientRoutes.ts @@ -8,6 +8,9 @@ import { CustomCommitmentGeneratingFunction, CustomGShareGeneratingFunction, CustomKShareGeneratingFunction, + CustomEddsaMPCv2SigningRound1GeneratingFunction, + CustomEddsaMPCv2SigningRound2GeneratingFunction, + CustomEddsaMPCv2SigningRound3GeneratingFunction, CustomMPCv2SigningRound1GeneratingFunction, CustomMPCv2SigningRound2GeneratingFunction, CustomMPCv2SigningRound3GeneratingFunction, @@ -17,6 +20,7 @@ import { CustomSShareGeneratingFunction, EcdsaMPCv2Utils, EcdsaUtils, + EddsaMPCv2Utils, EddsaUtils, EncryptedSignerShareRecord, encryptRsaWithAesGcm, @@ -455,18 +459,41 @@ export async function handleV2GenerateShareTSS( req.body.walletPassphrase = walletPw; try { if (coin.getMPCAlgorithm() === MPCType.EDDSA) { - const eddsaUtils = new EddsaUtils(bitgo, coin); - switch (req.decoded.sharetype) { - case ShareType.Commitment: - return await eddsaUtils.createCommitmentShareFromTxRequest(req.body); - case ShareType.R: - return await eddsaUtils.createRShareFromTxRequest(req.body); - case ShareType.G: - return await eddsaUtils.createGShareFromTxRequest(req.body); - default: - throw new Error( - `Share type ${req.decoded.sharetype} not supported, only commitment, G and R share generation is supported.` - ); + const isMPCv2 = + [ + ShareType.EddsaMPCv2Round1.toString(), + ShareType.EddsaMPCv2Round2.toString(), + ShareType.EddsaMPCv2Round3.toString(), + ].includes(req.decoded.sharetype) || req.decoded.sharetype.startsWith('EddsaMPCv2'); + + if (isMPCv2) { + const eddsaMPCv2Utils = new EddsaMPCv2Utils(bitgo, coin); + switch (req.decoded.sharetype) { + case ShareType.EddsaMPCv2Round1: + return await eddsaMPCv2Utils.createOfflineRound1Share(req.body); + case ShareType.EddsaMPCv2Round2: + return await eddsaMPCv2Utils.createOfflineRound2Share(req.body); + case ShareType.EddsaMPCv2Round3: + return await eddsaMPCv2Utils.createOfflineRound3Share(req.body); + default: + throw new Error( + `Share type ${req.decoded.sharetype} not supported for EdDSA MPCv2, only EddsaMPCv2Round1, EddsaMPCv2Round2 and EddsaMPCv2Round3 is supported.` + ); + } + } else { + const eddsaUtils = new EddsaUtils(bitgo, coin); + switch (req.decoded.sharetype) { + case ShareType.Commitment: + return await eddsaUtils.createCommitmentShareFromTxRequest(req.body); + case ShareType.R: + return await eddsaUtils.createRShareFromTxRequest(req.body); + case ShareType.G: + return await eddsaUtils.createGShareFromTxRequest(req.body); + default: + throw new Error( + `Share type ${req.decoded.sharetype} not supported, only commitment, G and R share generation is supported.` + ); + } } } else if (coin.getMPCAlgorithm() === MPCType.ECDSA) { const isMPCv2 = [ @@ -895,15 +922,33 @@ function createTSSSendParams(req: express.Request, wallet: Wallet) { if (req.config?.externalSignerUrl !== undefined) { const coin = req.bitgo.coin(req.params.coin); if (coin.getMPCAlgorithm() === MPCType.EDDSA) { - return { - ...req.body, - customCommitmentGeneratingFunction: createCustomCommitmentGenerator( - req.config.externalSignerUrl, - req.params.coin - ), - customRShareGeneratingFunction: createCustomRShareGenerator(req.config.externalSignerUrl, req.params.coin), - customGShareGeneratingFunction: createCustomGShareGenerator(req.config.externalSignerUrl, req.params.coin), - }; + if (wallet._wallet.multisigTypeVersion === 'MPCv2') { + return { + ...req.body, + customEddsaMPCv2SigningRound1GenerationFunction: createCustomEddsaMPCv2SigningRound1Generator( + req.config.externalSignerUrl, + req.params.coin + ), + customEddsaMPCv2SigningRound2GenerationFunction: createCustomEddsaMPCv2SigningRound2Generator( + req.config.externalSignerUrl, + req.params.coin + ), + customEddsaMPCv2SigningRound3GenerationFunction: createCustomEddsaMPCv2SigningRound3Generator( + req.config.externalSignerUrl, + req.params.coin + ), + }; + } else { + return { + ...req.body, + customCommitmentGeneratingFunction: createCustomCommitmentGenerator( + req.config.externalSignerUrl, + req.params.coin + ), + customRShareGeneratingFunction: createCustomRShareGenerator(req.config.externalSignerUrl, req.params.coin), + customGShareGeneratingFunction: createCustomGShareGenerator(req.config.externalSignerUrl, req.params.coin), + }; + } } else if (coin.getMPCAlgorithm() === MPCType.ECDSA) { if (wallet._wallet.multisigTypeVersion === 'MPCv2') { return { @@ -1776,6 +1821,51 @@ export function createCustomMPCv2SigningRound3Generator( }; } +export function createCustomEddsaMPCv2SigningRound1Generator( + externalSignerUrl: string, + coin: string +): CustomEddsaMPCv2SigningRound1GeneratingFunction { + return async function (params) { + const { body: result } = await retryPromise( + () => superagent.post(`${externalSignerUrl}/api/v2/${coin}/tssshare/EddsaMPCv2Round1`).type('json').send(params), + (err, tryCount) => { + debug(`failed to connect to external signer (attempt ${tryCount}, error: ${err.message})`); + } + ); + return result; + }; +} + +export function createCustomEddsaMPCv2SigningRound2Generator( + externalSignerUrl: string, + coin: string +): CustomEddsaMPCv2SigningRound2GeneratingFunction { + return async function (params) { + const { body: result } = await retryPromise( + () => superagent.post(`${externalSignerUrl}/api/v2/${coin}/tssshare/EddsaMPCv2Round2`).type('json').send(params), + (err, tryCount) => { + debug(`failed to connect to external signer (attempt ${tryCount}, error: ${err.message})`); + } + ); + return result; + }; +} + +export function createCustomEddsaMPCv2SigningRound3Generator( + externalSignerUrl: string, + coin: string +): CustomEddsaMPCv2SigningRound3GeneratingFunction { + return async function (params) { + const { body: result } = await retryPromise( + () => superagent.post(`${externalSignerUrl}/api/v2/${coin}/tssshare/EddsaMPCv2Round3`).type('json').send(params), + (err, tryCount) => { + debug(`failed to connect to external signer (attempt ${tryCount}, error: ${err.message})`); + } + ); + return result; + }; +} + export function setupAPIRoutes(app: express.Application, config: Config): void { // When adding new routes to BitGo Express make sure that you also add the exact same routes to the server. Since // some customers were confused when calling a BitGo Express route on the BitGo server, we now handle all BitGo diff --git a/modules/express/src/typedRoutes/api/v2/generateShareTSS.ts b/modules/express/src/typedRoutes/api/v2/generateShareTSS.ts index 1dfd385465..3e35233950 100644 --- a/modules/express/src/typedRoutes/api/v2/generateShareTSS.ts +++ b/modules/express/src/typedRoutes/api/v2/generateShareTSS.ts @@ -12,6 +12,7 @@ export const GenerateShareTSSParams = { /** * The type of share to generate. Valid values depend on the MPC algorithm: * - EDDSA: 'commitment', 'R', 'G' + * - EDDSA MPCv2: 'EddsaMPCv2Round1', 'EddsaMPCv2Round2', 'EddsaMPCv2Round3' * - ECDSA: 'PaillierModulus', 'K', 'MuDelta', 'S' * - ECDSA MPCv2: 'MPCv2Round1', 'MPCv2Round2', 'MPCv2Round3' */ @@ -471,8 +472,8 @@ export const EcdsaMuDeltaShareResponse = t.type({ /** ECDSA S share generation response (Step 3) with final signature components */ export const EcdsaSShareResponse = SShare; -/** ECDSA MPCv2 Round 1 response with initial signature share and encrypted session state */ -export const EcdsaMPCv2Round1Response = t.type({ +/** MPCv2 Round 1 response with initial signature share and encrypted session state (shared by ECDSA and EdDSA) */ +export const MPCv2Round1Response = t.type({ /** First round signature share for MPCv2 protocol */ signatureShareRound1: SignatureShareRecord, /** User's GPG public key for Round 2 communication */ @@ -483,20 +484,27 @@ export const EcdsaMPCv2Round1Response = t.type({ encryptedUserGpgPrvKey: t.string, }); -/** ECDSA MPCv2 Round 2 response with second signature share and session state */ -export const EcdsaMPCv2Round2Response = t.type({ +/** MPCv2 Round 2 response with second signature share and session state (shared by ECDSA and EdDSA) */ +export const MPCv2Round2Response = t.type({ /** Second round signature share for MPCv2 protocol */ signatureShareRound2: SignatureShareRecord, /** Encrypted session state to continue to Round 3 */ encryptedRound2Session: t.string, }); -/** ECDSA MPCv2 Round 3 response with final signature share */ -export const EcdsaMPCv2Round3Response = t.type({ +/** MPCv2 Round 3 response with final signature share (shared by ECDSA and EdDSA) */ +export const MPCv2Round3Response = t.type({ /** Signature share for round 3 (final signature) */ signatureShareRound3: SignatureShareRecord, }); +/** @deprecated Use MPCv2Round1Response */ +export const EcdsaMPCv2Round1Response = MPCv2Round1Response; +/** @deprecated Use MPCv2Round2Response */ +export const EcdsaMPCv2Round2Response = MPCv2Round2Response; +/** @deprecated Use MPCv2Round3Response */ +export const EcdsaMPCv2Round3Response = MPCv2Round3Response; + /** Union of all TSS share responses - EDDSA (Commitment/R/G), ECDSA (PaillierModulus/K/MuDelta/S), or MPCv2 (Round1/2/3) */ export const GenerateShareTSSResponse = { /** Successfully generated TSS share (type depends on MPC algorithm and sharetype parameter) */ @@ -511,6 +519,9 @@ export const GenerateShareTSSResponse = { EcdsaMPCv2Round1Response, // ECDSA MPCv2 Round 1 EcdsaMPCv2Round2Response, // ECDSA MPCv2 Round 2 EcdsaMPCv2Round3Response, // ECDSA MPCv2 Round 3 + MPCv2Round1Response, // EdDSA MPCv2 Round 1 + MPCv2Round2Response, // EdDSA MPCv2 Round 2 + MPCv2Round3Response, // EdDSA MPCv2 Round 3 ]), /** Invalid request parameters, missing configuration, or share generation validation failure */ 400: BitgoExpressError, diff --git a/modules/express/test/unit/clientRoutes/externalSign.ts b/modules/express/test/unit/clientRoutes/externalSign.ts index f80f1487b4..b09de2e623 100644 --- a/modules/express/test/unit/clientRoutes/externalSign.ts +++ b/modules/express/test/unit/clientRoutes/externalSign.ts @@ -6,14 +6,17 @@ import { common, Ed25519BIP32, Eddsa, + EddsaMPCv2Utils, Ecdsa, HDTree, SignatureShareType, + ShareType, ShareKeyPosition, TxRequest, SignatureShareRecord, } from '@bitgo/sdk-core'; import { Hash } from 'crypto'; +import { logger } from '@bitgo/logger'; import { TestBitGo, TestBitGoAPI } from '@bitgo/sdk-test'; import * as should from 'should'; import * as sinon from 'sinon'; @@ -42,7 +45,14 @@ import 'should-http'; import 'should-sinon'; import '../../lib/asserts'; -import { handleV2GenerateShareTSS, handleV2Sign } from '../../../src/clientRoutes'; +import { + createCustomEddsaMPCv2SigningRound1Generator, + createCustomEddsaMPCv2SigningRound2Generator, + createCustomEddsaMPCv2SigningRound3Generator, + handleV2GenerateShareTSS, + handleV2Sign, + handleV2SignTSSWalletTx, +} from '../../../src/clientRoutes'; import { fetchKeys } from '../../../src/fetchEncryptedPrivKeys'; import { mockChallengeA, mockChallengeB } from './mocks/ecdsaNtilde'; import { ExpressApiRouteRequest } from '../../../src/typedRoutes/api'; @@ -654,6 +664,214 @@ describe('External signer', () => { envStub.restore(); }); + it('should route EdDSA MPCv2 share types to offline round share generators', async function () { + const bgTest = new BitGo({ env: 'test' }); + const readFileStub = sinon.stub(fs.promises, 'readFile').resolves(validPrv); + const envStub = sinon.stub(process, 'env').value({ ['WALLET_' + walletId + '_PASSPHRASE']: walletPassword }); + const round1Response = { + signatureShareRound1: { from: SignatureShareType.USER, to: SignatureShareType.BITGO, share: 'round1' }, + userGpgPubKey: 'userGpgPubKey', + encryptedRound1Session: 'encryptedRound1Session', + encryptedUserGpgPrvKey: 'encryptedUserGpgPrvKey', + }; + const round2Response = { + signatureShareRound2: { from: SignatureShareType.USER, to: SignatureShareType.BITGO, share: 'round2' }, + encryptedRound2Session: 'encryptedRound2Session', + }; + const round3Response = { + signatureShareRound3: { from: SignatureShareType.USER, to: SignatureShareType.BITGO, share: 'round3' }, + }; + const round1Stub = sinon.stub(EddsaMPCv2Utils.prototype, 'createOfflineRound1Share').resolves(round1Response); + const round2Stub = sinon.stub(EddsaMPCv2Utils.prototype, 'createOfflineRound2Share').resolves(round2Response); + const round3Stub = sinon.stub(EddsaMPCv2Utils.prototype, 'createOfflineRound3Share').resolves(round3Response); + + try { + const round1Result = await handleV2GenerateShareTSS( + createEddsaMPCv2GenerateShareRequest(bgTest, walletId, ShareType.EddsaMPCv2Round1) + ); + round1Result.should.eql(round1Response); + round1Stub.calledOnce.should.be.true(); + round1Stub.firstCall.args[0].prv.should.equal(secret); + round1Stub.firstCall.args[0].walletPassphrase.should.equal(walletPassword); + + const round2Result = await handleV2GenerateShareTSS( + createEddsaMPCv2GenerateShareRequest(bgTest, walletId, ShareType.EddsaMPCv2Round2) + ); + round2Result.should.eql(round2Response); + round2Stub.calledOnce.should.be.true(); + + const round3Result = await handleV2GenerateShareTSS( + createEddsaMPCv2GenerateShareRequest(bgTest, walletId, ShareType.EddsaMPCv2Round3) + ); + round3Result.should.eql(round3Response); + round3Stub.calledOnce.should.be.true(); + } finally { + readFileStub.restore(); + envStub.restore(); + round1Stub.restore(); + round2Stub.restore(); + round3Stub.restore(); + } + }); + + it('should throw a clear error for unsupported EdDSA MPCv2 share types', async function () { + const bgTest = new BitGo({ env: 'test' }); + const readFileStub = sinon.stub(fs.promises, 'readFile').resolves(validPrv); + const envStub = sinon.stub(process, 'env').value({ ['WALLET_' + walletId + '_PASSPHRASE']: walletPassword }); + const loggerErrorStub = sinon.stub(logger, 'error'); + + try { + await assert.rejects( + handleV2GenerateShareTSS(createEddsaMPCv2GenerateShareRequest(bgTest, walletId, 'EddsaMPCv2Round4')), + (error: Error) => { + assert.match(error.message, /Share type EddsaMPCv2Round4 not supported for EdDSA MPCv2/); + return true; + } + ); + loggerErrorStub.calledOnce.should.be.true(); + } finally { + readFileStub.restore(); + envStub.restore(); + loggerErrorStub.restore(); + } + }); + + it('should create EdDSA MPCv2 external signer generators with correct route paths', async function () { + const externalSignerUrl = 'http://external-signer.example'; + const coin = 'tsol'; + type Round1GeneratorParams = Parameters>[0]; + type Round2GeneratorParams = Parameters>[0]; + type Round3GeneratorParams = Parameters>[0]; + const round1Params: Round1GeneratorParams = { + txRequest: createExternalSignerTxRequest('round1TxRequestId'), + }; + const round2Params: Round2GeneratorParams = { + txRequest: createExternalSignerTxRequest('round2TxRequestId'), + bitgoPublicGpgKey: 'bitgoPublicGpgKey', + encryptedRound1Session: 'encryptedRound1Session', + encryptedUserGpgPrvKey: 'encryptedUserGpgPrvKey', + }; + const round3Params: Round3GeneratorParams = { + txRequest: createExternalSignerTxRequest('round3TxRequestId'), + bitgoPublicGpgKey: 'bitgoPublicGpgKey', + encryptedRound2Session: 'encryptedRound2Session', + encryptedUserGpgPrvKey: 'encryptedUserGpgPrvKey', + }; + const round1Response = { + signatureShareRound1: { from: SignatureShareType.USER, to: SignatureShareType.BITGO, share: 'round1' }, + userGpgPubKey: 'userGpgPubKey', + encryptedRound1Session: 'encryptedRound1Session', + encryptedUserGpgPrvKey: 'encryptedUserGpgPrvKey', + }; + const round2Response = { + signatureShareRound2: { from: SignatureShareType.USER, to: SignatureShareType.BITGO, share: 'round2' }, + encryptedRound2Session: 'encryptedRound2Session', + }; + const round3Response = { + signatureShareRound3: { from: SignatureShareType.USER, to: SignatureShareType.BITGO, share: 'round3' }, + }; + const matchRound1Body = sinon.spy((body: Round1GeneratorParams) => { + assert.deepStrictEqual(body, round1Params); + return true; + }); + const matchRound2Body = sinon.spy((body: Round2GeneratorParams) => { + assert.deepStrictEqual(body, round2Params); + return true; + }); + const matchRound3Body = sinon.spy((body: Round3GeneratorParams) => { + assert.deepStrictEqual(body, round3Params); + return true; + }); + + const round1Nock = nock(externalSignerUrl) + .post(`/api/v2/${coin}/tssshare/EddsaMPCv2Round1`, (body: Round1GeneratorParams) => matchRound1Body(body)) + .reply(200, round1Response); + const round2Nock = nock(externalSignerUrl) + .post(`/api/v2/${coin}/tssshare/EddsaMPCv2Round2`, (body: Round2GeneratorParams) => matchRound2Body(body)) + .reply(200, round2Response); + const round3Nock = nock(externalSignerUrl) + .post(`/api/v2/${coin}/tssshare/EddsaMPCv2Round3`, (body: Round3GeneratorParams) => matchRound3Body(body)) + .reply(200, round3Response); + + const round1Result = await createCustomEddsaMPCv2SigningRound1Generator(externalSignerUrl, coin)(round1Params); + const round2Result = await createCustomEddsaMPCv2SigningRound2Generator(externalSignerUrl, coin)(round2Params); + const round3Result = await createCustomEddsaMPCv2SigningRound3Generator(externalSignerUrl, coin)(round3Params); + + round1Nock.done(); + round2Nock.done(); + round3Nock.done(); + matchRound1Body.calledOnce.should.be.true(); + matchRound2Body.calledOnce.should.be.true(); + matchRound3Body.calledOnce.should.be.true(); + round1Result.signatureShareRound1.share.should.equal(round1Response.signatureShareRound1.share); + round2Result.signatureShareRound2.share.should.equal(round2Response.signatureShareRound2.share); + round3Result.signatureShareRound3.share.should.equal(round3Response.signatureShareRound3.share); + }); + + it('should attach EdDSA MPCv2 external signer generators for MPCv2 wallets', async function () { + const ensureCleanSigSharesAndSignTransaction = sinon.stub().callsFake(async (params) => { + params.customEddsaMPCv2SigningRound1GenerationFunction.should.be.Function(); + params.customEddsaMPCv2SigningRound2GenerationFunction.should.be.Function(); + params.customEddsaMPCv2SigningRound3GenerationFunction.should.be.Function(); + should.not.exist(params.customCommitmentGeneratingFunction); + should.not.exist(params.customRShareGeneratingFunction); + should.not.exist(params.customGShareGeneratingFunction); + return { txRequestId: 'signedTxRequestId' }; + }); + const wallet = { + _wallet: { multisigTypeVersion: 'MPCv2' }, + ensureCleanSigSharesAndSignTransaction, + }; + const coin = { + getMPCAlgorithm: () => 'eddsa', + wallets: () => ({ get: sinon.stub().resolves(wallet) }), + }; + const req = { + bitgo: { coin: sinon.stub().returns(coin) }, + body: { txRequestId: 'txRequestId' }, + decoded: { coin: 'tsol', id: 'walletId' }, + params: { coin: 'tsol' }, + config: { externalSignerUrl: 'http://external-signer.example' }, + } as any; + + const result = await handleV2SignTSSWalletTx(req); + + result.should.eql({ txRequestId: 'signedTxRequestId' }); + ensureCleanSigSharesAndSignTransaction.calledOnce.should.be.true(); + }); + + it('should keep EdDSA v1 external signer generators for non-MPCv2 wallets', async function () { + const ensureCleanSigSharesAndSignTransaction = sinon.stub().callsFake(async (params) => { + params.customCommitmentGeneratingFunction.should.be.Function(); + params.customRShareGeneratingFunction.should.be.Function(); + params.customGShareGeneratingFunction.should.be.Function(); + should.not.exist(params.customEddsaMPCv2SigningRound1GenerationFunction); + should.not.exist(params.customEddsaMPCv2SigningRound2GenerationFunction); + should.not.exist(params.customEddsaMPCv2SigningRound3GenerationFunction); + return { txRequestId: 'signedTxRequestId' }; + }); + const wallet = { + _wallet: { multisigTypeVersion: 'MPCv1' }, + ensureCleanSigSharesAndSignTransaction, + }; + const coin = { + getMPCAlgorithm: () => 'eddsa', + wallets: () => ({ get: sinon.stub().resolves(wallet) }), + }; + const req = { + bitgo: { coin: sinon.stub().returns(coin) }, + body: { txRequestId: 'txRequestId' }, + decoded: { coin: 'tsol', id: 'walletId' }, + params: { coin: 'tsol' }, + config: { externalSignerUrl: 'http://external-signer.example' }, + } as any; + + const result = await handleV2SignTSSWalletTx(req); + + result.should.eql({ txRequestId: 'signedTxRequestId' }); + ensureCleanSigSharesAndSignTransaction.calledOnce.should.be.true(); + }); + it('should read an encrypted prv from signerFileSystemPath and pass it to MPCv2Round1, MPCv2Round2 and MPCv2Round3 share generators', async function () { // MPCv2 DKLS flow is CPU-heavy; extend timeout for CI stability this.timeout(180000); @@ -870,6 +1088,7 @@ describe('External signer', () => { const keyResult = { walletId, + encryptedPrv: JSON.parse(validPrv)[walletId], }; nock(bgUrl).get(`/api/v2/tbtc/wallet/${walletId}`).reply(200, walletResult); @@ -882,6 +1101,59 @@ describe('External signer', () => { }); }); +function createEddsaMPCv2GenerateShareRequest( + bitgo: BitGo, + walletId: string, + sharetype: string +): ExpressApiRouteRequest<'express.v2.tssshare.generate', 'post'> { + return { + bitgo, + body: { + txRequest: { + txRequestId: '123456', + apiVersion: 'full', + walletId, + transactions: [ + { + unsignedTx: { + derivationPath: 'm/0', + signableHex: 'deadbeef', + }, + signatureShares: [], + }, + ], + }, + }, + decoded: { + coin: 'tsol', + sharetype, + }, + params: { + coin: 'tsol', + sharetype, + }, + config: { + signerFileSystemPath: 'signerFileSystemPath', + }, + } as unknown as ExpressApiRouteRequest<'express.v2.tssshare.generate', 'post'>; +} + +function createExternalSignerTxRequest(txRequestId: string): TxRequest { + return { + txRequestId, + walletId: 'walletId', + walletType: 'hot', + version: 1, + state: 'pendingUserSignature', + date: '2026-05-28T00:00:00.000Z', + userId: 'userId', + intent: {}, + policiesChecked: true, + unsignedTxs: [], + latest: true, + }; +} + // #region MPCv2 utils function getBitGoPartyGpgKeyPrv(bitgoPrvKey: string): DklsTypes.PartyGpgKey { return { diff --git a/modules/express/test/unit/typedRoutes/generateShareTSS.ts b/modules/express/test/unit/typedRoutes/generateShareTSS.ts index ff0c869ea4..56916c54ed 100644 --- a/modules/express/test/unit/typedRoutes/generateShareTSS.ts +++ b/modules/express/test/unit/typedRoutes/generateShareTSS.ts @@ -13,6 +13,9 @@ import { EcdsaMPCv2Round1Response, EcdsaMPCv2Round2Response, EcdsaMPCv2Round3Response, + MPCv2Round1Response, + MPCv2Round2Response, + MPCv2Round3Response, } from '../../../src/typedRoutes/api/v2/generateShareTSS'; import { assertDecode } from './common'; import 'should'; @@ -363,6 +366,51 @@ describe('GenerateShareTSS codec tests (External Signer Mode)', function () { assert.strictEqual(decoded.signatureShareRound3.to, 'bitgo'); assert.strictEqual(decoded.signatureShareRound3.share, 'round3-share'); }); + + it('should validate EdDSA MPCv2 Round1 response', function () { + const validResponse = { + signatureShareRound1: { + from: 'user', + to: 'bitgo', + share: 'round1-share', + }, + userGpgPubKey: 'user-gpg-key', + encryptedRound1Session: 'session1', + encryptedUserGpgPrvKey: 'gpg-prv', + }; + const decoded = assertDecode(MPCv2Round1Response, validResponse); + assert.strictEqual(decoded.signatureShareRound1.from, 'user'); + assert.strictEqual(decoded.userGpgPubKey, 'user-gpg-key'); + }); + + it('should validate EdDSA MPCv2 Round2 response', function () { + const validResponse = { + signatureShareRound2: { + from: 'user', + to: 'bitgo', + share: 'round2-share', + }, + encryptedRound2Session: 'session2', + }; + const decoded = assertDecode(MPCv2Round2Response, validResponse); + assert.strictEqual(decoded.signatureShareRound2.from, 'user'); + assert.strictEqual(decoded.signatureShareRound2.to, 'bitgo'); + assert.strictEqual(decoded.encryptedRound2Session, 'session2'); + }); + + it('should validate EdDSA MPCv2 Round3 response', function () { + const validResponse = { + signatureShareRound3: { + from: 'user', + to: 'bitgo', + share: 'round3-share', + }, + }; + const decoded = assertDecode(MPCv2Round3Response, validResponse); + assert.strictEqual(decoded.signatureShareRound3.from, 'user'); + assert.strictEqual(decoded.signatureShareRound3.to, 'bitgo'); + assert.strictEqual(decoded.signatureShareRound3.share, 'round3-share'); + }); }); describe('EDDSA Share Generation', function () { diff --git a/modules/sdk-api/src/bitgoAPI.ts b/modules/sdk-api/src/bitgoAPI.ts index 1e7778eb47..feba1f8d83 100644 --- a/modules/sdk-api/src/bitgoAPI.ts +++ b/modules/sdk-api/src/bitgoAPI.ts @@ -40,9 +40,8 @@ import { toBitgoRequest, verifyResponseAsync, } from './api'; -import { decrypt, decryptAsync, encrypt } from './encrypt'; +import { decrypt, decryptAsync, encrypt, encryptAsync } from './encrypt'; import { createEncryptionSession } from './encryptionSession'; -import { encryptV2 } from './encryptV2'; import { verifyAddress } from './v1/verifyAddress'; import { AccessTokenOptions, @@ -853,10 +852,10 @@ export class BitGoAPI implements BitGoBase { if (!params.password) { throw new Error('cannot encrypt without password'); } - if (params.encryptionVersion === 2) { - return encryptV2(params.password, params.input, { adata: params.adata }); - } - return encrypt(params.password, params.input, { adata: params.adata }); + return await encryptAsync(params.password, params.input, { + adata: params.adata, + encryptionVersion: params.encryptionVersion, + }); } /** diff --git a/modules/sdk-api/src/encrypt.ts b/modules/sdk-api/src/encrypt.ts index e8d9307e45..b3f3dc9827 100644 --- a/modules/sdk-api/src/encrypt.ts +++ b/modules/sdk-api/src/encrypt.ts @@ -1,7 +1,7 @@ import * as sjcl from '@bitgo/sjcl'; import { randomBytes } from 'crypto'; -import { decryptV2 } from './encryptV2'; +import { decryptV2, encryptV2 } from './encryptV2'; /** * convert a 4 element Uint8Array to a 4 byte Number @@ -42,6 +42,21 @@ export function encrypt( return sjcl.encrypt(password, plaintext, encryptOptions); } +/** + * Async encrypt that dispatches to v1 (SJCL) or v2 (Argon2id + AES-256-GCM) + * when `encryptionVersion` is 2. Defaults to v1, matching sync `encrypt()`. + */ +export async function encryptAsync( + password: string, + plaintext: string, + options?: { salt?: Buffer; iv?: Buffer; adata?: string; encryptionVersion?: 1 | 2 } +): Promise { + if (options?.encryptionVersion === 2) { + return encryptV2(password, plaintext, { adata: options.adata }); + } + return encrypt(password, plaintext, options); +} + /** Decrypt a v1 SJCL envelope. */ export function decrypt(password: string, ciphertext: string): string { return sjcl.decrypt(password, ciphertext); diff --git a/modules/sdk-api/test/unit/encrypt.ts b/modules/sdk-api/test/unit/encrypt.ts index 2be52c59de..3a8be1cd3a 100644 --- a/modules/sdk-api/test/unit/encrypt.ts +++ b/modules/sdk-api/test/unit/encrypt.ts @@ -1,7 +1,16 @@ import assert from 'assert'; import { randomBytes } from 'crypto'; -import { decrypt, decryptAsync, decryptV2, encrypt, encryptV2, V2Envelope, createEncryptionSession } from '../../src'; +import { + decrypt, + decryptAsync, + decryptV2, + encrypt, + encryptAsync, + encryptV2, + V2Envelope, + createEncryptionSession, +} from '../../src'; import { BitGoAPI } from '../../src/bitgoAPI'; describe('encryption methods tests', () => { @@ -186,6 +195,70 @@ describe('encryption methods tests', () => { }); }); + describe('encryptAsync (v1/v2 dispatch)', () => { + const password = 'myPassword'; + const plaintext = 'Hello, World!'; + + it('dispatches to v1 by default and output is decryptable via decrypt', async () => { + const ct = await encryptAsync(password, plaintext); + const envelope = JSON.parse(ct); + assert.notStrictEqual(envelope.v, 2, 'default should not produce v2 envelope'); + assert.strictEqual(decrypt(password, ct), plaintext); + }); + + it('dispatches to v2 when encryptionVersion: 2', async () => { + const ct = await encryptAsync(password, plaintext, { encryptionVersion: 2 }); + const envelope: V2Envelope = JSON.parse(ct); + assert.strictEqual(envelope.v, 2); + const result = await decryptAsync(password, ct); + assert.strictEqual(result, plaintext); + }); + + it('dispatches to v1 when encryptionVersion: 1', async () => { + const ct = await encryptAsync(password, plaintext, { encryptionVersion: 1 }); + const envelope = JSON.parse(ct); + assert.notStrictEqual(envelope.v, 2); + assert.strictEqual(decrypt(password, ct), plaintext); + }); + + it('forwards adata to v2 envelope', async () => { + const adata = 'txhash:m/0/1'; + const ct = await encryptAsync(password, plaintext, { encryptionVersion: 2, adata }); + const envelope: V2Envelope = JSON.parse(ct); + assert.strictEqual(envelope.adata, adata); + assert.strictEqual(await decryptAsync(password, ct), plaintext); + }); + + it('encrypts v1 with adata', async () => { + const adata = 'additional data'; + const ct = await encryptAsync(password, plaintext, { adata }); + assert.strictEqual(decrypt(password, ct), plaintext); + }); + + it('returns different ciphertext for the same plaintext and password', async () => { + const ct1 = await encryptAsync(password, plaintext); + const ct2 = await encryptAsync(password, plaintext); + assert.notStrictEqual(ct1, ct2); + }); + + it('forwards salt and iv options to v1 encrypt for deterministic output', async () => { + const salt = randomBytes(8); + const iv = randomBytes(16); + const ct1 = await encryptAsync(password, plaintext, { salt, iv }); + const ct2 = await encryptAsync(password, plaintext, { salt, iv }); + assert.strictEqual(ct1, ct2); + assert.strictEqual(decrypt(password, ct1), plaintext); + }); + + it('throws an error if the salt length is not 8 bytes', async () => { + await assert.rejects(() => encryptAsync(password, plaintext, { salt: randomBytes(4) }), /salt must be 8 bytes/); + }); + + it('throws an error if the iv length is not 16 bytes', async () => { + await assert.rejects(() => encryptAsync(password, plaintext, { iv: randomBytes(4) }), /iv must be 16 bytes/); + }); + }); + describe('decryptAsync (auto-detect v1/v2)', () => { const password = 'myPassword'; const plaintext = 'Hello, World!'; diff --git a/modules/statics/src/allCoinsAndTokens.ts b/modules/statics/src/allCoinsAndTokens.ts index 496e258f6b..b995739a04 100644 --- a/modules/statics/src/allCoinsAndTokens.ts +++ b/modules/statics/src/allCoinsAndTokens.ts @@ -101,6 +101,7 @@ import { ETC_FEATURES, ETH_FEATURES, ETH_FEATURES_WITH_STAKING_AND_MMI, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE, EVM_FEATURES, EVM_NON_EIP1559_FEATURES, FLR_FEATURES, @@ -445,7 +446,8 @@ export const allCoinsAndTokens = [ 18, '0x79052ab3c166d4899a1e0dd033ac3b379af0b1fd', UnderlyingAsset['xtzevm:xu3o8'], - Networks.main.xtzevm + Networks.main.xtzevm, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'd06d5a8d-54c1-4014-bbc1-96b4c5d32a99', @@ -463,7 +465,8 @@ export const allCoinsAndTokens = [ 6, '0x01f07f4d78d47a64f4c3b2b65f513f15be6e1854', UnderlyingAsset['xtzevm:stxtz'], - Networks.main.xtzevm + Networks.main.xtzevm, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), account( 'e7fdbd6f-93ff-4dda-8a57-81580827188e', @@ -3176,7 +3179,7 @@ export const allCoinsAndTokens = [ UnderlyingAsset['hoodeth:usdg'], Networks.main.hoodeth ), - // Robinhood Chain tokens - CECHO-1183 + // Robinhood Chain tokens - CECHO-1183 (gated for BitGo Singapore Trust) erc20Token( 'eada9a10-3d17-465f-978b-5a183e73f4c6', 'hoodeth:nvda', @@ -3184,7 +3187,8 @@ export const allCoinsAndTokens = [ 18, '0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec', UnderlyingAsset['hoodeth:nvda'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '13ebc2ae-5bee-4433-b5f1-94d823c0db20', @@ -3193,7 +3197,8 @@ export const allCoinsAndTokens = [ 18, '0xff080c8ce2e5feadaca0da81314ae59d232d4afd', UnderlyingAsset['hoodeth:mu'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'b3a25405-760f-4578-bbe8-14ddfbe3aacd', @@ -3202,7 +3207,8 @@ export const allCoinsAndTokens = [ 18, '0xb90a19ff0af67f7779aff50a882a9cff42446400', UnderlyingAsset['hoodeth:sndk'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '2597a273-8103-4e42-89cd-da241c231bc0', @@ -3211,7 +3217,8 @@ export const allCoinsAndTokens = [ 18, '0x86923f96303d656e4aa86d9d42d1e57ad2023fdc', UnderlyingAsset['hoodeth:amd'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'e3613375-49ff-4279-9c57-e5fb9728a931', @@ -3220,7 +3227,8 @@ export const allCoinsAndTokens = [ 18, '0x117cc2133c37b721f49de2a7a74833232b3b4c0c', UnderlyingAsset['hoodeth:spy'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '49c855b1-0d85-4f79-9756-7ecf28440225', @@ -3229,7 +3237,8 @@ export const allCoinsAndTokens = [ 18, '0xe93237c50d904957cf27e7b1133b510c669c2e74', UnderlyingAsset['hoodeth:msft'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'f4e2c9a2-130f-4080-ba53-d43d5494ee2b', @@ -3238,7 +3247,8 @@ export const allCoinsAndTokens = [ 18, '0x894e1ec2d74ffe5aef8dc8a9e84686accb964f2a', UnderlyingAsset['hoodeth:pltr'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '8aa38d75-8f24-4fe4-8642-072e3e0529bd', @@ -3247,7 +3257,8 @@ export const allCoinsAndTokens = [ 18, '0xc72b96e0e48ecd4dc75e1e45396e26300bc39681', UnderlyingAsset['hoodeth:intc'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '92f0c908-efa9-490a-a344-15511d54ce57', @@ -3256,7 +3267,8 @@ export const allCoinsAndTokens = [ 18, '0xd5f3879160bc7c32ebb4dc785f8a4f505888de68', UnderlyingAsset['hoodeth:qqq'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '326f35b5-d998-4851-81b3-fcb5c0ccf0ec', @@ -3265,7 +3277,8 @@ export const allCoinsAndTokens = [ 18, '0x411efb0e7f985935daec3d4c3ebaea0d0ad7d89f', UnderlyingAsset['hoodeth:slv'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'c7491c49-a509-4791-aa18-2ab12130c518', @@ -3274,7 +3287,8 @@ export const allCoinsAndTokens = [ 18, '0xdf0992e440dd0be65bd8439b609d6d4366bf1cb5', UnderlyingAsset['hoodeth:crcl'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'df3845bb-bab1-49d4-a040-c81a768d244a', @@ -3283,7 +3297,8 @@ export const allCoinsAndTokens = [ 18, '0xc0d6457c16cc70d6790dd43521c899c87ce02f35', UnderlyingAsset['hoodeth:meta'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'da8769ad-98d5-4349-bea9-8fee3be83c9a', @@ -3292,7 +3307,8 @@ export const allCoinsAndTokens = [ 18, '0xaf3d76f1834a1d425780943c99ea8a608f8a93f9', UnderlyingAsset['hoodeth:aapl'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '31baa733-4e2b-4fc6-82ea-2653cbd083ff', @@ -3301,7 +3317,8 @@ export const allCoinsAndTokens = [ 18, '0x2e0847e8910a9732eb3fb1bb4b70a580adad4fe3', UnderlyingAsset['hoodeth:googl'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'f6f0a6f8-fea8-4306-baaf-c88a96b071de', @@ -3310,7 +3327,8 @@ export const allCoinsAndTokens = [ 18, '0xa30fa36db767ad9ed3f7a60fc79526fb4d56d344', UnderlyingAsset['hoodeth:uso'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '6852e072-48ec-41e7-b0ad-c8594c560f5c', @@ -3319,7 +3337,8 @@ export const allCoinsAndTokens = [ 18, '0x12f190a9f9d7d37a250758b26824b97ce941bf54', UnderlyingAsset['hoodeth:amzn'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '9c12894d-62c6-4e9c-bea7-9d909a23c496', @@ -3328,7 +3347,8 @@ export const allCoinsAndTokens = [ 18, '0x5f10a1c971b69e47e059e1dc91901b59b3fb49c3', UnderlyingAsset['hoodeth:crwv'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '0519b754-a119-4431-9d00-490522e2a4d1', @@ -3337,7 +3357,8 @@ export const allCoinsAndTokens = [ 18, '0xb0992820e760d836549ba69bc7598b4af75dee03', UnderlyingAsset['hoodeth:orcl'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'be7d01f7-12e9-4e19-91be-56d894c9fa9c', @@ -3346,7 +3367,8 @@ export const allCoinsAndTokens = [ 18, '0x92fd66527192e3e61d4ddd13322aa222de86f9b5', UnderlyingAsset['hoodeth:sgov'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'ffb9fa51-e51b-40f0-a2c9-3f735bab7d7c', @@ -3355,7 +3377,8 @@ export const allCoinsAndTokens = [ 18, '0x822cc93ffd030293e9842c30bbd678f530701867', UnderlyingAsset['hoodeth:be'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '7d0446f2-929f-4bea-b9b7-cb9f40dc0786', @@ -3364,7 +3387,8 @@ export const allCoinsAndTokens = [ 18, '0xd917b029c761d264c6a312bbbcda868658ef86a6', UnderlyingAsset['hoodeth:usar'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( '7e955555-9504-4173-b9a6-2799b88e38f0', @@ -3373,7 +3397,8 @@ export const allCoinsAndTokens = [ 18, '0x33c18e2cc8ae9ae486e785090d86b2ce632ff994', UnderlyingAsset['hoodeth:dram'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), erc20Token( 'ea09a0ff-059b-4527-8e7b-75dfc750218b', @@ -3382,7 +3407,8 @@ export const allCoinsAndTokens = [ 18, '0xc93a8c440cea26d7445df01729f193b27965099f', UnderlyingAsset['hoodeth:week'], - Networks.main.hoodeth + Networks.main.hoodeth, + EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE ), account( diff --git a/modules/statics/src/coinFeatures.ts b/modules/statics/src/coinFeatures.ts index 1a97ed34a3..b5c9fe0e84 100644 --- a/modules/statics/src/coinFeatures.ts +++ b/modules/statics/src/coinFeatures.ts @@ -267,6 +267,10 @@ export const POLYGON_TOKEN_FEATURES_EXCLUDE_SINGAPORE = [ ...ACCOUNT_COIN_DEFAULT_FEATURES_EXCLUDE_SINGAPORE, CoinFeature.BULK_TRANSACTION, ]; +export const EVM_ERC20_TOKEN_FEATURES_EXCLUDE_SINGAPORE = [ + ...ACCOUNT_COIN_DEFAULT_FEATURES_EXCLUDE_SINGAPORE, + CoinFeature.EIP1559, +]; export const POL_FEATURES = [ ...ACCOUNT_COIN_DEFAULT_FEATURES, CoinFeature.STAKING, diff --git a/modules/statics/src/coins/botOfcTokens.ts b/modules/statics/src/coins/botOfcTokens.ts index dc986f2ef7..e0480a9943 100644 --- a/modules/statics/src/coins/botOfcTokens.ts +++ b/modules/statics/src/coins/botOfcTokens.ts @@ -2,11 +2,11 @@ import type { UnderlyingAsset } from '../base'; import * as AccountCtors from '../ofc'; export const botOfcTokens = [ AccountCtors.ofcerc20( - 'b1a35b36-f93d-4aae-a5ef-4f496230210a', - 'ofceth:abtx', - 'Abbott Laboratories (xStock)', + '26f46d44-700d-4e32-8845-fb181e6d8027', + 'ofceth:gusdcq', + 'Galaxy USDC Quality', 18, - 'eth:abtx' as unknown as UnderlyingAsset, + 'eth:gusdcq' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -14,11 +14,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - '1a742c7f-794d-4c64-8757-9443c849c097', - 'ofceth:abbvx', - 'ABBVIE INC. (xStock)', + '336f05ca-6548-495e-9c0b-8deba95ea56b', + 'ofceth:gusdtq', + 'Galaxy USDT Quality', 18, - 'eth:abbvx' as unknown as UnderlyingAsset, + 'eth:gusdtq' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -26,11 +26,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - '80c3254c-e916-4460-a211-4f921d62ceb9', - 'ofceth:acnx', - 'Accenture PLC (xStock)', + '0c881f11-064e-4e54-9fa6-55406e419819', + 'ofceth:gwethq', + 'Galaxy WETH Quality', 18, - 'eth:acnx' as unknown as UnderlyingAsset, + 'eth:gwethq' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -38,875 +38,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - 'c577e80c-2891-4cec-8067-366b0ca8e15b', - 'ofceth:googlx', - 'Alphabet Inc. Class A Common Stock (xStock)', - 18, - 'eth:googlx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '71dd34d2-4fd1-4b0d-8e53-bdbaf7104037', - 'ofceth:amznx', - 'Amazon.com Inc. Common Stock (xStock)', - 18, - 'eth:amznx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '968c8806-c31a-47cc-917c-ad068e7b7ce7', - 'ofceth:ambrx', - 'Amber International Holding Limited American Depositary Shares (xStock)', - 18, - 'eth:ambrx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'b02c69b9-9ffb-4dfb-a463-0a32ab748249', - 'ofceth:aaplx', - 'Apple Inc. Common Stock (xStock)', - 18, - 'eth:aaplx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'ac845ed1-5d15-4cdd-9321-ae919b51ec7f', - 'ofceth:appx', - 'Applovin Corporation Class A Common Stock (xStock)', - 18, - 'eth:appx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'c22391e3-b963-4372-91e1-41f60b1e228d', - 'ofceth:aznx', - 'AstraZeneca PLC American Depositary Shares (xStock)', - 18, - 'eth:aznx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '387d15e0-e485-4672-a473-b4edb8cee343', - 'ofceth:bacx', - 'Bank of America Corporation (xStock)', - 18, - 'eth:bacx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'b2284610-854a-4f04-9269-9e68f68c4cd2', - 'ofceth:brkbx', - 'Berkshire Hathaway (xStock)', - 18, - 'eth:brkbx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '08284602-e821-4252-9317-2ec0b7a8b10e', - 'ofceth:avgox', - 'Broadcom Inc. Common Stock (xStock)', - 18, - 'eth:avgox' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '3e22a479-e03c-44fb-900b-1be6bf2dc742', - 'ofceth:cvxx', - 'Chevron Corporation (xStock)', - 18, - 'eth:cvxx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'b13267bf-ca46-4620-9f4f-55ecaaf00ac7', - 'ofceth:crclx', - 'Circle (xStock)', - 18, - 'eth:crclx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'fce161c3-25d5-4c02-8466-d9eb6f697616', - 'ofceth:cscox', - 'Cisco (DE) (xStock)', - 18, - 'eth:cscox' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'cf73eb78-2ea0-4008-b331-d981c6d5a48a', - 'ofceth:kox', - 'Coca-Cola Company (xStock)', - 18, - 'eth:kox' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'f306871e-d165-42df-9f07-6692c3cc33a6', - 'ofceth:coinx', - 'Coinbase Global Inc. Class A Common Stock (xStock)', - 18, - 'eth:coinx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '9ccce2e0-dbff-4b5e-a49d-a52f240d2c51', - 'ofceth:cmcsax', - 'Comcast Corporation Class A Common Stock (xStock)', - 18, - 'eth:cmcsax' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '0ce658b3-3984-4258-8365-417ef8d975dc', - 'ofceth:crwdx', - 'CrowdStrike Holdings Inc. Class A Common Stock (xStock)', - 18, - 'eth:crwdx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '28de9243-b748-4fc8-b7d5-65d58cbb4ca5', - 'ofceth:dhrx', - 'Danaher Corporation (xStock)', - 18, - 'eth:dhrx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '8acf2e93-95c6-4c2e-bc5a-707da02983a0', - 'ofceth:dfdvx', - 'DeFi Development Corp. Common Stock (xStock)', - 18, - 'eth:dfdvx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '1a14d1e9-ec0d-4e44-a861-708bdf14e60e', - 'ofceth:llyx', - 'Eli Lilly & Co. (xStock)', - 18, - 'eth:llyx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'd113043a-0732-42f5-86ea-48d7e5b956ac', - 'ofceth:xomx', - 'Exxon Mobil Corporation (xStock)', - 18, - 'eth:xomx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '4bbe120b-de0d-40d5-836f-1c98b58bae39', - 'ofceth:gmex', - 'GameStop Corp. Class A (xStock)', - 18, - 'eth:gmex' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'ba8ffd54-c852-4f60-a671-b6225499e106', - 'ofceth:gsx', - 'Goldman Sachs Group Inc. (xStock)', - 18, - 'eth:gsx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '87a02c48-a8bb-4607-b46c-8204e2d0c851', - 'ofceth:hdx', - 'Home Depot Inc. (xStock)', - 18, - 'eth:hdx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'c2c01f8f-3a98-4ed1-b6eb-6ac5709e2349', - 'ofceth:honx', - 'Honeywell International Inc. Common Stock (xStock)', - 18, - 'eth:honx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '15b84787-060d-4f32-a5bb-4ab44d2ae14c', - 'ofceth:intcx', - 'Intel Corporation Common Stock (xStock)', - 18, - 'eth:intcx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '04947aaa-9155-4ca7-acb2-7dc43a2553cc', - 'ofceth:ibmx', - 'International Business Machines Corporation (xStock)', - 18, - 'eth:ibmx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'b22f2748-0b48-4424-9a31-c16b5d5274f6', - 'ofceth:qqqx', - 'Nasdaq (xStock)', - 18, - 'eth:qqqx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '010f9396-d037-4555-affb-e6e7fc93ee29', - 'ofceth:jnjx', - 'Johnson & Johnson (xStock)', - 18, - 'eth:jnjx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'a39c40af-89d4-45df-9766-a2b1104b4665', - 'ofceth:jpmx', - 'JPMorgan Chase & Co. (xStock)', - 18, - 'eth:jpmx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '93438597-b538-4bb0-a2c5-e01e469d0ee7', - 'ofceth:linx', - 'Linde plc Ordinary Shares (xStock)', - 18, - 'eth:linx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'ee29f16e-1506-4beb-ba7a-baeb8bf20f8d', - 'ofceth:mrvlx', - 'Marvell Technology Inc. Common Stock (xStock)', - 18, - 'eth:mrvlx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'ee7d3f2c-5ce0-4efe-ab78-0b228652d299', - 'ofceth:max', - 'Mastercard Incorporated (xStock)', - 18, - 'eth:max' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '2d62cbd2-76d7-4735-af4b-ee947b66a038', - 'ofceth:mcdx', - "McDonald's Corporation (xStock)", - 18, - 'eth:mcdx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '1a1f8108-9b0a-4ec5-851e-28274ed79373', - 'ofceth:mdtx', - 'Medtronic plc (xStock)', - 18, - 'eth:mdtx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '76410ca1-31fc-46fe-ad6d-609cf2bbb8ca', - 'ofceth:mrkx', - 'Merck & Co. Inc. (xStock)', - 18, - 'eth:mrkx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'f3400c81-46bd-495a-8493-58e8e394e815', - 'ofceth:metax', - 'Meta Platforms Inc. Class A Common Stock (xStock)', - 18, - 'eth:metax' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'a62f44d8-541f-4fc0-a279-944bd7517381', - 'ofceth:msftx', - 'Microsoft Corporation Common Stock (xStock)', - 18, - 'eth:msftx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'da21da0c-8375-4bd3-8d30-61b099dde4b9', - 'ofceth:nflxx', - 'Netflix Inc. Common Stock (xStock)', - 18, - 'eth:nflxx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'ed18b283-956e-42dc-ade6-a5c39c388403', - 'ofceth:nvox', - 'Novo-Nordisk A/S (xStock)', - 18, - 'eth:nvox' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '7cc9fe10-fbc5-49ce-be51-e23599c6224d', - 'ofceth:nvdax', - 'NVIDIA Corporation Common Stock (xStock)', - 18, - 'eth:nvdax' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '3d4ba6cc-ba32-46f3-abfb-9360cec1c837', - 'ofceth:openx', - 'Opendoor Technologies Inc Common Stock (xStock)', - 18, - 'eth:openx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '32d73670-b0da-4ddd-a142-5fcd7605e6ea', - 'ofceth:orclx', - 'Oracle (xStock)', - 18, - 'eth:orclx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '63a849c3-39aa-42ed-a898-76409db137d4', - 'ofceth:pltrx', - 'Palantir Technologies (xStock)', - 18, - 'eth:pltrx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'fd3f89f9-4bbd-43c4-836a-03d1564cdf68', - 'ofceth:pepx', - 'PepsiCo (xStock)', - 18, - 'eth:pepx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '2d2f48bb-210a-425b-8306-1062bae63b0e', - 'ofceth:pfex', - 'Pfizer (xStock)', - 18, - 'eth:pfex' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '6cb28666-0989-4df9-92d8-c6cfb66f0139', - 'ofceth:pmx', - 'Philip Morris (xStock)', - 18, - 'eth:pmx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '42193c45-5722-427b-b83f-424bae85fa56', - 'ofceth:pgx', - 'Procter & Gamble Company (xStock)', - 18, - 'eth:pgx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'f214dd1f-91d8-4e5e-a54e-1c5d9400cd27', - 'ofceth:tqqqx', - 'ProShares UltraPro TQQQ (xStock)', - 18, - 'eth:tqqqx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'bf00f315-1ad4-4abe-917f-c1ea5937f4c4', - 'ofceth:hoodx', - 'Robinhood (xStock)', - 18, - 'eth:hoodx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'b3f6a18f-2c96-415d-927c-8821c5a3219e', - 'ofceth:crmx', - 'Salesforce Inc. (xStock)', - 18, - 'eth:crmx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'dc472bcb-525b-4fc1-bf41-f585c7a570fd', - 'ofceth:gldx', - 'SPDR Gold (xStock)', - 18, - 'eth:gldx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '181911f5-1297-4189-a68f-32e4c77d7126', - 'ofceth:spyx', - 'SPDR S&P 500 (xStock)', - 18, - 'eth:spyx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '8402d9ca-fa42-48af-9971-6cbf9c51557d', - 'ofceth:mstrx', - 'MicroStrategy (xStock)', - 18, - 'eth:mstrx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'c8c62be1-e695-4198-8dfb-c267e8099d0e', - 'ofceth:strcx', - 'Strategy PP Variable (xStock)', - 18, - 'eth:strcx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '4af9944c-e087-4b64-a8de-da45d73d092a', - 'ofceth:tslax', - 'Tesla (xStock)', - 18, - 'eth:tslax' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '7c875109-1c77-4dda-b6a5-d4c41ce086ef', - 'ofceth:tmox', - 'Thermo Fisher (xStock)', - 18, - 'eth:tmox' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'cb4ab29b-f7e1-4d40-b9a0-2cf74f76376e', - 'ofceth:tonxx', - 'TON Strategy (xStock)', - 18, - 'eth:tonxx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '9324300b-af60-4810-b0d8-10423aaac85c', - 'ofceth:unhx', - 'UnitedHealth (xStock)', - 18, - 'eth:unhx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'bef478b9-34c4-406d-b2ed-a0677d82b246', - 'ofceth:vtix', - 'Vanguard (xStock)', - 18, - 'eth:vtix' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '1fdf1af1-477f-4827-afc3-f48a6a82f858', - 'ofceth:vx', - 'VISA (xStock)', - 18, - 'eth:vx' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'c32a2da4-2172-451f-8b45-54678c9589eb', - 'ofceth:wmtxstock', - 'Walmart (xStock)', - 18, - 'eth:wmtxstock' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '02af63f1-21b9-41a6-836a-a273f0faa276', - 'ofceth:krwq', - 'KRWQ', - 18, - 'eth:krwq' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'adf94a02-974e-4fec-8132-d066ac52e49d', - 'ofceth:hybond', - 'HYBOND', - 18, - 'eth:hybond' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'f94875df-0a1e-4550-a75c-bad07f64f708', - 'ofceth:aethusdt', - 'Aave Ethereum USDT', - 8, - 'eth:aethusdt' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '64a6001c-ffaa-444b-90ee-cd13a76e8cf1', - 'ofceth:aethusdc', - 'Aave Ethereum USDC', - 6, - 'eth:aethusdc' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '30fe79ce-5f3e-483d-abaa-0d05f5577314', - 'ofceth:aethwbtc', - 'Aave Ethereum WBTC', - 8, - 'eth:aethwbtc' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'ced14516-7d18-47a3-bd05-b8198b0bfde6', - 'ofceth:aethcbbtc', - 'Aave Ethereum cbBTC', - 8, - 'eth:aethcbbtc' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'e1ecd4de-f19e-4da6-8c5d-f5fa238ec853', - 'ofceth:aethusde', - 'Aave Ethereum USDe', - 18, - 'eth:aethusde' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '073b057f-957f-4293-a148-dc5a47d77114', - 'ofceth:aethxaut', - 'Aave Ethereum XAUt', - 6, - 'eth:aethxaut' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '5b76e064-9595-4a71-9a6e-5f9ee6e219d9', - 'ofceth:aethaave', - 'Aave Ethereum AAVE', - 18, - 'eth:aethaave' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '15aaba6b-fd11-4269-9dae-b8770ee05fd4', - 'ofceth:aetheurc', - 'Aave Ethereum EURC', - 6, - 'eth:aetheurc' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'a10d01a5-bf6c-4f1c-bb22-d4544d6372a5', - 'ofceth:aethusdg', - 'Aave Ethereum USDG', - 6, - 'eth:aethusdg' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '64d24c47-3ba1-413e-b3c9-7fabfe6ac168', - 'ofceth:aethpyusd', - 'Aave Ethereum PYUSD', - 6, - 'eth:aethpyusd' as unknown as UnderlyingAsset, + 'f8ffca6e-a6dc-4d14-90d8-500383cdbffe', + 'ofceth:acu', + 'Acurast', + 12, + 'eth:acu' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -914,11 +50,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - 'b49e0d41-6484-4dbf-8045-6b3af6a43db5', - 'ofceth:aethcbeth', - 'Aave Ethereum cbETH', + '1a446703-1f79-4212-8ee2-5338515708d3', + 'ofceth:obol', + 'Obol', 18, - 'eth:aethcbeth' as unknown as UnderlyingAsset, + 'eth:obol' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -926,59 +62,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - '40dc2325-61dd-4380-96bc-a79080b74427', - 'ofceth:spusdc', - 'Spark Savings USDC', - 6, - 'eth:spusdc' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'c0c983a6-c9e4-42d1-b3c9-2675ea5efcba', - 'ofceth:spusdt', - 'Spark Savings USDT', - 6, - 'eth:spusdt' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '2aa437e9-ba5a-410d-a36f-69928ebca520', - 'ofceth:speth', - 'Spark Savings ETH', - 18, - 'eth:speth' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '9f465093-00b1-41d5-8da7-722e1771a32f', - 'ofceth:sppyusd', - 'Spark Savings PYUSD', - 6, - 'eth:sppyusd' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '62893048-f2c5-4d16-af1f-efc89c47af79', - 'ofceth:spwsteth', - 'Spark wstETH', + '6b42cbcb-1eba-4c20-be8b-f94e878f5365', + 'ofceth:re', + 'Re Protocol', 18, - 'eth:spwsteth' as unknown as UnderlyingAsset, + 'eth:re' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -986,59 +74,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - 'e892c3af-06b7-43a8-835a-a47711d7c950', - 'ofceth:spweth', - 'Spark WETH', - 18, - 'eth:spweth' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '49516014-f31b-4e63-b62c-9c02381568bd', - 'ofceth:spwbtc', - 'Spark WBTC', - 8, - 'eth:spwbtc' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '3d127a9e-d9ee-4a06-9698-ad82ad4cf932', - 'ofceth:spcbbtc', - 'Spark cbBTC', - 8, - 'eth:spcbbtc' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - 'a1b7e927-b2da-401c-8251-8d20ea13a1dd', - 'ofceth:syrupusdc', - 'Syrup USDC', - 6, - 'eth:syrupusdc' as unknown as UnderlyingAsset, - undefined, - undefined, - undefined, - undefined, - undefined - ), - AccountCtors.ofcerc20( - '0d7440fc-e0a6-4824-9077-8381b38ee14b', - 'ofceth:syrupusdt', - 'Syrup USDT', - 6, - 'eth:syrupusdt' as unknown as UnderlyingAsset, + '186594ec-8433-46db-9756-f071c172fa67', + 'ofceth:filqa', + 'Fidelity USD Digital Liquidity Fund-Acc', + 2, + 'eth:filqa' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -1046,11 +86,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - 'ace458bb-b294-4d5a-834f-222641c707ec', - 'ofceth:sparkusdt', - 'Spark USDT', - 6, - 'eth:sparkusdt' as unknown as UnderlyingAsset, + 'b28d8ff5-a32a-44db-b1b1-c3b9f9a949c3', + 'ofceth:filqd', + 'Fidelity USD Digital Liquidity Fund-Dist', + 2, + 'eth:filqd' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -1058,11 +98,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - '8843cfb2-9646-45f9-aad8-27db8ad9da09', - 'ofceth:sparkpyusd', - 'Spark PYUSD', + 'bc9074f8-e75b-4daf-9305-1c1d31127264', + 'ofceth:wylds', + 'Hastra wYLDS', 6, - 'eth:sparkpyusd' as unknown as UnderlyingAsset, + 'eth:wylds' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -1070,11 +110,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - 'a2b4b76d-cf2c-45b8-8f2c-783f7ca58dd5', - 'ofceth:sparkusdc', - 'Spark USDC', + '4451adc0-9d86-4518-87bf-fcaaf8fa43e8', + 'ofceth:hprime', + 'Hastra PRIME', 6, - 'eth:sparkusdc' as unknown as UnderlyingAsset, + 'eth:hprime' as unknown as UnderlyingAsset, undefined, undefined, undefined, @@ -1082,11 +122,11 @@ export const botOfcTokens = [ undefined ), AccountCtors.ofcerc20( - '696ac363-9a05-4708-8c80-59caae3ac6dc', - 'ofceth:aethwsteth', - 'Wrapped liquid staked Ether 2.0', + '8cfa782a-c177-4501-9af6-84423eeb2017', + 'ofceth:bill', + 'Billions Network', 18, - 'eth:aethwsteth' as unknown as UnderlyingAsset, + 'eth:bill' as unknown as UnderlyingAsset, undefined, undefined, undefined, diff --git a/modules/statics/src/coins/botTokens.ts b/modules/statics/src/coins/botTokens.ts index e02c4db740..9e22d3aaf3 100644 --- a/modules/statics/src/coins/botTokens.ts +++ b/modules/statics/src/coins/botTokens.ts @@ -1,5 +1,5 @@ -import { UnderlyingAsset } from '../base'; -import { networkFeatureMapForTokens } from '../networkFeatureMapForTokens'; +import { CoinFeature, UnderlyingAsset } from '../base'; +import { getTokenFeatures } from '../networkFeatureMapForTokens'; import { Networks } from '../networks'; import * as AccountCtors from '../account'; @@ -11,7 +11,7 @@ export const botTokens = [ 18, '0x2d8e3bd91678a7777ef2f2388dc126b973a43ce5', 'hteth:testamsv2' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, Networks.test.hoodi @@ -23,7 +23,7 @@ export const botTokens = [ 9, '0xabcdef1234567890abcdef1234567890abcdef12', 'ethx1' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, Networks.test.hoodi @@ -35,7 +35,7 @@ export const botTokens = [ 18, '0x0581ccdf2d9bca21baeff8b32b2551fd49cf70aa', 'eth:at' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, Networks.test.hoodi @@ -47,7 +47,7 @@ export const botTokens = [ 8, '0xa56a332d34b2db33ebc41dc0194afd28cb20d19b', 'hteth:WBTC' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, Networks.test.hoodi @@ -59,7 +59,7 @@ export const botTokens = [ 18, '0x7e99ee3c66636de415d2d7c880938f2f40f94de4', 'hteth:wsteth' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, Networks.test.hoodi @@ -71,7 +71,7 @@ export const botTokens = [ 18, '0x7728a33ebebcfa852cf7f7fc377bfc87c24a701b', 'hteth:fgh' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, Networks.test.hoodi @@ -83,7 +83,7 @@ export const botTokens = [ 18, '0x0581dcdf2d9bca21baeff8b32b2551fd49cf70da', 'hteth:asdf' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, Networks.test.hoodi @@ -95,7 +95,35 @@ export const botTokens = [ 18, '0x0581ccdf2d9bca21baeff8b32b2551fe49cf70da', 'hteth:lkm' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), + undefined, + undefined, + Networks.test.hoodi + ), + AccountCtors.terc20( + '832af104-5d50-49d6-84cc-1bd8d3c87a11', + 'hteth:xcv', + 'xcv', + 18, + '0xd64aaa49b243fe8d0a0e5c4f27ead9083c756cc2', + 'hteth:xcv' as unknown as UnderlyingAsset, + getTokenFeatures('eth', ['custody-bitgo-new-york' as CoinFeature, 'custody-bitgo-korea' as CoinFeature]), + undefined, + undefined, + Networks.test.hoodi + ), + AccountCtors.terc20( + '39057758-fec1-4bfc-9a84-84086af32b3b', + 'hteth:lseth', + 'Liquid Staked ETH', + 18, + '0x0ca0c58b1986a55876552e0d9532c963625d5646', + 'hteth:lseth' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), undefined, undefined, Networks.test.hoodi @@ -107,7 +135,7 @@ export const botTokens = [ 18, '0x89233399708c18ac6887f90a2b4cd8ba5fedd06e', 'eth:abtx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -119,7 +147,7 @@ export const botTokens = [ 18, '0xfbf2398df672cee4afcc2a4a733222331c742a6a', 'eth:abbvx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -131,7 +159,7 @@ export const botTokens = [ 18, '0x03183ce31b1656b72a55fa6056e287f50c35bbeb', 'eth:acnx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -143,7 +171,7 @@ export const botTokens = [ 18, '0xe92f673ca36c5e2efd2de7628f815f84807e803f', 'eth:googlx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -155,7 +183,7 @@ export const botTokens = [ 18, '0x3557ba345b01efa20a1bddc61f573bfd87195081', 'eth:amznx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -167,7 +195,7 @@ export const botTokens = [ 18, '0x2f9a35ab5ddfbc49927bfdeab98a86c53dc6e763', 'eth:ambrx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -179,7 +207,7 @@ export const botTokens = [ 18, '0x9d275685dc284c8eb1c79f6aba7a63dc75ec890a', 'eth:aaplx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -191,7 +219,7 @@ export const botTokens = [ 18, '0x50a1291f69d9d3853def8209cfb1af0b46927be1', 'eth:appx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -203,7 +231,7 @@ export const botTokens = [ 18, '0x5d642505fe1a28897eb3baba665f454755d8daa2', 'eth:aznx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -215,7 +243,7 @@ export const botTokens = [ 18, '0x314938c596f5ce31c3f75307d2979338c346d7f2', 'eth:bacx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -227,7 +255,7 @@ export const botTokens = [ 18, '0x12992613fdd35abe95dec5a4964331b1ee23b50d', 'eth:brkbx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -239,7 +267,7 @@ export const botTokens = [ 18, '0x38bac69cbbd28156796e4163b2b6dcb81e336565', 'eth:avgox' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -251,7 +279,7 @@ export const botTokens = [ 18, '0xad5cdc3340904285b8159089974a99a1a09eb4c0', 'eth:cvxx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -263,7 +291,7 @@ export const botTokens = [ 18, '0xfebded1b0986a8ee107f5ab1a1c5a813491deceb', 'eth:crclx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -275,7 +303,7 @@ export const botTokens = [ 18, '0x053c784cd87b74f42e0c089f98643e79c1a3ff16', 'eth:cscox' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -287,7 +315,7 @@ export const botTokens = [ 18, '0xdcc1a2699441079da889b1f49e12b69cc791129b', 'eth:kox' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -299,7 +327,7 @@ export const botTokens = [ 18, '0x364f210f430ec2448fc68a49203040f6124096f0', 'eth:coinx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -311,7 +339,7 @@ export const botTokens = [ 18, '0xbc7170a1280be28513b4e940c681537eb25e39f4', 'eth:cmcsax' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -323,7 +351,7 @@ export const botTokens = [ 18, '0x214151022c2a5e380ab80cdac31f23ae554a7345', 'eth:crwdx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -335,7 +363,7 @@ export const botTokens = [ 18, '0xdba228936f4079daf9aa906fd48a87f2300405f4', 'eth:dhrx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -347,7 +375,7 @@ export const botTokens = [ 18, '0x521860bb5df5468358875266b89bfe90d990c6e7', 'eth:dfdvx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -359,7 +387,7 @@ export const botTokens = [ 18, '0x19c41ea77b34bbdee61c3a87a75d1abda2ed0be4', 'eth:llyx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -371,7 +399,7 @@ export const botTokens = [ 18, '0xeedb0273c5af792745180e9ff568cd01550ffa13', 'eth:xomx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -383,7 +411,7 @@ export const botTokens = [ 18, '0xe5f6d3b2405abdfe6f660e63202b25d23763160d', 'eth:gmex' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -395,7 +423,7 @@ export const botTokens = [ 18, '0x3ee7e9b3a992fd23cd1c363b0e296856b04ab149', 'eth:gsx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -407,7 +435,7 @@ export const botTokens = [ 18, '0x766b0cd6ed6d90b5d49d2c36a3761e9728501ba9', 'eth:hdx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -419,7 +447,7 @@ export const botTokens = [ 18, '0x62a48560861b0b451654bfffdb5be6e47aa8ff1b', 'eth:honx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -431,7 +459,7 @@ export const botTokens = [ 18, '0xf8a80d1cb9cfd70d03d655d9df42339846f3b3c8', 'eth:intcx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -443,7 +471,7 @@ export const botTokens = [ 18, '0xd9913208647671fe0f48f7f260076b2c6f310aac', 'eth:ibmx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -455,7 +483,7 @@ export const botTokens = [ 18, '0xa753a7395cae905cd615da0b82a53e0560f250af', 'eth:qqqx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -467,7 +495,7 @@ export const botTokens = [ 18, '0xdb0482cfad4789798623e64b15eeba01b16e917c', 'eth:jnjx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -479,7 +507,7 @@ export const botTokens = [ 18, '0xd9fc3e075d45254a1d834fea18af8041207dea0a', 'eth:jpmx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -491,7 +519,7 @@ export const botTokens = [ 18, '0x15059c599c16fd8f70b633ade165502d6402cd49', 'eth:linx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -503,7 +531,7 @@ export const botTokens = [ 18, '0xeaad46f4146ded5a47b55aa7f6c48c191deaec88', 'eth:mrvlx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -515,7 +543,7 @@ export const botTokens = [ 18, '0xb365cd2588065f522d379ad19e903304f6b622c6', 'eth:max' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -527,7 +555,7 @@ export const botTokens = [ 18, '0x80a77a372c1e12accda84299492f404902e2da67', 'eth:mcdx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -539,7 +567,7 @@ export const botTokens = [ 18, '0x0588e851ec0418d660bee81230d6c678daf21d46', 'eth:mdtx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -551,7 +579,7 @@ export const botTokens = [ 18, '0x17d8186ed8f68059124190d147174d0f6697dc40', 'eth:mrkx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -563,7 +591,7 @@ export const botTokens = [ 18, '0x96702be57cd9777f835117a809c7124fe4ec989a', 'eth:metax' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -575,7 +603,7 @@ export const botTokens = [ 18, '0x5621737f42dae558b81269fcb9e9e70c19aa6b35', 'eth:msftx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -587,7 +615,7 @@ export const botTokens = [ 18, '0xa6a65ac27e76cd53cb790473e4345c46e5ebf961', 'eth:nflxx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -599,7 +627,7 @@ export const botTokens = [ 18, '0xf9523e369c5f55ad72dbaa75b0a9b92b3d8b147e', 'eth:nvox' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -611,7 +639,7 @@ export const botTokens = [ 18, '0xc845b2894dbddd03858fd2d643b4ef725fe0849d', 'eth:nvdax' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -623,7 +651,7 @@ export const botTokens = [ 18, '0xbee6b69345f376598fe16abd5592c6f844825e66', 'eth:openx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -635,7 +663,7 @@ export const botTokens = [ 18, '0x548308e91ec9f285c7bff05295badbd56a6e4971', 'eth:orclx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -647,7 +675,7 @@ export const botTokens = [ 18, '0x6d482cec5f9dd1f05ccee9fd3ff79b246170f8e2', 'eth:pltrx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -659,7 +687,7 @@ export const botTokens = [ 18, '0x36c424a6ec0e264b1616102ad63ed2ad7857413e', 'eth:pepx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -671,7 +699,7 @@ export const botTokens = [ 18, '0x1ac765b5bea23184802c7d2d497f7c33f1444a9e', 'eth:pfex' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -683,7 +711,7 @@ export const botTokens = [ 18, '0x02a6c1789c3b4fdb1a7a3dfa39f90e5d3c94f4f9', 'eth:pmx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -695,7 +723,7 @@ export const botTokens = [ 18, '0xa90424d5d3e770e8644103ab503ed775dd1318fd', 'eth:pgx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -707,7 +735,7 @@ export const botTokens = [ 18, '0xfdddb57878ef9d6f681ec4381dcb626b9e69ac86', 'eth:tqqqx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -719,7 +747,7 @@ export const botTokens = [ 18, '0xe1385fdd5ffb10081cd52c56584f25efa9084015', 'eth:hoodx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -731,7 +759,7 @@ export const botTokens = [ 18, '0x4a4073f2eaf299a1be22254dcd2c41727f6f54a2', 'eth:crmx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -743,7 +771,7 @@ export const botTokens = [ 18, '0x2380f2673c640fb67e2d6b55b44c62f0e0e69da9', 'eth:gldx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -755,7 +783,7 @@ export const botTokens = [ 18, '0x90a2a4c76b5d8c0bc892a69ea28aa775a8f2dd48', 'eth:spyx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -767,7 +795,7 @@ export const botTokens = [ 18, '0xae2f842ef90c0d5213259ab82639d5bbf649b08e', 'eth:mstrx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -779,7 +807,7 @@ export const botTokens = [ 18, '0x1aad217b8f78dba5e6693460e8470f8b1a3977f3', 'eth:strcx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -791,7 +819,7 @@ export const botTokens = [ 18, '0x8ad3c73f833d3f9a523ab01476625f269aeb7cf0', 'eth:tslax' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -803,7 +831,7 @@ export const botTokens = [ 18, '0xaf072f109a2c173d822a4fe9af311a1b18f83d19', 'eth:tmox' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -815,7 +843,7 @@ export const botTokens = [ 18, '0xe95ab205e333443d7970336d5fd827ef9ed97608', 'eth:tonxx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -827,7 +855,7 @@ export const botTokens = [ 18, '0x167a6375da1efc4a5be0f470e73ecefd66245048', 'eth:unhx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -839,7 +867,7 @@ export const botTokens = [ 18, '0xbd730e618bcd88c82ddee52e10275cf2f88a4777', 'eth:vtix' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -851,7 +879,7 @@ export const botTokens = [ 18, '0x2363fd1235c1b6d3a5088ddf8df3a0b3a30c5293', 'eth:vx' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -863,7 +891,7 @@ export const botTokens = [ 18, '0x7aefc9965699fbea943e03264d96e50cd4a97b21', 'eth:wmtxstock' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -875,7 +903,7 @@ export const botTokens = [ 18, '0x03168025af98ef150696646ea433f08c9821769f', 'eth:gobucks' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -887,7 +915,7 @@ export const botTokens = [ 18, '0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8', 'eth:aethweth' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -899,7 +927,7 @@ export const botTokens = [ 18, '0xc00db6b41473d065027f5ed6fada20fde75f142e', 'eth:krwq' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -911,7 +939,7 @@ export const botTokens = [ 18, '0x67c312a26695ea9842bbcf1e1d0ee64694e42db6', 'eth:hybond' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth'), undefined, undefined, undefined @@ -923,7 +951,7 @@ export const botTokens = [ 8, '0x23878914efe38d27c4d67ab83ed1b93a74d4086a', 'eth:aethusdt' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -935,7 +963,7 @@ export const botTokens = [ 6, '0x98c23e9d8f34fefb1b7bd6a91b7ff122f4e16f5c', 'eth:aethusdc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -947,7 +975,7 @@ export const botTokens = [ 8, '0x5ee5bf7ae06d1be5997a1a72006fe6c607ec6de8', 'eth:aethwbtc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -959,7 +987,7 @@ export const botTokens = [ 8, '0x5c647ce0ae10658ec44fa4e11a51c96e94efd1dd', 'eth:aethcbbtc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -971,7 +999,7 @@ export const botTokens = [ 18, '0x4f5923fc5fd4a93352581b38b7cd26943012decf', 'eth:aethusde' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -983,7 +1011,7 @@ export const botTokens = [ 6, '0x8a2b6f94ff3a89a03e8c02ee92b55af90c9454a2', 'eth:aethxaut' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -995,7 +1023,7 @@ export const botTokens = [ 18, '0xa700b4eb416be35b2911fd5dee80678ff64ff6c9', 'eth:aethaave' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1007,7 +1035,7 @@ export const botTokens = [ 6, '0xaa6e91c82942aeae040303bf96c15a6dbcb82ca0', 'eth:aetheurc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1019,7 +1047,7 @@ export const botTokens = [ 6, '0x7c0477d085ecb607cf8429f3ec91ae5e1e460f4f', 'eth:aethusdg' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1031,7 +1059,7 @@ export const botTokens = [ 6, '0x0c0d01abf3e6adfca0989ebba9d6e85dd58eab1e', 'eth:aethpyusd' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1043,7 +1071,7 @@ export const botTokens = [ 18, '0x977b6fc5de62598b08c85ac8cf2b745874e8b78c', 'eth:aethcbeth' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1055,7 +1083,7 @@ export const botTokens = [ 6, '0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d', 'eth:spusdc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1067,7 +1095,7 @@ export const botTokens = [ 6, '0xe2e7a17dff93280dec073c995595155283e3c372', 'eth:spusdt' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1079,7 +1107,7 @@ export const botTokens = [ 18, '0xfe6eb3b609a7c8352a241f7f3a21cea4e9209b8f', 'eth:speth' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1091,7 +1119,7 @@ export const botTokens = [ 6, '0x80128dbb9f07b93dde62a6daeadb69ed14a7d354', 'eth:sppyusd' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1103,7 +1131,7 @@ export const botTokens = [ 18, '0x12b54025c112aa61face2cdb7118740875a566e9', 'eth:spwsteth' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1115,7 +1143,7 @@ export const botTokens = [ 18, '0x59cd1c87501baa753d0b5b5ab5d8416a45cd71db', 'eth:spweth' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1127,7 +1155,7 @@ export const botTokens = [ 8, '0x4197ba364ae6698015ae5c1468f54087602715b2', 'eth:spwbtc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1139,7 +1167,7 @@ export const botTokens = [ 8, '0xb3973d459df38ae57797811f2a1fd061da1bc123', 'eth:spcbbtc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1151,7 +1179,7 @@ export const botTokens = [ 6, '0x80ac24aa929eaf5013f6436cda2a7ba190f5cc0b', 'eth:syrupusdc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1163,7 +1191,7 @@ export const botTokens = [ 6, '0x356b8d89c1e1239cbbb9de4815c39a1474d5ba7d', 'eth:syrupusdt' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1175,7 +1203,7 @@ export const botTokens = [ 6, '0xe7df13b8e3d6740fe17cbe928c7334243d86c92f', 'eth:sparkusdt' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1187,7 +1215,7 @@ export const botTokens = [ 6, '0x779224df1c756b4edd899854f32a53e8c2b2ce5d', 'eth:sparkpyusd' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1199,7 +1227,7 @@ export const botTokens = [ 6, '0x377c3bd93f2a2984e1e7be6a5c22c525ed4a4815', 'eth:sparkusdc' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['receipt-token' as CoinFeature]), undefined, undefined, undefined @@ -1211,7 +1239,186 @@ export const botTokens = [ 18, '0x0b925ed163218f6662a35e0f0371ac234f9e9371', 'eth:aethwsteth' as unknown as UnderlyingAsset, - networkFeatureMapForTokens['eth'], + getTokenFeatures('eth', ['rebase-token' as CoinFeature, 'receipt-token' as CoinFeature]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '48d76727-de8a-4e7b-a3d7-6c522b521aa1', + 'eth:gusdcq', + 'Galaxy USDC Quality', + 18, + '0x91600e31fbedc72433d4a57f16639cfe661be7d8', + 'eth:gusdcq' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + 'receipt-token' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '64ebeef7-7375-4259-8006-127714dd0ddc', + 'eth:gusdtq', + 'Galaxy USDT Quality', + 18, + '0x71ffb6a81786ec285d429d531cf655107b9d878d', + 'eth:gusdtq' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + 'receipt-token' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '6ac1354a-72a7-403f-9150-3013011e23d4', + 'eth:gwethq', + 'Galaxy WETH Quality', + 18, + '0x1878805799273d10ae96a58201a6f5254cf9824f', + 'eth:gwethq' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + 'receipt-token' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '83266196-2819-4809-9d47-6f0b99679557', + 'eth:acu', + 'Acurast', + 12, + '0x216b3643ff8b7bb30d8a48e9f1bd550126202add', + 'eth:acu' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '431af581-cfdc-42eb-a647-a4df29caa2a3', + 'eth:obol', + 'Obol', + 18, + '0x0b010000b7624eb9b3dfbc279673c76e9d29d5f7', + 'eth:obol' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '323781ae-52df-4235-be37-d766a5b80f4c', + 'eth:re', + 'Re Protocol', + 18, + '0x526526528f35ac738177003b8773b402b8df8143', + 'eth:re' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '01838a78-6c97-450f-8953-c773b8e2b29d', + 'eth:filqa', + 'Fidelity USD Digital Liquidity Fund-Acc', + 2, + '0x54a4fc78431f9201824643e99bec891bb7462a1d', + 'eth:filqa' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '704a5f49-9cc7-4285-a3f8-f072c460d846', + 'eth:filqd', + 'Fidelity USD Digital Liquidity Fund-Dist', + 2, + '0xf0db6f529581e7f6ebac7a7f6882923c00fc3a66', + 'eth:filqd' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + 'c622923a-848f-408a-a568-b5fda0bdbbb7', + 'eth:wylds', + 'Hastra wYLDS', + 6, + '0x6ad038ca6c04e885630851278ca0a856ad9a66cc', + 'eth:wylds' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '365ef4d7-2e69-407d-a41f-74ea563f718d', + 'eth:hprime', + 'Hastra PRIME', + 6, + '0x19ebb35279a16207ec4ba82799cc64715065f7f6', + 'eth:hprime' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), + undefined, + undefined, + undefined + ), + AccountCtors.erc20( + '7710885e-6a97-4861-8682-30ea97ae3ba9', + 'eth:bill', + 'Billions Network', + 18, + '0xb1110919016846972056ab995054d65560d5f05e', + 'eth:bill' as unknown as UnderlyingAsset, + getTokenFeatures('eth', [ + 'custody-bitgo-new-york' as CoinFeature, + 'custody-bitgo-germany' as CoinFeature, + 'custody-bitgo-korea' as CoinFeature, + ]), undefined, undefined, undefined diff --git a/modules/statics/src/coins/ofcCoins.ts b/modules/statics/src/coins/ofcCoins.ts index 27e4942f87..4940fcf13f 100644 --- a/modules/statics/src/coins/ofcCoins.ts +++ b/modules/statics/src/coins/ofcCoins.ts @@ -4818,7 +4818,7 @@ export const ofcCoins = [ 6, UnderlyingAsset['sol:tusdc'] ), - ofcsolToken('4c928099-4b07-457a-944e-58ed464418de', 'ofcsol:slx', 'Solstice', 9, UnderlyingAsset['sol:slx']), + ofcsolToken('4c928099-4b07-457a-944e-58ed464418de', 'ofcsol:slx', 'Solstice', 6, UnderlyingAsset['sol:slx']), ofcsolToken('8ff32b48-1bab-4769-b239-d34afbb74a89', 'ofcsol:ab1', 'Animoca', 0, UnderlyingAsset['sol:ab1']), // New Canton OFC tokens ofcCantonToken( diff --git a/modules/statics/src/coins/solTokens.ts b/modules/statics/src/coins/solTokens.ts index a2832fbbe6..efb9f5e507 100644 --- a/modules/statics/src/coins/solTokens.ts +++ b/modules/statics/src/coins/solTokens.ts @@ -3997,7 +3997,7 @@ export const solTokens = [ '777c1935-c7dd-4652-85cd-4fbc188934aa', 'sol:slx', 'Solstice', - 9, + 6, 'SLXdx4BUt2v9uJQNzWqSfzTJ9UKLUDsvxHFMEEdrfgq', 'SLXdx4BUt2v9uJQNzWqSfzTJ9UKLUDsvxHFMEEdrfgq', UnderlyingAsset['sol:slx'], diff --git a/modules/utxo-bin/package.json b/modules/utxo-bin/package.json index c1db06e869..84750eec44 100644 --- a/modules/utxo-bin/package.json +++ b/modules/utxo-bin/package.json @@ -31,7 +31,7 @@ "@bitgo/unspents": "^0.51.5", "@bitgo/utxo-core": "^1.39.1", "@bitgo/utxo-lib": "^11.23.0", - "@bitgo/wasm-utxo": "^4.14.1", + "@bitgo/wasm-utxo": "^4.16.0", "@noble/curves": "1.8.1", "archy": "^1.0.0", "bech32": "^2.0.0", diff --git a/modules/utxo-core/package.json b/modules/utxo-core/package.json index 781870faf0..237db12619 100644 --- a/modules/utxo-core/package.json +++ b/modules/utxo-core/package.json @@ -81,7 +81,7 @@ "@bitgo/secp256k1": "^1.11.0", "@bitgo/unspents": "^0.51.5", "@bitgo/utxo-lib": "^11.23.0", - "@bitgo/wasm-utxo": "^4.14.1", + "@bitgo/wasm-utxo": "^4.16.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", "fast-sha256": "^1.3.0" }, diff --git a/modules/utxo-descriptors/package.json b/modules/utxo-descriptors/package.json index a85b9cc11d..89e0d57b38 100644 --- a/modules/utxo-descriptors/package.json +++ b/modules/utxo-descriptors/package.json @@ -60,6 +60,6 @@ }, "dependencies": { "@bitgo/utxo-core": "^1.39.1", - "@bitgo/wasm-utxo": "^4.14.1" + "@bitgo/wasm-utxo": "^4.16.0" } } diff --git a/modules/utxo-lib/src/bitgo/transaction.ts b/modules/utxo-lib/src/bitgo/transaction.ts index 1c7d0e040f..6ce2f8811b 100644 --- a/modules/utxo-lib/src/bitgo/transaction.ts +++ b/modules/utxo-lib/src/bitgo/transaction.ts @@ -154,8 +154,8 @@ export function createPsbtFromTransaction(tx: UtxoTransaction, prevOuts: } export function getDefaultTransactionVersion(network: Network): number { - // Use NU6_1 version for both mainnet and testnet - // https://zips.z.cash/zip-0255 + // Mainnet activated NU6.2 at block 3364600; testnet has not (activation 4052000), + // so testnet still builds NU6.1 transactions. if (network === networks.zcashTest) { return ZcashTransaction.VERSION4_BRANCH_NU6_1; } @@ -167,7 +167,7 @@ export function getDefaultTransactionVersion(network: Network): number { case networks.ecash: return 2; case networks.zcash: - return ZcashTransaction.VERSION4_BRANCH_NU6_1; + return ZcashTransaction.VERSION4_BRANCH_NU6_2; default: return 1; } @@ -219,9 +219,11 @@ export function setPsbtDefaults( ZcashTransaction.VERSION4_BRANCH_NU5, ZcashTransaction.VERSION4_BRANCH_NU6, ZcashTransaction.VERSION4_BRANCH_NU6_1, + ZcashTransaction.VERSION4_BRANCH_NU6_2, ZcashTransaction.VERSION5_BRANCH_NU5, ZcashTransaction.VERSION5_BRANCH_NU6, ZcashTransaction.VERSION5_BRANCH_NU6_1, + ZcashTransaction.VERSION5_BRANCH_NU6_2, ].includes(version) ) { throw new Error(`invalid version`); diff --git a/modules/utxo-lib/src/bitgo/zcash/ZcashPsbt.ts b/modules/utxo-lib/src/bitgo/zcash/ZcashPsbt.ts index 2ed2180abd..08927d8a06 100644 --- a/modules/utxo-lib/src/bitgo/zcash/ZcashPsbt.ts +++ b/modules/utxo-lib/src/bitgo/zcash/ZcashPsbt.ts @@ -122,12 +122,14 @@ export class ZcashPsbt extends UtxoPsbt> { case ZcashTransaction.VERSION4_BRANCH_NU5: case ZcashTransaction.VERSION4_BRANCH_NU6: case ZcashTransaction.VERSION4_BRANCH_NU6_1: + case ZcashTransaction.VERSION4_BRANCH_NU6_2: this.setVersion(4); break; case 5: case ZcashTransaction.VERSION5_BRANCH_NU5: case ZcashTransaction.VERSION5_BRANCH_NU6: case ZcashTransaction.VERSION5_BRANCH_NU6_1: + case ZcashTransaction.VERSION5_BRANCH_NU6_2: this.setVersion(5); break; default: diff --git a/modules/utxo-lib/src/bitgo/zcash/ZcashTransaction.ts b/modules/utxo-lib/src/bitgo/zcash/ZcashTransaction.ts index 06073e83e2..f44fdabe66 100644 --- a/modules/utxo-lib/src/bitgo/zcash/ZcashTransaction.ts +++ b/modules/utxo-lib/src/bitgo/zcash/ZcashTransaction.ts @@ -25,6 +25,8 @@ const CANOPY_BRANCH_ID = 0xe9ff75a6; const NU5_BRANCH_ID = 0xc2d6d0b4; const NU6_BRANCH_ID = 0xc8e71055; const NU6_1_BRANCH_ID = 0x4dec4df0; // https://zips.z.cash/zip-0255 +// NU6.2 emergency hard fork re-enabling Orchard with a corrected circuit (mainnet block 3364600). +const NU6_2_BRANCH_ID = 0x5437f330; export class UnsupportedTransactionError extends Error { constructor(message: string) { @@ -38,18 +40,20 @@ export function getDefaultVersionGroupIdForVersion(version: number): number { case 450: case 455: case 456: + case 457: return SAPLING_VERSION_GROUP_ID; case 500: case 550: case 551: + case 552: return ZIP225_VERSION_GROUP_ID; } throw new Error(`no value for version ${version}`); } export function getDefaultConsensusBranchIdForVersion(network: ZcashNetwork, version: number): number { - // Use NU6.1 version for testnet, activated on mainnet in block 2726400 - // https://zips.z.cash/zip-0255 + // Testnet has not yet activated NU6.2 (testnet activation block 4052000), so keep + // defaulting to NU6.1 there. Mainnet activated NU6.2 at block 3364600. if (network === networks.zcashTest) { if (version === 4 || version === 5) { return NU6_1_BRANCH_ID; @@ -74,12 +78,16 @@ export function getDefaultConsensusBranchIdForVersion(network: ZcashNetwork, ver case ZcashTransaction.VERSION5_BRANCH_NU6: // https://zips.z.cash/zip-0253 return NU6_BRANCH_ID; - case 4: - case 5: case ZcashTransaction.VERSION4_BRANCH_NU6_1: case ZcashTransaction.VERSION5_BRANCH_NU6_1: // https://zips.z.cash/zip-0255 return NU6_1_BRANCH_ID; + case 4: + case 5: + case ZcashTransaction.VERSION4_BRANCH_NU6_2: + case ZcashTransaction.VERSION5_BRANCH_NU6_2: + // NU6.2 — emergency hard fork re-enabling Orchard, mainnet block 3364600 + return NU6_2_BRANCH_ID; } throw new Error(`no value for version ${version}`); } @@ -93,9 +101,11 @@ export class ZcashTransaction extends static VERSION4_BRANCH_NU5 = 450; static VERSION4_BRANCH_NU6 = 455; static VERSION4_BRANCH_NU6_1 = 456; + static VERSION4_BRANCH_NU6_2 = 457; static VERSION5_BRANCH_NU5 = 500; static VERSION5_BRANCH_NU6 = 550; static VERSION5_BRANCH_NU6_1 = 551; + static VERSION5_BRANCH_NU6_2 = 552; // 1 if the transaction is post overwinter upgrade, 0 otherwise overwintered = 0; diff --git a/modules/utxo-lib/src/bitgo/zcash/ZcashTransactionBuilder.ts b/modules/utxo-lib/src/bitgo/zcash/ZcashTransactionBuilder.ts index 63b1657a09..90ce9f9df6 100644 --- a/modules/utxo-lib/src/bitgo/zcash/ZcashTransactionBuilder.ts +++ b/modules/utxo-lib/src/bitgo/zcash/ZcashTransactionBuilder.ts @@ -74,12 +74,14 @@ export class ZcashTransactionBuilder e case ZcashTransaction.VERSION4_BRANCH_NU5: case ZcashTransaction.VERSION4_BRANCH_NU6: case ZcashTransaction.VERSION4_BRANCH_NU6_1: + case ZcashTransaction.VERSION4_BRANCH_NU6_2: this.setVersion(4); break; case 5: case ZcashTransaction.VERSION5_BRANCH_NU5: case ZcashTransaction.VERSION5_BRANCH_NU6: case ZcashTransaction.VERSION5_BRANCH_NU6_1: + case ZcashTransaction.VERSION5_BRANCH_NU6_2: this.setVersion(5); break; default: diff --git a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.fullsigned.json b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.fullsigned.json index ecbdc83584..98f068abb5 100644 --- a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.fullsigned.json +++ b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.fullsigned.json @@ -4,16 +4,16 @@ "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" ], - "psbtBase64": "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", - "psbtBase64Finalized": "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", + "psbtBase64": "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", + "psbtBase64Finalized": "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", "inputs": [ { - "hash": "ed950a6fa3ff06d2c22ca7c7834bb067ae7b2331ccf1d48e847a0c5475dd1975", + "hash": "4bc48f52371ae8a886f68e4a9e9417b635e6751f58c38d84591ac357f15cb28c", "index": 0, "sequence": 4294967295 }, { - "hash": "144896e405e26925e0c7549d778b57c737449963ca999e6b61a3ee2e129aa418", + "hash": "48b85379ca34c6f2831bafb3d6cc6c4c7cf040a9068b0f2df7c1d4889fb32486", "index": 1, "sequence": 4294967295 } @@ -28,11 +28,11 @@ "partialSig": [ { "pubkey": "03e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b", - "signature": "30450221009540f61ff6f751a8b3af6879d4a7962a6c5f0135c239a6dd2e5c57c9afcc27af022052d8e04bc825137514b77b8164f2ccaf8717b57c5cc453ce43054e0f10be7f9301" + "signature": "3045022100d5ea6b5412f60a3e6cd3ed334d63391a76a8c790856473daed421b897801cdd102207269c0d0f23c7846c008401882654440a84c6ee1c2dea012aa20549cefa85d0901" }, { "pubkey": "03f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f", - "signature": "3044022062b22ff49dea9ffaacf06ab4a38ea3c655127a5887e9da5e9afea43496cb1a29022004f8455ddca8c1563250ed08ddc1014edc16f7ef6c5b7707ee7d931e09543c7401" + "signature": "3045022100aa3dc3f88fb3938f477a8f144d23c2f36dbea2824a0dfe4212d262209a713954022007c7b5550b06993c92a874451bc0c922b77294497f064ca61cc217f0ac05151e01" } ], "sighashType": 1, @@ -64,7 +64,7 @@ "partialSig": [ { "pubkey": "0336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095", - "signature": "3045022100fd365630d2236decb096b5bf33342163982354c60e80ee4e47724749f06419a902202c45bd8b310a6304cfc0f19999236196a53e8fd354efddff341aabda0601fc6501" + "signature": "3045022100fc701cbd800adb19f7cb2c26dd773ecb9f8ace86b869a3045bcc0b027ad477d102201a31a56fc7acf61beddb7a9157edab4414e1c8ce92af3b50096e80c9ecb0538401" } ], "sighashType": 1, @@ -78,7 +78,7 @@ "script": "a914567cd7b44f9f3a07c3138f37bf984b60fbbaf24387", "value": "2000" }, - "finalScriptSig": "00473044022062b22ff49dea9ffaacf06ab4a38ea3c655127a5887e9da5e9afea43496cb1a29022004f8455ddca8c1563250ed08ddc1014edc16f7ef6c5b7707ee7d931e09543c74014830450221009540f61ff6f751a8b3af6879d4a7962a6c5f0135c239a6dd2e5c57c9afcc27af022052d8e04bc825137514b77b8164f2ccaf8717b57c5cc453ce43054e0f10be7f93014c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53ae" + "finalScriptSig": "00483045022100aa3dc3f88fb3938f477a8f144d23c2f36dbea2824a0dfe4212d262209a713954022007c7b5550b06993c92a874451bc0c922b77294497f064ca61cc217f0ac05151e01483045022100d5ea6b5412f60a3e6cd3ed334d63391a76a8c790856473daed421b897801cdd102207269c0d0f23c7846c008401882654440a84c6ee1c2dea012aa20549cefa85d09014c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53ae" }, { "type": "p2shP2pk", @@ -86,7 +86,7 @@ "script": "a91420b37094d82a513451ff0ccd9db23aba05bc5ef387", "value": "2000" }, - "finalScriptSig": "483045022100fd365630d2236decb096b5bf33342163982354c60e80ee4e47724749f06419a902202c45bd8b310a6304cfc0f19999236196a53e8fd354efddff341aabda0601fc650123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095ac" + "finalScriptSig": "483045022100fc701cbd800adb19f7cb2c26dd773ecb9f8ace86b869a3045bcc0b027ad477d102201a31a56fc7acf61beddb7a9157edab4414e1c8ce92af3b50096e80c9ecb053840123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095ac" } ], "outputs": [ @@ -151,5 +151,5 @@ {}, {} ], - "extractedTransaction": "0400008085202f8902ed950a6fa3ff06d2c22ca7c7834bb067ae7b2331ccf1d48e847a0c5475dd197500000000fdfd0000473044022062b22ff49dea9ffaacf06ab4a38ea3c655127a5887e9da5e9afea43496cb1a29022004f8455ddca8c1563250ed08ddc1014edc16f7ef6c5b7707ee7d931e09543c74014830450221009540f61ff6f751a8b3af6879d4a7962a6c5f0135c239a6dd2e5c57c9afcc27af022052d8e04bc825137514b77b8164f2ccaf8717b57c5cc453ce43054e0f10be7f93014c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53aeffffffff144896e405e26925e0c7549d778b57c737449963ca999e6b61a3ee2e129aa418010000006d483045022100fd365630d2236decb096b5bf33342163982354c60e80ee4e47724749f06419a902202c45bd8b310a6304cfc0f19999236196a53e8fd354efddff341aabda0601fc650123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095acffffffff04840300000000000017a914d909474404c124a3d04c3fbff61faa49cf43c58b87840300000000000017a9144efd761e9be61caa421c8aac4a902ad6f2a54bcf87840300000000000017a914d24d3816be8a250cbdde7eaa674f80170cda944e870000000000000000116a0f736574656320617374726f6e6f6d7900000000000000000000000000000000000000" + "extractedTransaction": "0400008085202f89024bc48f52371ae8a886f68e4a9e9417b635e6751f58c38d84591ac357f15cb28c00000000fdfe0000483045022100aa3dc3f88fb3938f477a8f144d23c2f36dbea2824a0dfe4212d262209a713954022007c7b5550b06993c92a874451bc0c922b77294497f064ca61cc217f0ac05151e01483045022100d5ea6b5412f60a3e6cd3ed334d63391a76a8c790856473daed421b897801cdd102207269c0d0f23c7846c008401882654440a84c6ee1c2dea012aa20549cefa85d09014c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53aeffffffff48b85379ca34c6f2831bafb3d6cc6c4c7cf040a9068b0f2df7c1d4889fb32486010000006d483045022100fc701cbd800adb19f7cb2c26dd773ecb9f8ace86b869a3045bcc0b027ad477d102201a31a56fc7acf61beddb7a9157edab4414e1c8ce92af3b50096e80c9ecb053840123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095acffffffff04840300000000000017a914d909474404c124a3d04c3fbff61faa49cf43c58b87840300000000000017a9144efd761e9be61caa421c8aac4a902ad6f2a54bcf87840300000000000017a914d24d3816be8a250cbdde7eaa674f80170cda944e870000000000000000116a0f736574656320617374726f6e6f6d7900000000000000000000000000000000000000" } diff --git a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.halfsigned.json b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.halfsigned.json index cad8362a60..342b19848a 100644 --- a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.halfsigned.json +++ b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.halfsigned.json @@ -4,16 +4,16 @@ "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" ], - "psbtBase64": "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", + "psbtBase64": "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", "psbtBase64Finalized": null, "inputs": [ { - "hash": "ed950a6fa3ff06d2c22ca7c7834bb067ae7b2331ccf1d48e847a0c5475dd1975", + "hash": "4bc48f52371ae8a886f68e4a9e9417b635e6751f58c38d84591ac357f15cb28c", "index": 0, "sequence": 4294967295 }, { - "hash": "144896e405e26925e0c7549d778b57c737449963ca999e6b61a3ee2e129aa418", + "hash": "48b85379ca34c6f2831bafb3d6cc6c4c7cf040a9068b0f2df7c1d4889fb32486", "index": 1, "sequence": 4294967295 } @@ -28,7 +28,7 @@ "partialSig": [ { "pubkey": "03f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f", - "signature": "3044022062b22ff49dea9ffaacf06ab4a38ea3c655127a5887e9da5e9afea43496cb1a29022004f8455ddca8c1563250ed08ddc1014edc16f7ef6c5b7707ee7d931e09543c7401" + "signature": "3045022100aa3dc3f88fb3938f477a8f144d23c2f36dbea2824a0dfe4212d262209a713954022007c7b5550b06993c92a874451bc0c922b77294497f064ca61cc217f0ac05151e01" } ], "sighashType": 1, @@ -60,7 +60,7 @@ "partialSig": [ { "pubkey": "0336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095", - "signature": "3045022100fd365630d2236decb096b5bf33342163982354c60e80ee4e47724749f06419a902202c45bd8b310a6304cfc0f19999236196a53e8fd354efddff341aabda0601fc6501" + "signature": "3045022100fc701cbd800adb19f7cb2c26dd773ecb9f8ace86b869a3045bcc0b027ad477d102201a31a56fc7acf61beddb7a9157edab4414e1c8ce92af3b50096e80c9ecb0538401" } ], "sighashType": 1, diff --git a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.unsigned.json b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.unsigned.json index a0e30c2878..48461f2b0d 100644 --- a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.unsigned.json +++ b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt-lite.zcash.unsigned.json @@ -4,16 +4,16 @@ "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" ], - "psbtBase64": "cHNidP8BAOkEAACAhSAviQLtlQpvo/8G0sIsp8eDS7BnrnsjMczx1I6EegxUdd0ZdQAAAAAA/////xRIluQF4mkl4MdUnXeLV8c3RJljypmea2Gj7i4SmqQYAQAAAAD/////BIQDAAAAAAAAF6kU2QlHRATBJKPQTD+/9h+qSc9DxYuHhAMAAAAAAAAXqRRO/XYem+YcqkIciqxKkCrW8qVLz4eEAwAAAAAAABepFNJNOBa+iiUMvd5+qmdPgBcM2pROhwAAAAAAAAAAEWoPc2V0ZWMgYXN0cm9ub215AAAAAAAAAAAAAAAAAAAAAAAAAE8BBIiyHgAAAAAAAAAAADqSLinwyOsNsqYEhMvctjH2sQfJyq4//c8+fS7B9rzQAxIUhxXzYdq2haZp1CQx5dbT+XNATaucn9G5ULJ5rXY0BMwYrghPAQSIsh4AAAAAAAAAAABtHWVtPd2RwZTARWWjYDcCohAWztFKJl84mC1ideZ7ZAPTusIxOnxrIcuxGxSw0QNB+SLApAOovYyH8NyCDzWvbgT2XNhpTwEEiLIeAAAAAAAAAAAAywT9Y6s02Q/mRmuIDioCzPioYzdDEpka+JEbGqq0QzQDNu8ij/6bjv/7oFLDLTNGYN0fg2bPj+RK5apnK2tikJUE8u8DiQj8BUJJVEdPAATwTexNAAEBINAHAAAAAAAAF6kUVnzXtE+fOgfDE483v5hLYPu68kOHAQMEAQAAAAEEaVIhA/b0B2S9XWPyAKJ3iIOs916W8VCVyZgmPAhycNDJfn5/IQNf+3q8cBWeBGn0uYmm1eF4WikEFp/wULL0aP5dPV278iED4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1tTriIGA1/7erxwFZ4EafS5iabV4XhaKQQWn/BQsvRo/l09XbvyFMwYrggAAAAAAAAAAAEAAAAAAAAAIgYD4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1sU9lzYaQAAAAAAAAAAAQAAAAAAAAAiBgP29AdkvV1j8gCid4iDrPdelvFQlcmYJjwIcnDQyX5+fxTy7wOJAAAAAAAAAAABAAAAAAAAAAABASDQBwAAAAAAABepFCCzcJTYKlE0Uf8MzZ2yOroFvF7zhwEDBAEAAAABBCMhAzbvIo/+m47/+6BSwy0zRmDdH4Nmz4/kSuWqZytrYpCVrAABAGlSIQLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCSEC1y/Q0NkCk0NK1fyhYPJ44DxhRJeqTkJc9FTiwTMPlqshA0TYhBNt9VAgKGX/vGIYx/nIj+bOOclFeYGQuts4p1LxU64iAgLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCRTy7wOJAAAAAAAAAAAAAAAAAAAAACICAtcv0NDZApNDStX8oWDyeOA8YUSXqk5CXPRU4sEzD5arFMwYrggAAAAAAAAAAAAAAAAAAAAAIgIDRNiEE231UCAoZf+8YhjH+ciP5s45yUV5gZC62zinUvEU9lzYaQAAAAAAAAAAAAAAAAAAAAAAAQBpUiEDa3kQtZHTp1bV7nWl6MwOJ+dF6FUw/qvSfU9YR6UPMIYhAq/hLVd9GiCj7a/C/T0lWs59G4sYPQr53T++W/VUOrx9IQNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAEVOuIgICr+EtV30aIKPtr8L9PSVazn0bixg9CvndP75b9VQ6vH0U1K2DcgAAAAAAAAAAAAAAAAEAAAAiAgNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAERRAXGW9AAAAAAAAAAAAAAAAAQAAACICA2t5ELWR06dW1e51pejMDifnRehVMP6r0n1PWEelDzCGFFR/RXYAAAAAAAAAAAAAAAABAAAAAAAA", + "psbtBase64": "cHNidP8BAOkEAACAhSAviQJLxI9SNxroqIb2jkqelBe2NeZ1H1jDjYRZGsNX8VyyjAAAAAAA/////0i4U3nKNMbygxuvs9bMbEx88ECpBosPLffB1IifsySGAQAAAAD/////BIQDAAAAAAAAF6kU2QlHRATBJKPQTD+/9h+qSc9DxYuHhAMAAAAAAAAXqRRO/XYem+YcqkIciqxKkCrW8qVLz4eEAwAAAAAAABepFNJNOBa+iiUMvd5+qmdPgBcM2pROhwAAAAAAAAAAEWoPc2V0ZWMgYXN0cm9ub215AAAAAAAAAAAAAAAAAAAAAAAAAE8BBIiyHgAAAAAAAAAAADqSLinwyOsNsqYEhMvctjH2sQfJyq4//c8+fS7B9rzQAxIUhxXzYdq2haZp1CQx5dbT+XNATaucn9G5ULJ5rXY0BMwYrghPAQSIsh4AAAAAAAAAAABtHWVtPd2RwZTARWWjYDcCohAWztFKJl84mC1ideZ7ZAPTusIxOnxrIcuxGxSw0QNB+SLApAOovYyH8NyCDzWvbgT2XNhpTwEEiLIeAAAAAAAAAAAAywT9Y6s02Q/mRmuIDioCzPioYzdDEpka+JEbGqq0QzQDNu8ij/6bjv/7oFLDLTNGYN0fg2bPj+RK5apnK2tikJUE8u8DiQj8BUJJVEdPAAQw8zdUAAEBINAHAAAAAAAAF6kUVnzXtE+fOgfDE483v5hLYPu68kOHAQMEAQAAAAEEaVIhA/b0B2S9XWPyAKJ3iIOs916W8VCVyZgmPAhycNDJfn5/IQNf+3q8cBWeBGn0uYmm1eF4WikEFp/wULL0aP5dPV278iED4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1tTriIGA1/7erxwFZ4EafS5iabV4XhaKQQWn/BQsvRo/l09XbvyFMwYrggAAAAAAAAAAAEAAAAAAAAAIgYD4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1sU9lzYaQAAAAAAAAAAAQAAAAAAAAAiBgP29AdkvV1j8gCid4iDrPdelvFQlcmYJjwIcnDQyX5+fxTy7wOJAAAAAAAAAAABAAAAAAAAAAABASDQBwAAAAAAABepFCCzcJTYKlE0Uf8MzZ2yOroFvF7zhwEDBAEAAAABBCMhAzbvIo/+m47/+6BSwy0zRmDdH4Nmz4/kSuWqZytrYpCVrAABAGlSIQLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCSEC1y/Q0NkCk0NK1fyhYPJ44DxhRJeqTkJc9FTiwTMPlqshA0TYhBNt9VAgKGX/vGIYx/nIj+bOOclFeYGQuts4p1LxU64iAgLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCRTy7wOJAAAAAAAAAAAAAAAAAAAAACICAtcv0NDZApNDStX8oWDyeOA8YUSXqk5CXPRU4sEzD5arFMwYrggAAAAAAAAAAAAAAAAAAAAAIgIDRNiEE231UCAoZf+8YhjH+ciP5s45yUV5gZC62zinUvEU9lzYaQAAAAAAAAAAAAAAAAAAAAAAAQBpUiEDa3kQtZHTp1bV7nWl6MwOJ+dF6FUw/qvSfU9YR6UPMIYhAq/hLVd9GiCj7a/C/T0lWs59G4sYPQr53T++W/VUOrx9IQNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAEVOuIgICr+EtV30aIKPtr8L9PSVazn0bixg9CvndP75b9VQ6vH0U1K2DcgAAAAAAAAAAAAAAAAEAAAAiAgNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAERRAXGW9AAAAAAAAAAAAAAAAAQAAACICA2t5ELWR06dW1e51pejMDifnRehVMP6r0n1PWEelDzCGFFR/RXYAAAAAAAAAAAAAAAABAAAAAAAA", "psbtBase64Finalized": null, "inputs": [ { - "hash": "ed950a6fa3ff06d2c22ca7c7834bb067ae7b2331ccf1d48e847a0c5475dd1975", + "hash": "4bc48f52371ae8a886f68e4a9e9417b635e6751f58c38d84591ac357f15cb28c", "index": 0, "sequence": 4294967295 }, { - "hash": "144896e405e26925e0c7549d778b57c737449963ca999e6b61a3ee2e129aa418", + "hash": "48b85379ca34c6f2831bafb3d6cc6c4c7cf040a9068b0f2df7c1d4889fb32486", "index": 1, "sequence": 4294967295 } diff --git a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.fullsigned.json b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.fullsigned.json index de67d8b5b3..2c1867f22e 100644 --- a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.fullsigned.json +++ b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.fullsigned.json @@ -4,16 +4,16 @@ "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" ], - "psbtBase64": "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", - "psbtBase64Finalized": "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", + "psbtBase64": "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", + "psbtBase64Finalized": "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", "inputs": [ { - "hash": "ed950a6fa3ff06d2c22ca7c7834bb067ae7b2331ccf1d48e847a0c5475dd1975", + "hash": "4bc48f52371ae8a886f68e4a9e9417b635e6751f58c38d84591ac357f15cb28c", "index": 0, "sequence": 4294967295 }, { - "hash": "144896e405e26925e0c7549d778b57c737449963ca999e6b61a3ee2e129aa418", + "hash": "48b85379ca34c6f2831bafb3d6cc6c4c7cf040a9068b0f2df7c1d4889fb32486", "index": 1, "sequence": 4294967295 } @@ -48,11 +48,11 @@ "partialSig": [ { "pubkey": "03f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f", - "signature": "3044022062b22ff49dea9ffaacf06ab4a38ea3c655127a5887e9da5e9afea43496cb1a29022004f8455ddca8c1563250ed08ddc1014edc16f7ef6c5b7707ee7d931e09543c7401" + "signature": "3045022100aa3dc3f88fb3938f477a8f144d23c2f36dbea2824a0dfe4212d262209a713954022007c7b5550b06993c92a874451bc0c922b77294497f064ca61cc217f0ac05151e01" }, { "pubkey": "03e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b", - "signature": "30450221009540f61ff6f751a8b3af6879d4a7962a6c5f0135c239a6dd2e5c57c9afcc27af022052d8e04bc825137514b77b8164f2ccaf8717b57c5cc453ce43054e0f10be7f9301" + "signature": "3045022100d5ea6b5412f60a3e6cd3ed334d63391a76a8c790856473daed421b897801cdd102207269c0d0f23c7846c008401882654440a84c6ee1c2dea012aa20549cefa85d0901" } ] }, @@ -68,7 +68,7 @@ "partialSig": [ { "pubkey": "0336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095", - "signature": "3045022100fd365630d2236decb096b5bf33342163982354c60e80ee4e47724749f06419a902202c45bd8b310a6304cfc0f19999236196a53e8fd354efddff341aabda0601fc6501" + "signature": "3045022100fc701cbd800adb19f7cb2c26dd773ecb9f8ace86b869a3045bcc0b027ad477d102201a31a56fc7acf61beddb7a9157edab4414e1c8ce92af3b50096e80c9ecb0538401" } ] } @@ -80,7 +80,7 @@ "script": "a914567cd7b44f9f3a07c3138f37bf984b60fbbaf24387", "value": "2000" }, - "finalScriptSig": "00473044022062b22ff49dea9ffaacf06ab4a38ea3c655127a5887e9da5e9afea43496cb1a29022004f8455ddca8c1563250ed08ddc1014edc16f7ef6c5b7707ee7d931e09543c74014830450221009540f61ff6f751a8b3af6879d4a7962a6c5f0135c239a6dd2e5c57c9afcc27af022052d8e04bc825137514b77b8164f2ccaf8717b57c5cc453ce43054e0f10be7f93014c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53ae" + "finalScriptSig": "00483045022100aa3dc3f88fb3938f477a8f144d23c2f36dbea2824a0dfe4212d262209a713954022007c7b5550b06993c92a874451bc0c922b77294497f064ca61cc217f0ac05151e01483045022100d5ea6b5412f60a3e6cd3ed334d63391a76a8c790856473daed421b897801cdd102207269c0d0f23c7846c008401882654440a84c6ee1c2dea012aa20549cefa85d09014c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53ae" }, { "type": "p2shP2pk", @@ -88,7 +88,7 @@ "script": "a91420b37094d82a513451ff0ccd9db23aba05bc5ef387", "value": "2000" }, - "finalScriptSig": "483045022100fd365630d2236decb096b5bf33342163982354c60e80ee4e47724749f06419a902202c45bd8b310a6304cfc0f19999236196a53e8fd354efddff341aabda0601fc650123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095ac" + "finalScriptSig": "483045022100fc701cbd800adb19f7cb2c26dd773ecb9f8ace86b869a3045bcc0b027ad477d102201a31a56fc7acf61beddb7a9157edab4414e1c8ce92af3b50096e80c9ecb053840123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095ac" } ], "outputs": [ @@ -159,5 +159,5 @@ "unknownKeyVals": [] } ], - "extractedTransaction": "0400008085202f8902ed950a6fa3ff06d2c22ca7c7834bb067ae7b2331ccf1d48e847a0c5475dd197500000000fdfd0000473044022062b22ff49dea9ffaacf06ab4a38ea3c655127a5887e9da5e9afea43496cb1a29022004f8455ddca8c1563250ed08ddc1014edc16f7ef6c5b7707ee7d931e09543c74014830450221009540f61ff6f751a8b3af6879d4a7962a6c5f0135c239a6dd2e5c57c9afcc27af022052d8e04bc825137514b77b8164f2ccaf8717b57c5cc453ce43054e0f10be7f93014c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53aeffffffff144896e405e26925e0c7549d778b57c737449963ca999e6b61a3ee2e129aa418010000006d483045022100fd365630d2236decb096b5bf33342163982354c60e80ee4e47724749f06419a902202c45bd8b310a6304cfc0f19999236196a53e8fd354efddff341aabda0601fc650123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095acffffffff04840300000000000017a914d909474404c124a3d04c3fbff61faa49cf43c58b87840300000000000017a9144efd761e9be61caa421c8aac4a902ad6f2a54bcf87840300000000000017a914d24d3816be8a250cbdde7eaa674f80170cda944e870000000000000000116a0f736574656320617374726f6e6f6d7900000000000000000000000000000000000000" + "extractedTransaction": "0400008085202f89024bc48f52371ae8a886f68e4a9e9417b635e6751f58c38d84591ac357f15cb28c00000000fdfe0000483045022100aa3dc3f88fb3938f477a8f144d23c2f36dbea2824a0dfe4212d262209a713954022007c7b5550b06993c92a874451bc0c922b77294497f064ca61cc217f0ac05151e01483045022100d5ea6b5412f60a3e6cd3ed334d63391a76a8c790856473daed421b897801cdd102207269c0d0f23c7846c008401882654440a84c6ee1c2dea012aa20549cefa85d09014c69522103f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f21035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf22103e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b53aeffffffff48b85379ca34c6f2831bafb3d6cc6c4c7cf040a9068b0f2df7c1d4889fb32486010000006d483045022100fc701cbd800adb19f7cb2c26dd773ecb9f8ace86b869a3045bcc0b027ad477d102201a31a56fc7acf61beddb7a9157edab4414e1c8ce92af3b50096e80c9ecb053840123210336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095acffffffff04840300000000000017a914d909474404c124a3d04c3fbff61faa49cf43c58b87840300000000000017a9144efd761e9be61caa421c8aac4a902ad6f2a54bcf87840300000000000017a914d24d3816be8a250cbdde7eaa674f80170cda944e870000000000000000116a0f736574656320617374726f6e6f6d7900000000000000000000000000000000000000" } diff --git a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.halfsigned.json b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.halfsigned.json index 24a09a6d38..7851f6e1b3 100644 --- a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.halfsigned.json +++ b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.halfsigned.json @@ -4,16 +4,16 @@ "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" ], - "psbtBase64": "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", + "psbtBase64": "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", "psbtBase64Finalized": null, "inputs": [ { - "hash": "ed950a6fa3ff06d2c22ca7c7834bb067ae7b2331ccf1d48e847a0c5475dd1975", + "hash": "4bc48f52371ae8a886f68e4a9e9417b635e6751f58c38d84591ac357f15cb28c", "index": 0, "sequence": 4294967295 }, { - "hash": "144896e405e26925e0c7549d778b57c737449963ca999e6b61a3ee2e129aa418", + "hash": "48b85379ca34c6f2831bafb3d6cc6c4c7cf040a9068b0f2df7c1d4889fb32486", "index": 1, "sequence": 4294967295 } @@ -48,7 +48,7 @@ "partialSig": [ { "pubkey": "03f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f", - "signature": "3044022062b22ff49dea9ffaacf06ab4a38ea3c655127a5887e9da5e9afea43496cb1a29022004f8455ddca8c1563250ed08ddc1014edc16f7ef6c5b7707ee7d931e09543c7401" + "signature": "3045022100aa3dc3f88fb3938f477a8f144d23c2f36dbea2824a0dfe4212d262209a713954022007c7b5550b06993c92a874451bc0c922b77294497f064ca61cc217f0ac05151e01" } ] }, @@ -64,7 +64,7 @@ "partialSig": [ { "pubkey": "0336ef228ffe9b8efffba052c32d334660dd1f8366cf8fe44ae5aa672b6b629095", - "signature": "3045022100fd365630d2236decb096b5bf33342163982354c60e80ee4e47724749f06419a902202c45bd8b310a6304cfc0f19999236196a53e8fd354efddff341aabda0601fc6501" + "signature": "3045022100fc701cbd800adb19f7cb2c26dd773ecb9f8ace86b869a3045bcc0b027ad477d102201a31a56fc7acf61beddb7a9157edab4414e1c8ce92af3b50096e80c9ecb0538401" } ] } diff --git a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.unsigned.json b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.unsigned.json index ed71ff41a2..7099a92682 100644 --- a/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.unsigned.json +++ b/modules/utxo-lib/test/bitgo/fixtures/psbt/psbt.zcash.unsigned.json @@ -4,16 +4,16 @@ "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" ], - "psbtBase64": "cHNidP8BAOkEAACAhSAviQLtlQpvo/8G0sIsp8eDS7BnrnsjMczx1I6EegxUdd0ZdQAAAAAA/////xRIluQF4mkl4MdUnXeLV8c3RJljypmea2Gj7i4SmqQYAQAAAAD/////BIQDAAAAAAAAF6kU2QlHRATBJKPQTD+/9h+qSc9DxYuHhAMAAAAAAAAXqRRO/XYem+YcqkIciqxKkCrW8qVLz4eEAwAAAAAAABepFNJNOBa+iiUMvd5+qmdPgBcM2pROhwAAAAAAAAAAEWoPc2V0ZWMgYXN0cm9ub215AAAAAAAAAAAAAAAAAAAAAAAAAE8BBIiyHgAAAAAAAAAAADqSLinwyOsNsqYEhMvctjH2sQfJyq4//c8+fS7B9rzQAxIUhxXzYdq2haZp1CQx5dbT+XNATaucn9G5ULJ5rXY0BMwYrghPAQSIsh4AAAAAAAAAAABtHWVtPd2RwZTARWWjYDcCohAWztFKJl84mC1ideZ7ZAPTusIxOnxrIcuxGxSw0QNB+SLApAOovYyH8NyCDzWvbgT2XNhpTwEEiLIeAAAAAAAAAAAAywT9Y6s02Q/mRmuIDioCzPioYzdDEpka+JEbGqq0QzQDNu8ij/6bjv/7oFLDLTNGYN0fg2bPj+RK5apnK2tikJUE8u8DiQj8BUJJVEdPAATwTexNAAEBINAHAAAAAAAAF6kUVnzXtE+fOgfDE483v5hLYPu68kOHAQMEAQAAAAEEaVIhA/b0B2S9XWPyAKJ3iIOs916W8VCVyZgmPAhycNDJfn5/IQNf+3q8cBWeBGn0uYmm1eF4WikEFp/wULL0aP5dPV278iED4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1tTriIGA1/7erxwFZ4EafS5iabV4XhaKQQWn/BQsvRo/l09XbvyFMwYrggAAAAAAAAAAAEAAAAAAAAAIgYD4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1sU9lzYaQAAAAAAAAAAAQAAAAAAAAAiBgP29AdkvV1j8gCid4iDrPdelvFQlcmYJjwIcnDQyX5+fxTy7wOJAAAAAAAAAAABAAAAAAAAAAABASDQBwAAAAAAABepFCCzcJTYKlE0Uf8MzZ2yOroFvF7zhwEDBAEAAAABBCMhAzbvIo/+m47/+6BSwy0zRmDdH4Nmz4/kSuWqZytrYpCVrAABAGlSIQLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCSEC1y/Q0NkCk0NK1fyhYPJ44DxhRJeqTkJc9FTiwTMPlqshA0TYhBNt9VAgKGX/vGIYx/nIj+bOOclFeYGQuts4p1LxU64iAgLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCRTy7wOJAAAAAAAAAAAAAAAAAAAAACICAtcv0NDZApNDStX8oWDyeOA8YUSXqk5CXPRU4sEzD5arFMwYrggAAAAAAAAAAAAAAAAAAAAAIgIDRNiEE231UCAoZf+8YhjH+ciP5s45yUV5gZC62zinUvEU9lzYaQAAAAAAAAAAAAAAAAAAAAAAAQBpUiEDa3kQtZHTp1bV7nWl6MwOJ+dF6FUw/qvSfU9YR6UPMIYhAq/hLVd9GiCj7a/C/T0lWs59G4sYPQr53T++W/VUOrx9IQNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAEVOuIgICr+EtV30aIKPtr8L9PSVazn0bixg9CvndP75b9VQ6vH0U1K2DcgAAAAAAAAAAAAAAAAEAAAAiAgNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAERRAXGW9AAAAAAAAAAAAAAAAAQAAACICA2t5ELWR06dW1e51pejMDifnRehVMP6r0n1PWEelDzCGFFR/RXYAAAAAAAAAAAAAAAABAAAAAAAA", + "psbtBase64": "cHNidP8BAOkEAACAhSAviQJLxI9SNxroqIb2jkqelBe2NeZ1H1jDjYRZGsNX8VyyjAAAAAAA/////0i4U3nKNMbygxuvs9bMbEx88ECpBosPLffB1IifsySGAQAAAAD/////BIQDAAAAAAAAF6kU2QlHRATBJKPQTD+/9h+qSc9DxYuHhAMAAAAAAAAXqRRO/XYem+YcqkIciqxKkCrW8qVLz4eEAwAAAAAAABepFNJNOBa+iiUMvd5+qmdPgBcM2pROhwAAAAAAAAAAEWoPc2V0ZWMgYXN0cm9ub215AAAAAAAAAAAAAAAAAAAAAAAAAE8BBIiyHgAAAAAAAAAAADqSLinwyOsNsqYEhMvctjH2sQfJyq4//c8+fS7B9rzQAxIUhxXzYdq2haZp1CQx5dbT+XNATaucn9G5ULJ5rXY0BMwYrghPAQSIsh4AAAAAAAAAAABtHWVtPd2RwZTARWWjYDcCohAWztFKJl84mC1ideZ7ZAPTusIxOnxrIcuxGxSw0QNB+SLApAOovYyH8NyCDzWvbgT2XNhpTwEEiLIeAAAAAAAAAAAAywT9Y6s02Q/mRmuIDioCzPioYzdDEpka+JEbGqq0QzQDNu8ij/6bjv/7oFLDLTNGYN0fg2bPj+RK5apnK2tikJUE8u8DiQj8BUJJVEdPAAQw8zdUAAEBINAHAAAAAAAAF6kUVnzXtE+fOgfDE483v5hLYPu68kOHAQMEAQAAAAEEaVIhA/b0B2S9XWPyAKJ3iIOs916W8VCVyZgmPAhycNDJfn5/IQNf+3q8cBWeBGn0uYmm1eF4WikEFp/wULL0aP5dPV278iED4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1tTriIGA1/7erxwFZ4EafS5iabV4XhaKQQWn/BQsvRo/l09XbvyFMwYrggAAAAAAAAAAAEAAAAAAAAAIgYD4VJNf2/FerPqy7ZZt4cQZ4CkddHbSDlSwjELfpo4l1sU9lzYaQAAAAAAAAAAAQAAAAAAAAAiBgP29AdkvV1j8gCid4iDrPdelvFQlcmYJjwIcnDQyX5+fxTy7wOJAAAAAAAAAAABAAAAAAAAAAABASDQBwAAAAAAABepFCCzcJTYKlE0Uf8MzZ2yOroFvF7zhwEDBAEAAAABBCMhAzbvIo/+m47/+6BSwy0zRmDdH4Nmz4/kSuWqZytrYpCVrAABAGlSIQLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCSEC1y/Q0NkCk0NK1fyhYPJ44DxhRJeqTkJc9FTiwTMPlqshA0TYhBNt9VAgKGX/vGIYx/nIj+bOOclFeYGQuts4p1LxU64iAgLMTQ+kEcrCREhvjrLAjgNf90EPRgo1nKf4gQmRvTtCCRTy7wOJAAAAAAAAAAAAAAAAAAAAACICAtcv0NDZApNDStX8oWDyeOA8YUSXqk5CXPRU4sEzD5arFMwYrggAAAAAAAAAAAAAAAAAAAAAIgIDRNiEE231UCAoZf+8YhjH+ciP5s45yUV5gZC62zinUvEU9lzYaQAAAAAAAAAAAAAAAAAAAAAAAQBpUiEDa3kQtZHTp1bV7nWl6MwOJ+dF6FUw/qvSfU9YR6UPMIYhAq/hLVd9GiCj7a/C/T0lWs59G4sYPQr53T++W/VUOrx9IQNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAEVOuIgICr+EtV30aIKPtr8L9PSVazn0bixg9CvndP75b9VQ6vH0U1K2DcgAAAAAAAAAAAAAAAAEAAAAiAgNKJrA23w9fA99EdNB5JKmKBeEbolhEduGt20SCrOpAERRAXGW9AAAAAAAAAAAAAAAAAQAAACICA2t5ELWR06dW1e51pejMDifnRehVMP6r0n1PWEelDzCGFFR/RXYAAAAAAAAAAAAAAAABAAAAAAAA", "psbtBase64Finalized": null, "inputs": [ { - "hash": "ed950a6fa3ff06d2c22ca7c7834bb067ae7b2331ccf1d48e847a0c5475dd1975", + "hash": "4bc48f52371ae8a886f68e4a9e9417b635e6751f58c38d84591ac357f15cb28c", "index": 0, "sequence": 4294967295 }, { - "hash": "144896e405e26925e0c7549d778b57c737449963ca999e6b61a3ee2e129aa418", + "hash": "48b85379ca34c6f2831bafb3d6cc6c4c7cf040a9068b0f2df7c1d4889fb32486", "index": 1, "sequence": 4294967295 } diff --git a/modules/utxo-lib/test/bitgo/zcash/consensusBranchId.ts b/modules/utxo-lib/test/bitgo/zcash/consensusBranchId.ts new file mode 100644 index 0000000000..ae56b4cab1 --- /dev/null +++ b/modules/utxo-lib/test/bitgo/zcash/consensusBranchId.ts @@ -0,0 +1,45 @@ +import * as assert from 'assert'; +import { networks } from '../../../src'; +import { + ZcashTransaction, + getDefaultConsensusBranchIdForVersion, + getDefaultTransactionVersion, +} from '../../../src/bitgo'; + +// NU6.2 emergency hard fork re-enabling Orchard (mainnet block 3364600, testnet 4052000). +describe('Zcash consensus branch id (NU6.2)', function () { + const NU6_1_BRANCH_ID = 0x4dec4df0; + const NU6_2_BRANCH_ID = 0x5437f330; + + it('defaults mainnet transaction builds to NU6.2', function () { + assert.strictEqual(getDefaultTransactionVersion(networks.zcash), ZcashTransaction.VERSION4_BRANCH_NU6_2); + assert.strictEqual( + getDefaultConsensusBranchIdForVersion(networks.zcash, ZcashTransaction.VERSION4_BRANCH_NU6_2), + NU6_2_BRANCH_ID + ); + assert.strictEqual( + getDefaultConsensusBranchIdForVersion(networks.zcash, ZcashTransaction.VERSION5_BRANCH_NU6_2), + NU6_2_BRANCH_ID + ); + // Bare version 4/5 on mainnet resolve to the current upgrade (NU6.2). + assert.strictEqual(getDefaultConsensusBranchIdForVersion(networks.zcash, 4), NU6_2_BRANCH_ID); + assert.strictEqual(getDefaultConsensusBranchIdForVersion(networks.zcash, 5), NU6_2_BRANCH_ID); + }); + + it('keeps testnet on NU6.1 (NU6.2 not yet activated on testnet)', function () { + assert.strictEqual(getDefaultTransactionVersion(networks.zcashTest), ZcashTransaction.VERSION4_BRANCH_NU6_1); + assert.strictEqual(getDefaultConsensusBranchIdForVersion(networks.zcashTest, 4), NU6_1_BRANCH_ID); + assert.strictEqual(getDefaultConsensusBranchIdForVersion(networks.zcashTest, 5), NU6_1_BRANCH_ID); + }); + + it('still resolves explicit NU6.1 versions to the NU6.1 branch id', function () { + assert.strictEqual( + getDefaultConsensusBranchIdForVersion(networks.zcash, ZcashTransaction.VERSION4_BRANCH_NU6_1), + NU6_1_BRANCH_ID + ); + assert.strictEqual( + getDefaultConsensusBranchIdForVersion(networks.zcash, ZcashTransaction.VERSION5_BRANCH_NU6_1), + NU6_1_BRANCH_ID + ); + }); +}); diff --git a/modules/utxo-ord/package.json b/modules/utxo-ord/package.json index 429c947a63..9cb04d3854 100644 --- a/modules/utxo-ord/package.json +++ b/modules/utxo-ord/package.json @@ -45,7 +45,7 @@ "directory": "modules/utxo-ord" }, "dependencies": { - "@bitgo/wasm-utxo": "^4.14.1" + "@bitgo/wasm-utxo": "^4.16.0" }, "devDependencies": { "@bitgo/utxo-lib": "^11.23.0" diff --git a/modules/utxo-staking/package.json b/modules/utxo-staking/package.json index faf94f5741..bebfe18187 100644 --- a/modules/utxo-staking/package.json +++ b/modules/utxo-staking/package.json @@ -63,7 +63,7 @@ "@bitgo/babylonlabs-io-btc-staking-ts": "^3.5.0", "@bitgo/utxo-core": "^1.39.1", "@bitgo/utxo-lib": "^11.23.0", - "@bitgo/wasm-utxo": "^4.14.1", + "@bitgo/wasm-utxo": "^4.16.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", "bip322-js": "^2.0.0", "bitcoinjs-lib": "^6.1.7", diff --git a/yarn.lock b/yarn.lock index c83e8186c3..3a010e56b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1094,10 +1094,10 @@ resolved "https://registry.npmjs.org/@bitgo/wasm-ton/-/wasm-ton-1.1.1.tgz" integrity sha512-Y4x2V2ZcYWlmx42v7dlrKDtT2DuUt8smk8E98mh7RhpiifJhLk2v5RmXDwBl0A3v9TzUOU6qMOnSS/iZ8Pq52w== -"@bitgo/wasm-utxo@^4.14.1": - version "4.14.1" - resolved "https://registry.npmjs.org/@bitgo/wasm-utxo/-/wasm-utxo-4.14.1.tgz#bf709a98078f10f9c52900bcba24a6c6a9d0256e" - integrity sha512-cHGJzCNlPMpVXp/ydFIHQ0/GSRJLYG+cqzVYa6u7x2bbnKDzIqgn34hpWX1w/FfZ626U0S47HGo8ujmoWoUn2Q== +"@bitgo/wasm-utxo@^4.16.0": + version "4.16.0" + resolved "https://registry.npmjs.org/@bitgo/wasm-utxo/-/wasm-utxo-4.16.0.tgz#6dc23f288b4abf52b5e34599e7488da8d8693c53" + integrity sha512-2hg8J1pkaPyf/baS8LQ4aarwbEBHuVuHeaSQpRzkBuCWezJAhqZsoTlx9WrDd4TQC/0oPcl34phg+Ny5c8wZUg== "@brandonblack/musig@^0.0.1-alpha.0": version "0.0.1-alpha.1"