@chainvue/verus-sdk 0.4.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 (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -0
  3. package/dist/VerusSDK.d.ts +59 -0
  4. package/dist/VerusSDK.d.ts.map +1 -0
  5. package/dist/VerusSDK.js +170 -0
  6. package/dist/VerusSDK.js.map +1 -0
  7. package/dist/address/index.d.ts +16 -0
  8. package/dist/address/index.d.ts.map +1 -0
  9. package/dist/address/index.js +33 -0
  10. package/dist/address/index.js.map +1 -0
  11. package/dist/bundle.js +34129 -0
  12. package/dist/constants/index.d.ts +51 -0
  13. package/dist/constants/index.d.ts.map +1 -0
  14. package/dist/constants/index.js +53 -0
  15. package/dist/constants/index.js.map +1 -0
  16. package/dist/currency/classify.d.ts +14 -0
  17. package/dist/currency/classify.d.ts.map +1 -0
  18. package/dist/currency/classify.js +32 -0
  19. package/dist/currency/classify.js.map +1 -0
  20. package/dist/currency/index.d.ts +22 -0
  21. package/dist/currency/index.d.ts.map +1 -0
  22. package/dist/currency/index.js +87 -0
  23. package/dist/currency/index.js.map +1 -0
  24. package/dist/errors.d.ts +37 -0
  25. package/dist/errors.d.ts.map +1 -0
  26. package/dist/errors.js +69 -0
  27. package/dist/errors.js.map +1 -0
  28. package/dist/identity/index.d.ts +129 -0
  29. package/dist/identity/index.d.ts.map +1 -0
  30. package/dist/identity/index.js +691 -0
  31. package/dist/identity/index.js.map +1 -0
  32. package/dist/index.d.ts +24 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +96 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/keys/index.d.ts +48 -0
  37. package/dist/keys/index.d.ts.map +1 -0
  38. package/dist/keys/index.js +169 -0
  39. package/dist/keys/index.js.map +1 -0
  40. package/dist/message/index.d.ts +18 -0
  41. package/dist/message/index.d.ts.map +1 -0
  42. package/dist/message/index.js +61 -0
  43. package/dist/message/index.js.map +1 -0
  44. package/dist/signing/index.d.ts +53 -0
  45. package/dist/signing/index.d.ts.map +1 -0
  46. package/dist/signing/index.js +100 -0
  47. package/dist/signing/index.js.map +1 -0
  48. package/dist/transfer/index.d.ts +37 -0
  49. package/dist/transfer/index.d.ts.map +1 -0
  50. package/dist/transfer/index.js +275 -0
  51. package/dist/transfer/index.js.map +1 -0
  52. package/dist/types/index.d.ts +359 -0
  53. package/dist/types/index.d.ts.map +1 -0
  54. package/dist/types/index.js +6 -0
  55. package/dist/types/index.js.map +1 -0
  56. package/dist/utils/index.d.ts +48 -0
  57. package/dist/utils/index.d.ts.map +1 -0
  58. package/dist/utils/index.js +141 -0
  59. package/dist/utils/index.js.map +1 -0
  60. package/dist/utxo/index.d.ts +21 -0
  61. package/dist/utxo/index.d.ts.map +1 -0
  62. package/dist/utxo/index.js +139 -0
  63. package/dist/utxo/index.js.map +1 -0
  64. package/package.json +65 -0
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * Client-side UTXO selection for Verus transactions
4
+ *
5
+ * Selects UTXOs to cover required native + currency amounts,
6
+ * calculates fees, and determines change outputs.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.decodeUtxo = decodeUtxo;
10
+ exports.estimateFee = estimateFee;
11
+ exports.selectUtxos = selectUtxos;
12
+ const utxo_lib_1 = require("@bitgo/utxo-lib");
13
+ const index_js_1 = require("../constants/index.js");
14
+ const errors_js_1 = require("../errors.js");
15
+ const { unpackOutput } = utxo_lib_1.smarttxs;
16
+ // Transaction size estimation constants
17
+ const INPUT_SIZE = 180;
18
+ const P2PKH_OUTPUT_SIZE = 34;
19
+ const SMART_OUTPUT_SIZE = 200;
20
+ const TX_OVERHEAD = 60;
21
+ /**
22
+ * Decode a UTXO's script to extract currency values
23
+ */
24
+ function decodeUtxo(utxo, systemId) {
25
+ const currencyValues = new Map();
26
+ try {
27
+ const output = {
28
+ value: utxo.satoshis,
29
+ script: Buffer.from(utxo.script, 'hex'),
30
+ };
31
+ const unpacked = unpackOutput(output, systemId, true);
32
+ for (const [currency, value] of Object.entries(unpacked.values)) {
33
+ const amount = typeof value === 'number' ? value : value.toNumber();
34
+ if (amount > 0) {
35
+ currencyValues.set(currency, amount);
36
+ }
37
+ }
38
+ }
39
+ catch {
40
+ // If unpacking fails, treat as native-only
41
+ if (utxo.satoshis > 0) {
42
+ currencyValues.set(systemId, utxo.satoshis);
43
+ }
44
+ }
45
+ return { ...utxo, currencyValues };
46
+ }
47
+ /**
48
+ * Estimate transaction fee based on input/output counts
49
+ */
50
+ function estimateFee(numInputs, numOutputs, feePerKb = index_js_1.DEFAULT_FEE_PER_KB, hasSmartOutputs = false) {
51
+ const outputSize = hasSmartOutputs ? SMART_OUTPUT_SIZE : P2PKH_OUTPUT_SIZE;
52
+ const txSize = TX_OVERHEAD + numInputs * INPUT_SIZE + numOutputs * outputSize;
53
+ const fee = Math.ceil((txSize / 1000) * feePerKb);
54
+ return Math.max(fee, 10000);
55
+ }
56
+ /**
57
+ * Select UTXOs to cover required amounts
58
+ */
59
+ function selectUtxos(utxos, requiredNative, requiredCurrencies = new Map(), numOutputs = 2, systemId = index_js_1.NETWORK_CONFIG.mainnet.chainId, feePerKb = index_js_1.DEFAULT_FEE_PER_KB, hasSmartOutputs = false) {
60
+ const decoded = utxos.map((u) => decodeUtxo(u, systemId));
61
+ const remaining = new Map(requiredCurrencies);
62
+ let remainingNative = requiredNative;
63
+ const selected = [];
64
+ // Phase 1: Select UTXOs that have required non-native currencies
65
+ if (remaining.size > 0) {
66
+ for (const utxo of decoded) {
67
+ if (selected.includes(utxo))
68
+ continue;
69
+ let hasNeededCurrency = false;
70
+ for (const [currency, needed] of remaining) {
71
+ if (currency === systemId)
72
+ continue;
73
+ const utxoAmount = utxo.currencyValues.get(currency) || 0;
74
+ if (utxoAmount > 0 && needed > 0) {
75
+ hasNeededCurrency = true;
76
+ break;
77
+ }
78
+ }
79
+ if (hasNeededCurrency) {
80
+ selected.push(utxo);
81
+ for (const [currency, amount] of utxo.currencyValues) {
82
+ if (currency === systemId) {
83
+ remainingNative -= amount;
84
+ }
85
+ else {
86
+ const needed = remaining.get(currency) || 0;
87
+ remaining.set(currency, needed - amount);
88
+ }
89
+ }
90
+ remainingNative -= utxo.satoshis;
91
+ }
92
+ }
93
+ for (const [currency, needed] of remaining) {
94
+ if (currency !== systemId && needed > 0) {
95
+ const totalAvailable = decoded.reduce((sum, u) => sum + (u.currencyValues.get(currency) || 0), 0);
96
+ throw new errors_js_1.InsufficientFundsError(needed + totalAvailable, totalAvailable, currency);
97
+ }
98
+ }
99
+ }
100
+ // Phase 2: Select UTXOs for native amount + fee
101
+ const nativeOnly = decoded
102
+ .filter((u) => !selected.includes(u))
103
+ .sort((a, b) => b.satoshis - a.satoshis);
104
+ let changeOutputCount = 0;
105
+ for (const [currency, needed] of remaining) {
106
+ if (currency !== systemId && needed < 0) {
107
+ changeOutputCount++;
108
+ }
109
+ }
110
+ let fee = estimateFee(selected.length + 1, numOutputs + 1 + changeOutputCount, feePerKb, hasSmartOutputs);
111
+ while (remainingNative + fee > 0) {
112
+ const next = nativeOnly.shift();
113
+ if (!next) {
114
+ const totalAvailable = decoded.reduce((sum, u) => sum + u.satoshis, 0);
115
+ throw new errors_js_1.InsufficientFundsError(requiredNative + fee, totalAvailable, 'VRSC');
116
+ }
117
+ selected.push(next);
118
+ remainingNative -= next.satoshis;
119
+ fee = estimateFee(selected.length, numOutputs + 1 + changeOutputCount, feePerKb, hasSmartOutputs);
120
+ }
121
+ // Calculate change
122
+ const totalNativeIn = selected.reduce((sum, u) => sum + u.satoshis, 0);
123
+ const actualNativeChange = totalNativeIn - requiredNative - fee;
124
+ const currencyChanges = new Map();
125
+ for (const [currency, needed] of remaining) {
126
+ if (currency !== systemId && needed < 0) {
127
+ currencyChanges.set(currency, -needed);
128
+ }
129
+ }
130
+ const finalNativeChange = actualNativeChange > index_js_1.DUST_THRESHOLD ? actualNativeChange : 0;
131
+ const finalFee = actualNativeChange > index_js_1.DUST_THRESHOLD ? fee : fee + actualNativeChange;
132
+ return {
133
+ selected: selected.map(({ currencyValues, ...utxo }) => utxo),
134
+ nativeChange: finalNativeChange,
135
+ currencyChanges,
136
+ fee: finalFee,
137
+ };
138
+ }
139
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utxo/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAqBH,gCAwBC;AAKD,kCAUC;AAKD,kCAoHC;AAnLD,8CAA2C;AAC3C,oDAA2F;AAC3F,4CAAsD;AAGtD,MAAM,EAAE,YAAY,EAAE,GAAG,mBAAQ,CAAC;AAKlC,wCAAwC;AACxC,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB;;GAEG;AACH,SAAgB,UAAU,CAAC,IAAU,EAAE,QAAgB;IACrD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;SACxC,CAAC;QACF,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEtD,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChE,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,KAAa,CAAC,QAAQ,EAAE,CAAC;YAC7E,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;QAC3C,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACtB,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CACzB,SAAiB,EACjB,UAAkB,EAClB,WAAmB,6BAAkB,EACrC,kBAA2B,KAAK;IAEhC,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC3E,MAAM,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CACzB,KAAa,EACb,cAAsB,EACtB,qBAA0C,IAAI,GAAG,EAAE,EACnD,aAAqB,CAAC,EACtB,WAAmB,yBAAc,CAAC,OAAO,CAAC,OAAO,EACjD,WAAmB,6BAAkB,EACrC,kBAA2B,KAAK;IAEhC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAiB,kBAAkB,CAAC,CAAC;IAC9D,IAAI,eAAe,GAAG,cAAc,CAAC;IAErC,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,iEAAiE;IACjE,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEtC,IAAI,iBAAiB,GAAG,KAAK,CAAC;YAC9B,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC3C,IAAI,QAAQ,KAAK,QAAQ;oBAAE,SAAS;gBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC1D,IAAI,UAAU,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,iBAAiB,GAAG,IAAI,CAAC;oBACzB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,iBAAiB,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACrD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC1B,eAAe,IAAI,MAAM,CAAC;oBAC5B,CAAC;yBAAM,CAAC;wBACN,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAC5C,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBACD,eAAe,IAAI,IAAI,CAAC,QAAQ,CAAC;YACnC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC3C,IAAI,QAAQ,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClG,MAAM,IAAI,kCAAsB,CAC9B,MAAM,GAAG,cAAc,EAAE,cAAc,EAAE,QAAQ,CAClD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,MAAM,UAAU,GAAG,OAAO;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC3C,IAAI,QAAQ,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,iBAAiB,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,GAAG,GAAG,WAAW,CACnB,QAAQ,CAAC,MAAM,GAAG,CAAC,EACnB,UAAU,GAAG,CAAC,GAAG,iBAAiB,EAClC,QAAQ,EACR,eAAe,CAChB,CAAC;IAEF,OAAO,eAAe,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACvE,MAAM,IAAI,kCAAsB,CAC9B,cAAc,GAAG,GAAG,EAAE,cAAc,EAAE,MAAM,CAC7C,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,eAAe,IAAI,IAAI,CAAC,QAAQ,CAAC;QAEjC,GAAG,GAAG,WAAW,CACf,QAAQ,CAAC,MAAM,EACf,UAAU,GAAG,CAAC,GAAG,iBAAiB,EAClC,QAAQ,EACR,eAAe,CAChB,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,kBAAkB,GAAG,aAAa,GAAG,cAAc,GAAG,GAAG,CAAC;IAEhE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC3C,IAAI,QAAQ,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,GACrB,kBAAkB,GAAG,yBAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GACZ,kBAAkB,GAAG,yBAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,kBAAkB,CAAC;IAEvE,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;QAC7D,YAAY,EAAE,iBAAiB;QAC/B,eAAe;QACf,GAAG,EAAE,QAAQ;KACd,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@chainvue/verus-sdk",
3
+ "version": "0.4.0",
4
+ "description": "100% offline, fully typed TypeScript SDK for Verus transaction signing",
5
+ "main": "dist/bundle.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "test": "vitest run",
10
+ "test:watch": "vitest",
11
+ "clean": "rm -rf dist",
12
+ "prepublishOnly": "pnpm run clean && pnpm run build && pnpm run bundle && pnpm run test",
13
+ "bundle": "tsup"
14
+ },
15
+ "keywords": [
16
+ "verus",
17
+ "cryptocurrency",
18
+ "offline-signing",
19
+ "typescript"
20
+ ],
21
+ "license": "MIT",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/chainvue/verus-sdk.git"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "dependencies": {
30
+ "@bitgo/utxo-lib": "github:VerusCoin/BitGoJS#utxo-lib-verus",
31
+ "bitcoin-ops": "github:VerusCoin/bitcoin-ops",
32
+ "bn.js": "^5.2.2",
33
+ "bs58check": "^2.1.2",
34
+ "create-hash": "^1.2.0",
35
+ "ecpair": "^2.1.0",
36
+ "tiny-secp256k1": "^2.2.4",
37
+ "verus-typescript-primitives": "github:VerusCoin/verus-typescript-primitives#4243cd075b4f68df1ce72fd2fd9c9b18ac36767e",
38
+ "wif": "^4.0.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/bn.js": "^5.2.0",
42
+ "@types/bs58check": "^2.1.2",
43
+ "@types/create-hash": "^1.2.6",
44
+ "@types/node": "^20.19.33",
45
+ "tsup": "^8.5.1",
46
+ "typescript": "^5.9.3",
47
+ "vitest": "^1.6.1"
48
+ },
49
+ "engines": {
50
+ "node": ">=18"
51
+ },
52
+ "files": [
53
+ "dist/**/*"
54
+ ],
55
+ "packageManager": "pnpm@9.15.0",
56
+ "pnpm": {
57
+ "overrides": {
58
+ "bitcoin-ops": "github:VerusCoin/bitcoin-ops",
59
+ "verus-typescript-primitives": "github:VerusCoin/verus-typescript-primitives#4243cd075b4f68df1ce72fd2fd9c9b18ac36767e"
60
+ },
61
+ "patchedDependencies": {
62
+ "bitcoin-ops": "patches/bitcoin-ops.patch"
63
+ }
64
+ }
65
+ }