@bsv/sdk 1.1.33 → 1.2.1

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 (214) hide show
  1. package/dist/cjs/mod.js +4 -0
  2. package/dist/cjs/mod.js.map +1 -1
  3. package/dist/cjs/package.json +4 -3
  4. package/dist/cjs/src/auth/Certificate.js +163 -0
  5. package/dist/cjs/src/auth/Certificate.js.map +1 -0
  6. package/dist/cjs/src/auth/index.js +9 -0
  7. package/dist/cjs/src/auth/index.js.map +1 -0
  8. package/dist/cjs/src/compat/BSM.js +17 -7
  9. package/dist/cjs/src/compat/BSM.js.map +1 -1
  10. package/dist/cjs/src/compat/ECIES.js +17 -7
  11. package/dist/cjs/src/compat/ECIES.js.map +1 -1
  12. package/dist/cjs/src/compat/HD.js +17 -7
  13. package/dist/cjs/src/compat/HD.js.map +1 -1
  14. package/dist/cjs/src/compat/Mnemonic.js +17 -7
  15. package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
  16. package/dist/cjs/src/compat/index.js +17 -7
  17. package/dist/cjs/src/compat/index.js.map +1 -1
  18. package/dist/cjs/src/messages/index.js +17 -7
  19. package/dist/cjs/src/messages/index.js.map +1 -1
  20. package/dist/cjs/src/overlay-tools/LookupResolver.js +170 -0
  21. package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -0
  22. package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js +69 -0
  23. package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -0
  24. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +336 -0
  25. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -0
  26. package/dist/cjs/src/overlay-tools/index.js +29 -0
  27. package/dist/cjs/src/overlay-tools/index.js.map +1 -0
  28. package/dist/cjs/src/primitives/PrivateKey.js +17 -7
  29. package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
  30. package/dist/cjs/src/primitives/TransactionSignature.js +17 -7
  31. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
  32. package/dist/cjs/src/primitives/index.js +17 -7
  33. package/dist/cjs/src/primitives/index.js.map +1 -1
  34. package/dist/cjs/src/script/Spend.js +17 -7
  35. package/dist/cjs/src/script/Spend.js.map +1 -1
  36. package/dist/cjs/src/script/templates/PushDrop.js +218 -0
  37. package/dist/cjs/src/script/templates/PushDrop.js.map +1 -0
  38. package/dist/cjs/src/script/templates/index.js +3 -1
  39. package/dist/cjs/src/script/templates/index.js.map +1 -1
  40. package/dist/cjs/src/transaction/http/DefaultHttpClient.js +1 -1
  41. package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
  42. package/dist/cjs/src/wallet/CachedKeyDeriver.js +177 -0
  43. package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -0
  44. package/dist/cjs/src/wallet/KeyDeriver.js +174 -0
  45. package/dist/cjs/src/wallet/KeyDeriver.js.map +1 -0
  46. package/dist/cjs/src/wallet/ProtoWallet.js +245 -0
  47. package/dist/cjs/src/wallet/ProtoWallet.js.map +1 -0
  48. package/dist/cjs/src/wallet/Wallet.interfaces.js +3 -0
  49. package/dist/cjs/src/wallet/Wallet.interfaces.js.map +1 -0
  50. package/dist/cjs/src/wallet/WalletClient.js +181 -0
  51. package/dist/cjs/src/wallet/WalletClient.js.map +1 -0
  52. package/dist/cjs/src/wallet/WalletError.js +28 -0
  53. package/dist/cjs/src/wallet/WalletError.js.map +1 -0
  54. package/dist/cjs/src/wallet/index.js +34 -0
  55. package/dist/cjs/src/wallet/index.js.map +1 -0
  56. package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js +45 -0
  57. package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js.map +1 -0
  58. package/dist/cjs/src/wallet/substrates/WalletWire.js +3 -0
  59. package/dist/cjs/src/wallet/substrates/WalletWire.js.map +1 -0
  60. package/dist/cjs/src/wallet/substrates/WalletWireCalls.js +36 -0
  61. package/dist/cjs/src/wallet/substrates/WalletWireCalls.js.map +1 -0
  62. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +1821 -0
  63. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -0
  64. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +1305 -0
  65. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -0
  66. package/dist/cjs/src/wallet/substrates/XDM.js +130 -0
  67. package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -0
  68. package/dist/cjs/src/wallet/substrates/index.js +33 -0
  69. package/dist/cjs/src/wallet/substrates/index.js.map +1 -0
  70. package/dist/cjs/src/wallet/substrates/window.CWI.js +102 -0
  71. package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -0
  72. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  73. package/dist/esm/mod.js +4 -0
  74. package/dist/esm/mod.js.map +1 -1
  75. package/dist/esm/src/auth/Certificate.js +185 -0
  76. package/dist/esm/src/auth/Certificate.js.map +1 -0
  77. package/dist/esm/src/auth/index.js +2 -0
  78. package/dist/esm/src/auth/index.js.map +1 -0
  79. package/dist/esm/src/overlay-tools/LookupResolver.js +167 -0
  80. package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -0
  81. package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js +64 -0
  82. package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -0
  83. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js +335 -0
  84. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -0
  85. package/dist/esm/src/overlay-tools/index.js +6 -0
  86. package/dist/esm/src/overlay-tools/index.js.map +1 -0
  87. package/dist/esm/src/script/templates/PushDrop.js +215 -0
  88. package/dist/esm/src/script/templates/PushDrop.js.map +1 -0
  89. package/dist/esm/src/script/templates/index.js +1 -0
  90. package/dist/esm/src/script/templates/index.js.map +1 -1
  91. package/dist/esm/src/transaction/http/DefaultHttpClient.js +1 -1
  92. package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
  93. package/dist/esm/src/wallet/CachedKeyDeriver.js +174 -0
  94. package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -0
  95. package/dist/esm/src/wallet/KeyDeriver.js +172 -0
  96. package/dist/esm/src/wallet/KeyDeriver.js.map +1 -0
  97. package/dist/esm/src/wallet/ProtoWallet.js +207 -0
  98. package/dist/esm/src/wallet/ProtoWallet.js.map +1 -0
  99. package/dist/esm/src/wallet/Wallet.interfaces.js +2 -0
  100. package/dist/esm/src/wallet/Wallet.interfaces.js.map +1 -0
  101. package/dist/esm/src/wallet/WalletClient.js +177 -0
  102. package/dist/esm/src/wallet/WalletClient.js.map +1 -0
  103. package/dist/esm/src/wallet/WalletError.js +25 -0
  104. package/dist/esm/src/wallet/WalletError.js.map +1 -0
  105. package/dist/esm/src/wallet/index.js +9 -0
  106. package/dist/esm/src/wallet/index.js.map +1 -0
  107. package/dist/esm/src/wallet/substrates/HTTPWalletWire.js +42 -0
  108. package/dist/esm/src/wallet/substrates/HTTPWalletWire.js.map +1 -0
  109. package/dist/esm/src/wallet/substrates/WalletWire.js +2 -0
  110. package/dist/esm/src/wallet/substrates/WalletWire.js.map +1 -0
  111. package/dist/esm/src/wallet/substrates/WalletWireCalls.js +34 -0
  112. package/dist/esm/src/wallet/substrates/WalletWireCalls.js.map +1 -0
  113. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +1816 -0
  114. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -0
  115. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +1300 -0
  116. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -0
  117. package/dist/esm/src/wallet/substrates/XDM.js +128 -0
  118. package/dist/esm/src/wallet/substrates/XDM.js.map +1 -0
  119. package/dist/esm/src/wallet/substrates/index.js +8 -0
  120. package/dist/esm/src/wallet/substrates/index.js.map +1 -0
  121. package/dist/esm/src/wallet/substrates/window.CWI.js +100 -0
  122. package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -0
  123. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  124. package/dist/types/mod.d.ts +4 -0
  125. package/dist/types/mod.d.ts.map +1 -1
  126. package/dist/types/src/auth/Certificate.d.ts +76 -0
  127. package/dist/types/src/auth/Certificate.d.ts.map +1 -0
  128. package/dist/types/src/auth/index.d.ts +2 -0
  129. package/dist/types/src/auth/index.d.ts.map +1 -0
  130. package/dist/types/src/overlay-tools/LookupResolver.d.ts +71 -0
  131. package/dist/types/src/overlay-tools/LookupResolver.d.ts.map +1 -0
  132. package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts +44 -0
  133. package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts.map +1 -0
  134. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts +90 -0
  135. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts.map +1 -0
  136. package/dist/types/src/overlay-tools/index.d.ts +6 -0
  137. package/dist/types/src/overlay-tools/index.d.ts.map +1 -0
  138. package/dist/types/src/script/templates/PushDrop.d.ts +53 -0
  139. package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -0
  140. package/dist/types/src/script/templates/index.d.ts +1 -0
  141. package/dist/types/src/script/templates/index.d.ts.map +1 -1
  142. package/dist/types/src/wallet/CachedKeyDeriver.d.ts +92 -0
  143. package/dist/types/src/wallet/CachedKeyDeriver.d.ts.map +1 -0
  144. package/dist/types/src/wallet/KeyDeriver.d.ts +72 -0
  145. package/dist/types/src/wallet/KeyDeriver.d.ts.map +1 -0
  146. package/dist/types/src/wallet/ProtoWallet.d.ts +415 -0
  147. package/dist/types/src/wallet/ProtoWallet.d.ts.map +1 -0
  148. package/dist/types/src/wallet/Wallet.interfaces.d.ts +996 -0
  149. package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -0
  150. package/dist/types/src/wallet/WalletClient.d.ts +182 -0
  151. package/dist/types/src/wallet/WalletClient.d.ts.map +1 -0
  152. package/dist/types/src/wallet/WalletError.d.ts +14 -0
  153. package/dist/types/src/wallet/WalletError.d.ts.map +1 -0
  154. package/dist/types/src/wallet/index.d.ts +9 -0
  155. package/dist/types/src/wallet/index.d.ts.map +1 -0
  156. package/dist/types/src/wallet/substrates/HTTPWalletWire.d.ts +9 -0
  157. package/dist/types/src/wallet/substrates/HTTPWalletWire.d.ts.map +1 -0
  158. package/dist/types/src/wallet/substrates/WalletWire.d.ts +7 -0
  159. package/dist/types/src/wallet/substrates/WalletWire.d.ts.map +1 -0
  160. package/dist/types/src/wallet/substrates/WalletWireCalls.d.ts +33 -0
  161. package/dist/types/src/wallet/substrates/WalletWireCalls.d.ts.map +1 -0
  162. package/dist/types/src/wallet/substrates/WalletWireProcessor.d.ts +18 -0
  163. package/dist/types/src/wallet/substrates/WalletWireProcessor.d.ts.map +1 -0
  164. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts +196 -0
  165. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts.map +1 -0
  166. package/dist/types/src/wallet/substrates/XDM.d.ts +412 -0
  167. package/dist/types/src/wallet/substrates/XDM.d.ts.map +1 -0
  168. package/dist/types/src/wallet/substrates/index.d.ts +8 -0
  169. package/dist/types/src/wallet/substrates/index.d.ts.map +1 -0
  170. package/dist/types/src/wallet/substrates/window.CWI.d.ts +410 -0
  171. package/dist/types/src/wallet/substrates/window.CWI.d.ts.map +1 -0
  172. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  173. package/dist/umd/bundle.js +1 -1
  174. package/docs/overlay-tools.md +537 -0
  175. package/docs/script.md +135 -0
  176. package/docs/totp.md +119 -0
  177. package/docs/wallet-substrates.md +10 -0
  178. package/docs/wallet.md +3718 -0
  179. package/mod.ts +5 -1
  180. package/package.json +44 -3
  181. package/src/auth/Certificate.ts +233 -0
  182. package/src/auth/__tests/Certificate.test.ts +282 -0
  183. package/src/auth/index.ts +1 -0
  184. package/src/overlay-tools/LookupResolver.ts +228 -0
  185. package/src/overlay-tools/OverlayAdminTokenTemplate.ts +79 -0
  186. package/src/overlay-tools/SHIPBroadcaster.ts +405 -0
  187. package/src/overlay-tools/__tests/LookupResolver.test.ts +1403 -0
  188. package/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.ts +69 -0
  189. package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +904 -0
  190. package/src/overlay-tools/index.ts +5 -0
  191. package/src/script/templates/PushDrop.ts +246 -0
  192. package/src/script/templates/__tests/PushDrop.test.ts +158 -0
  193. package/src/script/templates/index.ts +1 -0
  194. package/src/transaction/http/DefaultHttpClient.ts +1 -1
  195. package/src/wallet/CachedKeyDeriver.ts +193 -0
  196. package/src/wallet/KeyDeriver.ts +178 -0
  197. package/src/wallet/ProtoWallet.ts +732 -0
  198. package/src/wallet/Wallet.interfaces.ts +1170 -0
  199. package/src/wallet/WalletClient.ts +201 -0
  200. package/src/wallet/WalletError.ts +27 -0
  201. package/src/wallet/__tests/CachedKeyDeriver.test.ts +322 -0
  202. package/src/wallet/__tests/KeyDeriver.test.ts +118 -0
  203. package/src/wallet/__tests/ProtoWallet.test.ts +543 -0
  204. package/src/wallet/index.ts +8 -0
  205. package/src/wallet/substrates/HTTPWalletWire.ts +47 -0
  206. package/src/wallet/substrates/WalletWire.ts +6 -0
  207. package/src/wallet/substrates/WalletWireCalls.ts +34 -0
  208. package/src/wallet/substrates/WalletWireProcessor.ts +2046 -0
  209. package/src/wallet/substrates/WalletWireTransceiver.ts +1454 -0
  210. package/src/wallet/substrates/XDM.ts +157 -0
  211. package/src/wallet/substrates/__tests/WalletWire.integration.test.ts +2194 -0
  212. package/src/wallet/substrates/__tests/XDM.test.ts +659 -0
  213. package/src/wallet/substrates/index.ts +7 -0
  214. package/src/wallet/substrates/window.CWI.ts +133 -0
@@ -0,0 +1,732 @@
1
+ import {
2
+ Base64String,
3
+ BasketStringUnder300Bytes,
4
+ BEEF,
5
+ BooleanDefaultFalse,
6
+ BooleanDefaultTrue,
7
+ Byte,
8
+ CertificateFieldNameUnder50Bytes,
9
+ DescriptionString5to50Bytes,
10
+ EntityIconURLStringMax500Bytes,
11
+ EntityNameStringMax100Bytes,
12
+ HexString,
13
+ ISOTimestampString,
14
+ KeyIDStringUnder800Bytes,
15
+ LabelStringUnder300Bytes,
16
+ OriginatorDomainNameStringUnder250Bytes,
17
+ OutpointString,
18
+ OutputTagStringUnder300Bytes,
19
+ PositiveInteger,
20
+ PositiveIntegerDefault10Max10000,
21
+ PositiveIntegerMax10,
22
+ PositiveIntegerOrZero,
23
+ ProtocolString5To400Bytes,
24
+ PubKeyHex,
25
+ SatoshiValue,
26
+ TXIDHexString,
27
+ VersionString7To30Bytes,
28
+ Wallet
29
+ } from './Wallet.interfaces.js'
30
+ import KeyDeriver from './KeyDeriver.js'
31
+ import { PrivateKey, Hash, ECDSA, BigNumber, Signature, Schnorr, PublicKey, Point } from '../primitives/index.js'
32
+ import walletErrors, { WalletError } from './WalletError.js'
33
+
34
+ /**
35
+ * A ProtoWallet is a structure that fulfills the Wallet interface, capable of performing all foundational cryptographic operations. It can derive keys, create signatures, facilitate encryption and HMAC operations, and reveal key linkages. However, ProtoWallet does not create transactions, manage outputs, interact with the blockchain, enable the management of identity certificates, or store any data.
36
+ */
37
+ export default class ProtoWallet implements Wallet {
38
+ keyDeriver: KeyDeriver
39
+ privilegedError: string =
40
+ 'ProtoWallet is a single-keyring wallet, operating without context about whether its configured keyring is privileged.'
41
+
42
+ constructor(rootKey: PrivateKey | 'anyone', KeyDeriverClass = KeyDeriver) {
43
+ this.keyDeriver = new KeyDeriverClass(rootKey)
44
+ }
45
+
46
+ async createAction(
47
+ args: {
48
+ description: DescriptionString5to50Bytes
49
+ inputs?: Array<{
50
+ tx?: BEEF
51
+ outpoint: OutpointString
52
+ unlockingScript?: HexString
53
+ unlockingScriptLength?: PositiveInteger
54
+ inputDescription: DescriptionString5to50Bytes
55
+ sequenceNumber?: PositiveIntegerOrZero
56
+ }>
57
+ outputs?: Array<{
58
+ lockingScript: HexString
59
+ satoshis: SatoshiValue
60
+ outputDescription: DescriptionString5to50Bytes
61
+ basket?: BasketStringUnder300Bytes
62
+ customInstructions?: string
63
+ tags?: OutputTagStringUnder300Bytes[]
64
+ }>
65
+ lockTime?: PositiveIntegerOrZero
66
+ version?: PositiveIntegerOrZero
67
+ labels?: LabelStringUnder300Bytes[]
68
+ options?: {
69
+ signAndProcess?: BooleanDefaultTrue
70
+ acceptDelayedBroadcast?: BooleanDefaultTrue
71
+ trustSelf?: 'known'
72
+ knownTxids?: TXIDHexString[]
73
+ returnTXIDOnly?: BooleanDefaultFalse
74
+ noSend?: BooleanDefaultFalse
75
+ noSendChange?: OutpointString[]
76
+ sendWith?: TXIDHexString[]
77
+ randomizeOutputs?: BooleanDefaultTrue
78
+ }
79
+ },
80
+ originator?: OriginatorDomainNameStringUnder250Bytes
81
+ ): Promise<{
82
+ txid?: TXIDHexString
83
+ tx?: BEEF
84
+ noSendChange?: OutpointString[]
85
+ sendWithResults?: Array<{
86
+ txid: TXIDHexString
87
+ status: 'unproven' | 'sending' | 'failed'
88
+ }>
89
+ signableTransaction?: {
90
+ tx: BEEF
91
+ reference: Base64String
92
+ }
93
+ }> {
94
+ throw new WalletError('ProtoWallet does not support creating transactions.', walletErrors.unsupportedAction)
95
+ }
96
+
97
+ async signAction(
98
+ args: {
99
+ spends: Record<
100
+ PositiveIntegerOrZero,
101
+ {
102
+ unlockingScript: HexString
103
+ sequenceNumber?: PositiveIntegerOrZero
104
+ }
105
+ >
106
+ reference: Base64String
107
+ options?: {
108
+ acceptDelayedBroadcast?: BooleanDefaultTrue
109
+ returnTXIDOnly?: BooleanDefaultFalse
110
+ noSend?: BooleanDefaultFalse
111
+ noSendChange?: OutpointString[]
112
+ sendWith?: TXIDHexString[]
113
+ }
114
+ },
115
+ originator?: OriginatorDomainNameStringUnder250Bytes
116
+ ): Promise<{
117
+ txid?: TXIDHexString
118
+ tx?: BEEF
119
+ noSendChange?: OutpointString[]
120
+ sendWithResults?: Array<{
121
+ txid: TXIDHexString
122
+ status: 'unproven' | 'sending' | 'failed'
123
+ }>
124
+ }> {
125
+ throw new WalletError('ProtoWallet does not support creating transactions.', walletErrors.unsupportedAction)
126
+ }
127
+
128
+ async abortAction(
129
+ args: {
130
+ reference: Base64String
131
+ },
132
+ originator?: OriginatorDomainNameStringUnder250Bytes
133
+ ): Promise<{ aborted: true }> {
134
+ throw new WalletError('ProtoWallet does not support aborting transactions.', walletErrors.unsupportedAction)
135
+ }
136
+
137
+ async listActions(
138
+ args: {
139
+ labels: LabelStringUnder300Bytes[]
140
+ labelQueryMode?: 'any' | 'all'
141
+ includeLabels?: BooleanDefaultFalse
142
+ includeInputs?: BooleanDefaultFalse
143
+ includeInputSourceLockingScripts?: BooleanDefaultFalse
144
+ includeInputUnlockingScripts?: BooleanDefaultFalse
145
+ includeOutputs?: BooleanDefaultFalse
146
+ includeOutputLockingScripts?: BooleanDefaultFalse
147
+ limit?: PositiveIntegerDefault10Max10000
148
+ offset?: PositiveIntegerOrZero
149
+ },
150
+ originator?: OriginatorDomainNameStringUnder250Bytes
151
+ ): Promise<{
152
+ totalActions: PositiveIntegerOrZero
153
+ actions: Array<{
154
+ txid: TXIDHexString
155
+ satoshis: SatoshiValue
156
+ status:
157
+ | 'completed'
158
+ | 'unprocessed'
159
+ | 'sending'
160
+ | 'unproven'
161
+ | 'unsigned'
162
+ | 'nosend'
163
+ | 'nonfinal'
164
+ isOutgoing: boolean
165
+ description: DescriptionString5to50Bytes
166
+ labels?: LabelStringUnder300Bytes[]
167
+ version: PositiveIntegerOrZero
168
+ lockTime: PositiveIntegerOrZero
169
+ inputs?: Array<{
170
+ sourceOutpoint: OutpointString
171
+ sourceSatoshis: SatoshiValue
172
+ sourceLockingScript?: HexString
173
+ unlockingScript?: HexString
174
+ inputDescription: DescriptionString5to50Bytes
175
+ sequenceNumber: PositiveIntegerOrZero
176
+ }>
177
+ outputs?: Array<{
178
+ outputIndex: PositiveIntegerOrZero
179
+ satoshis: SatoshiValue
180
+ lockingScript?: HexString
181
+ spendable: boolean
182
+ outputDescription: DescriptionString5to50Bytes
183
+ basket: BasketStringUnder300Bytes
184
+ tags: OutputTagStringUnder300Bytes[]
185
+ customInstructions?: string
186
+ }>
187
+ }>
188
+ }> {
189
+ throw new WalletError('ProtoWallet does not support retrieving transactions.', walletErrors.unsupportedAction)
190
+ }
191
+
192
+ async internalizeAction(
193
+ args: {
194
+ tx: BEEF
195
+ outputs: Array<{
196
+ outputIndex: PositiveIntegerOrZero
197
+ protocol: 'wallet payment' | 'basket insertion'
198
+ paymentRemittance?: {
199
+ derivationPrefix: Base64String
200
+ derivationSuffix: Base64String
201
+ senderIdentityKey: PubKeyHex
202
+ }
203
+ insertionRemittance?: {
204
+ basket: BasketStringUnder300Bytes
205
+ customInstructions?: string
206
+ tags?: OutputTagStringUnder300Bytes[]
207
+ }
208
+ }>
209
+ description: DescriptionString5to50Bytes
210
+ labels?: LabelStringUnder300Bytes[]
211
+ },
212
+ originator?: OriginatorDomainNameStringUnder250Bytes
213
+ ): Promise<{ accepted: true }> {
214
+ throw new WalletError('ProtoWallet does not support internalizing transactions.', walletErrors.unsupportedAction)
215
+ }
216
+
217
+ async listOutputs(
218
+ args: {
219
+ basket: BasketStringUnder300Bytes
220
+ tags?: OutputTagStringUnder300Bytes[]
221
+ tagQueryMode?: 'all' | 'any'
222
+ include?: 'locking scripts' | 'entire transactions'
223
+ includeCustomInstructions?: BooleanDefaultFalse
224
+ includeTags?: BooleanDefaultFalse
225
+ includeLabels?: BooleanDefaultFalse
226
+ limit?: PositiveIntegerDefault10Max10000
227
+ offset?: PositiveIntegerOrZero
228
+ },
229
+ originator?: OriginatorDomainNameStringUnder250Bytes
230
+ ): Promise<{
231
+ totalOutputs: PositiveIntegerOrZero
232
+ outputs: Array<{
233
+ outpoint: OutpointString
234
+ satoshis: SatoshiValue
235
+ lockingScript?: HexString
236
+ tx?: BEEF
237
+ spendable: true
238
+ customInstructions?: string
239
+ tags?: OutputTagStringUnder300Bytes[]
240
+ labels?: LabelStringUnder300Bytes[]
241
+ }>
242
+ }> {
243
+ throw new WalletError('ProtoWallet does not support retrieving outputs.', walletErrors.unsupportedAction)
244
+ }
245
+
246
+ async relinquishOutput(
247
+ args: {
248
+ basket: BasketStringUnder300Bytes
249
+ output: OutpointString
250
+ },
251
+ originator?: OriginatorDomainNameStringUnder250Bytes
252
+ ): Promise<{ relinquished: true }> {
253
+ throw new WalletError('ProtoWallet does not support deleting outputs.', walletErrors.unsupportedAction)
254
+ }
255
+
256
+ async getPublicKey(
257
+ args: {
258
+ identityKey?: true
259
+ protocolID?: [0 | 1 | 2, ProtocolString5To400Bytes]
260
+ keyID?: KeyIDStringUnder800Bytes
261
+ privileged?: BooleanDefaultFalse
262
+ privilegedReason?: DescriptionString5to50Bytes
263
+ counterparty?: PubKeyHex | 'self' | 'anyone'
264
+ forSelf?: BooleanDefaultFalse
265
+ },
266
+ originator?: OriginatorDomainNameStringUnder250Bytes
267
+ ): Promise<{ publicKey: PubKeyHex }> {
268
+ if (args.privileged) {
269
+ throw new WalletError(this.privilegedError)
270
+ }
271
+ if (args.identityKey) {
272
+ return { publicKey: this.keyDeriver.rootKey.toPublicKey().toString() }
273
+ } else {
274
+ return {
275
+ publicKey: this.keyDeriver
276
+ .derivePublicKey(
277
+ args.protocolID,
278
+ args.keyID,
279
+ args.counterparty || 'self',
280
+ args.forSelf
281
+ )
282
+ .toString()
283
+ }
284
+ }
285
+ }
286
+
287
+ async revealCounterpartyKeyLinkage(
288
+ args: {
289
+ counterparty: PubKeyHex
290
+ verifier: PubKeyHex
291
+ privilegedReason?: DescriptionString5to50Bytes
292
+ privileged?: BooleanDefaultFalse
293
+ },
294
+ originator?: OriginatorDomainNameStringUnder250Bytes
295
+ ): Promise<{
296
+ prover: PubKeyHex
297
+ verifier: PubKeyHex
298
+ counterparty: PubKeyHex
299
+ revelationTime: ISOTimestampString
300
+ encryptedLinkage: Byte[]
301
+ encryptedLinkageProof: Byte[]
302
+ }> {
303
+ if (args.privileged) {
304
+ throw new WalletError(this.privilegedError)
305
+ }
306
+ const { publicKey: identityKey } = await this.getPublicKey({ identityKey: true })
307
+ const linkage = this.keyDeriver.revealCounterpartySecret(args.counterparty)
308
+ const linkageProof = new Schnorr().generateProof(this.keyDeriver.rootKey, this.keyDeriver.rootKey.toPublicKey(), PublicKey.fromString(args.counterparty), Point.fromDER(linkage))
309
+ const linkageProofBin = [
310
+ ...linkageProof.R.encode(true),
311
+ ...linkageProof.SPrime.encode(true),
312
+ ...linkageProof.z.toArray()
313
+ ] as number[]
314
+ const revelationTime = new Date().toISOString()
315
+ const { ciphertext: encryptedLinkage } = await this.encrypt({
316
+ plaintext: linkage,
317
+ protocolID: [2, 'counterparty linkage revelation'],
318
+ keyID: revelationTime,
319
+ counterparty: args.verifier
320
+ })
321
+ const { ciphertext: encryptedLinkageProof } = await this.encrypt({
322
+ plaintext: linkageProofBin,
323
+ protocolID: [2, 'counterparty linkage revelation'],
324
+ keyID: revelationTime,
325
+ counterparty: args.verifier
326
+ })
327
+ return {
328
+ prover: identityKey,
329
+ verifier: args.verifier,
330
+ counterparty: args.counterparty,
331
+ revelationTime,
332
+ encryptedLinkage,
333
+ encryptedLinkageProof
334
+ }
335
+ }
336
+
337
+ async revealSpecificKeyLinkage(
338
+ args: {
339
+ counterparty: PubKeyHex
340
+ verifier: PubKeyHex
341
+ protocolID: [0 | 1 | 2, ProtocolString5To400Bytes]
342
+ keyID: KeyIDStringUnder800Bytes
343
+ privilegedReason?: DescriptionString5to50Bytes
344
+ privileged?: BooleanDefaultFalse
345
+ },
346
+ originator?: OriginatorDomainNameStringUnder250Bytes
347
+ ): Promise<{
348
+ prover: PubKeyHex
349
+ verifier: PubKeyHex
350
+ counterparty: PubKeyHex
351
+ protocolID: [0 | 1 | 2, ProtocolString5To400Bytes]
352
+ keyID: KeyIDStringUnder800Bytes
353
+ encryptedLinkage: Byte[]
354
+ encryptedLinkageProof: Byte[]
355
+ proofType: Byte
356
+ }> {
357
+ if (args.privileged) {
358
+ throw new WalletError(this.privilegedError)
359
+ }
360
+ const { publicKey: identityKey } = await this.getPublicKey({ identityKey: true })
361
+ const linkage = this.keyDeriver.revealSpecificSecret(
362
+ args.counterparty,
363
+ args.protocolID,
364
+ args.keyID
365
+ )
366
+ const { ciphertext: encryptedLinkage } = await this.encrypt({
367
+ plaintext: linkage,
368
+ protocolID: [2, `specific linkage revelation ${args.protocolID[0]} ${args.protocolID[1]}`],
369
+ keyID: args.keyID,
370
+ counterparty: args.verifier
371
+ })
372
+ const { ciphertext: encryptedLinkageProof } = await this.encrypt({
373
+ plaintext: [0], // Proof type 0, no proof provided
374
+ protocolID: [2, `specific linkage revelation ${args.protocolID[0]} ${args.protocolID[1]}`],
375
+ keyID: args.keyID,
376
+ counterparty: args.verifier
377
+ })
378
+ return {
379
+ prover: identityKey,
380
+ verifier: args.verifier,
381
+ counterparty: args.counterparty,
382
+ protocolID: args.protocolID,
383
+ keyID: args.keyID,
384
+ encryptedLinkage,
385
+ encryptedLinkageProof,
386
+ proofType: 0
387
+ }
388
+ }
389
+
390
+ async encrypt(
391
+ args: {
392
+ plaintext: Byte[]
393
+ protocolID: [0 | 1 | 2, ProtocolString5To400Bytes]
394
+ keyID: KeyIDStringUnder800Bytes
395
+ privilegedReason?: DescriptionString5to50Bytes
396
+ counterparty?: PubKeyHex | 'self' | 'anyone'
397
+ privileged?: BooleanDefaultFalse
398
+ },
399
+ originator?: OriginatorDomainNameStringUnder250Bytes
400
+ ): Promise<{ ciphertext: Byte[] }> {
401
+ if (args.privileged) {
402
+ throw new WalletError(this.privilegedError)
403
+ }
404
+ const key = this.keyDeriver.deriveSymmetricKey(
405
+ args.protocolID,
406
+ args.keyID,
407
+ args.counterparty || 'self'
408
+ )
409
+ return { ciphertext: key.encrypt(args.plaintext) as number[] }
410
+ }
411
+
412
+ async decrypt(
413
+ args: {
414
+ ciphertext: Byte[]
415
+ protocolID: [0 | 1 | 2, ProtocolString5To400Bytes]
416
+ keyID: KeyIDStringUnder800Bytes
417
+ privilegedReason?: DescriptionString5to50Bytes
418
+ counterparty?: PubKeyHex | 'self' | 'anyone'
419
+ privileged?: BooleanDefaultFalse
420
+ },
421
+ originator?: OriginatorDomainNameStringUnder250Bytes
422
+ ): Promise<{ plaintext: Byte[] }> {
423
+ if (args.privileged) {
424
+ throw new WalletError(this.privilegedError)
425
+ }
426
+ const key = this.keyDeriver.deriveSymmetricKey(
427
+ args.protocolID,
428
+ args.keyID,
429
+ args.counterparty || 'self'
430
+ )
431
+ return { plaintext: key.decrypt(args.ciphertext) as number[] }
432
+ }
433
+
434
+ async createHmac(
435
+ args: {
436
+ data: Byte[]
437
+ protocolID: [0 | 1 | 2, ProtocolString5To400Bytes]
438
+ keyID: KeyIDStringUnder800Bytes
439
+ privilegedReason?: DescriptionString5to50Bytes
440
+ counterparty?: PubKeyHex | 'self' | 'anyone'
441
+ privileged?: BooleanDefaultFalse
442
+ },
443
+ originator?: OriginatorDomainNameStringUnder250Bytes
444
+ ): Promise<{ hmac: Byte[] }> {
445
+ if (args.privileged) {
446
+ throw new WalletError(this.privilegedError)
447
+ }
448
+ const key = this.keyDeriver.deriveSymmetricKey(
449
+ args.protocolID,
450
+ args.keyID,
451
+ args.counterparty || 'self'
452
+ )
453
+ return { hmac: Hash.sha256hmac(key.toArray(), args.data) }
454
+ }
455
+
456
+ async verifyHmac(
457
+ args: {
458
+ data: Byte[]
459
+ hmac: Byte[]
460
+ protocolID: [0 | 1 | 2, ProtocolString5To400Bytes]
461
+ keyID: KeyIDStringUnder800Bytes
462
+ privilegedReason?: DescriptionString5to50Bytes
463
+ counterparty?: PubKeyHex | 'self' | 'anyone'
464
+ privileged?: BooleanDefaultFalse
465
+ },
466
+ originator?: OriginatorDomainNameStringUnder250Bytes
467
+ ): Promise<{ valid: true }> {
468
+ if (args.privileged) {
469
+ throw new WalletError(this.privilegedError)
470
+ }
471
+ const key = this.keyDeriver.deriveSymmetricKey(
472
+ args.protocolID,
473
+ args.keyID,
474
+ args.counterparty || 'self'
475
+ )
476
+ const valid = Hash.sha256hmac(key.toArray(), args.data).toString() === args.hmac.toString()
477
+ if (!valid) {
478
+ throw new WalletError('HMAC is not valid', walletErrors.invalidHmac)
479
+ }
480
+ return { valid }
481
+ }
482
+
483
+ async createSignature(
484
+ args: {
485
+ data?: Byte[]
486
+ hashToDirectlySign?: Byte[]
487
+ protocolID: [0 | 1 | 2, ProtocolString5To400Bytes]
488
+ keyID: KeyIDStringUnder800Bytes
489
+ privilegedReason?: DescriptionString5to50Bytes
490
+ counterparty?: PubKeyHex | 'self' | 'anyone'
491
+ privileged?: BooleanDefaultFalse
492
+ },
493
+ originator?: OriginatorDomainNameStringUnder250Bytes
494
+ ): Promise<{ signature: Byte[] }> {
495
+ if (args.privileged) {
496
+ throw new WalletError(this.privilegedError)
497
+ }
498
+ let hash: number[] = args.hashToDirectlySign
499
+ if (!hash) {
500
+ hash = Hash.sha256(args.data)
501
+ }
502
+ const key = this.keyDeriver.derivePrivateKey(
503
+ args.protocolID,
504
+ args.keyID,
505
+ args.counterparty || 'anyone'
506
+ )
507
+ return { signature: ECDSA.sign(new BigNumber(hash), key, true).toDER() as number[] }
508
+ }
509
+
510
+ async verifySignature(
511
+ args: {
512
+ data?: Byte[]
513
+ hashToDirectlyVerify?: Byte[]
514
+ signature: Byte[]
515
+ protocolID: [0 | 1 | 2, ProtocolString5To400Bytes]
516
+ keyID: KeyIDStringUnder800Bytes
517
+ privilegedReason?: DescriptionString5to50Bytes
518
+ counterparty?: PubKeyHex | 'self' | 'anyone'
519
+ forSelf?: BooleanDefaultFalse
520
+ privileged?: BooleanDefaultFalse
521
+ },
522
+ originator?: OriginatorDomainNameStringUnder250Bytes
523
+ ): Promise<{ valid: true }> {
524
+ if (args.privileged) {
525
+ throw new WalletError(this.privilegedError)
526
+ }
527
+ let hash: number[] = args.hashToDirectlyVerify
528
+ if (!hash) {
529
+ hash = Hash.sha256(args.data)
530
+ }
531
+ const key = this.keyDeriver.derivePublicKey(
532
+ args.protocolID,
533
+ args.keyID,
534
+ args.counterparty || 'self',
535
+ args.forSelf
536
+ )
537
+ const valid = ECDSA.verify(new BigNumber(hash), Signature.fromDER(args.signature), key)
538
+ if (!valid) {
539
+ throw new WalletError('Signature is not valid', walletErrors.invalidSignature)
540
+ }
541
+ return { valid }
542
+ }
543
+
544
+ async acquireCertificate(
545
+ args: {
546
+ type: Base64String
547
+ certifier: PubKeyHex
548
+ acquisitionProtocol: 'direct' | 'issuance'
549
+ fields: Record<CertificateFieldNameUnder50Bytes, string>
550
+ serialNumber?: Base64String
551
+ revocationOutpoint?: OutpointString
552
+ signature?: HexString
553
+ certifierUrl?: string
554
+ keyringRevealer?: PubKeyHex | 'certifier'
555
+ keyringForSubject?: Record<CertificateFieldNameUnder50Bytes, Base64String>
556
+ privileged?: BooleanDefaultFalse
557
+ privilegedReason?: DescriptionString5to50Bytes
558
+ },
559
+ originator?: OriginatorDomainNameStringUnder250Bytes
560
+ ): Promise<{
561
+ type: Base64String
562
+ subject: PubKeyHex
563
+ serialNumber: Base64String
564
+ certifier: PubKeyHex
565
+ revocationOutpoint: OutpointString
566
+ signature: HexString
567
+ fields: Record<CertificateFieldNameUnder50Bytes, string>
568
+ }> {
569
+ throw new WalletError('ProtoWallet does not support acquiring certificates.', walletErrors.unsupportedAction)
570
+ }
571
+
572
+ async listCertificates(
573
+ args: {
574
+ certifiers: PubKeyHex[]
575
+ types: Base64String[]
576
+ limit?: PositiveIntegerDefault10Max10000
577
+ offset?: PositiveIntegerOrZero
578
+ privileged?: BooleanDefaultFalse
579
+ privilegedReason?: DescriptionString5to50Bytes
580
+ },
581
+ originator?: OriginatorDomainNameStringUnder250Bytes
582
+ ): Promise<{
583
+ totalCertificates: PositiveIntegerOrZero
584
+ certificates: Array<{
585
+ type: Base64String
586
+ subject: PubKeyHex
587
+ serialNumber: Base64String
588
+ certifier: PubKeyHex
589
+ revocationOutpoint: OutpointString
590
+ signature: HexString
591
+ fields: Record<CertificateFieldNameUnder50Bytes, string>
592
+ }>
593
+ }> {
594
+ throw new WalletError('ProtoWallet does not support retrieving certificates.', walletErrors.unsupportedAction)
595
+ }
596
+
597
+ async proveCertificate(
598
+ args: {
599
+ certificate: {
600
+ type: Base64String
601
+ subject: PubKeyHex
602
+ serialNumber: Base64String
603
+ certifier: PubKeyHex
604
+ revocationOutpoint: OutpointString
605
+ signature: HexString
606
+ fields: Record<CertificateFieldNameUnder50Bytes, string>
607
+ }
608
+ fieldsToReveal: CertificateFieldNameUnder50Bytes[]
609
+ verifier: PubKeyHex
610
+ privileged?: BooleanDefaultFalse
611
+ privilegedReason?: DescriptionString5to50Bytes
612
+ },
613
+ originator?: OriginatorDomainNameStringUnder250Bytes
614
+ ): Promise<{
615
+ keyringForVerifier: Record<CertificateFieldNameUnder50Bytes, Base64String>
616
+ }> {
617
+ throw new WalletError('ProtoWallet does not support proving certificates.', walletErrors.unsupportedAction)
618
+ }
619
+
620
+ async relinquishCertificate(
621
+ args: {
622
+ type: Base64String
623
+ serialNumber: Base64String
624
+ certifier: PubKeyHex
625
+ },
626
+ originator?: OriginatorDomainNameStringUnder250Bytes
627
+ ): Promise<{ relinquished: true }> {
628
+ throw new WalletError('ProtoWallet does not support deleting certificates.', walletErrors.unsupportedAction)
629
+ }
630
+
631
+ async discoverByIdentityKey(
632
+ args: {
633
+ identityKey: PubKeyHex
634
+ limit?: PositiveIntegerDefault10Max10000
635
+ offset?: PositiveIntegerOrZero
636
+ },
637
+ originator?: OriginatorDomainNameStringUnder250Bytes
638
+ ): Promise<{
639
+ totalCertificates: PositiveIntegerOrZero
640
+ certificates: Array<{
641
+ type: Base64String
642
+ subject: PubKeyHex
643
+ serialNumber: Base64String
644
+ certifier: PubKeyHex
645
+ revocationOutpoint: OutpointString
646
+ signature: HexString
647
+ fields: Record<CertificateFieldNameUnder50Bytes, Base64String>
648
+ certifierInfo: {
649
+ name: EntityNameStringMax100Bytes
650
+ iconUrl: EntityIconURLStringMax500Bytes
651
+ description: DescriptionString5to50Bytes
652
+ trust: PositiveIntegerMax10
653
+ }
654
+ publiclyRevealedKeyring: Record<CertificateFieldNameUnder50Bytes, Base64String>
655
+ decryptedFields: Record<CertificateFieldNameUnder50Bytes, string>
656
+ }>
657
+ }> {
658
+ throw new WalletError('ProtoWallet does not support resolving identities.', walletErrors.unsupportedAction)
659
+ }
660
+
661
+ async discoverByAttributes(
662
+ args: {
663
+ attributes: Record<CertificateFieldNameUnder50Bytes, string>
664
+ limit?: PositiveIntegerDefault10Max10000
665
+ offset?: PositiveIntegerOrZero
666
+ },
667
+ originator?: OriginatorDomainNameStringUnder250Bytes
668
+ ): Promise<{
669
+ totalCertificates: PositiveIntegerOrZero
670
+ certificates: Array<{
671
+ type: Base64String
672
+ subject: PubKeyHex
673
+ serialNumber: Base64String
674
+ certifier: PubKeyHex
675
+ revocationOutpoint: OutpointString
676
+ signature: HexString
677
+ fields: Record<CertificateFieldNameUnder50Bytes, Base64String>
678
+ certifierInfo: {
679
+ name: EntityNameStringMax100Bytes
680
+ iconUrl: EntityIconURLStringMax500Bytes
681
+ description: DescriptionString5to50Bytes
682
+ trust: PositiveIntegerMax10
683
+ }
684
+ publiclyRevealedKeyring: Record<CertificateFieldNameUnder50Bytes, Base64String>
685
+ decryptedFields: Record<CertificateFieldNameUnder50Bytes, string>
686
+ }>
687
+ }> {
688
+ throw new WalletError('ProtoWallet does not support resolving identities.', walletErrors.unsupportedAction)
689
+ }
690
+
691
+ async isAuthenticated(
692
+ args: {},
693
+ originator?: OriginatorDomainNameStringUnder250Bytes
694
+ ): Promise<{ authenticated: boolean }> {
695
+ return { authenticated: true }
696
+ }
697
+
698
+ async waitForAuthentication(
699
+ args: {},
700
+ originator?: OriginatorDomainNameStringUnder250Bytes
701
+ ): Promise<{ authenticated: true }> {
702
+ return { authenticated: true }
703
+ }
704
+
705
+ async getHeight(
706
+ args: {},
707
+ originator?: OriginatorDomainNameStringUnder250Bytes
708
+ ): Promise<{ height: PositiveInteger }> {
709
+ throw new WalletError('ProtoWallet does not support blockchain tracking.', walletErrors.unsupportedAction)
710
+ }
711
+
712
+ async getHeaderForHeight(
713
+ args: { height: PositiveInteger },
714
+ originator?: OriginatorDomainNameStringUnder250Bytes
715
+ ): Promise<{ header: HexString }> {
716
+ throw new WalletError('ProtoWallet does not support blockchain tracking.', walletErrors.unsupportedAction)
717
+ }
718
+
719
+ async getNetwork(
720
+ args: {},
721
+ originator?: OriginatorDomainNameStringUnder250Bytes
722
+ ): Promise<{ network: 'mainnet' | 'testnet' }> {
723
+ return { network: 'mainnet' }
724
+ }
725
+
726
+ async getVersion(
727
+ args: {},
728
+ originator?: OriginatorDomainNameStringUnder250Bytes
729
+ ): Promise<{ version: VersionString7To30Bytes }> {
730
+ return { version: 'proto-1.0.0' }
731
+ }
732
+ }