@utxopia/sdk 0.1.0-alpha.2 → 0.1.0-alpha.4

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 (142) hide show
  1. package/README.md +214 -108
  2. package/{packages/sdk/dist → dist}/client.d.ts +25 -1
  3. package/{packages/sdk/dist → dist}/client.js +36 -1
  4. package/{packages/sdk/dist → dist}/crypto-ed25519.d.ts +14 -0
  5. package/{packages/sdk/dist → dist}/crypto-ed25519.js +14 -0
  6. package/{packages/sdk/dist → dist}/index.d.ts +3 -3
  7. package/{packages/sdk/dist → dist}/index.js +3 -3
  8. package/{packages/sdk/dist → dist}/instructions.d.ts +28 -11
  9. package/{packages/sdk/dist → dist}/instructions.js +45 -15
  10. package/{packages/sdk/dist → dist}/psbt.d.ts +12 -2
  11. package/{packages/sdk/dist → dist}/psbt.js +17 -12
  12. package/{packages/sdk/dist → dist}/stealth.d.ts +104 -9
  13. package/{packages/sdk/dist → dist}/stealth.js +146 -14
  14. package/{packages/sdk/dist → dist}/taproot.d.ts +39 -2
  15. package/{packages/sdk/dist → dist}/taproot.js +54 -2
  16. package/package.json +86 -63
  17. package/src/announcement-client.ts +457 -0
  18. package/src/auditor-ciphertext.ts +181 -0
  19. package/src/auditor.ts +409 -0
  20. package/src/bitcoin/ika.ts +103 -0
  21. package/src/bitcoin/index.ts +5 -0
  22. package/src/bound-params.ts +322 -0
  23. package/src/chadbuffer.ts +603 -0
  24. package/src/circomlibjs.d.ts +51 -0
  25. package/src/claim-link.ts +53 -0
  26. package/src/client.ts +638 -0
  27. package/src/commitment-tree.ts +736 -0
  28. package/src/config.ts +772 -0
  29. package/src/core/esplora.ts +332 -0
  30. package/src/core/mempool.ts +159 -0
  31. package/src/crypto-babyjub.ts +385 -0
  32. package/src/crypto-ed25519.ts +297 -0
  33. package/src/crypto.ts +199 -0
  34. package/src/event-client.ts +231 -0
  35. package/src/events.ts +384 -0
  36. package/src/explorer.ts +300 -0
  37. package/src/index.ts +902 -0
  38. package/src/instructions.ts +2820 -0
  39. package/src/keys.ts +1228 -0
  40. package/src/logger.ts +41 -0
  41. package/src/magicblock.ts +278 -0
  42. package/src/merkle.ts +197 -0
  43. package/src/note.ts +754 -0
  44. package/src/pda.ts +516 -0
  45. package/src/pool-state.ts +176 -0
  46. package/src/poseidon.ts +175 -0
  47. package/src/prover/index.ts +19 -0
  48. package/src/prover/mobile.ts +303 -0
  49. package/src/prover/web.ts +771 -0
  50. package/src/psbt.ts +345 -0
  51. package/src/selective-disclosure.ts +284 -0
  52. package/src/sender-memo.ts +343 -0
  53. package/src/snarkjs.d.ts +19 -0
  54. package/src/sns-resolver.ts +333 -0
  55. package/src/solana/connection.ts +189 -0
  56. package/src/solana/priority-fee.ts +201 -0
  57. package/src/spend-doc.ts +163 -0
  58. package/src/stealth.ts +1477 -0
  59. package/src/taproot.ts +707 -0
  60. package/src/token-registry.ts +207 -0
  61. package/src/utils/encoding.ts +33 -0
  62. package/src/vk-registry.ts +295 -0
  63. package/LICENSE +0 -21
  64. package/packages/btc-client/src/esplora-client.ts +0 -153
  65. package/packages/btc-client/src/index.ts +0 -3
  66. package/packages/btc-client/src/op-return.ts +0 -93
  67. package/packages/btc-client/src/types.ts +0 -112
  68. package/packages/sdk/README.md +0 -277
  69. /package/{packages/sdk/dist → dist}/announcement-client.d.ts +0 -0
  70. /package/{packages/sdk/dist → dist}/announcement-client.js +0 -0
  71. /package/{packages/sdk/dist → dist}/auditor-ciphertext.d.ts +0 -0
  72. /package/{packages/sdk/dist → dist}/auditor-ciphertext.js +0 -0
  73. /package/{packages/sdk/dist → dist}/auditor.d.ts +0 -0
  74. /package/{packages/sdk/dist → dist}/auditor.js +0 -0
  75. /package/{packages/sdk/dist → dist}/bitcoin/ika.d.ts +0 -0
  76. /package/{packages/sdk/dist → dist}/bitcoin/ika.js +0 -0
  77. /package/{packages/sdk/dist → dist}/bitcoin/index.d.ts +0 -0
  78. /package/{packages/sdk/dist → dist}/bitcoin/index.js +0 -0
  79. /package/{packages/sdk/dist → dist}/bound-params.d.ts +0 -0
  80. /package/{packages/sdk/dist → dist}/bound-params.js +0 -0
  81. /package/{packages/sdk/dist → dist}/chadbuffer.d.ts +0 -0
  82. /package/{packages/sdk/dist → dist}/chadbuffer.js +0 -0
  83. /package/{packages/sdk/dist → dist}/claim-link.d.ts +0 -0
  84. /package/{packages/sdk/dist → dist}/claim-link.js +0 -0
  85. /package/{packages/sdk/dist → dist}/commitment-tree.d.ts +0 -0
  86. /package/{packages/sdk/dist → dist}/commitment-tree.js +0 -0
  87. /package/{packages/sdk/dist → dist}/config.d.ts +0 -0
  88. /package/{packages/sdk/dist → dist}/config.js +0 -0
  89. /package/{packages/sdk/dist → dist}/core/esplora.d.ts +0 -0
  90. /package/{packages/sdk/dist → dist}/core/esplora.js +0 -0
  91. /package/{packages/sdk/dist → dist}/core/mempool.d.ts +0 -0
  92. /package/{packages/sdk/dist → dist}/core/mempool.js +0 -0
  93. /package/{packages/sdk/dist → dist}/crypto-babyjub.d.ts +0 -0
  94. /package/{packages/sdk/dist → dist}/crypto-babyjub.js +0 -0
  95. /package/{packages/sdk/dist → dist}/crypto.d.ts +0 -0
  96. /package/{packages/sdk/dist → dist}/crypto.js +0 -0
  97. /package/{packages/sdk/dist → dist}/event-client.d.ts +0 -0
  98. /package/{packages/sdk/dist → dist}/event-client.js +0 -0
  99. /package/{packages/sdk/dist → dist}/events.d.ts +0 -0
  100. /package/{packages/sdk/dist → dist}/events.js +0 -0
  101. /package/{packages/sdk/dist → dist}/explorer.d.ts +0 -0
  102. /package/{packages/sdk/dist → dist}/explorer.js +0 -0
  103. /package/{packages/sdk/dist → dist}/keys.d.ts +0 -0
  104. /package/{packages/sdk/dist → dist}/keys.js +0 -0
  105. /package/{packages/sdk/dist → dist}/logger.d.ts +0 -0
  106. /package/{packages/sdk/dist → dist}/logger.js +0 -0
  107. /package/{packages/sdk/dist → dist}/magicblock.d.ts +0 -0
  108. /package/{packages/sdk/dist → dist}/magicblock.js +0 -0
  109. /package/{packages/sdk/dist → dist}/merkle.d.ts +0 -0
  110. /package/{packages/sdk/dist → dist}/merkle.js +0 -0
  111. /package/{packages/sdk/dist → dist}/note.d.ts +0 -0
  112. /package/{packages/sdk/dist → dist}/note.js +0 -0
  113. /package/{packages/sdk/dist → dist}/pda.d.ts +0 -0
  114. /package/{packages/sdk/dist → dist}/pda.js +0 -0
  115. /package/{packages/sdk/dist → dist}/pool-state.d.ts +0 -0
  116. /package/{packages/sdk/dist → dist}/pool-state.js +0 -0
  117. /package/{packages/sdk/dist → dist}/poseidon.d.ts +0 -0
  118. /package/{packages/sdk/dist → dist}/poseidon.js +0 -0
  119. /package/{packages/sdk/dist → dist}/prover/index.d.ts +0 -0
  120. /package/{packages/sdk/dist → dist}/prover/index.js +0 -0
  121. /package/{packages/sdk/dist → dist}/prover/mobile.d.ts +0 -0
  122. /package/{packages/sdk/dist → dist}/prover/mobile.js +0 -0
  123. /package/{packages/sdk/dist → dist}/prover/web.d.ts +0 -0
  124. /package/{packages/sdk/dist → dist}/prover/web.js +0 -0
  125. /package/{packages/sdk/dist → dist}/selective-disclosure.d.ts +0 -0
  126. /package/{packages/sdk/dist → dist}/selective-disclosure.js +0 -0
  127. /package/{packages/sdk/dist → dist}/sender-memo.d.ts +0 -0
  128. /package/{packages/sdk/dist → dist}/sender-memo.js +0 -0
  129. /package/{packages/sdk/dist → dist}/sns-resolver.d.ts +0 -0
  130. /package/{packages/sdk/dist → dist}/sns-resolver.js +0 -0
  131. /package/{packages/sdk/dist → dist}/solana/connection.d.ts +0 -0
  132. /package/{packages/sdk/dist → dist}/solana/connection.js +0 -0
  133. /package/{packages/sdk/dist → dist}/solana/priority-fee.d.ts +0 -0
  134. /package/{packages/sdk/dist → dist}/solana/priority-fee.js +0 -0
  135. /package/{packages/sdk/dist → dist}/spend-doc.d.ts +0 -0
  136. /package/{packages/sdk/dist → dist}/spend-doc.js +0 -0
  137. /package/{packages/sdk/dist → dist}/token-registry.d.ts +0 -0
  138. /package/{packages/sdk/dist → dist}/token-registry.js +0 -0
  139. /package/{packages/sdk/dist → dist}/utils/encoding.d.ts +0 -0
  140. /package/{packages/sdk/dist → dist}/utils/encoding.js +0 -0
  141. /package/{packages/sdk/dist → dist}/vk-registry.d.ts +0 -0
  142. /package/{packages/sdk/dist → dist}/vk-registry.js +0 -0
@@ -22,18 +22,55 @@ export declare function deriveTaprootAddress(commitment: Uint8Array, network?: "
22
22
  address: string;
23
23
  outputKey: Uint8Array;
24
24
  tweak: Uint8Array;
25
+ /** y-parity of the output key — the low bit of a script-path control block. */
26
+ parity: number;
25
27
  };
26
28
  /**
27
- * Commitment a `verify_deposit` (disc 25) deposit address is derived from.
29
+ * Per-deposit commitment carried in a `verify_deposit` (disc 25) address's tapleaf.
28
30
  *
29
31
  * Both keys are hashed in. Binding the note key alone would leave the ephemeral
30
32
  * pubkey caller-chosen on the Solana side: the credited amount and owner would
31
33
  * still be right, but a substituted ephemeral key makes the stealth announcement
32
34
  * undecryptable and the recipient never finds their note.
33
35
  *
34
- * Feed the result to `deriveTaprootAddress` as the commitment.
36
+ * Feed the result to `deriveDepositAddress`.
35
37
  */
36
38
  export declare function depositTweakCommitment(notePublicKey: Uint8Array, ephemeralPubkey: Uint8Array): Uint8Array;
39
+ /**
40
+ * BIP-341's suggested NUMS point, used as the deposit address's internal key.
41
+ *
42
+ * Nobody knows its discrete log, so the key path is unspendable and custody
43
+ * rests entirely on the script path. That is deliberate: Ika's MPC cannot sign
44
+ * for a tweaked key, so an address whose internal key were the dWallet key plus
45
+ * a per-deposit tweak would be unspendable by the custodian meant to sweep it.
46
+ */
47
+ export declare const DEPOSIT_NUMS_INTERNAL_KEY: Uint8Array<ArrayBufferLike>;
48
+ /**
49
+ * The single tapleaf a deposit address commits to:
50
+ *
51
+ * ```text
52
+ * <commitment> OP_DROP <ika_xonly> OP_CHECKSIG
53
+ * ```
54
+ *
55
+ * The commitment rides in the script purely to make the leaf — and so the
56
+ * address — unique per deposit; `OP_DROP` discards it at spend time. Only the
57
+ * dWallet key can satisfy the `OP_CHECKSIG`, and it signs untweaked.
58
+ */
59
+ export declare function depositLeafScript(commitment: Uint8Array, ikaXOnlyPubkey: Uint8Array): Uint8Array;
60
+ /**
61
+ * Derive a deposit address bound to `commitment`, spendable only by the pool's
62
+ * Ika dWallet via the script path.
63
+ *
64
+ * Returns everything the sweeper needs to spend it: a script-path witness is
65
+ * `[signature, leafScript, controlBlock]`.
66
+ */
67
+ export declare function deriveDepositAddress(commitment: Uint8Array, ikaXOnlyPubkey: Uint8Array, network?: "mainnet" | "testnet" | "regtest"): {
68
+ address: string;
69
+ outputKey: Uint8Array;
70
+ leafScript: Uint8Array;
71
+ leafHash: Uint8Array;
72
+ controlBlock: Uint8Array;
73
+ };
37
74
  /**
38
75
  * Verify that a Taproot address is correctly derived from a commitment
39
76
  *
@@ -68,17 +68,18 @@ export function deriveTaprootAddress(commitment, network = "testnet", internalKe
68
68
  address,
69
69
  outputKey,
70
70
  tweak,
71
+ parity: outputKeyHex.startsWith("03") ? 1 : 0,
71
72
  };
72
73
  }
73
74
  /**
74
- * Commitment a `verify_deposit` (disc 25) deposit address is derived from.
75
+ * Per-deposit commitment carried in a `verify_deposit` (disc 25) address's tapleaf.
75
76
  *
76
77
  * Both keys are hashed in. Binding the note key alone would leave the ephemeral
77
78
  * pubkey caller-chosen on the Solana side: the credited amount and owner would
78
79
  * still be right, but a substituted ephemeral key makes the stealth announcement
79
80
  * undecryptable and the recipient never finds their note.
80
81
  *
81
- * Feed the result to `deriveTaprootAddress` as the commitment.
82
+ * Feed the result to `deriveDepositAddress`.
82
83
  */
83
84
  export function depositTweakCommitment(notePublicKey, ephemeralPubkey) {
84
85
  if (notePublicKey.length !== 32 || ephemeralPubkey.length !== 32) {
@@ -89,6 +90,57 @@ export function depositTweakCommitment(notePublicKey, ephemeralPubkey) {
89
90
  material.set(ephemeralPubkey, 32);
90
91
  return sha256(material);
91
92
  }
93
+ /**
94
+ * BIP-341's suggested NUMS point, used as the deposit address's internal key.
95
+ *
96
+ * Nobody knows its discrete log, so the key path is unspendable and custody
97
+ * rests entirely on the script path. That is deliberate: Ika's MPC cannot sign
98
+ * for a tweaked key, so an address whose internal key were the dWallet key plus
99
+ * a per-deposit tweak would be unspendable by the custodian meant to sweep it.
100
+ */
101
+ export const DEPOSIT_NUMS_INTERNAL_KEY = hexToBytes("50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0");
102
+ /**
103
+ * The single tapleaf a deposit address commits to:
104
+ *
105
+ * ```text
106
+ * <commitment> OP_DROP <ika_xonly> OP_CHECKSIG
107
+ * ```
108
+ *
109
+ * The commitment rides in the script purely to make the leaf — and so the
110
+ * address — unique per deposit; `OP_DROP` discards it at spend time. Only the
111
+ * dWallet key can satisfy the `OP_CHECKSIG`, and it signs untweaked.
112
+ */
113
+ export function depositLeafScript(commitment, ikaXOnlyPubkey) {
114
+ if (commitment.length !== 32 || ikaXOnlyPubkey.length !== 32) {
115
+ throw new Error("commitment and ikaXOnlyPubkey must be 32 bytes");
116
+ }
117
+ const script = new Uint8Array(68);
118
+ script[0] = 0x20; // push 32 bytes
119
+ script.set(commitment, 1);
120
+ script[33] = 0x75; // OP_DROP
121
+ script[34] = 0x20; // push 32 bytes
122
+ script.set(ikaXOnlyPubkey, 35);
123
+ script[67] = 0xac; // OP_CHECKSIG
124
+ return script;
125
+ }
126
+ /**
127
+ * Derive a deposit address bound to `commitment`, spendable only by the pool's
128
+ * Ika dWallet via the script path.
129
+ *
130
+ * Returns everything the sweeper needs to spend it: a script-path witness is
131
+ * `[signature, leafScript, controlBlock]`.
132
+ */
133
+ export function deriveDepositAddress(commitment, ikaXOnlyPubkey, network = "testnet") {
134
+ const leafScript = depositLeafScript(commitment, ikaXOnlyPubkey);
135
+ // One leaf, so the leaf hash IS the merkle root.
136
+ const leafHash = computeTapLeafHash(leafScript);
137
+ const { address, outputKey, parity } = deriveTaprootAddress(leafHash, network, DEPOSIT_NUMS_INTERNAL_KEY);
138
+ // <leaf_version | parity> || internal_key. No merkle path: single leaf.
139
+ const controlBlock = new Uint8Array(33);
140
+ controlBlock[0] = 0xc0 | parity;
141
+ controlBlock.set(DEPOSIT_NUMS_INTERNAL_KEY, 1);
142
+ return { address, outputKey, leafScript, leafHash, controlBlock };
143
+ }
92
144
  /**
93
145
  * Verify that a Taproot address is correctly derived from a commitment
94
146
  *
package/package.json CHANGED
@@ -1,73 +1,88 @@
1
1
  {
2
2
  "name": "@utxopia/sdk",
3
- "version": "0.1.0-alpha.2",
4
- "description": "UTXOpia public SDK workspace",
5
- "license": "MIT",
6
- "repository": {
7
- "type": "git",
8
- "url": "git+https://github.com/UTXOpia/utxopia-sdk.git"
9
- },
10
- "homepage": "https://github.com/UTXOpia/utxopia-sdk#readme",
11
- "bugs": {
12
- "url": "https://github.com/UTXOpia/utxopia-sdk/issues"
13
- },
3
+ "version": "0.1.0-alpha.4",
4
+ "description": "UTXOpia SDK - Private Bitcoin across Solana and Sui",
14
5
  "type": "module",
15
- "private": false,
16
- "publishConfig": {
17
- "access": "public"
18
- },
19
- "files": [
20
- "packages/sdk/dist",
21
- "packages/btc-client/src",
22
- "README.md",
23
- "LICENSE"
24
- ],
25
- "sideEffects": false,
26
- "main": "./packages/sdk/dist/index.js",
27
- "module": "./packages/sdk/dist/index.js",
28
- "types": "./packages/sdk/dist/index.d.ts",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
29
9
  "exports": {
30
10
  ".": {
31
- "types": "./packages/sdk/dist/index.d.ts",
32
- "import": "./packages/sdk/dist/index.js",
33
- "default": "./packages/sdk/dist/index.js"
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
34
14
  },
35
15
  "./prover": {
36
- "types": "./packages/sdk/dist/prover/index.d.ts",
37
- "import": "./packages/sdk/dist/prover/index.js",
38
- "default": "./packages/sdk/dist/prover/index.js"
16
+ "types": "./dist/prover/index.d.ts",
17
+ "import": "./dist/prover/index.js",
18
+ "default": "./dist/prover/index.js"
39
19
  },
40
20
  "./prover/web": {
41
- "types": "./packages/sdk/dist/prover/web.d.ts",
42
- "import": "./packages/sdk/dist/prover/web.js",
43
- "default": "./packages/sdk/dist/prover/web.js"
21
+ "types": "./dist/prover/web.d.ts",
22
+ "import": "./dist/prover/web.js",
23
+ "default": "./dist/prover/web.js"
44
24
  },
45
25
  "./prover/mobile": {
46
- "types": "./packages/sdk/dist/prover/mobile.d.ts",
47
- "import": "./packages/sdk/dist/prover/mobile.js",
48
- "default": "./packages/sdk/dist/prover/mobile.js"
26
+ "types": "./dist/prover/mobile.d.ts",
27
+ "import": "./dist/prover/mobile.js",
28
+ "default": "./dist/prover/mobile.js"
29
+ },
30
+ "./stealth": {
31
+ "types": "./dist/stealth/index.d.ts",
32
+ "import": "./dist/stealth/index.js",
33
+ "default": "./dist/stealth/index.js"
49
34
  },
50
35
  "./bitcoin": {
51
- "types": "./packages/sdk/dist/bitcoin/index.d.ts",
52
- "import": "./packages/sdk/dist/bitcoin/index.js",
53
- "default": "./packages/sdk/dist/bitcoin/index.js"
36
+ "types": "./dist/bitcoin/index.d.ts",
37
+ "import": "./dist/bitcoin/index.js",
38
+ "default": "./dist/bitcoin/index.js"
54
39
  },
55
- "./stealth": {
56
- "types": "./packages/sdk/dist/stealth.d.ts",
57
- "import": "./packages/sdk/dist/stealth.js",
58
- "default": "./packages/sdk/dist/stealth.js"
40
+ "./solana": {
41
+ "types": "./dist/solana/index.d.ts",
42
+ "import": "./dist/solana/index.js",
43
+ "default": "./dist/solana/index.js"
44
+ },
45
+ "./watcher": {
46
+ "types": "./dist/watcher/index.d.ts",
47
+ "import": "./dist/watcher/index.js",
48
+ "default": "./dist/watcher/index.js"
49
+ },
50
+ "./watcher/web": {
51
+ "types": "./dist/watcher/web.d.ts",
52
+ "import": "./dist/watcher/web.js",
53
+ "default": "./dist/watcher/web.js"
59
54
  },
60
- "./btc-client": {
61
- "types": "./packages/btc-client/src/index.ts",
62
- "import": "./packages/btc-client/src/index.ts",
63
- "default": "./packages/btc-client/src/index.ts"
55
+ "./watcher/native": {
56
+ "types": "./dist/watcher/native.d.ts",
57
+ "import": "./dist/watcher/native.js",
58
+ "default": "./dist/watcher/native.js"
59
+ },
60
+ "./react": {
61
+ "types": "./dist/react/index.d.ts",
62
+ "import": "./dist/react/index.js",
63
+ "default": "./dist/react/index.js"
64
64
  }
65
65
  },
66
+ "files": [
67
+ "dist",
68
+ "src",
69
+ "circuits"
70
+ ],
66
71
  "scripts": {
67
- "build": "cd packages/sdk && bunx tsc",
68
- "test": "cd packages/sdk && bun install --ignore-scripts && bun test",
69
- "prepare": "cd packages/sdk && bunx tsc",
70
- "copy-circuits": "cd packages/sdk && bun run copy-circuits"
72
+ "build": "tsc",
73
+ "clean": "rm -rf dist",
74
+ "prepublishOnly": "bun run build",
75
+ "test": "bun test",
76
+ "test:unit": "bun test src/ test/commitment.test.ts test/commitment-onchain.test.ts",
77
+ "test:e2e": "bun test test/e2e/",
78
+ "test:e2e:devnet": "NETWORK=devnet bun test test/e2e/",
79
+ "test:e2e:claim": "bun test test/e2e/claim.test.ts",
80
+ "test:e2e:split": "bun test test/e2e/split.test.ts",
81
+ "test:e2e:partial": "bun test test/e2e/partial-public.test.ts",
82
+ "test:e2e:nullifier": "bun test test/e2e/nullifier.test.ts",
83
+ "test:e2e:tree": "bun test test/e2e/tree-consistency.test.ts",
84
+ "copy-circuits": "CIRCUITS_DIR=${UTXOPIA_CIRCUITS_DIR:-../../utxopia-circuits/circuits}; mkdir -p circuits && cp -r \"$CIRCUITS_DIR\"/build/* circuits/",
85
+ "e2e": "bun run scripts/e2e-mock-spv.ts"
71
86
  },
72
87
  "dependencies": {
73
88
  "@magicblock-labs/ephemeral-rollups-kit": "0.16.2",
@@ -82,6 +97,12 @@
82
97
  "circomlibjs": "^0.1.7",
83
98
  "poseidon-lite": "0.3.0"
84
99
  },
100
+ "devDependencies": {
101
+ "@solana/web3.js": "^1.98.4",
102
+ "@types/node": "^20.10.0",
103
+ "@types/react": "^19",
104
+ "typescript": "^5.3.0"
105
+ },
85
106
  "peerDependencies": {
86
107
  "react": ">=17.0.0",
87
108
  "snarkjs": "^0.7.5"
@@ -94,15 +115,17 @@
94
115
  "optional": true
95
116
  }
96
117
  },
97
- "devDependencies": {
98
- "@solana/web3.js": "^1.98.4",
99
- "@types/node": "^20.10.0",
100
- "@types/react": "^19",
101
- "typescript": "^5.3.0"
102
- },
103
- "overrides": {
104
- "uuid": "11.1.1",
105
- "valibot": "1.4.2",
106
- "ws": "8.21.1"
107
- }
118
+ "keywords": [
119
+ "solana",
120
+ "bitcoin",
121
+ "bridge",
122
+ "privacy",
123
+ "zkp",
124
+ "circom",
125
+ "groth16",
126
+ "snarkjs",
127
+ "taproot"
128
+ ],
129
+ "author": "UTXOpia Team",
130
+ "license": "MIT"
108
131
  }