@bitgo/abstract-utxo 12.4.4 → 12.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts +3 -0
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  3. package/dist/cjs/src/abstractUtxoCoin.js +13 -6
  4. package/dist/cjs/src/impl/bch/bch.js +2 -2
  5. package/dist/cjs/src/impl/zec/address.d.ts +28 -0
  6. package/dist/cjs/src/impl/zec/address.d.ts.map +1 -0
  7. package/dist/cjs/src/impl/zec/address.js +55 -0
  8. package/dist/cjs/src/impl/zec/index.d.ts +3 -0
  9. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -1
  10. package/dist/cjs/src/impl/zec/index.js +4 -1
  11. package/dist/cjs/src/impl/zec/recipients.d.ts +84 -0
  12. package/dist/cjs/src/impl/zec/recipients.d.ts.map +1 -0
  13. package/dist/cjs/src/impl/zec/recipients.js +94 -0
  14. package/dist/cjs/src/impl/zec/types.d.ts +5 -0
  15. package/dist/cjs/src/impl/zec/types.d.ts.map +1 -0
  16. package/dist/cjs/src/impl/zec/types.js +3 -0
  17. package/dist/cjs/src/impl/zec/zec.d.ts +12 -1
  18. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -1
  19. package/dist/cjs/src/impl/zec/zec.js +14 -1
  20. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +4 -0
  21. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
  22. package/dist/cjs/src/recovery/backupKeyRecovery.js +3 -1
  23. package/dist/cjs/src/transaction/descriptor/parse.d.ts +3 -3
  24. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -1
  25. package/dist/cjs/src/transaction/descriptor/parse.js +17 -17
  26. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts +2 -1
  27. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -1
  28. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +4 -3
  29. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +3 -3
  30. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  31. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +7 -6
  32. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts +3 -1
  33. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -1
  34. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +5 -4
  35. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts +2 -1
  36. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  37. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +15 -14
  38. package/dist/cjs/src/transaction/parseTransaction.d.ts +2 -1
  39. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -1
  40. package/dist/cjs/src/transaction/parseTransaction.js +5 -4
  41. package/dist/cjs/src/transaction/recipient.d.ts +31 -15
  42. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -1
  43. package/dist/cjs/src/transaction/recipient.js +69 -47
  44. package/dist/cjs/src/transaction/verifyTransaction.d.ts +2 -1
  45. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -1
  46. package/dist/cjs/src/transaction/verifyTransaction.js +4 -3
  47. package/dist/cjs/test/unit/impl/zec/unit/address.d.ts +2 -0
  48. package/dist/cjs/test/unit/impl/zec/unit/address.d.ts.map +1 -0
  49. package/dist/cjs/test/unit/impl/zec/unit/address.js +66 -0
  50. package/dist/cjs/test/unit/impl/zec/unit/resolvePsbtRecipients.d.ts +2 -0
  51. package/dist/cjs/test/unit/impl/zec/unit/resolvePsbtRecipients.d.ts.map +1 -0
  52. package/dist/cjs/test/unit/impl/zec/unit/resolvePsbtRecipients.js +89 -0
  53. package/dist/cjs/test/unit/impl/zec/unit/unifiedRecipientPreference.d.ts +2 -0
  54. package/dist/cjs/test/unit/impl/zec/unit/unifiedRecipientPreference.d.ts.map +1 -0
  55. package/dist/cjs/test/unit/impl/zec/unit/unifiedRecipientPreference.js +57 -0
  56. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +14 -1
  57. package/dist/cjs/test/unit/transaction/descriptor/parse.js +4 -2
  58. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.js +6 -5
  59. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  60. package/dist/esm/abstractUtxoCoin.d.ts +3 -0
  61. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  62. package/dist/esm/abstractUtxoCoin.js +14 -7
  63. package/dist/esm/impl/bch/bch.js +3 -3
  64. package/dist/esm/impl/zec/address.d.ts +28 -0
  65. package/dist/esm/impl/zec/address.d.ts.map +1 -0
  66. package/dist/esm/impl/zec/address.js +50 -0
  67. package/dist/esm/impl/zec/index.d.ts +3 -0
  68. package/dist/esm/impl/zec/index.d.ts.map +1 -1
  69. package/dist/esm/impl/zec/index.js +4 -1
  70. package/dist/esm/impl/zec/recipients.d.ts +84 -0
  71. package/dist/esm/impl/zec/recipients.d.ts.map +1 -0
  72. package/dist/esm/impl/zec/recipients.js +90 -0
  73. package/dist/esm/impl/zec/types.d.ts +5 -0
  74. package/dist/esm/impl/zec/types.d.ts.map +1 -0
  75. package/dist/esm/impl/zec/types.js +2 -0
  76. package/dist/esm/impl/zec/zec.d.ts +12 -1
  77. package/dist/esm/impl/zec/zec.d.ts.map +1 -1
  78. package/dist/esm/impl/zec/zec.js +14 -1
  79. package/dist/esm/recovery/backupKeyRecovery.d.ts +4 -0
  80. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
  81. package/dist/esm/recovery/backupKeyRecovery.js +3 -1
  82. package/dist/esm/transaction/descriptor/parse.d.ts +3 -3
  83. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -1
  84. package/dist/esm/transaction/descriptor/parse.js +18 -18
  85. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +2 -1
  86. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -1
  87. package/dist/esm/transaction/descriptor/parseToAmountType.js +4 -3
  88. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +3 -3
  89. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  90. package/dist/esm/transaction/descriptor/verifyTransaction.js +7 -6
  91. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +3 -1
  92. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -1
  93. package/dist/esm/transaction/fixedScript/parseOutput.js +5 -4
  94. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +2 -1
  95. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  96. package/dist/esm/transaction/fixedScript/parseTransaction.js +16 -15
  97. package/dist/esm/transaction/parseTransaction.d.ts +2 -1
  98. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -1
  99. package/dist/esm/transaction/parseTransaction.js +5 -4
  100. package/dist/esm/transaction/recipient.d.ts +31 -15
  101. package/dist/esm/transaction/recipient.d.ts.map +1 -1
  102. package/dist/esm/transaction/recipient.js +68 -48
  103. package/dist/esm/transaction/verifyTransaction.d.ts +2 -1
  104. package/dist/esm/transaction/verifyTransaction.d.ts.map +1 -1
  105. package/dist/esm/transaction/verifyTransaction.js +4 -3
  106. package/package.json +9 -9
@@ -1,32 +1,48 @@
1
1
  import { UtxoCoinName } from '../names';
2
- /**
3
- * Check if the address is a script recipient (starts with `scriptPubKey:`).
4
- * @param address
5
- */
2
+ /** Address/network-aware recipient conversion with overridable address decoding. */
3
+ export declare class AddressCodec {
4
+ readonly coinName: UtxoCoinName;
5
+ constructor(coinName: UtxoCoinName);
6
+ /** Check if the address is a script recipient (starts with `scriptPubKey:`). */
7
+ static isScriptRecipient(address: string): boolean;
8
+ /** Convert an extended address to either a regular address or a raw script. */
9
+ static fromExtendedAddressFormat(extendedAddress: string): {
10
+ address: string;
11
+ } | {
12
+ script: string;
13
+ };
14
+ static assertValidTransactionRecipient(output: {
15
+ amount: bigint | number | string;
16
+ address?: string;
17
+ }): void;
18
+ decode(address: string): Uint8Array;
19
+ fromExtendedAddressFormatToScript(extendedAddress: string): Buffer;
20
+ toOutputScript(v: string | {
21
+ address: string;
22
+ } | {
23
+ script: string;
24
+ }): Buffer;
25
+ toExtendedAddressFormat(script: Buffer): string;
26
+ }
27
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
6
28
  export declare function isScriptRecipient(address: string): boolean;
7
- /**
8
- * An extended address is one that encodes either a regular address or a hex encoded script with the prefix `scriptPubKey:`.
9
- * This function converts the extended address format to either a script or an address.
10
- * @param extendedAddress
11
- */
29
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
12
30
  export declare function fromExtendedAddressFormat(extendedAddress: string): {
13
31
  address: string;
14
32
  } | {
15
33
  script: string;
16
34
  };
35
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
17
36
  export declare function fromExtendedAddressFormatToScript(extendedAddress: string, coinName: UtxoCoinName): Buffer;
37
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
18
38
  export declare function toOutputScript(v: string | {
19
39
  address: string;
20
40
  } | {
21
41
  script: string;
22
42
  }, coinName: UtxoCoinName): Buffer;
23
- /**
24
- * Convert a script or address to the extended address format.
25
- * @param script
26
- * @param coinName
27
- * @returns if the script is an OP_RETURN script, then it will be prefixed with `scriptPubKey:`, otherwise it will be converted to an address.
28
- */
43
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
29
44
  export declare function toExtendedAddressFormat(script: Buffer, coinName: UtxoCoinName): string;
45
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
30
46
  export declare function assertValidTransactionRecipient(output: {
31
47
  amount: bigint | number | string;
32
48
  address?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"recipient.d.ts","sourceRoot":"","sources":["../../../../src/transaction/recipient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIxC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAK3G;AAED,wBAAgB,iCAAiC,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAMzG;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAWnH;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAItF;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUpH"}
1
+ {"version":3,"file":"recipient.d.ts","sourceRoot":"","sources":["../../../../src/transaction/recipient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,oFAAoF;AACpF,qBAAa,YAAY;aACK,QAAQ,EAAE,YAAY;gBAAtB,QAAQ,EAAE,YAAY;IAElD,gFAAgF;IAChF,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlD,+EAA+E;IAC/E,MAAM,CAAC,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAOnG,MAAM,CAAC,+BAA+B,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAY5G,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAInC,iCAAiC,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM;IAQlE,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAa5E,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAKhD;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAE3G;AAED,oFAAoF;AACpF,wBAAgB,iCAAiC,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAEzG;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAEnH;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAEtF;AAED,oFAAoF;AACpF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAEpH"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddressCodec = void 0;
3
4
  exports.isScriptRecipient = isScriptRecipient;
4
5
  exports.fromExtendedAddressFormat = fromExtendedAddressFormat;
5
6
  exports.fromExtendedAddressFormatToScript = fromExtendedAddressFormatToScript;
@@ -8,62 +9,83 @@ exports.toExtendedAddressFormat = toExtendedAddressFormat;
8
9
  exports.assertValidTransactionRecipient = assertValidTransactionRecipient;
9
10
  const wasm_utxo_1 = require("@bitgo/wasm-utxo");
10
11
  const ScriptRecipientPrefix = 'scriptPubKey:';
11
- /**
12
- * Check if the address is a script recipient (starts with `scriptPubKey:`).
13
- * @param address
14
- */
12
+ const OP_RETURN = 0x6a;
13
+ /** Address/network-aware recipient conversion with overridable address decoding. */
14
+ class AddressCodec {
15
+ constructor(coinName) {
16
+ this.coinName = coinName;
17
+ }
18
+ /** Check if the address is a script recipient (starts with `scriptPubKey:`). */
19
+ static isScriptRecipient(address) {
20
+ return address.toLowerCase().startsWith(ScriptRecipientPrefix.toLowerCase());
21
+ }
22
+ /** Convert an extended address to either a regular address or a raw script. */
23
+ static fromExtendedAddressFormat(extendedAddress) {
24
+ if (AddressCodec.isScriptRecipient(extendedAddress)) {
25
+ return { script: extendedAddress.slice(ScriptRecipientPrefix.length) };
26
+ }
27
+ return { address: extendedAddress };
28
+ }
29
+ static assertValidTransactionRecipient(output) {
30
+ // In the case that this is an OP_RETURN output or another non-encodable scriptPubkey, we dont have an address.
31
+ // We will verify that the amount is zero, and if it isnt then we will throw an error.
32
+ if (!output.address || AddressCodec.isScriptRecipient(output.address)) {
33
+ if (output.amount.toString() !== '0') {
34
+ throw new Error(`Only zero amounts allowed for non-encodeable scriptPubkeys: amount: ${output.amount}, address: ${output.address}`);
35
+ }
36
+ }
37
+ }
38
+ decode(address) {
39
+ return wasm_utxo_1.address.toOutputScriptWithCoin(address, this.coinName);
40
+ }
41
+ fromExtendedAddressFormatToScript(extendedAddress) {
42
+ const result = AddressCodec.fromExtendedAddressFormat(extendedAddress);
43
+ if ('script' in result) {
44
+ return Buffer.from(result.script, 'hex');
45
+ }
46
+ return Buffer.from(this.decode(result.address));
47
+ }
48
+ toOutputScript(v) {
49
+ if (typeof v === 'string') {
50
+ return this.fromExtendedAddressFormatToScript(v);
51
+ }
52
+ if ('script' in v) {
53
+ return Buffer.from(v.script, 'hex');
54
+ }
55
+ if ('address' in v) {
56
+ return this.fromExtendedAddressFormatToScript(v.address);
57
+ }
58
+ throw new Error('invalid input');
59
+ }
60
+ toExtendedAddressFormat(script) {
61
+ return script[0] === OP_RETURN
62
+ ? `${ScriptRecipientPrefix}${script.toString('hex')}`
63
+ : wasm_utxo_1.address.fromOutputScriptWithCoin(script, this.coinName);
64
+ }
65
+ }
66
+ exports.AddressCodec = AddressCodec;
67
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
15
68
  function isScriptRecipient(address) {
16
- return address.toLowerCase().startsWith(ScriptRecipientPrefix.toLowerCase());
69
+ return AddressCodec.isScriptRecipient(address);
17
70
  }
18
- /**
19
- * An extended address is one that encodes either a regular address or a hex encoded script with the prefix `scriptPubKey:`.
20
- * This function converts the extended address format to either a script or an address.
21
- * @param extendedAddress
22
- */
71
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
23
72
  function fromExtendedAddressFormat(extendedAddress) {
24
- if (isScriptRecipient(extendedAddress)) {
25
- return { script: extendedAddress.slice(ScriptRecipientPrefix.length) };
26
- }
27
- return { address: extendedAddress };
73
+ return AddressCodec.fromExtendedAddressFormat(extendedAddress);
28
74
  }
75
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
29
76
  function fromExtendedAddressFormatToScript(extendedAddress, coinName) {
30
- const result = fromExtendedAddressFormat(extendedAddress);
31
- if ('script' in result) {
32
- return Buffer.from(result.script, 'hex');
33
- }
34
- return Buffer.from(wasm_utxo_1.address.toOutputScriptWithCoin(result.address, coinName));
77
+ return new AddressCodec(coinName).fromExtendedAddressFormatToScript(extendedAddress);
35
78
  }
79
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
36
80
  function toOutputScript(v, coinName) {
37
- if (typeof v === 'string') {
38
- return fromExtendedAddressFormatToScript(v, coinName);
39
- }
40
- if ('script' in v) {
41
- return Buffer.from(v.script, 'hex');
42
- }
43
- if ('address' in v) {
44
- return fromExtendedAddressFormatToScript(v.address, coinName);
45
- }
46
- throw new Error('invalid input');
81
+ return new AddressCodec(coinName).toOutputScript(v);
47
82
  }
48
- const OP_RETURN = 0x6a;
49
- /**
50
- * Convert a script or address to the extended address format.
51
- * @param script
52
- * @param coinName
53
- * @returns if the script is an OP_RETURN script, then it will be prefixed with `scriptPubKey:`, otherwise it will be converted to an address.
54
- */
83
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
55
84
  function toExtendedAddressFormat(script, coinName) {
56
- return script[0] === OP_RETURN
57
- ? `${ScriptRecipientPrefix}${script.toString('hex')}`
58
- : wasm_utxo_1.address.fromOutputScriptWithCoin(script, coinName);
85
+ return new AddressCodec(coinName).toExtendedAddressFormat(script);
59
86
  }
87
+ /** Legacy helper retained for consumers that use the module-level recipient API. */
60
88
  function assertValidTransactionRecipient(output) {
61
- // In the case that this is an OP_RETURN output or another non-encodable scriptPubkey, we dont have an address.
62
- // We will verify that the amount is zero, and if it isnt then we will throw an error.
63
- if (!output.address || isScriptRecipient(output.address)) {
64
- if (output.amount.toString() !== '0') {
65
- throw new Error(`Only zero amounts allowed for non-encodeable scriptPubkeys: amount: ${output.amount}, address: ${output.address}`);
66
- }
67
- }
89
+ AddressCodec.assertValidTransactionRecipient(output);
68
90
  }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL3JlY2lwaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVVBLDhDQUVDO0FBT0QsOERBS0M7QUFFRCw4RUFNQztBQUVELHdDQVdDO0FBVUQsMERBSUM7QUFFRCwwRUFVQztBQXZFRCxnREFBMkM7QUFJM0MsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUM7QUFFOUM7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsT0FBZTtJQUMvQyxPQUFPLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLHlCQUF5QixDQUFDLGVBQXVCO0lBQy9ELElBQUksaUJBQWlCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBZ0IsaUNBQWlDLENBQUMsZUFBdUIsRUFBRSxRQUFzQjtJQUMvRixNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxRCxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFPLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsQ0FBb0QsRUFBRSxRQUFzQjtJQUN6RyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE9BQU8saUNBQWlDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFFdkI7Ozs7O0dBS0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsUUFBc0I7SUFDNUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUztRQUM1QixDQUFDLENBQUMsR0FBRyxxQkFBcUIsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3JELENBQUMsQ0FBQyxtQkFBTyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsU0FBZ0IsK0JBQStCLENBQUMsTUFBOEQ7SUFDNUcsK0dBQStHO0lBQy9HLHNGQUFzRjtJQUN0RixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUUsTUFBTSxDQUFDLE1BQU0sY0FBYyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQ25ILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGRyZXNzIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IFV0eG9Db2luTmFtZSB9IGZyb20gJy4uL25hbWVzJztcblxuY29uc3QgU2NyaXB0UmVjaXBpZW50UHJlZml4ID0gJ3NjcmlwdFB1YktleTonO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBhZGRyZXNzIGlzIGEgc2NyaXB0IHJlY2lwaWVudCAoc3RhcnRzIHdpdGggYHNjcmlwdFB1YktleTpgKS5cbiAqIEBwYXJhbSBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NjcmlwdFJlY2lwaWVudChhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFkZHJlc3MudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFNjcmlwdFJlY2lwaWVudFByZWZpeC50b0xvd2VyQ2FzZSgpKTtcbn1cblxuLyoqXG4gKiBBbiBleHRlbmRlZCBhZGRyZXNzIGlzIG9uZSB0aGF0IGVuY29kZXMgZWl0aGVyIGEgcmVndWxhciBhZGRyZXNzIG9yIGEgaGV4IGVuY29kZWQgc2NyaXB0IHdpdGggdGhlIHByZWZpeCBgc2NyaXB0UHViS2V5OmAuXG4gKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBleHRlbmRlZCBhZGRyZXNzIGZvcm1hdCB0byBlaXRoZXIgYSBzY3JpcHQgb3IgYW4gYWRkcmVzcy5cbiAqIEBwYXJhbSBleHRlbmRlZEFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXQoZXh0ZW5kZWRBZGRyZXNzOiBzdHJpbmcpOiB7IGFkZHJlc3M6IHN0cmluZyB9IHwgeyBzY3JpcHQ6IHN0cmluZyB9IHtcbiAgaWYgKGlzU2NyaXB0UmVjaXBpZW50KGV4dGVuZGVkQWRkcmVzcykpIHtcbiAgICByZXR1cm4geyBzY3JpcHQ6IGV4dGVuZGVkQWRkcmVzcy5zbGljZShTY3JpcHRSZWNpcGllbnRQcmVmaXgubGVuZ3RoKSB9O1xuICB9XG4gIHJldHVybiB7IGFkZHJlc3M6IGV4dGVuZGVkQWRkcmVzcyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0KGV4dGVuZGVkQWRkcmVzczogc3RyaW5nLCBjb2luTmFtZTogVXR4b0NvaW5OYW1lKTogQnVmZmVyIHtcbiAgY29uc3QgcmVzdWx0ID0gZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdChleHRlbmRlZEFkZHJlc3MpO1xuICBpZiAoJ3NjcmlwdCcgaW4gcmVzdWx0KSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHJlc3VsdC5zY3JpcHQsICdoZXgnKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20oYWRkcmVzcy50b091dHB1dFNjcmlwdFdpdGhDb2luKHJlc3VsdC5hZGRyZXNzLCBjb2luTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PdXRwdXRTY3JpcHQodjogc3RyaW5nIHwgeyBhZGRyZXNzOiBzdHJpbmcgfSB8IHsgc2NyaXB0OiBzdHJpbmcgfSwgY29pbk5hbWU6IFV0eG9Db2luTmFtZSk6IEJ1ZmZlciB7XG4gIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0KHYsIGNvaW5OYW1lKTtcbiAgfVxuICBpZiAoJ3NjcmlwdCcgaW4gdikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2LnNjcmlwdCwgJ2hleCcpO1xuICB9XG4gIGlmICgnYWRkcmVzcycgaW4gdikge1xuICAgIHJldHVybiBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQodi5hZGRyZXNzLCBjb2luTmFtZSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGlucHV0Jyk7XG59XG5cbmNvbnN0IE9QX1JFVFVSTiA9IDB4NmE7XG5cbi8qKlxuICogQ29udmVydCBhIHNjcmlwdCBvciBhZGRyZXNzIHRvIHRoZSBleHRlbmRlZCBhZGRyZXNzIGZvcm1hdC5cbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEBwYXJhbSBjb2luTmFtZVxuICogQHJldHVybnMgaWYgdGhlIHNjcmlwdCBpcyBhbiBPUF9SRVRVUk4gc2NyaXB0LCB0aGVuIGl0IHdpbGwgYmUgcHJlZml4ZWQgd2l0aCBgc2NyaXB0UHViS2V5OmAsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBhZGRyZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQoc2NyaXB0OiBCdWZmZXIsIGNvaW5OYW1lOiBVdHhvQ29pbk5hbWUpOiBzdHJpbmcge1xuICByZXR1cm4gc2NyaXB0WzBdID09PSBPUF9SRVRVUk5cbiAgICA/IGAke1NjcmlwdFJlY2lwaWVudFByZWZpeH0ke3NjcmlwdC50b1N0cmluZygnaGV4Jyl9YFxuICAgIDogYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0V2l0aENvaW4oc2NyaXB0LCBjb2luTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZFRyYW5zYWN0aW9uUmVjaXBpZW50KG91dHB1dDogeyBhbW91bnQ6IGJpZ2ludCB8IG51bWJlciB8IHN0cmluZzsgYWRkcmVzcz86IHN0cmluZyB9KTogdm9pZCB7XG4gIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhpcyBpcyBhbiBPUF9SRVRVUk4gb3V0cHV0IG9yIGFub3RoZXIgbm9uLWVuY29kYWJsZSBzY3JpcHRQdWJrZXksIHdlIGRvbnQgaGF2ZSBhbiBhZGRyZXNzLlxuICAvLyBXZSB3aWxsIHZlcmlmeSB0aGF0IHRoZSBhbW91bnQgaXMgemVybywgYW5kIGlmIGl0IGlzbnQgdGhlbiB3ZSB3aWxsIHRocm93IGFuIGVycm9yLlxuICBpZiAoIW91dHB1dC5hZGRyZXNzIHx8IGlzU2NyaXB0UmVjaXBpZW50KG91dHB1dC5hZGRyZXNzKSkge1xuICAgIGlmIChvdXRwdXQuYW1vdW50LnRvU3RyaW5nKCkgIT09ICcwJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgT25seSB6ZXJvIGFtb3VudHMgYWxsb3dlZCBmb3Igbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5czogYW1vdW50OiAke291dHB1dC5hbW91bnR9LCBhZGRyZXNzOiAke291dHB1dC5hZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL3JlY2lwaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxRUEsOENBRUM7QUFHRCw4REFFQztBQUdELDhFQUVDO0FBR0Qsd0NBRUM7QUFHRCwwREFFQztBQUdELDBFQUVDO0FBaEdELGdEQUEwRDtBQUkxRCxNQUFNLHFCQUFxQixHQUFHLGVBQWUsQ0FBQztBQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFFdkIsb0ZBQW9GO0FBQ3BGLE1BQWEsWUFBWTtJQUN2QixZQUE0QixRQUFzQjtRQUF0QixhQUFRLEdBQVIsUUFBUSxDQUFjO0lBQUcsQ0FBQztJQUV0RCxnRkFBZ0Y7SUFDaEYsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQWU7UUFDdEMsT0FBTyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxNQUFNLENBQUMseUJBQXlCLENBQUMsZUFBdUI7UUFDdEQsSUFBSSxZQUFZLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxDQUFDLCtCQUErQixDQUFDLE1BQThEO1FBQ25HLCtHQUErRztRQUMvRyxzRkFBc0Y7UUFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksWUFBWSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RFLElBQUksTUFBTSxDQUFD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NUcsWUFBWSxDQUFDLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGRyZXNzIGFzIHdhc21BZGRyZXNzIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IFV0eG9Db2luTmFtZSB9IGZyb20gJy4uL25hbWVzJztcblxuY29uc3QgU2NyaXB0UmVjaXBpZW50UHJlZml4ID0gJ3NjcmlwdFB1YktleTonO1xuY29uc3QgT1BfUkVUVVJOID0gMHg2YTtcblxuLyoqIEFkZHJlc3MvbmV0d29yay1hd2FyZSByZWNpcGllbnQgY29udmVyc2lvbiB3aXRoIG92ZXJyaWRhYmxlIGFkZHJlc3MgZGVjb2RpbmcuICovXG5leHBvcnQgY2xhc3MgQWRkcmVzc0NvZGVjIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvaW5OYW1lOiBVdHhvQ29pbk5hbWUpIHt9XG5cbiAgLyoqIENoZWNrIGlmIHRoZSBhZGRyZXNzIGlzIGEgc2NyaXB0IHJlY2lwaWVudCAoc3RhcnRzIHdpdGggYHNjcmlwdFB1YktleTpgKS4gKi9cbiAgc3RhdGljIGlzU2NyaXB0UmVjaXBpZW50KGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhZGRyZXNzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChTY3JpcHRSZWNpcGllbnRQcmVmaXgudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvKiogQ29udmVydCBhbiBleHRlbmRlZCBhZGRyZXNzIHRvIGVpdGhlciBhIHJlZ3VsYXIgYWRkcmVzcyBvciBhIHJhdyBzY3JpcHQuICovXG4gIHN0YXRpYyBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KGV4dGVuZGVkQWRkcmVzczogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmcgfSB8IHsgc2NyaXB0OiBzdHJpbmcgfSB7XG4gICAgaWYgKEFkZHJlc3NDb2RlYy5pc1NjcmlwdFJlY2lwaWVudChleHRlbmRlZEFkZHJlc3MpKSB7XG4gICAgICByZXR1cm4geyBzY3JpcHQ6IGV4dGVuZGVkQWRkcmVzcy5zbGljZShTY3JpcHRSZWNpcGllbnRQcmVmaXgubGVuZ3RoKSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBhZGRyZXNzOiBleHRlbmRlZEFkZHJlc3MgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3NlcnRWYWxpZFRyYW5zYWN0aW9uUmVjaXBpZW50KG91dHB1dDogeyBhbW91bnQ6IGJpZ2ludCB8IG51bWJlciB8IHN0cmluZzsgYWRkcmVzcz86IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGlzIGFuIE9QX1JFVFVSTiBvdXRwdXQgb3IgYW5vdGhlciBub24tZW5jb2RhYmxlIHNjcmlwdFB1YmtleSwgd2UgZG9udCBoYXZlIGFuIGFkZHJlc3MuXG4gICAgLy8gV2Ugd2lsbCB2ZXJpZnkgdGhhdCB0aGUgYW1vdW50IGlzIHplcm8sIGFuZCBpZiBpdCBpc250IHRoZW4gd2Ugd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICBpZiAoIW91dHB1dC5hZGRyZXNzIHx8IEFkZHJlc3NDb2RlYy5pc1NjcmlwdFJlY2lwaWVudChvdXRwdXQuYWRkcmVzcykpIHtcbiAgICAgIGlmIChvdXRwdXQuYW1vdW50LnRvU3RyaW5nKCkgIT09ICcwJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE9ubHkgemVybyBhbW91bnRzIGFsbG93ZWQgZm9yIG5vbi1lbmNvZGVhYmxlIHNjcmlwdFB1YmtleXM6IGFtb3VudDogJHtvdXRwdXQuYW1vdW50fSwgYWRkcmVzczogJHtvdXRwdXQuYWRkcmVzc31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVjb2RlKGFkZHJlc3M6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB3YXNtQWRkcmVzcy50b091dHB1dFNjcmlwdFdpdGhDb2luKGFkZHJlc3MsIHRoaXMuY29pbk5hbWUpO1xuICB9XG5cbiAgZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0KGV4dGVuZGVkQWRkcmVzczogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBjb25zdCByZXN1bHQgPSBBZGRyZXNzQ29kZWMuZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdChleHRlbmRlZEFkZHJlc3MpO1xuICAgIGlmICgnc2NyaXB0JyBpbiByZXN1bHQpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShyZXN1bHQuc2NyaXB0LCAnaGV4Jyk7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLmRlY29kZShyZXN1bHQuYWRkcmVzcykpO1xuICB9XG5cbiAgdG9PdXRwdXRTY3JpcHQodjogc3RyaW5nIHwgeyBhZGRyZXNzOiBzdHJpbmcgfSB8IHsgc2NyaXB0OiBzdHJpbmcgfSk6IEJ1ZmZlciB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0KHYpO1xuICAgIH1cbiAgICBpZiAoJ3NjcmlwdCcgaW4gdikge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHYuc2NyaXB0LCAnaGV4Jyk7XG4gICAgfVxuICAgIGlmICgnYWRkcmVzcycgaW4gdikge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0KHYuYWRkcmVzcyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnB1dCcpO1xuICB9XG5cbiAgdG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQoc2NyaXB0OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBzY3JpcHRbMF0gPT09IE9QX1JFVFVSTlxuICAgICAgPyBgJHtTY3JpcHRSZWNpcGllbnRQcmVmaXh9JHtzY3JpcHQudG9TdHJpbmcoJ2hleCcpfWBcbiAgICAgIDogd2FzbUFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdFdpdGhDb2luKHNjcmlwdCwgdGhpcy5jb2luTmFtZSk7XG4gIH1cbn1cblxuLyoqIExlZ2FjeSBoZWxwZXIgcmV0YWluZWQgZm9yIGNvbnN1bWVycyB0aGF0IHVzZSB0aGUgbW9kdWxlLWxldmVsIHJlY2lwaWVudCBBUEkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTY3JpcHRSZWNpcGllbnQoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBBZGRyZXNzQ29kZWMuaXNTY3JpcHRSZWNpcGllbnQoYWRkcmVzcyk7XG59XG5cbi8qKiBMZWdhY3kgaGVscGVyIHJldGFpbmVkIGZvciBjb25zdW1lcnMgdGhhdCB1c2UgdGhlIG1vZHVsZS1sZXZlbCByZWNpcGllbnQgQVBJLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXQoZXh0ZW5kZWRBZGRyZXNzOiBzdHJpbmcpOiB7IGFkZHJlc3M6IHN0cmluZyB9IHwgeyBzY3JpcHQ6IHN0cmluZyB9IHtcbiAgcmV0dXJuIEFkZHJlc3NDb2RlYy5mcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KGV4dGVuZGVkQWRkcmVzcyk7XG59XG5cbi8qKiBMZWdhY3kgaGVscGVyIHJldGFpbmVkIGZvciBjb25zdW1lcnMgdGhhdCB1c2UgdGhlIG1vZHVsZS1sZXZlbCByZWNpcGllbnQgQVBJLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXRUb1NjcmlwdChleHRlbmRlZEFkZHJlc3M6IHN0cmluZywgY29pbk5hbWU6IFV0eG9Db2luTmFtZSk6IEJ1ZmZlciB7XG4gIHJldHVybiBuZXcgQWRkcmVzc0NvZGVjKGNvaW5OYW1lKS5mcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQoZXh0ZW5kZWRBZGRyZXNzKTtcbn1cblxuLyoqIExlZ2FjeSBoZWxwZXIgcmV0YWluZWQgZm9yIGNvbnN1bWVycyB0aGF0IHVzZSB0aGUgbW9kdWxlLWxldmVsIHJlY2lwaWVudCBBUEkuICovXG5leHBvcnQgZnVuY3Rpb24gdG9PdXRwdXRTY3JpcHQodjogc3RyaW5nIHwgeyBhZGRyZXNzOiBzdHJpbmcgfSB8IHsgc2NyaXB0OiBzdHJpbmcgfSwgY29pbk5hbWU6IFV0eG9Db2luTmFtZSk6IEJ1ZmZlciB7XG4gIHJldHVybiBuZXcgQWRkcmVzc0NvZGVjKGNvaW5OYW1lKS50b091dHB1dFNjcmlwdCh2KTtcbn1cblxuLyoqIExlZ2FjeSBoZWxwZXIgcmV0YWluZWQgZm9yIGNvbnN1bWVycyB0aGF0IHVzZSB0aGUgbW9kdWxlLWxldmVsIHJlY2lwaWVudCBBUEkuICovXG5leHBvcnQgZnVuY3Rpb24gdG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQoc2NyaXB0OiBCdWZmZXIsIGNvaW5OYW1lOiBVdHhvQ29pbk5hbWUpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IEFkZHJlc3NDb2RlYyhjb2luTmFtZSkudG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQoc2NyaXB0KTtcbn1cblxuLyoqIExlZ2FjeSBoZWxwZXIgcmV0YWluZWQgZm9yIGNvbnN1bWVycyB0aGF0IHVzZSB0aGUgbW9kdWxlLWxldmVsIHJlY2lwaWVudCBBUEkuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRUcmFuc2FjdGlvblJlY2lwaWVudChvdXRwdXQ6IHsgYW1vdW50OiBiaWdpbnQgfCBudW1iZXIgfCBzdHJpbmc7IGFkZHJlc3M/OiBzdHJpbmcgfSk6IHZvaWQge1xuICBBZGRyZXNzQ29kZWMuYXNzZXJ0VmFsaWRUcmFuc2FjdGlvblJlY2lwaWVudChvdXRwdXQpO1xufVxuIl19
@@ -1,4 +1,5 @@
1
1
  import { BitGoBase } from '@bitgo/sdk-core';
2
2
  import { AbstractUtxoCoin, VerifyTransactionOptions } from '../abstractUtxoCoin';
3
- export declare function verifyTransaction<TNumber extends bigint | number>(coin: AbstractUtxoCoin, bitgo: BitGoBase, params: VerifyTransactionOptions<TNumber>): Promise<boolean>;
3
+ import { AddressCodec } from './recipient';
4
+ export declare function verifyTransaction<TNumber extends bigint | number>(coin: AbstractUtxoCoin, bitgo: BitGoBase, params: VerifyTransactionOptions<TNumber>, addressCodec?: AddressCodec): Promise<boolean>;
4
5
  //# sourceMappingURL=verifyTransaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifyTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/verifyTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAOjF,wBAAsB,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACrE,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,wBAAwB,CAAC,OAAO,CAAC,GACxC,OAAO,CAAC,OAAO,CAAC,CAWlB"}
1
+ {"version":3,"file":"verifyTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/verifyTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,wBAAsB,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACrE,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,wBAAwB,CAAC,OAAO,CAAC,EACzC,YAAY,GAAE,YAA0C,GACvD,OAAO,CAAC,OAAO,CAAC,CAYlB"}
@@ -36,15 +36,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.verifyTransaction = verifyTransaction;
37
37
  const descriptor_1 = require("../descriptor");
38
38
  const keychains_1 = require("../keychains");
39
+ const recipient_1 = require("./recipient");
39
40
  const fixedScript = __importStar(require("./fixedScript"));
40
41
  const descriptor = __importStar(require("./descriptor"));
41
- async function verifyTransaction(coin, bitgo, params) {
42
+ async function verifyTransaction(coin, bitgo, params, addressCodec = new recipient_1.AddressCodec(coin.name)) {
42
43
  if ((0, descriptor_1.isDescriptorWallet)(params.wallet)) {
43
44
  const walletKeys = (0, keychains_1.toBip32Triple)(await (0, keychains_1.fetchKeychains)(coin, params.wallet));
44
- return descriptor.verifyTransaction(coin, params, (0, descriptor_1.getDescriptorMapFromWallet)(params.wallet, walletKeys, (0, descriptor_1.getPolicyForEnv)(bitgo.env)));
45
+ return descriptor.verifyTransaction(coin, params, (0, descriptor_1.getDescriptorMapFromWallet)(params.wallet, walletKeys, (0, descriptor_1.getPolicyForEnv)(bitgo.env)), addressCodec);
45
46
  }
46
47
  else {
47
48
  return fixedScript.verifyTransaction(coin, bitgo, params);
48
49
  }
49
50
  }
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTQSw4Q0FlQztBQXJCRCw4Q0FBZ0c7QUFDaEcsNENBQTZEO0FBRTdELDJEQUE2QztBQUM3Qyx5REFBMkM7QUFFcEMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxJQUFzQixFQUN0QixLQUFnQixFQUNoQixNQUF5QztJQUV6QyxJQUFJLElBQUEsK0JBQWtCLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBQSx5QkFBYSxFQUFDLE1BQU0sSUFBQSwwQkFBYyxFQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1RSxPQUFPLFVBQVUsQ0FBQyxpQkFBaUIsQ0FDakMsSUFBSSxFQUNKLE1BQU0sRUFDTixJQUFBLHVDQUEwQixFQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUEsNEJBQWUsRUFBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDbEYsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgZ2V0RGVzY3JpcHRvck1hcEZyb21XYWxsZXQsIGlzRGVzY3JpcHRvcldhbGxldCwgZ2V0UG9saWN5Rm9yRW52IH0gZnJvbSAnLi4vZGVzY3JpcHRvcic7XG5pbXBvcnQgeyBmZXRjaEtleWNoYWlucywgdG9CaXAzMlRyaXBsZSB9IGZyb20gJy4uL2tleWNoYWlucyc7XG5cbmltcG9ydCAqIGFzIGZpeGVkU2NyaXB0IGZyb20gJy4vZml4ZWRTY3JpcHQnO1xuaW1wb3J0ICogYXMgZGVzY3JpcHRvciBmcm9tICcuL2Rlc2NyaXB0b3InO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIGJpZ2ludCB8IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGlzRGVzY3JpcHRvcldhbGxldChwYXJhbXMud2FsbGV0KSkge1xuICAgIGNvbnN0IHdhbGxldEtleXMgPSB0b0JpcDMyVHJpcGxlKGF3YWl0IGZldGNoS2V5Y2hhaW5zKGNvaW4sIHBhcmFtcy53YWxsZXQpKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvci52ZXJpZnlUcmFuc2FjdGlvbihcbiAgICAgIGNvaW4sXG4gICAgICBwYXJhbXMsXG4gICAgICBnZXREZXNjcmlwdG9yTWFwRnJvbVdhbGxldChwYXJhbXMud2FsbGV0LCB3YWxsZXRLZXlzLCBnZXRQb2xpY3lGb3JFbnYoYml0Z28uZW52KSlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaXhlZFNjcmlwdC52ZXJpZnlUcmFuc2FjdGlvbihjb2luLCBiaXRnbywgcGFyYW1zKTtcbiAgfVxufVxuIl19
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSw4Q0FpQkM7QUF4QkQsOENBQWdHO0FBQ2hHLDRDQUE2RDtBQUU3RCwyQ0FBMkM7QUFDM0MsMkRBQTZDO0FBQzdDLHlEQUEyQztBQUVwQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLElBQXNCLEVBQ3RCLEtBQWdCLEVBQ2hCLE1BQXlDLEVBQ3pDLGVBQTZCLElBQUksd0JBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBRXhELElBQUksSUFBQSwrQkFBa0IsRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFBLHlCQUFhLEVBQUMsTUFBTSxJQUFBLDBCQUFjLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sVUFBVSxDQUFDLGlCQUFpQixDQUNqQyxJQUFJLEVBQ0osTUFBTSxFQUNOLElBQUEsdUNBQTBCLEVBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBQSw0QkFBZSxFQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNqRixZQUFZLENBQ2IsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgZ2V0RGVzY3JpcHRvck1hcEZyb21XYWxsZXQsIGlzRGVzY3JpcHRvcldhbGxldCwgZ2V0UG9saWN5Rm9yRW52IH0gZnJvbSAnLi4vZGVzY3JpcHRvcic7XG5pbXBvcnQgeyBmZXRjaEtleWNoYWlucywgdG9CaXAzMlRyaXBsZSB9IGZyb20gJy4uL2tleWNoYWlucyc7XG5cbmltcG9ydCB7IEFkZHJlc3NDb2RlYyB9IGZyb20gJy4vcmVjaXBpZW50JztcbmltcG9ydCAqIGFzIGZpeGVkU2NyaXB0IGZyb20gJy4vZml4ZWRTY3JpcHQnO1xuaW1wb3J0ICogYXMgZGVzY3JpcHRvciBmcm9tICcuL2Rlc2NyaXB0b3InO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIGJpZ2ludCB8IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+LFxuICBhZGRyZXNzQ29kZWM6IEFkZHJlc3NDb2RlYyA9IG5ldyBBZGRyZXNzQ29kZWMoY29pbi5uYW1lKVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChpc0Rlc2NyaXB0b3JXYWxsZXQocGFyYW1zLndhbGxldCkpIHtcbiAgICBjb25zdCB3YWxsZXRLZXlzID0gdG9CaXAzMlRyaXBsZShhd2FpdCBmZXRjaEtleWNoYWlucyhjb2luLCBwYXJhbXMud2FsbGV0KSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IudmVyaWZ5VHJhbnNhY3Rpb24oXG4gICAgICBjb2luLFxuICAgICAgcGFyYW1zLFxuICAgICAgZ2V0RGVzY3JpcHRvck1hcEZyb21XYWxsZXQocGFyYW1zLndhbGxldCwgd2FsbGV0S2V5cywgZ2V0UG9saWN5Rm9yRW52KGJpdGdvLmVudikpLFxuICAgICAgYWRkcmVzc0NvZGVjXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZml4ZWRTY3JpcHQudmVyaWZ5VHJhbnNhY3Rpb24oY29pbiwgYml0Z28sIHBhcmFtcyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/impl/zec/unit/address.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const sdk_api_1 = require("@bitgo/sdk-api");
8
+ const zec_1 = require("../../../../../src/impl/zec");
9
+ // ZIP-316 unified-address test vectors, copied from
10
+ // BitGoWASM/packages/wasm-utxo/test/fixtures/zcash/unified_address.json so
11
+ // both repos test against the same known-good data.
12
+ const zip316Mainnet = {
13
+ unified: 'u1pg2aaph7jp8rpf6yhsza25722sg5fcn3vaca6ze27hqjw7jvvhhuxkpcg0ge9xh6drsgdkda8qjq5chpehkcpxf87rnjryjqwymdheptpvnljqqrjqzjwkc2ma6hcq666kgwfytxwac8eyex6ndgr6ezte66706e3vaqrd25dzvzkc69kw0jgywtd0cmq52q5lkw6uh7hyvzjse8ksx',
14
+ };
15
+ const testnetWallet = {
16
+ unified: 'utest1w5m0qcnp8egl8qa296n70n8nvj0tqnzk90p7f48v7mjhhdrdqs8vgqydslg5plmzefawefnpmgmlm6hcy38m972erwxs04s02cq2prhguz8kqly75m6zjy56m08d5jnycgtpqtjeprte576gkmrxyszepgx76yzuwhh7m4lfz9jaq7unjk0x5ant46juxz73hsc6q4v3dqtzww00vps',
17
+ transparentAddress: 'tmM4DvLVJKXZt5ydn1tqYTHvahpKSwgjuRk',
18
+ };
19
+ describe('Zcash address validation', function () {
20
+ let bitgo;
21
+ let zec;
22
+ let tzec;
23
+ before(function () {
24
+ bitgo = new sdk_api_1.BitGoAPI({ env: 'mock' });
25
+ bitgo.register('zec', zec_1.Zec.createInstance);
26
+ bitgo.register('tzec', zec_1.Tzec.createInstance);
27
+ zec = bitgo.coin('zec');
28
+ tzec = bitgo.coin('tzec');
29
+ });
30
+ it('recognizes a mainnet unified address as shielded', function () {
31
+ strict_1.default.strictEqual(zec.isValidAddress(zip316Mainnet.unified), true);
32
+ strict_1.default.strictEqual((0, zec_1.getZcashAddressKind)(zip316Mainnet.unified, 'zec'), 'shielded');
33
+ strict_1.default.strictEqual((0, zec_1.isShieldedZcashAddress)(zip316Mainnet.unified, 'zec'), true);
34
+ strict_1.default.strictEqual((0, zec_1.isValidZcashAddress)(zip316Mainnet.unified, 'zec'), true);
35
+ });
36
+ it('recognizes a testnet unified address as shielded', function () {
37
+ strict_1.default.strictEqual(tzec.isValidAddress(testnetWallet.unified), true);
38
+ strict_1.default.strictEqual((0, zec_1.getZcashAddressKind)(testnetWallet.unified, 'tzec'), 'shielded');
39
+ strict_1.default.strictEqual((0, zec_1.isShieldedZcashAddress)(testnetWallet.unified, 'tzec'), true);
40
+ strict_1.default.strictEqual((0, zec_1.isValidZcashAddress)(testnetWallet.unified, 'tzec'), true);
41
+ });
42
+ it('recognizes a testnet transparent address as transparent', function () {
43
+ strict_1.default.strictEqual(tzec.isValidAddress(testnetWallet.transparentAddress), true);
44
+ strict_1.default.strictEqual((0, zec_1.getZcashAddressKind)(testnetWallet.transparentAddress, 'tzec'), 'transparent');
45
+ strict_1.default.strictEqual((0, zec_1.isValidZcashAddress)(testnetWallet.transparentAddress, 'tzec'), true);
46
+ });
47
+ it('recognizes a mainnet transparent (P2PKH) address as transparent', function () {
48
+ const address = 't1cN2ZVWzWcVRrnfeQzmkpLhzQ4dYRv8yRY';
49
+ strict_1.default.strictEqual(zec.isValidAddress(address), true);
50
+ strict_1.default.strictEqual((0, zec_1.getZcashAddressKind)(address, 'zec'), 'transparent');
51
+ strict_1.default.strictEqual((0, zec_1.isValidZcashAddress)(address, 'zec'), true);
52
+ });
53
+ it('rejects a garbage string', function () {
54
+ const garbage = 'not-a-real-address';
55
+ strict_1.default.strictEqual(zec.isValidAddress(garbage), false);
56
+ strict_1.default.strictEqual((0, zec_1.getZcashAddressKind)(garbage, 'zec'), undefined);
57
+ strict_1.default.strictEqual((0, zec_1.isValidZcashAddress)(garbage, 'zec'), false);
58
+ });
59
+ it('rejects a unified address checked against the wrong network', function () {
60
+ strict_1.default.strictEqual(tzec.isValidAddress(zip316Mainnet.unified), false);
61
+ strict_1.default.strictEqual((0, zec_1.getZcashAddressKind)(zip316Mainnet.unified, 'tzec'), undefined);
62
+ strict_1.default.strictEqual((0, zec_1.isShieldedZcashAddress)(zip316Mainnet.unified, 'tzec'), false);
63
+ strict_1.default.strictEqual((0, zec_1.isValidZcashAddress)(zip316Mainnet.unified, 'tzec'), false);
64
+ });
65
+ });
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9pbXBsL3plYy91bml0L2FkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxnRUFBd0M7QUFFeEMsNENBQTBDO0FBRTFDLHFEQU1xQztBQUVyQyxvREFBb0Q7QUFDcEQsMkVBQTJFO0FBQzNFLG9EQUFvRDtBQUNwRCxNQUFNLGFBQWEsR0FBRztJQUNwQixPQUFPLEVBQ0wsdU5BQXVOO0NBQzFOLENBQUM7QUFDRixNQUFNLGFBQWEsR0FBRztJQUNwQixPQUFPLEVBQ0wsMk5BQTJOO0lBQzdOLGtCQUFrQixFQUFFLHFDQUFxQztDQUMxRCxDQUFDO0FBRUYsUUFBUSxDQUFDLDBCQUEwQixFQUFFO0lBQ25DLElBQUksS0FBZSxDQUFDO0lBQ3BCLElBQUksR0FBRyxDQUFDO0lBQ1IsSUFBSSxJQUFJLENBQUM7SUFFVCxNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsSUFBSSxrQkFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1QyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrREFBa0QsRUFBRTtRQUNyRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxnQkFBTSxD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QztRQUN0RSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLHlCQUFtQixFQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEYsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSw0QkFBc0IsRUFBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEseUJBQW1CLEVBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydC9zdHJpY3QnO1xuXG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcblxuaW1wb3J0IHtcbiAgWmVjLFxuICBUemVjLFxuICBnZXRaY2FzaEFkZHJlc3NLaW5kLFxuICBpc1NoaWVsZGVkWmNhc2hBZGRyZXNzLFxuICBpc1ZhbGlkWmNhc2hBZGRyZXNzLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvaW1wbC96ZWMnO1xuXG4vLyBaSVAtMzE2IHVuaWZpZWQtYWRkcmVzcyB0ZXN0IHZlY3RvcnMsIGNvcGllZCBmcm9tXG4vLyBCaXRHb1dBU00vcGFja2FnZXMvd2FzbS11dHhvL3Rlc3QvZml4dHVyZXMvemNhc2gvdW5pZmllZF9hZGRyZXNzLmpzb24gc29cbi8vIGJvdGggcmVwb3MgdGVzdCBhZ2FpbnN0IHRoZSBzYW1lIGtub3duLWdvb2QgZGF0YS5cbmNvbnN0IHppcDMxNk1haW5uZXQgPSB7XG4gIHVuaWZpZWQ6XG4gICAgJ3UxcGcyYWFwaDdqcDhycGY2eWhzemEyNTcyMnNnNWZjbjN2YWNhNnplMjdocWp3N2p2dmhodXhrcGNnMGdlOXhoNmRyc2dka2RhOHFqcTVjaHBlaGtjcHhmODdybmpyeWpxd3ltZGhlcHRwdm5sanFxcmpxemp3a2MybWE2aGNxNjY2a2d3Znl0eHdhYzhleWV4Nm5kZ3I2ZXp0ZTY2NzA2ZTN2YXFyZDI1ZHp2emtjNjlrdzBqZ3l3dGQwY21xNTJxNWxrdzZ1aDdoeXZ6anNlOGtzeCcsXG59O1xuY29uc3QgdGVzdG5ldFdhbGxldCA9IHtcbiAgdW5pZmllZDpcbiAgICAndXRlc3QxdzVtMHFjbnA4ZWdsOHFhMjk2bjcwbjhudmowdHFuems5MHA3ZjQ4djdtamhoZHJkcXM4dmdxeWRzbGc1cGxtemVmYXdlZm5wbWdtbG02aGN5MzhtOTcyZXJ3eHMwNHMwMmNxMnByaGd1ejhrcWx5NzVtNnpqeTU2bTA4ZDVqbnljZ3RwcXRqZXBydGU1NzZna21yeHlzemVwZ3g3Nnl6dXdoaDdtNGxmejlqYXE3dW5qazB4NWFudDQ2anV4ejczaHNjNnE0djNkcXR6d3cwMHZwcycsXG4gIHRyYW5zcGFyZW50QWRkcmVzczogJ3RtTTREdkxWSktYWnQ1eWRuMXRxWVRIdmFocEtTd2dqdVJrJyxcbn07XG5cbmRlc2NyaWJlKCdaY2FzaCBhZGRyZXNzIHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogQml0R29BUEk7XG4gIGxldCB6ZWM7XG4gIGxldCB0emVjO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBuZXcgQml0R29BUEkoeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5yZWdpc3RlcignemVjJywgWmVjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5yZWdpc3RlcigndHplYycsIFR6ZWMuY3JlYXRlSW5zdGFuY2UpO1xuICAgIHplYyA9IGJpdGdvLmNvaW4oJ3plYycpO1xuICAgIHR6ZWMgPSBiaXRnby5jb2luKCd0emVjJyk7XG4gIH0pO1xuXG4gIGl0KCdyZWNvZ25pemVzIGEgbWFpbm5ldCB1bmlmaWVkIGFkZHJlc3MgYXMgc2hpZWxkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHplYy5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpLCB0cnVlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0WmNhc2hBZGRyZXNzS2luZCh6aXAzMTZNYWlubmV0LnVuaWZpZWQsICd6ZWMnKSwgJ3NoaWVsZGVkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzU2hpZWxkZWRaY2FzaEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAnemVjJyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3plYycpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlY29nbml6ZXMgYSB0ZXN0bmV0IHVuaWZpZWQgYWRkcmVzcyBhcyBzaGllbGRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHplYy5pc1ZhbGlkQWRkcmVzcyh0ZXN0bmV0V2FsbGV0LnVuaWZpZWQpLCB0cnVlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0WmNhc2hBZGRyZXNzS2luZCh0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsICd0emVjJyksICdzaGllbGRlZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1NoaWVsZGVkWmNhc2hBZGRyZXNzKHRlc3RuZXRXYWxsZXQudW5pZmllZCwgJ3R6ZWMnKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRaY2FzaEFkZHJlc3ModGVzdG5ldFdhbGxldC51bmlmaWVkLCAndHplYycpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlY29nbml6ZXMgYSB0ZXN0bmV0IHRyYW5zcGFyZW50IGFkZHJlc3MgYXMgdHJhbnNwYXJlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR6ZWMuaXNWYWxpZEFkZHJlc3ModGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpLCB0cnVlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0WmNhc2hBZGRyZXNzS2luZCh0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcywgJ3R6ZWMnKSwgJ3RyYW5zcGFyZW50Jyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRaY2FzaEFkZHJlc3ModGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MsICd0emVjJyksIHRydWUpO1xuICB9KTtcblxuICBpdCgncmVjb2duaXplcyBhIG1haW5uZXQgdHJhbnNwYXJlbnQgKFAyUEtIKSBhZGRyZXNzIGFzIHRyYW5zcGFyZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFkZHJlc3MgPSAndDFjTjJaVld6V2NWUnJuZmVRem1rcExoelE0ZFlSdjh5UlknO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh6ZWMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRaY2FzaEFkZHJlc3NLaW5kKGFkZHJlc3MsICd6ZWMnKSwgJ3RyYW5zcGFyZW50Jyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRaY2FzaEFkZHJlc3MoYWRkcmVzcywgJ3plYycpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSBnYXJiYWdlIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBnYXJiYWdlID0gJ25vdC1hLXJlYWwtYWRkcmVzcyc7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHplYy5pc1ZhbGlkQWRkcmVzcyhnYXJiYWdlKSwgZmFsc2UpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRaY2FzaEFkZHJlc3NLaW5kKGdhcmJhZ2UsICd6ZWMnKSwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFpjYXNoQWRkcmVzcyhnYXJiYWdlLCAnemVjJyksIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSB1bmlmaWVkIGFkZHJlc3MgY2hlY2tlZCBhZ2FpbnN0IHRoZSB3cm9uZyBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0emVjLmlzVmFsaWRBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCksIGZhbHNlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0WmNhc2hBZGRyZXNzS2luZCh6aXAzMTZNYWlubmV0LnVuaWZpZWQsICd0emVjJyksIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzU2hpZWxkZWRaY2FzaEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAndHplYycpLCBmYWxzZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRaY2FzaEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAndHplYycpLCBmYWxzZSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolvePsbtRecipients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvePsbtRecipients.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/impl/zec/unit/resolvePsbtRecipients.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
8
+ const recipients_1 = require("../../../../../src/impl/zec/recipients");
9
+ const util_1 = require("../../../util");
10
+ // ZIP-316 unified-address test vector, copied from
11
+ // BitGoWASM/packages/wasm-utxo/test/fixtures/zcash/unified_address.json so both repos test
12
+ // against the same known-good data.
13
+ const testnetWallet = {
14
+ unified: 'utest1w5m0qcnp8egl8qa296n70n8nvj0tqnzk90p7f48v7mjhhdrdqs8vgqydslg5plmzefawefnpmgmlm6hcy38m972erwxs04s02cq2prhguz8kqly75m6zjy56m08d5jnycgtpqtjeprte576gkmrxyszepgx76yzuwhh7m4lfz9jaq7unjk0x5ant46juxz73hsc6q4v3dqtzww00vps',
15
+ transparentAddress: 'tmM4DvLVJKXZt5ydn1tqYTHvahpKSwgjuRk',
16
+ };
17
+ const IRONWOOD_HEIGHT = 4200000; // after the NU6.3 testnet activation (4134000)
18
+ const IRONWOOD_RECEIVER = Buffer.from('d632c28aa0831d671be17709a42c9627e2eb687a1b2a55768ea470c9bae7499cd0bd3d0eb0484e307236b5', 'hex');
19
+ describe('resolvePsbtRecipients', function () {
20
+ const { walletKeys } = (0, util_1.getDefaultWasmWalletKeys)();
21
+ function buildV4Psbt(unifiedAddress) {
22
+ const psbt = wasm_utxo_1.fixedScriptWallet.ZcashBitGoPsbt.createEmpty('tzec', walletKeys, { blockHeight: 3146400 });
23
+ psbt.addWalletInput({ txid: '22'.repeat(32), vout: 0, value: 200000n }, walletKeys, {
24
+ scriptId: { chain: 0, index: 1 },
25
+ });
26
+ psbt.addWalletOutput(walletKeys, { chain: 1, index: 0, value: 100000n });
27
+ const externalScript = wasm_utxo_1.address.toOutputScriptWithCoin(testnetWallet.transparentAddress, 'tzec');
28
+ psbt.addTransparentOutput(externalScript, 12345n, unifiedAddress);
29
+ return psbt;
30
+ }
31
+ function buildV6Psbt(unifiedAddress) {
32
+ const psbt = wasm_utxo_1.fixedScriptWallet.ZcashIronwoodBitGoPsbt.createEmpty('tzec', walletKeys, {
33
+ blockHeight: IRONWOOD_HEIGHT,
34
+ });
35
+ psbt.addWalletInput({ txid: '11'.repeat(32), vout: 0, value: 100000n }, walletKeys, {
36
+ scriptId: { chain: 0, index: 0 },
37
+ });
38
+ psbt.addWalletOutput(walletKeys, { chain: 1, index: 0, value: 90000n });
39
+ psbt.addShieldedOutputs([{ recipient: new Uint8Array(IRONWOOD_RECEIVER), amount: 5000n, unifiedAddress }], new Uint8Array(32) // all-zero anchor, as in the utxo-core shielded build tests
40
+ );
41
+ return psbt;
42
+ }
43
+ it('resolves external transparent outputs and excludes wallet change (v4)', function () {
44
+ const recipients = (0, recipients_1.resolvePsbtRecipients)(buildV4Psbt(), walletKeys);
45
+ strict_1.default.strictEqual(recipients.length, 1);
46
+ const recipient = recipients[0];
47
+ strict_1.default.strictEqual(recipient.destination.kind, 'transparent');
48
+ strict_1.default.strictEqual(recipient.address, testnetWallet.transparentAddress);
49
+ strict_1.default.strictEqual(recipient.amount, 12345n);
50
+ strict_1.default.strictEqual(recipient.unifiedAddress, undefined);
51
+ strict_1.default.deepStrictEqual(Buffer.from(recipient.script), Buffer.from(wasm_utxo_1.address.toOutputScriptWithCoin(testnetWallet.transparentAddress, 'tzec')));
52
+ });
53
+ it('reports the original UA verbatim for a transparent output built from a Unified Address (v4)', function () {
54
+ const recipients = (0, recipients_1.resolvePsbtRecipients)(buildV4Psbt(testnetWallet.unified), walletKeys);
55
+ strict_1.default.strictEqual(recipients.length, 1);
56
+ const recipient = recipients[0];
57
+ strict_1.default.deepStrictEqual(recipient.destination, {
58
+ kind: 'zcashUnifiedTransparent',
59
+ unifiedAddress: testnetWallet.unified,
60
+ });
61
+ strict_1.default.strictEqual(recipient.unifiedAddress, testnetWallet.unified);
62
+ // For a transparent output built from a Unified Address, the parsed address is the UA
63
+ // itself (verbatim), not just the transparent receiver.
64
+ strict_1.default.strictEqual(recipient.address, testnetWallet.unified);
65
+ });
66
+ it('resolves a shielded v6 output to its (re-encoded) Orchard Unified Address recipient', function () {
67
+ const recipients = (0, recipients_1.resolvePsbtRecipients)(buildV6Psbt(), walletKeys);
68
+ strict_1.default.strictEqual(recipients.length, 1);
69
+ const recipient = recipients[0];
70
+ const expectedAddress = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.encodeOrchardReceiver(new Uint8Array(IRONWOOD_RECEIVER), 'tzec');
71
+ strict_1.default.deepStrictEqual(recipient.destination, {
72
+ kind: 'zcashShielded',
73
+ unifiedAddress: expectedAddress,
74
+ });
75
+ strict_1.default.strictEqual(recipient.address, expectedAddress);
76
+ strict_1.default.strictEqual(recipient.amount, 5000n);
77
+ strict_1.default.deepStrictEqual(Buffer.from(recipient.script), IRONWOOD_RECEIVER);
78
+ });
79
+ it('reports the original UA verbatim for a shielded output built from a Unified Address (v6)', function () {
80
+ const orchardOnlyUa = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.encodeOrchardReceiver(new Uint8Array(IRONWOOD_RECEIVER), 'tzec');
81
+ const recipients = (0, recipients_1.resolvePsbtRecipients)(buildV6Psbt(orchardOnlyUa), walletKeys);
82
+ strict_1.default.strictEqual(recipients.length, 1);
83
+ const recipient = recipients[0];
84
+ strict_1.default.deepStrictEqual(recipient.destination, { kind: 'zcashShielded', unifiedAddress: orchardOnlyUa });
85
+ strict_1.default.strictEqual(recipient.unifiedAddress, orchardOnlyUa);
86
+ strict_1.default.strictEqual(recipient.address, orchardOnlyUa);
87
+ });
88
+ });
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZVBzYnRSZWNpcGllbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2ltcGwvemVjL3VuaXQvcmVzb2x2ZVBzYnRSZWNpcGllbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0VBQXdDO0FBRXhDLGdEQUE2RTtBQUU3RSx1RUFBK0U7QUFDL0Usd0NBQXlEO0FBRXpELG1EQUFtRDtBQUNuRCwyRkFBMkY7QUFDM0Ysb0NBQW9DO0FBQ3BDLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLE9BQU8sRUFDTCwyTkFBMk47SUFDN04sa0JBQWtCLEVBQUUscUNBQXFDO0NBQzFELENBQUM7QUFDRixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsQ0FBQywrQ0FBK0M7QUFDaEYsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUNuQyx3RkFBd0YsRUFDeEYsS0FBSyxDQUNOLENBQUM7QUFFRixRQUFRLENBQUMsdUJBQXVCLEVBQUU7SUFDaEMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUEsK0JBQXdCLEdBQUUsQ0FBQztJQUVsRCxTQUFTLFdBQVcsQ0FBQyxjQUF1QjtRQUMxQyxNQUFNLElBQUksR0FBRyw2QkFBaUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFO1lBQ2xGLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUNqQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFB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QUMsTUFBTSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwRkFBMEYsRUFBRTtRQUM3RixNQUFNLGFBQWEsR0FBRyw2QkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FDL0UsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFDakMsTUFBTSxDQUNQLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxJQUFBLGtDQUFxQixFQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN4RyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELGdCQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQvc3RyaWN0JztcblxuaW1wb3J0IHsgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcywgZml4ZWRTY3JpcHRXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHsgcmVzb2x2ZVBzYnRSZWNpcGllbnRzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjL3JlY2lwaWVudHMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFdhc21XYWxsZXRLZXlzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbCc7XG5cbi8vIFpJUC0zMTYgdW5pZmllZC1hZGRyZXNzIHRlc3QgdmVjdG9yLCBjb3BpZWQgZnJvbVxuLy8gQml0R29XQVNNL3BhY2thZ2VzL3dhc20tdXR4by90ZXN0L2ZpeHR1cmVzL3pjYXNoL3VuaWZpZWRfYWRkcmVzcy5qc29uIHNvIGJvdGggcmVwb3MgdGVzdFxuLy8gYWdhaW5zdCB0aGUgc2FtZSBrbm93bi1nb29kIGRhdGEuXG5jb25zdCB0ZXN0bmV0V2FsbGV0ID0ge1xuICB1bmlmaWVkOlxuICAgICd1dGVzdDF3NW0wcWNucDhlZ2w4cWEyOTZuNzBuOG52ajB0cW56azkwcDdmNDh2N21qaGhkcmRxczh2Z3F5ZHNsZzVwbG16ZWZhd2VmbnBtZ21sbTZoY3kzOG05NzJlcnd4czA0czAyY3EycHJoZ3V6OGtxbHk3NW02emp5NTZtMDhkNWpueWNndHBxdGplcHJ0ZTU3NmdrbXJ4eXN6ZXBneDc2eXp1d2hoN200bGZ6OWphcTd1bmprMHg1YW50NDZqdXh6NzNoc2M2cTR2M2RxdHp3dzAwdnBzJyxcbiAgdHJhbnNwYXJlbnRBZGRyZXNzOiAndG1NNER2TFZKS1hadDV5ZG4xdHFZVEh2YWhwS1N3Z2p1UmsnLFxufTtcbmNvbnN0IElST05XT09EX0hFSUdIVCA9IDQyMDAwMDA7IC8vIGFmdGVyIHRoZSBOVTYuMyB0ZXN0bmV0IGFjdGl2YXRpb24gKDQxMzQwMDApXG5jb25zdCBJUk9OV09PRF9SRUNFSVZFUiA9IEJ1ZmZlci5mcm9tKFxuICAnZDYzMmMyOGFhMDgzMWQ2NzFiZTE3NzA5YTQyYzk2MjdlMmViNjg3YTFiMmE1NTc2OGVhNDcwYzliYWU3NDk5Y2QwYmQzZDBlYjA0ODRlMzA3MjM2YjUnLFxuICAnaGV4J1xuKTtcblxuZGVzY3JpYmUoJ3Jlc29sdmVQc2J0UmVjaXBpZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgeyB3YWxsZXRLZXlzIH0gPSBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMoKTtcblxuICBmdW5jdGlvbiBidWlsZFY0UHNidCh1bmlmaWVkQWRkcmVzcz86IHN0cmluZyk6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoQml0R29Qc2J0IHtcbiAgICBjb25zdCBwc2J0ID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hCaXRHb1BzYnQuY3JlYXRlRW1wdHkoJ3R6ZWMnLCB3YWxsZXRLZXlzLCB7IGJsb2NrSGVpZ2h0OiAzMTQ2NDAwIH0pO1xuICAgIHBzYnQuYWRkV2FsbGV0SW5wdXQoeyB0eGlkOiAnMjInLnJlcGVhdCgzMiksIHZvdXQ6IDAsIHZhbHVlOiAyMDAwMDBuIH0sIHdhbGxldEtleXMsIHtcbiAgICAgIHNjcmlwdElkOiB7IGNoYWluOiAwLCBpbmRleDogMSB9LFxuICAgIH0pO1xuICAgIHBzYnQuYWRkV2FsbGV0T3V0cHV0KHdhbGxldEtleXMsIHsgY2hhaW46IDEsIGluZGV4OiAwLCB2YWx1ZTogMTAwMDAwbiB9KTtcbiAgICBjb25zdCBleHRlcm5hbFNjcmlwdCA9IHdhc21BZGRyZXNzLnRvT3V0cHV0U2NyaXB0V2l0aENvaW4odGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MsICd0emVjJyk7XG4gICAgcHNidC5hZGRUcmFuc3BhcmVudE91dHB1dChleHRlcm5hbFNjcmlwdCwgMTIzNDVuLCB1bmlmaWVkQWRkcmVzcyk7XG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFY2UHNidCh1bmlmaWVkQWRkcmVzcz86IHN0cmluZyk6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoSXJvbndvb2RCaXRHb1BzYnQge1xuICAgIGNvbnN0IHBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaElyb253b29kQml0R29Qc2J0LmNyZWF0ZUVtcHR5KCd0emVjJywgd2FsbGV0S2V5cywge1xuICAgICAgYmxvY2tIZWlnaHQ6IElST05XT09EX0hFSUdIVCxcbiAgICB9KTtcbiAgICBwc2J0LmFkZFdhbGxldElucHV0KHsgdHhpZDogJzExJy5yZXBlYXQoMzIpLCB2b3V0OiAwLCB2YWx1ZTogMTAwMDAwbiB9LCB3YWxsZXRLZXlzLCB7XG4gICAgICBzY3JpcHRJZDogeyBjaGFpbjogMCwgaW5kZXg6IDAgfSxcbiAgICB9KTtcbiAgICBwc2J0LmFkZFdhbGxldE91dHB1dCh3YWxsZXRLZXlzLCB7IGNoYWluOiAxLCBpbmRleDogMCwgdmFsdWU6IDkwMDAwbiB9KTtcbiAgICBwc2J0LmFkZFNoaWVsZGVkT3V0cHV0cyhcbiAgICAgIFt7IHJlY2lwaWVudDogbmV3IFVpbnQ4QXJyYXkoSVJPTldPT0RfUkVDRUlWRVIpLCBhbW91bnQ6IDUwMDBuLCB1bmlmaWVkQWRkcmVzcyB9XSxcbiAgICAgIG5ldyBVaW50OEFycmF5KDMyKSAvLyBhbGwtemVybyBhbmNob3IsIGFzIGluIHRoZSB1dHhvLWNvcmUgc2hpZWxkZWQgYnVpbGQgdGVzdHNcbiAgICApO1xuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgaXQoJ3Jlc29sdmVzIGV4dGVybmFsIHRyYW5zcGFyZW50IG91dHB1dHMgYW5kIGV4Y2x1ZGVzIHdhbGxldCBjaGFuZ2UgKHY0KScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZWNpcGllbnRzID0gcmVzb2x2ZVBzYnRSZWNpcGllbnRzKGJ1aWxkVjRQc2J0KCksIHdhbGxldEtleXMpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnRzLmxlbmd0aCwgMSk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gcmVjaXBpZW50c1swXTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50LmRlc3RpbmF0aW9uLmtpbmQsICd0cmFuc3BhcmVudCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnQuYWRkcmVzcywgdGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnQuYW1vdW50LCAxMjM0NW4pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnQudW5pZmllZEFkZHJlc3MsIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgIEJ1ZmZlci5mcm9tKHJlY2lwaWVudC5zY3JpcHQpLFxuICAgICAgQnVmZmVyLmZyb20od2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbih0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcywgJ3R6ZWMnKSlcbiAgICApO1xuICB9KTtcblxuICBpdCgncmVwb3J0cyB0aGUgb3JpZ2luYWwgVUEgdmVyYmF0aW0gZm9yIGEgdHJhbnNwYXJlbnQgb3V0cHV0IGJ1aWx0IGZyb20gYSBVbmlmaWVkIEFkZHJlc3MgKHY0KScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZWNpcGllbnRzID0gcmVzb2x2ZVBzYnRSZWNpcGllbnRzKGJ1aWxkVjRQc2J0KHRlc3RuZXRXYWxsZXQudW5pZmllZCksIHdhbGxldEtleXMpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnRzLmxlbmd0aCwgMSk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gcmVjaXBpZW50c1swXTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlY2lwaWVudC5kZXN0aW5hdGlvbiwge1xuICAgICAga2luZDogJ3pjYXNoVW5pZmllZFRyYW5zcGFyZW50JyxcbiAgICAgIHVuaWZpZWRBZGRyZXNzOiB0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsXG4gICAgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC51bmlmaWVkQWRkcmVzcywgdGVzdG5ldFdhbGxldC51bmlmaWVkKTtcbiAgICAvLyBGb3IgYSB0cmFuc3BhcmVudCBvdXRwdXQgYnVpbHQgZnJvbSBhIFVuaWZpZWQgQWRkcmVzcywgdGhlIHBhcnNlZCBhZGRyZXNzIGlzIHRoZSBVQVxuICAgIC8vIGl0c2VsZiAodmVyYmF0aW0pLCBub3QganVzdCB0aGUgdHJhbnNwYXJlbnQgcmVjZWl2ZXIuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC5hZGRyZXNzLCB0ZXN0bmV0V2FsbGV0LnVuaWZpZWQpO1xuICB9KTtcblxuICBpdCgncmVzb2x2ZXMgYSBzaGllbGRlZCB2NiBvdXRwdXQgdG8gaXRzIChyZS1lbmNvZGVkKSBPcmNoYXJkIFVuaWZpZWQgQWRkcmVzcyByZWNpcGllbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHJlc29sdmVQc2J0UmVjaXBpZW50cyhidWlsZFY2UHNidCgpLCB3YWxsZXRLZXlzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50cy5sZW5ndGgsIDEpO1xuICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbMF07XG4gICAgY29uc3QgZXhwZWN0ZWRBZGRyZXNzID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hVbmlmaWVkQWRkcmVzcy5lbmNvZGVPcmNoYXJkUmVjZWl2ZXIoXG4gICAgICBuZXcgVWludDhBcnJheShJUk9OV09PRF9SRUNFSVZFUiksXG4gICAgICAndHplYydcbiAgICApO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjaXBpZW50LmRlc3RpbmF0aW9uLCB7XG4gICAgICBraW5kOiAnemNhc2hTaGllbGRlZCcsXG4gICAgICB1bmlmaWVkQWRkcmVzczogZXhwZWN0ZWRBZGRyZXNzLFxuICAgIH0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnQuYWRkcmVzcywgZXhwZWN0ZWRBZGRyZXNzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50LmFtb3VudCwgNTAwMG4pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20ocmVjaXBpZW50LnNjcmlwdCksIElST05XT09EX1JFQ0VJVkVSKTtcbiAgfSk7XG5cbiAgaXQoJ3JlcG9ydHMgdGhlIG9yaWdpbmFsIFVBIHZlcmJhdGltIGZvciBhIHNoaWVsZGVkIG91dHB1dCBidWlsdCBmcm9tIGEgVW5pZmllZCBBZGRyZXNzICh2NiknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgb3JjaGFyZE9ubHlVYSA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MuZW5jb2RlT3JjaGFyZFJlY2VpdmVyKFxuICAgICAgbmV3IFVpbnQ4QXJyYXkoSVJPTldPT0RfUkVDRUlWRVIpLFxuICAgICAgJ3R6ZWMnXG4gICAgKTtcbiAgICBjb25zdCByZWNpcGllbnRzID0gcmVzb2x2ZVBzYnRSZWNpcGllbnRzKGJ1aWxkVjZQc2J0KG9yY2hhcmRPbmx5VWEpLCB3YWxsZXRLZXlzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50cy5sZW5ndGgsIDEpO1xuICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbMF07XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWNpcGllbnQuZGVzdGluYXRpb24sIHsga2luZDogJ3pjYXNoU2hpZWxkZWQnLCB1bmlmaWVkQWRkcmVzczogb3JjaGFyZE9ubHlVYSB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50LnVuaWZpZWRBZGRyZXNzLCBvcmNoYXJkT25seVVhKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50LmFkZHJlc3MsIG9yY2hhcmRPbmx5VWEpO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=unifiedRecipientPreference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unifiedRecipientPreference.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/impl/zec/unit/unifiedRecipientPreference.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
8
+ const recipients_1 = require("../../../../../src/impl/zec/recipients");
9
+ // ZIP-316 unified-address test vectors, copied from
10
+ // BitGoWASM/packages/wasm-utxo/test/fixtures/zcash/unified_address.json so
11
+ // both repos test against the same known-good data.
12
+ const zip316Mainnet = {
13
+ unified: 'u1pg2aaph7jp8rpf6yhsza25722sg5fcn3vaca6ze27hqjw7jvvhhuxkpcg0ge9xh6drsgdkda8qjq5chpehkcpxf87rnjryjqwymdheptpvnljqqrjqzjwkc2ma6hcq666kgwfytxwac8eyex6ndgr6ezte66706e3vaqrd25dzvzkc69kw0jgywtd0cmq52q5lkw6uh7hyvzjse8ksx',
14
+ };
15
+ const testnetWallet = {
16
+ unified: 'utest1w5m0qcnp8egl8qa296n70n8nvj0tqnzk90p7f48v7mjhhdrdqs8vgqydslg5plmzefawefnpmgmlm6hcy38m972erwxs04s02cq2prhguz8kqly75m6zjy56m08d5jnycgtpqtjeprte576gkmrxyszepgx76yzuwhh7m4lfz9jaq7unjk0x5ant46juxz73hsc6q4v3dqtzww00vps',
17
+ transparentAddress: 'tmM4DvLVJKXZt5ydn1tqYTHvahpKSwgjuRk',
18
+ };
19
+ describe('getUnifiedRecipientPreference', function () {
20
+ function orchardOnlyUa(network) {
21
+ return wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.encodeOrchardReceiver(new Uint8Array(43).fill(0x42), network);
22
+ }
23
+ it('returns undefined for no recipients', function () {
24
+ strict_1.default.strictEqual((0, recipients_1.getUnifiedRecipientPreference)('tzec', []), undefined);
25
+ });
26
+ it('returns undefined for an ordinary transparent address', function () {
27
+ strict_1.default.strictEqual((0, recipients_1.getUnifiedRecipientPreference)('tzec', [{ address: testnetWallet.transparentAddress }]), undefined);
28
+ });
29
+ it('returns undefined for a raw-script recipient with no address', function () {
30
+ strict_1.default.strictEqual((0, recipients_1.getUnifiedRecipientPreference)('tzec', [{ address: undefined }]), undefined);
31
+ });
32
+ it("returns 'shielded' for an Orchard-only Unified Address", function () {
33
+ strict_1.default.strictEqual((0, recipients_1.getUnifiedRecipientPreference)('tzec', [{ address: orchardOnlyUa('tzec') }]), 'shielded');
34
+ });
35
+ it("infers 'shielded' on mainnet", function () {
36
+ strict_1.default.strictEqual((0, recipients_1.getUnifiedRecipientPreference)('zec', [{ address: orchardOnlyUa('zec') }]), 'shielded');
37
+ });
38
+ it('classifies a Unified Address carrying transparent + Orchard receivers as transparent', function () {
39
+ // Both official vectors carry a transparent receiver alongside the Orchard one, so the
40
+ // transparent-first classification applies even though they also classify as shielded.
41
+ strict_1.default.strictEqual((0, recipients_1.getUnifiedRecipientPreference)('tzec', [{ address: testnetWallet.unified }]), undefined);
42
+ strict_1.default.strictEqual((0, recipients_1.getUnifiedRecipientPreference)('zec', [{ address: zip316Mainnet.unified }]), undefined);
43
+ });
44
+ it('fails hard for an unrecognizable address instead of defaulting to transparent', function () {
45
+ strict_1.default.throws(() => (0, recipients_1.getUnifiedRecipientPreference)('tzec', [{ address: 'not-an-address' }]));
46
+ });
47
+ it('fails hard for a unified address on the wrong network', function () {
48
+ strict_1.default.throws(() => (0, recipients_1.getUnifiedRecipientPreference)('tzec', [{ address: zip316Mainnet.unified }]));
49
+ });
50
+ it('rejects a mix of shielded and transparent recipients', function () {
51
+ strict_1.default.throws(() => (0, recipients_1.getUnifiedRecipientPreference)('tzec', [
52
+ { address: orchardOnlyUa('tzec') },
53
+ { address: testnetWallet.transparentAddress },
54
+ ]), /Mixed shielded and transparent recipients/);
55
+ });
56
+ });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvaW1wbC96ZWMvdW5pdC91bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdFQUF3QztBQUV4QyxnREFBcUQ7QUFFckQsdUVBQXVGO0FBRXZGLG9EQUFvRDtBQUNwRCwyRUFBMkU7QUFDM0Usb0RBQW9EO0FBQ3BELE1BQU0sYUFBYSxHQUFHO0lBQ3BCLE9BQU8sRUFDTCx1TkFBdU47Q0FDMU4sQ0FBQztBQUNGLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLE9BQU8sRUFDTCwyTkFBMk47SUFDN04sa0JBQWtCLEVBQUUscUNBQXFDO0NBQzFELENBQUM7QUFFRixRQUFRLENBQUMsK0JBQStCLEVBQUU7SUFDeEMsU0FBUyxhQUFhLENBQUMsT0FBdUI7UUFDNUMsT0FBTyw2QkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0csQ0FBQztJQUVELEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRTtRQUN4QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBDQUE2QixFQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRTtRQUMxRCxnQkFBTSxDQUFDLFdBQVcsQ0FDaEIsSUFBQSwwQ0FBNkIsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLEVBQ3RGLFNBQVMsQ0FDVixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOERBQThELEVBQUU7UUFDakUsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQ0FBNkIsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakcsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUU7UUFDM0QsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQ0FBNkIsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUcsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7UUFDakMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQ0FBNkIsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDNUcsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0ZBQXNGLEVBQUU7UUFDekYsdUZBQXVGO1FBQ3ZGLHVGQUF1RjtRQUN2RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBDQUE2QixFQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0csZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQ0FBNkIsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVHLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtFQUErRSxFQUFFO1FBQ2xGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsMENBQTZCLEVBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRTtRQUMxRCxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDBDQUE2QixFQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzREFBc0QsRUFBRTtRQUN6RCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxJQUFBLDBDQUE2QixFQUFDLE1BQU0sRUFBRTtZQUNwQyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEMsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLGtCQUFrQixFQUFFO1NBQzlDLENBQUMsRUFDSiwyQ0FBMkMsQ0FDNUMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCB7IGZpeGVkU2NyaXB0V2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IGdldFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjL3JlY2lwaWVudHMnO1xuXG4vLyBaSVAtMzE2IHVuaWZpZWQtYWRkcmVzcyB0ZXN0IHZlY3RvcnMsIGNvcGllZCBmcm9tXG4vLyBCaXRHb1dBU00vcGFja2FnZXMvd2FzbS11dHhvL3Rlc3QvZml4dHVyZXMvemNhc2gvdW5pZmllZF9hZGRyZXNzLmpzb24gc29cbi8vIGJvdGggcmVwb3MgdGVzdCBhZ2FpbnN0IHRoZSBzYW1lIGtub3duLWdvb2QgZGF0YS5cbmNvbnN0IHppcDMxNk1haW5uZXQgPSB7XG4gIHVuaWZpZWQ6XG4gICAgJ3UxcGcyYWFwaDdqcDhycGY2eWhzemEyNTcyMnNnNWZjbjN2YWNhNnplMjdocWp3N2p2dmhodXhrcGNnMGdlOXhoNmRyc2dka2RhOHFqcTVjaHBlaGtjcHhmODdybmpyeWpxd3ltZGhlcHRwdm5sanFxcmpxemp3a2MybWE2aGNxNjY2a2d3Znl0eHdhYzhleWV4Nm5kZ3I2ZXp0ZTY2NzA2ZTN2YXFyZDI1ZHp2emtjNjlrdzBqZ3l3dGQwY21xNTJxNWxrdzZ1aDdoeXZ6anNlOGtzeCcsXG59O1xuY29uc3QgdGVzdG5ldFdhbGxldCA9IHtcbiAgdW5pZmllZDpcbiAgICAndXRlc3QxdzVtMHFjbnA4ZWdsOHFhMjk2bjcwbjhudmowdHFuems5MHA3ZjQ4djdtamhoZHJkcXM4dmdxeWRzbGc1cGxtemVmYXdlZm5wbWdtbG02aGN5MzhtOTcyZXJ3eHMwNHMwMmNxMnByaGd1ejhrcWx5NzVtNnpqeTU2bTA4ZDVqbnljZ3RwcXRqZXBydGU1NzZna21yeHlzemVwZ3g3Nnl6dXdoaDdtNGxmejlqYXE3dW5qazB4NWFudDQ2anV4ejczaHNjNnE0djNkcXR6d3cwMHZwcycsXG4gIHRyYW5zcGFyZW50QWRkcmVzczogJ3RtTTREdkxWSktYWnQ1eWRuMXRxWVRIdmFocEtTd2dqdVJrJyxcbn07XG5cbmRlc2NyaWJlKCdnZXRVbmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gb3JjaGFyZE9ubHlVYShuZXR3b3JrOiAnemVjJyB8ICd0emVjJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MuZW5jb2RlT3JjaGFyZFJlY2VpdmVyKG5ldyBVaW50OEFycmF5KDQzKS5maWxsKDB4NDIpLCBuZXR3b3JrKTtcbiAgfVxuXG4gIGl0KCdyZXR1cm5zIHVuZGVmaW5lZCBmb3Igbm8gcmVjaXBpZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0VW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UoJ3R6ZWMnLCBbXSksIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIHVuZGVmaW5lZCBmb3IgYW4gb3JkaW5hcnkgdHJhbnNwYXJlbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICBnZXRVbmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSgndHplYycsIFt7IGFkZHJlc3M6IHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzIH1dKSxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIHVuZGVmaW5lZCBmb3IgYSByYXctc2NyaXB0IHJlY2lwaWVudCB3aXRoIG5vIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlKCd0emVjJywgW3sgYWRkcmVzczogdW5kZWZpbmVkIH1dKSwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zICdzaGllbGRlZCcgZm9yIGFuIE9yY2hhcmQtb25seSBVbmlmaWVkIEFkZHJlc3NcIiwgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRVbmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSgndHplYycsIFt7IGFkZHJlc3M6IG9yY2hhcmRPbmx5VWEoJ3R6ZWMnKSB9XSksICdzaGllbGRlZCcpO1xuICB9KTtcblxuICBpdChcImluZmVycyAnc2hpZWxkZWQnIG9uIG1haW5uZXRcIiwgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRVbmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSgnemVjJywgW3sgYWRkcmVzczogb3JjaGFyZE9ubHlVYSgnemVjJykgfV0pLCAnc2hpZWxkZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ2NsYXNzaWZpZXMgYSBVbmlmaWVkIEFkZHJlc3MgY2FycnlpbmcgdHJhbnNwYXJlbnQgKyBPcmNoYXJkIHJlY2VpdmVycyBhcyB0cmFuc3BhcmVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBCb3RoIG9mZmljaWFsIHZlY3RvcnMgY2FycnkgYSB0cmFuc3BhcmVudCByZWNlaXZlciBhbG9uZ3NpZGUgdGhlIE9yY2hhcmQgb25lLCBzbyB0aGVcbiAgICAvLyB0cmFuc3BhcmVudC1maXJzdCBjbGFzc2lmaWNhdGlvbiBhcHBsaWVzIGV2ZW4gdGhvdWdoIHRoZXkgYWxzbyBjbGFzc2lmeSBhcyBzaGllbGRlZC5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0VW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UoJ3R6ZWMnLCBbeyBhZGRyZXNzOiB0ZXN0bmV0V2FsbGV0LnVuaWZpZWQgfV0pLCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRVbmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSgnemVjJywgW3sgYWRkcmVzczogemlwMzE2TWFpbm5ldC51bmlmaWVkIH1dKSwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ2ZhaWxzIGhhcmQgZm9yIGFuIHVucmVjb2duaXphYmxlIGFkZHJlc3MgaW5zdGVhZCBvZiBkZWZhdWx0aW5nIHRvIHRyYW5zcGFyZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZ2V0VW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UoJ3R6ZWMnLCBbeyBhZGRyZXNzOiAnbm90LWFuLWFkZHJlc3MnIH1dKSk7XG4gIH0pO1xuXG4gIGl0KCdmYWlscyBoYXJkIGZvciBhIHVuaWZpZWQgYWRkcmVzcyBvbiB0aGUgd3JvbmcgbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGdldFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlKCd0emVjJywgW3sgYWRkcmVzczogemlwMzE2TWFpbm5ldC51bmlmaWVkIH1dKSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgbWl4IG9mIHNoaWVsZGVkIGFuZCB0cmFuc3BhcmVudCByZWNpcGllbnRzJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PlxuICAgICAgICBnZXRVbmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSgndHplYycsIFtcbiAgICAgICAgICB7IGFkZHJlc3M6IG9yY2hhcmRPbmx5VWEoJ3R6ZWMnKSB9LFxuICAgICAgICAgIHsgYWRkcmVzczogdGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MgfSxcbiAgICAgICAgXSksXG4gICAgICAvTWl4ZWQgc2hpZWxkZWQgYW5kIHRyYW5zcGFyZW50IHJlY2lwaWVudHMvXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==