@bopen-io/wallet-toolbox 1.7.19 → 1.7.20-idb-fix.2

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.
@@ -0,0 +1,218 @@
1
+ # Security Issue: WalletPermissionsManager Token/Ordinal Theft Vulnerability
2
+
3
+ ## Summary
4
+
5
+ A malicious dApp can transfer tokens and ordinals out of a user's wallet without triggering the `onSpendingAuthorizationRequested` callback, bypassing the spending permission prompt entirely.
6
+
7
+ ## Severity
8
+
9
+ **HIGH** - This vulnerability allows unauthorized transfer of tokenized assets (ordinals, BSV21 tokens) without user consent.
10
+
11
+ ## Affected Component
12
+
13
+ `WalletPermissionsManager.createAction()` in [src/WalletPermissionsManager.ts](src/WalletPermissionsManager.ts#L2598-L2832)
14
+
15
+ ## Vulnerability Details
16
+
17
+ ### Root Cause
18
+
19
+ The spending authorization check in `createAction` only triggers when `netSpent > 0`:
20
+
21
+ ```typescript
22
+ // Line 2798-2813
23
+ netSpent = totalOutputSatoshis + tx.getFee() - totalInputSatoshis
24
+
25
+ if (netSpent > 0) {
26
+ try {
27
+ await this.ensureSpendingAuthorization({
28
+ originator: originator!,
29
+ satoshis: netSpent,
30
+ lineItems,
31
+ reason: originalDescription
32
+ })
33
+ } catch (err) {
34
+ await this.underlying.abortAction({ reference })
35
+ throw err
36
+ }
37
+ }
38
+ ```
39
+
40
+ The `netSpent` calculation is based purely on satoshi value:
41
+ - `totalOutputSatoshis` = sum of dApp-requested outputs
42
+ - `totalInputSatoshis` = sum of dApp-requested inputs
43
+ - `netSpent` = outputs + fee - inputs
44
+
45
+ ### The Problem
46
+
47
+ This logic only considers satoshi flow, ignoring that UTXOs may carry tokenized assets:
48
+
49
+ 1. **1Sat Ordinals** - NFTs stored in 1 satoshi outputs
50
+ 2. **BSV21 Tokens** - Fungible tokens in minimal satoshi outputs
51
+ 3. **Any protocol using data-carrying outputs**
52
+
53
+ Users should be prompted whenever their assets are being spent, regardless of the net satoshi flow.
54
+
55
+ ### Attack Scenario
56
+
57
+ 1. User has an ordinal (1 sat UTXO)
58
+ 2. Malicious dApp calls `createAction` with:
59
+ - Input: User's ordinal UTXO (1 sat) - dApp knows the outpoint
60
+ - Input: dApp's own 2 sat UTXO (with provided unlockingScript)
61
+ - Output: 2 sats to user's address
62
+ 3. Calculation: `netSpent = 2 + fee - (1 + 2) = -1 + fee`
63
+ 4. If `fee < 1 sat` (possible for small transactions), `netSpent <= 0`
64
+ 5. **No spending prompt fires**
65
+ 6. The ordinal is transferred without user approval
66
+
67
+ ### Why This Works
68
+
69
+ The dApp provides its own inputs with `unlockingScript` already specified - those don't require the wallet to sign them. The wallet only needs to sign the user's ordinal input. Since `netSpent <= 0`, no authorization is requested, and the wallet automatically signs and broadcasts the transaction.
70
+
71
+ ## Impact
72
+
73
+ - **Unauthorized transfer of ordinals** without user knowledge
74
+ - **Unauthorized transfer of BSV21 tokens** without user knowledge
75
+ - **Any wallet-owned UTXO** can be transferred if the attacker provides offsetting satoshi value
76
+ - Users lose control over their tokenized assets
77
+
78
+ ## Proof of Concept
79
+
80
+ ```typescript
81
+ // Malicious dApp code
82
+ async function transferOrdinalWithoutConsent(walletClient, targetOrdinalOutpoint: string) {
83
+ const result = await walletClient.createAction({
84
+ description: "Legitimate-looking transaction",
85
+ inputs: [
86
+ {
87
+ // User's ordinal - wallet will sign this
88
+ outpoint: targetOrdinalOutpoint, // e.g., "abc123...def.0"
89
+ unlockingScriptLength: 107
90
+ },
91
+ {
92
+ // Attacker's funding input - already unlocked
93
+ outpoint: "attacker-utxo-txid.0",
94
+ unlockingScript: "3044..." // Pre-signed by attacker
95
+ }
96
+ ],
97
+ outputs: [
98
+ {
99
+ // Return some sats to user (to make netSpent <= 0)
100
+ satoshis: 2,
101
+ lockingScript: "76a914..." // user's address
102
+ },
103
+ {
104
+ // Take the ordinal
105
+ satoshis: 1,
106
+ lockingScript: "76a914..." // attacker's address
107
+ }
108
+ ]
109
+ });
110
+ // Ordinal transferred without any user prompt
111
+ }
112
+ ```
113
+
114
+ ## Proposed Fix
115
+
116
+ ### Option 1: Always Prompt for Wallet-Owned Inputs (Recommended)
117
+
118
+ Trigger `onSpendingAuthorizationRequested` whenever any wallet-owned input is being consumed, regardless of `netSpent` value:
119
+
120
+ ```typescript
121
+ // Check if any wallet-owned inputs are being consumed
122
+ const hasWalletOwnedInputs = args.inputs?.some(input => {
123
+ // An input is wallet-owned if it doesn't have a pre-provided unlockingScript
124
+ return !input.unlockingScript;
125
+ });
126
+
127
+ if (netSpent > 0 || hasWalletOwnedInputs) {
128
+ await this.ensureSpendingAuthorization({...});
129
+ }
130
+ ```
131
+
132
+ ### Option 2: Protected Baskets Configuration
133
+
134
+ Add a configuration option to specify baskets that always require spending authorization:
135
+
136
+ ```typescript
137
+ interface PermissionsManagerConfig {
138
+ // ... existing config
139
+
140
+ /**
141
+ * Baskets that always require spending authorization when consumed as inputs,
142
+ * regardless of netSpent value. Use this for tokenized assets.
143
+ */
144
+ alwaysPromptForBasketInputs?: string[];
145
+ }
146
+ ```
147
+
148
+ Then in `createAction`:
149
+
150
+ ```typescript
151
+ // Check if any inputs belong to protected baskets
152
+ const protectedBaskets = this.config.alwaysPromptForBasketInputs || [];
153
+ let consumesProtectedAsset = false;
154
+
155
+ if (protectedBaskets.length > 0) {
156
+ for (const input of args.inputs || []) {
157
+ // Query the output's basket membership
158
+ const outputInfo = await this.underlying.listOutputs({
159
+ outpoint: input.outpoint,
160
+ include: 'locking scripts'
161
+ });
162
+ if (outputInfo.outputs.length > 0) {
163
+ const basket = outputInfo.outputs[0].basket;
164
+ if (basket && protectedBaskets.includes(basket)) {
165
+ consumesProtectedAsset = true;
166
+ break;
167
+ }
168
+ }
169
+ }
170
+ }
171
+
172
+ if (netSpent > 0 || consumesProtectedAsset) {
173
+ await this.ensureSpendingAuthorization({...});
174
+ }
175
+ ```
176
+
177
+ ### Option 3: Hybrid Approach
178
+
179
+ Combine both options - always prompt for wallet-owned inputs, but provide extra context when protected baskets are involved:
180
+
181
+ ```typescript
182
+ if (netSpent > 0 || hasWalletOwnedInputs) {
183
+ const lineItemsWithAssetInfo = await this.enrichLineItemsWithAssetInfo(lineItems, args.inputs);
184
+ await this.ensureSpendingAuthorization({
185
+ satoshis: Math.max(netSpent, 0),
186
+ lineItems: lineItemsWithAssetInfo,
187
+ // New field to indicate asset consumption
188
+ consumesAssets: consumesProtectedAsset,
189
+ assetBaskets: consumedBaskets
190
+ });
191
+ }
192
+ ```
193
+
194
+ ## Application-Level Mitigation (Interim)
195
+
196
+ Until a fix is implemented, applications can protect tokenized assets by:
197
+
198
+ 1. **Derived key locking scripts**: Store ordinals/tokens with locking scripts that require `customInstructions` for signing. The wallet cannot auto-sign without derivation info, so malicious dApps can't spend them.
199
+
200
+ 2. **Custom permission modules**: Implement a `PermissionsModule` for token baskets that enforces additional checks.
201
+
202
+ ## Related Files
203
+
204
+ - [src/WalletPermissionsManager.ts](src/WalletPermissionsManager.ts) - Main implementation
205
+ - [src/__tests/WalletPermissionsManager.proxying.test.ts](src/__tests/WalletPermissionsManager.proxying.test.ts) - Existing tests
206
+ - [src/__tests/WalletPermissionsManager.tokens.test.ts](src/__tests/WalletPermissionsManager.tokens.test.ts) - Token tests
207
+
208
+ ## Test Cases to Add
209
+
210
+ 1. Should trigger spending authorization when consuming wallet-owned inputs with netSpent <= 0
211
+ 2. Should trigger spending authorization when consuming inputs from protected baskets
212
+ 3. Should include asset information in spending authorization request
213
+ 4. Should not be bypassable by providing offsetting external inputs
214
+
215
+ ## References
216
+
217
+ - BRC-98: Wallet Protocol Permissions
218
+ - BRC-99: Spending Authorizations
@@ -0,0 +1,23 @@
1
+ The vulnerability is in WalletPermissionsManager.createAction():
2
+
3
+ Issue: onSpendingAuthorizationRequested can be bypassed for token/ordinal theft
4
+
5
+ WalletPermissionsManager only triggers onSpendingAuthorizationRequested when netSpent > 0. The calculation:
6
+
7
+
8
+ netSpent = (dApp-requested outputs) + fee - (dApp-requested inputs)
9
+ This works for satoshi value but fails for tokens/ordinals where a 1 sat UTXO may hold significant value.
10
+
11
+ Attack scenario:
12
+
13
+ User has ordinal worth 1 sat (but $1000 market value)
14
+ Malicious dApp calls createAction with:
15
+ User's ordinal as input (1 sat)
16
+ dApp's own 2 sat input (with provided unlockingScript)
17
+ Output: 2 sats to user
18
+ netSpent = 2 + fee - 3 = -1 + fee
19
+ If fee < 1 sat, no spending prompt fires
20
+ User loses ordinal without approval
21
+ Mitigation (application-level): Store tokens/ordinals with derived key locking scripts. The wallet can't auto-sign without derivation info in customInstructions, so malicious dApps can't spend them even if they bypass the spending prompt.
22
+
23
+ Potential fix (WPM-level): Consider triggering onSpendingAuthorizationRequested whenever wallet-owned inputs are consumed, regardless of netSpent value. Or add a config option like alwaysPromptForBasketInputs: ['1sat', 'bsv21'].
@@ -0,0 +1,303 @@
1
+ import { AbortActionArgs, AcquireCertificateArgs, AcquisitionProtocol, AtomicBEEF, Base64String, BasketInsertion, BasketStringUnder300Bytes, BEEF, BooleanDefaultFalse, BooleanDefaultTrue, CertificateFieldNameUnder50Bytes, CreateActionArgs, CreateActionInput, CreateActionOptions, CreateActionOutput, DescriptionString5to50Bytes, DiscoverByAttributesArgs, DiscoverByIdentityKeyArgs, HexString, InternalizeActionArgs, InternalizeOutput, KeyringRevealer, LabelStringUnder300Bytes, ListActionsArgs, ListCertificatesArgs, ListOutputsArgs, OutpointString, OutputTagStringUnder300Bytes, PositiveInteger, PositiveIntegerDefault10Max10000, PositiveIntegerOrZero, ProveCertificateArgs, PubKeyHex, RelinquishCertificateArgs, RelinquishOutputArgs, SatoshiValue, SignActionArgs, SignActionOptions, SignActionSpend, TrustSelf, TXIDHexString, WalletPayment } from '@bsv/sdk';
2
+ import { OutPoint } from './types';
3
+ export declare function parseWalletOutpoint(outpoint: string): {
4
+ txid: string;
5
+ vout: number;
6
+ };
7
+ export declare function validateSatoshis(v: number | undefined, name: string, min?: number): number;
8
+ export declare function validateOptionalInteger(v: number | undefined, name: string, min?: number, max?: number): number | undefined;
9
+ export declare function validateInteger(v: number | undefined, name: string, defaultValue?: number, min?: number, max?: number): number;
10
+ export declare function validatePositiveIntegerOrZero(v: number, name: string): number;
11
+ export declare function validateStringLength(s: string, name: string, min?: number, max?: number): string;
12
+ export declare function isHexString(s: string): boolean;
13
+ /**
14
+ * @typedef {string & { minLength: 5, maxLength: 2000 }} DescriptionString5to2000Bytes
15
+ * A string used for descriptions, with a length between 5 and 2000 characters.
16
+ */
17
+ export type DescriptionString5to2000Bytes = string;
18
+ export interface ValidWalletSignerArgs {
19
+ }
20
+ export interface ValidCreateActionInput {
21
+ outpoint: OutPoint;
22
+ inputDescription: DescriptionString5to2000Bytes;
23
+ sequenceNumber: PositiveIntegerOrZero;
24
+ unlockingScript?: HexString;
25
+ unlockingScriptLength: PositiveInteger;
26
+ }
27
+ export declare function validateCreateActionInput(i: CreateActionInput): ValidCreateActionInput;
28
+ export interface ValidCreateActionOutput {
29
+ lockingScript: HexString;
30
+ satoshis: SatoshiValue;
31
+ outputDescription: DescriptionString5to2000Bytes;
32
+ basket?: BasketStringUnder300Bytes;
33
+ customInstructions?: string;
34
+ tags: BasketStringUnder300Bytes[];
35
+ }
36
+ export declare function validateCreateActionOutput(o: CreateActionOutput): ValidCreateActionOutput;
37
+ /**
38
+ * Set all default true/false booleans to true or false if undefined.
39
+ * Set all possibly undefined numbers to their default values.
40
+ * Set all possibly undefined arrays to empty arrays.
41
+ * Convert string outpoints to `{ txid: string, vout: number }`
42
+ */
43
+ export declare function validateCreateActionOptions(options?: CreateActionOptions): ValidCreateActionOptions;
44
+ export interface ValidProcessActionOptions {
45
+ acceptDelayedBroadcast: BooleanDefaultTrue;
46
+ returnTXIDOnly: BooleanDefaultFalse;
47
+ noSend: BooleanDefaultFalse;
48
+ sendWith: TXIDHexString[];
49
+ }
50
+ export interface ValidCreateActionOptions extends ValidProcessActionOptions {
51
+ signAndProcess: boolean;
52
+ trustSelf?: TrustSelf;
53
+ knownTxids: TXIDHexString[];
54
+ noSendChange: OutPoint[];
55
+ randomizeOutputs: boolean;
56
+ }
57
+ export interface ValidSignActionOptions extends ValidProcessActionOptions {
58
+ acceptDelayedBroadcast: boolean;
59
+ returnTXIDOnly: boolean;
60
+ noSend: boolean;
61
+ sendWith: TXIDHexString[];
62
+ }
63
+ export interface ValidProcessActionArgs extends ValidWalletSignerArgs {
64
+ options: ValidProcessActionOptions;
65
+ isSendWith: boolean;
66
+ isNewTx: boolean;
67
+ isRemixChange: boolean;
68
+ isNoSend: boolean;
69
+ isDelayed: boolean;
70
+ }
71
+ export interface ValidCreateActionArgs extends ValidProcessActionArgs {
72
+ description: DescriptionString5to2000Bytes;
73
+ inputBEEF?: BEEF;
74
+ inputs: ValidCreateActionInput[];
75
+ outputs: ValidCreateActionOutput[];
76
+ lockTime: number;
77
+ version: number;
78
+ labels: string[];
79
+ options: ValidCreateActionOptions;
80
+ isSignAction: boolean;
81
+ randomVals?: number[];
82
+ /**
83
+ * If true, signableTransactions will include sourceTransaction for each input,
84
+ * including those that do not require signature and those that were also contained
85
+ * in the inputBEEF.
86
+ */
87
+ includeAllSourceTransactions: boolean;
88
+ }
89
+ export interface ValidSignActionArgs extends ValidProcessActionArgs {
90
+ spends: Record<PositiveIntegerOrZero, SignActionSpend>;
91
+ reference: Base64String;
92
+ options: ValidSignActionOptions;
93
+ }
94
+ export declare function validateCreateActionArgs(args: CreateActionArgs): ValidCreateActionArgs;
95
+ /**
96
+ * Set all default true/false booleans to true or false if undefined.
97
+ * Set all possibly undefined numbers to their default values.
98
+ * Set all possibly undefined arrays to empty arrays.
99
+ * Convert string outpoints to `{ txid: string, vout: number }`
100
+ */
101
+ export declare function validateSignActionOptions(options?: SignActionOptions): ValidSignActionOptions;
102
+ export declare function validateSignActionArgs(args: SignActionArgs): ValidSignActionArgs;
103
+ export interface ValidAbortActionArgs extends ValidWalletSignerArgs {
104
+ reference: Base64String;
105
+ }
106
+ export declare function validateAbortActionArgs(args: AbortActionArgs): ValidAbortActionArgs;
107
+ export interface ValidWalletPayment {
108
+ derivationPrefix: Base64String;
109
+ derivationSuffix: Base64String;
110
+ senderIdentityKey: PubKeyHex;
111
+ }
112
+ export declare function validateWalletPayment(args?: WalletPayment): ValidWalletPayment | undefined;
113
+ export interface ValidBasketInsertion {
114
+ basket: BasketStringUnder300Bytes;
115
+ customInstructions?: string;
116
+ tags: BasketStringUnder300Bytes[];
117
+ }
118
+ export declare function validateBasketInsertion(args?: BasketInsertion): ValidBasketInsertion | undefined;
119
+ export interface ValidInternalizeOutput {
120
+ outputIndex: PositiveIntegerOrZero;
121
+ protocol: 'wallet payment' | 'basket insertion';
122
+ paymentRemittance?: ValidWalletPayment;
123
+ insertionRemittance?: ValidBasketInsertion;
124
+ }
125
+ export declare function validateInternalizeOutput(args: InternalizeOutput): ValidInternalizeOutput;
126
+ export interface ValidInternalizeActionArgs extends ValidWalletSignerArgs {
127
+ tx: AtomicBEEF;
128
+ outputs: InternalizeOutput[];
129
+ description: DescriptionString5to2000Bytes;
130
+ labels: LabelStringUnder300Bytes[];
131
+ seekPermission: BooleanDefaultTrue;
132
+ }
133
+ export declare function validateOriginator(s?: string): string | undefined;
134
+ export declare function validateInternalizeActionArgs(args: InternalizeActionArgs): ValidInternalizeActionArgs;
135
+ export declare function validateOptionalOutpointString(outpoint: string | undefined, name: string): string | undefined;
136
+ export declare function validateOutpointString(outpoint: string, name: string): string;
137
+ export interface ValidRelinquishOutputArgs extends ValidWalletSignerArgs {
138
+ basket: BasketStringUnder300Bytes;
139
+ output: OutpointString;
140
+ }
141
+ export declare function validateRelinquishOutputArgs(args: RelinquishOutputArgs): ValidRelinquishOutputArgs;
142
+ export interface ValidRelinquishCertificateArgs extends ValidWalletSignerArgs {
143
+ type: Base64String;
144
+ serialNumber: Base64String;
145
+ certifier: PubKeyHex;
146
+ }
147
+ export declare function validateRelinquishCertificateArgs(args: RelinquishCertificateArgs): ValidRelinquishCertificateArgs;
148
+ export interface ValidListCertificatesArgs extends ValidWalletSignerArgs {
149
+ partial?: {
150
+ type?: Base64String;
151
+ serialNumber?: Base64String;
152
+ certifier?: PubKeyHex;
153
+ subject?: PubKeyHex;
154
+ revocationOutpoint?: OutpointString;
155
+ signature?: HexString;
156
+ };
157
+ certifiers: PubKeyHex[];
158
+ types: Base64String[];
159
+ limit: PositiveIntegerDefault10Max10000;
160
+ offset: PositiveIntegerOrZero;
161
+ privileged: BooleanDefaultFalse;
162
+ privilegedReason?: DescriptionString5to50Bytes;
163
+ }
164
+ export declare function validateListCertificatesArgs(args: ListCertificatesArgs): ValidListCertificatesArgs;
165
+ export interface ValidAcquireCertificateArgs extends ValidWalletSignerArgs {
166
+ acquisitionProtocol: AcquisitionProtocol;
167
+ type: Base64String;
168
+ serialNumber?: Base64String;
169
+ certifier: PubKeyHex;
170
+ revocationOutpoint?: OutpointString;
171
+ fields: Record<CertificateFieldNameUnder50Bytes, string>;
172
+ signature?: HexString;
173
+ certifierUrl?: string;
174
+ keyringRevealer?: KeyringRevealer;
175
+ keyringForSubject?: Record<CertificateFieldNameUnder50Bytes, Base64String>;
176
+ privileged: boolean;
177
+ privilegedReason?: DescriptionString5to50Bytes;
178
+ }
179
+ /**
180
+ *
181
+ * @param args
182
+ * @param subject Must be valid for "direct" `acquisitionProtocol`. public key of the certificate subject.
183
+ * @returns
184
+ */
185
+ export declare function validateAcquireCertificateArgs(args: AcquireCertificateArgs): Promise<ValidAcquireCertificateArgs>;
186
+ export interface ValidAcquireDirectCertificateArgs extends ValidWalletSignerArgs {
187
+ type: Base64String;
188
+ serialNumber: Base64String;
189
+ certifier: PubKeyHex;
190
+ revocationOutpoint: OutpointString;
191
+ fields: Record<CertificateFieldNameUnder50Bytes, string>;
192
+ signature: HexString;
193
+ /**
194
+ * validated to an empty string, must be provided by wallet and must
195
+ * match expectations of keyringForSubject
196
+ */
197
+ subject: PubKeyHex;
198
+ keyringRevealer: KeyringRevealer;
199
+ keyringForSubject: Record<CertificateFieldNameUnder50Bytes, Base64String>;
200
+ privileged: boolean;
201
+ privilegedReason?: DescriptionString5to50Bytes;
202
+ }
203
+ export interface ValidAcquireIssuanceCertificateArgs extends ValidWalletSignerArgs {
204
+ type: Base64String;
205
+ certifier: PubKeyHex;
206
+ certifierUrl: string;
207
+ fields: Record<CertificateFieldNameUnder50Bytes, string>;
208
+ /**
209
+ * validated to an empty string, must be provided by wallet and must
210
+ * match expectations of keyringForSubject
211
+ */
212
+ subject: PubKeyHex;
213
+ privileged: boolean;
214
+ privilegedReason?: DescriptionString5to50Bytes;
215
+ }
216
+ export declare function validateAcquireIssuanceCertificateArgs(args: AcquireCertificateArgs): ValidAcquireIssuanceCertificateArgs;
217
+ export declare function validateAcquireDirectCertificateArgs(args: AcquireCertificateArgs): ValidAcquireDirectCertificateArgs;
218
+ export interface ValidProveCertificateArgs extends ValidWalletSignerArgs {
219
+ type?: Base64String;
220
+ serialNumber?: Base64String;
221
+ certifier?: PubKeyHex;
222
+ subject?: PubKeyHex;
223
+ revocationOutpoint?: OutpointString;
224
+ signature?: HexString;
225
+ fieldsToReveal: CertificateFieldNameUnder50Bytes[];
226
+ verifier: PubKeyHex;
227
+ privileged: boolean;
228
+ privilegedReason?: DescriptionString5to50Bytes;
229
+ }
230
+ export declare function validateProveCertificateArgs(args: ProveCertificateArgs): ValidProveCertificateArgs;
231
+ export interface ValidDiscoverByIdentityKeyArgs extends ValidWalletSignerArgs {
232
+ identityKey: PubKeyHex;
233
+ limit: PositiveIntegerDefault10Max10000;
234
+ offset: PositiveIntegerOrZero;
235
+ seekPermission: boolean;
236
+ }
237
+ export declare function validateDiscoverByIdentityKeyArgs(args: DiscoverByIdentityKeyArgs): ValidDiscoverByIdentityKeyArgs;
238
+ export interface ValidDiscoverByAttributesArgs extends ValidWalletSignerArgs {
239
+ attributes: Record<CertificateFieldNameUnder50Bytes, string>;
240
+ limit: PositiveIntegerDefault10Max10000;
241
+ offset: PositiveIntegerOrZero;
242
+ seekPermission: boolean;
243
+ }
244
+ export declare function validateDiscoverByAttributesArgs(args: DiscoverByAttributesArgs): ValidDiscoverByAttributesArgs;
245
+ export interface ValidListOutputsArgs extends ValidWalletSignerArgs {
246
+ basket: BasketStringUnder300Bytes;
247
+ tags: OutputTagStringUnder300Bytes[];
248
+ tagQueryMode: 'all' | 'any';
249
+ includeLockingScripts: boolean;
250
+ includeTransactions: boolean;
251
+ includeCustomInstructions: BooleanDefaultFalse;
252
+ includeTags: BooleanDefaultFalse;
253
+ includeLabels: BooleanDefaultFalse;
254
+ limit: PositiveIntegerDefault10Max10000;
255
+ offset: number;
256
+ seekPermission: BooleanDefaultTrue;
257
+ knownTxids: string[];
258
+ }
259
+ /**
260
+ * @param {BasketStringUnder300Bytes} args.basket - Required. The associated basket name whose outputs should be listed.
261
+ * @param {OutputTagStringUnder300Bytes[]} [args.tags] - Optional. Filter outputs based on these tags.
262
+ * @param {'all' | 'any'} [args.tagQueryMode] - Optional. Filter mode, defining whether all or any of the tags must match. By default, any tag can match.
263
+ * @param {'locking scripts' | 'entire transactions'} [args.include] - Optional. Whether to include locking scripts (with each output) or entire transactions (as aggregated BEEF, at the top level) in the result. By default, unless specified, neither are returned.
264
+ * @param {BooleanDefaultFalse} [args.includeEntireTransactions] - Optional. Whether to include the entire transaction(s) in the result.
265
+ * @param {BooleanDefaultFalse} [args.includeCustomInstructions] - Optional. Whether custom instructions should be returned in the result.
266
+ * @param {BooleanDefaultFalse} [args.includeTags] - Optional. Whether the tags associated with the output should be returned.
267
+ * @param {BooleanDefaultFalse} [args.includeLabels] - Optional. Whether the labels associated with the transaction containing the output should be returned.
268
+ * @param {PositiveIntegerDefault10Max10000} [args.limit] - Optional limit on the number of outputs to return.
269
+ * @param {number} [args.offset] - If positive or zero: Number of outputs to skip before starting to return results, oldest first.
270
+ * If negative: Outputs are returned newest first and offset of -1 is the newest output.
271
+ * When using negative offsets, caution is required as new outputs may be added between calls,
272
+ * potentially causing outputs to be duplicated across calls.
273
+ * @param {BooleanDefaultTrue} [args.seekPermission] — Optional. Whether to seek permission from the user for this operation if required. Default true, will return an error rather than proceed if set to false.
274
+ */
275
+ export declare function validateListOutputsArgs(args: ListOutputsArgs): ValidListOutputsArgs;
276
+ export interface ValidListActionsArgs extends ValidWalletSignerArgs {
277
+ labels: LabelStringUnder300Bytes[];
278
+ labelQueryMode: 'any' | 'all';
279
+ includeLabels: BooleanDefaultFalse;
280
+ includeInputs: BooleanDefaultFalse;
281
+ includeInputSourceLockingScripts: BooleanDefaultFalse;
282
+ includeInputUnlockingScripts: BooleanDefaultFalse;
283
+ includeOutputs: BooleanDefaultFalse;
284
+ includeOutputLockingScripts: BooleanDefaultFalse;
285
+ limit: PositiveIntegerDefault10Max10000;
286
+ offset: PositiveIntegerOrZero;
287
+ seekPermission: BooleanDefaultTrue;
288
+ }
289
+ /**
290
+ * @param {LabelStringUnder300Bytes[]} args.labels - An array of labels used to filter actions.
291
+ * @param {'any' | 'all'} [args.labelQueryMode] - Optional. Specifies how to match labels (default is any which matches any of the labels).
292
+ * @param {BooleanDefaultFalse} [args.includeLabels] - Optional. Whether to include transaction labels in the result set.
293
+ * @param {BooleanDefaultFalse} [args.includeInputs] - Optional. Whether to include input details in the result set.
294
+ * @param {BooleanDefaultFalse} [args.includeInputSourceLockingScripts] - Optional. Whether to include input source locking scripts in the result set.
295
+ * @param {BooleanDefaultFalse} [args.includeInputUnlockingScripts] - Optional. Whether to include input unlocking scripts in the result set.
296
+ * @param {BooleanDefaultFalse} [args.includeOutputs] - Optional. Whether to include output details in the result set.
297
+ * @param {BooleanDefaultFalse} [args.includeOutputLockingScripts] - Optional. Whether to include output locking scripts in the result set.
298
+ * @param {PositiveIntegerDefault10Max10000} [args.limit] - Optional. The maximum number of transactions to retrieve.
299
+ * @param {PositiveIntegerOrZero} [args.offset] - Optional. Number of transactions to skip before starting to return the results.
300
+ * @param {BooleanDefaultTrue} [args.seekPermission] — Optional. Whether to seek permission from the user for this operation if required. Default true, will return an error rather than proceed if set to false.
301
+ */
302
+ export declare function validateListActionsArgs(args: ListActionsArgs): ValidListActionsArgs;
303
+ //# sourceMappingURL=validationHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationHelpers.d.ts","sourceRoot":"","sources":["../../../src/sdk/validationHelpers.ts"],"names":[],"mappings":"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"}