Skip to content

Commit 0ff2e45

Browse files
committed
feat: add support for zcash NU6_1 branch
Add support for Zcash NU6_1 branch as specified in ZIP-0255. Update default transaction version to use NU6_1 for both mainnet and testnet. Co-authored-by: llm-git <[email protected]> Ticket: BTC-2374 TICKET: BTC-2374
1 parent 8b5f522 commit 0ff2e45

File tree

5 files changed

+31
-10
lines changed

5 files changed

+31
-10
lines changed

modules/utxo-lib/src/bitgo/transaction.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,10 @@ export function createPsbtFromTransaction(tx: UtxoTransaction<bigint>, prevOuts:
154154
}
155155

156156
export function getDefaultTransactionVersion(network: Network): number {
157-
// Use NU6 version for testnet, activated on mainnet in block 2726400
158-
// https://zips.z.cash/zip-0253
159-
if (network === networks.zcashTest) {
160-
return ZcashTransaction.VERSION4_BRANCH_NU6;
157+
// Use NU6_1 version for both mainnet and testnet
158+
// https://zips.z.cash/zip-0255
159+
if (network === networks.zcash || network === networks.zcashTest) {
160+
return ZcashTransaction.VERSION4_BRANCH_NU6_1;
161161
}
162162

163163
switch (getMainnet(network)) {
@@ -166,8 +166,6 @@ export function getDefaultTransactionVersion(network: Network): number {
166166
case networks.bitcoingold:
167167
case networks.ecash:
168168
return 2;
169-
case networks.zcash:
170-
return ZcashTransaction.VERSION4_BRANCH_NU6;
171169
default:
172170
return 1;
173171
}
@@ -218,8 +216,10 @@ export function setPsbtDefaults(
218216
ZcashTransaction.VERSION4_BRANCH_CANOPY,
219217
ZcashTransaction.VERSION4_BRANCH_NU5,
220218
ZcashTransaction.VERSION4_BRANCH_NU6,
219+
ZcashTransaction.VERSION4_BRANCH_NU6_1,
221220
ZcashTransaction.VERSION5_BRANCH_NU5,
222221
ZcashTransaction.VERSION5_BRANCH_NU6,
222+
ZcashTransaction.VERSION5_BRANCH_NU6_1,
223223
].includes(version)
224224
) {
225225
throw new Error(`invalid version`);

modules/utxo-lib/src/bitgo/zcash/ZcashPsbt.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,13 @@ export class ZcashPsbt extends UtxoPsbt<ZcashTransaction<bigint>> {
108108
case ZcashTransaction.VERSION4_BRANCH_CANOPY:
109109
case ZcashTransaction.VERSION4_BRANCH_NU5:
110110
case ZcashTransaction.VERSION4_BRANCH_NU6:
111+
case ZcashTransaction.VERSION4_BRANCH_NU6_1:
111112
this.setVersion(4);
112113
break;
113114
case 5:
114115
case ZcashTransaction.VERSION5_BRANCH_NU5:
115116
case ZcashTransaction.VERSION5_BRANCH_NU6:
117+
case ZcashTransaction.VERSION5_BRANCH_NU6_1:
116118
this.setVersion(5);
117119
break;
118120
default:

modules/utxo-lib/src/bitgo/zcash/ZcashTransaction.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const OVERWINTER_BRANCH_ID = 0x5ba81b19;
2424
const CANOPY_BRANCH_ID = 0xe9ff75a6;
2525
const NU5_BRANCH_ID = 0xc2d6d0b4;
2626
const NU6_BRANCH_ID = 0xc8e71055;
27+
const NU6_1_BRANCH_ID = 0x4dec4df0; // https://zips.z.cash/zip-0255
2728

2829
export class UnsupportedTransactionError extends Error {
2930
constructor(message: string) {
@@ -36,15 +37,25 @@ export function getDefaultVersionGroupIdForVersion(version: number): number {
3637
case 400:
3738
case 450:
3839
case 455:
40+
case 456:
3941
return SAPLING_VERSION_GROUP_ID;
4042
case 500:
4143
case 550:
44+
case 551:
4245
return ZIP225_VERSION_GROUP_ID;
4346
}
4447
throw new Error(`no value for version ${version}`);
4548
}
4649

4750
export function getDefaultConsensusBranchIdForVersion(network: ZcashNetwork, version: number): number {
51+
// Use NU6.1 version for testnet, activated on mainnet in block 2726400
52+
// https://zips.z.cash/zip-0255
53+
if (network === networks.zcashTest) {
54+
if (version === 4 || version === 5) {
55+
return NU6_1_BRANCH_ID;
56+
}
57+
}
58+
4859
switch (version) {
4960
case 1:
5061
case 2:
@@ -59,12 +70,16 @@ export function getDefaultConsensusBranchIdForVersion(network: ZcashNetwork, ver
5970
// https://zips.z.cash/zip-0252
6071
// NU5 is deprecated on mainnet on block 2726400
6172
return NU5_BRANCH_ID;
62-
case 4:
63-
case 5:
6473
case ZcashTransaction.VERSION4_BRANCH_NU6:
6574
case ZcashTransaction.VERSION5_BRANCH_NU6:
75+
case 4:
76+
case 5:
6677
// https://zips.z.cash/zip-0253
6778
return NU6_BRANCH_ID;
79+
case ZcashTransaction.VERSION4_BRANCH_NU6_1:
80+
case ZcashTransaction.VERSION5_BRANCH_NU6_1:
81+
// https://zips.z.cash/zip-0255
82+
return NU6_1_BRANCH_ID;
6883
}
6984
throw new Error(`no value for version ${version}`);
7085
}
@@ -77,8 +92,10 @@ export class ZcashTransaction<TNumber extends number | bigint = number> extends
7792
static VERSION4_BRANCH_CANOPY = 400;
7893
static VERSION4_BRANCH_NU5 = 450;
7994
static VERSION4_BRANCH_NU6 = 455;
95+
static VERSION4_BRANCH_NU6_1 = 456;
8096
static VERSION5_BRANCH_NU5 = 500;
8197
static VERSION5_BRANCH_NU6 = 550;
98+
static VERSION5_BRANCH_NU6_1 = 551;
8299

83100
// 1 if the transaction is post overwinter upgrade, 0 otherwise
84101
overwintered = 0;

modules/utxo-lib/src/bitgo/zcash/ZcashTransactionBuilder.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,13 @@ export class ZcashTransactionBuilder<TNumber extends number | bigint = number> e
7373
case ZcashTransaction.VERSION4_BRANCH_CANOPY:
7474
case ZcashTransaction.VERSION4_BRANCH_NU5:
7575
case ZcashTransaction.VERSION4_BRANCH_NU6:
76+
case ZcashTransaction.VERSION4_BRANCH_NU6_1:
7677
this.setVersion(4);
7778
break;
7879
case 5:
7980
case ZcashTransaction.VERSION5_BRANCH_NU5:
8081
case ZcashTransaction.VERSION5_BRANCH_NU6:
82+
case ZcashTransaction.VERSION5_BRANCH_NU6_1:
8183
this.setVersion(5);
8284
break;
8385
default:

modules/utxo-lib/test/bitgo/psbt/ZcashPsbt.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('Zcash PSBT', function () {
2929
assert.deepStrictEqual(psbt.toHex(), psbt.toBuffer().toString('hex'));
3030
});
3131
}
32-
[400, 450, 455, 500, 550].forEach((version) => testToHexForVersion(version));
32+
[400, 450, 455, 456, 500, 550, 551].forEach((version) => testToHexForVersion(version));
3333

3434
function testFromHexForVersion(version: number) {
3535
it(`version ${version} should deserialize from toHex`, async function () {
@@ -39,7 +39,7 @@ describe('Zcash PSBT', function () {
3939
assert.deepStrictEqual(psbt2Hex, psbtHex);
4040
});
4141
}
42-
[400, 450, 455, 500, 550].forEach((version) => testFromHexForVersion(version));
42+
[400, 450, 455, 456, 500, 550, 551].forEach((version) => testFromHexForVersion(version));
4343
});
4444

4545
describe('should be able to sign the transaction', function () {

0 commit comments

Comments
 (0)