@bsv/wallet-toolbox 1.5.20 → 1.5.21
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.
- package/CHANGELOG.md +4 -0
- package/docs/client.md +5 -2
- package/docs/wallet.md +5 -2
- package/mobile/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/mobile/out/src/WalletPermissionsManager.js.map +1 -1
- package/mobile/out/src/sdk/validationHelpers.d.ts +5 -2
- package/mobile/out/src/sdk/validationHelpers.d.ts.map +1 -1
- package/mobile/out/src/sdk/validationHelpers.js +5 -2
- package/mobile/out/src/sdk/validationHelpers.js.map +1 -1
- package/mobile/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -1
- package/mobile/out/src/storage/methods/listOutputsIdb.js +3 -0
- package/mobile/out/src/storage/methods/listOutputsIdb.js.map +1 -1
- package/mobile/package-lock.json +6 -6
- package/mobile/package.json +2 -2
- package/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/out/src/WalletPermissionsManager.js.map +1 -1
- package/out/src/sdk/validationHelpers.d.ts +5 -2
- package/out/src/sdk/validationHelpers.d.ts.map +1 -1
- package/out/src/sdk/validationHelpers.js +5 -2
- package/out/src/sdk/validationHelpers.js.map +1 -1
- package/out/src/storage/methods/listOutputsIdb.d.ts.map +1 -1
- package/out/src/storage/methods/listOutputsIdb.js +3 -0
- package/out/src/storage/methods/listOutputsIdb.js.map +1 -1
- package/out/src/storage/methods/listOutputsKnex.d.ts.map +1 -1
- package/out/src/storage/methods/listOutputsKnex.js +12 -7
- package/out/src/storage/methods/listOutputsKnex.js.map +1 -1
- package/out/test/wallet/list/listOutputs.test.d.ts.map +1 -1
- package/out/test/wallet/list/listOutputs.test.js +70 -0
- package/out/test/wallet/list/listOutputs.test.js.map +1 -1
- package/out/tsconfig.all.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/WalletPermissionsManager.ts +10 -11
- package/src/sdk/validationHelpers.ts +6 -3
- package/src/storage/methods/listOutputsIdb.ts +2 -1
- package/src/storage/methods/listOutputsKnex.ts +12 -7
- package/test/wallet/list/listOutputs.test.ts +73 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsv/wallet-toolbox",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.21",
|
|
4
4
|
"description": "BRC100 conforming wallet, wallet storage and wallet signer components",
|
|
5
5
|
"main": "./out/src/index.js",
|
|
6
6
|
"types": "./out/src/index.d.ts",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
},
|
|
31
31
|
"homepage": "https://github.com/bsv-blockchain/wallet-toolbox#readme",
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@bsv/auth-express-middleware": "^1.2.
|
|
33
|
+
"@bsv/auth-express-middleware": "^1.2.3",
|
|
34
34
|
"@bsv/payment-express-middleware": "^1.2.3",
|
|
35
|
-
"@bsv/sdk": "^1.6.
|
|
35
|
+
"@bsv/sdk": "^1.6.23",
|
|
36
36
|
"express": "^4.21.2",
|
|
37
37
|
"idb": "^8.0.2",
|
|
38
38
|
"knex": "^3.1.0",
|
|
@@ -1044,7 +1044,6 @@ export class WalletPermissionsManager implements WalletInterface {
|
|
|
1044
1044
|
}
|
|
1045
1045
|
}
|
|
1046
1046
|
|
|
1047
|
-
|
|
1048
1047
|
/**
|
|
1049
1048
|
* Ensures the originator has label usage permission.
|
|
1050
1049
|
* If no valid (unexpired) permission token is found, triggers a permission request flow.
|
|
@@ -2909,15 +2908,15 @@ export class WalletPermissionsManager implements WalletInterface {
|
|
|
2909
2908
|
* do not produce multiple user prompts.
|
|
2910
2909
|
*/
|
|
2911
2910
|
private buildRequestKey(r: PermissionRequest): string {
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2911
|
+
switch (r.type) {
|
|
2912
|
+
case 'protocol':
|
|
2913
|
+
return `proto:${r.originator}:${!!r.privileged}:${r.protocolID?.join(',')}:${r.counterparty}`
|
|
2914
|
+
case 'basket':
|
|
2915
|
+
return `basket:${r.originator}:${r.basket}`
|
|
2916
|
+
case 'certificate':
|
|
2917
|
+
return `cert:${r.originator}:${!!r.privileged}:${r.certificate?.verifier}:${r.certificate?.certType}:${r.certificate?.fields.join('|')}`
|
|
2918
|
+
case 'spending':
|
|
2919
|
+
return `spend:${r.originator}:${r.spending?.satoshis}`
|
|
2920
|
+
}
|
|
2922
2921
|
}
|
|
2923
2922
|
}
|
|
@@ -881,7 +881,7 @@ export interface ValidListOutputsArgs extends ValidWalletSignerArgs {
|
|
|
881
881
|
includeTags: BooleanDefaultFalse
|
|
882
882
|
includeLabels: BooleanDefaultFalse
|
|
883
883
|
limit: PositiveIntegerDefault10Max10000
|
|
884
|
-
offset:
|
|
884
|
+
offset: number
|
|
885
885
|
seekPermission: BooleanDefaultTrue
|
|
886
886
|
knownTxids: string[]
|
|
887
887
|
}
|
|
@@ -896,7 +896,10 @@ export interface ValidListOutputsArgs extends ValidWalletSignerArgs {
|
|
|
896
896
|
* @param {BooleanDefaultFalse} [args.includeTags] - Optional. Whether the tags associated with the output should be returned.
|
|
897
897
|
* @param {BooleanDefaultFalse} [args.includeLabels] - Optional. Whether the labels associated with the transaction containing the output should be returned.
|
|
898
898
|
* @param {PositiveIntegerDefault10Max10000} [args.limit] - Optional limit on the number of outputs to return.
|
|
899
|
-
* @param {
|
|
899
|
+
* @param {number} [args.offset] - If positive or zero: Number of outputs to skip before starting to return results, oldest first.
|
|
900
|
+
* If negative: Outputs are returned newest first and offset of -1 is the newest output.
|
|
901
|
+
* When using negative offsets, caution is required as new outputs may be added between calls,
|
|
902
|
+
* potentially causing outputs to be duplicated across calls.
|
|
900
903
|
* @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.
|
|
901
904
|
*/
|
|
902
905
|
export function validateListOutputsArgs(args: ListOutputsArgs): ValidListOutputsArgs {
|
|
@@ -915,7 +918,7 @@ export function validateListOutputsArgs(args: ListOutputsArgs): ValidListOutputs
|
|
|
915
918
|
includeTags: defaultFalse(args.includeTags),
|
|
916
919
|
includeLabels: defaultFalse(args.includeLabels),
|
|
917
920
|
limit: validateInteger(args.limit, 'limit', 10, 1, 10000),
|
|
918
|
-
offset: validateInteger(args.offset, 'offset', 0,
|
|
921
|
+
offset: validateInteger(args.offset, 'offset', 0, undefined, undefined),
|
|
919
922
|
seekPermission: defaultTrue(args.seekPermission),
|
|
920
923
|
knownTxids: []
|
|
921
924
|
}
|
|
@@ -3,7 +3,7 @@ import { TableOutput, TableOutputBasket, TableOutputTag } from '../index.client'
|
|
|
3
3
|
import { asString, sdk, verifyId, verifyOne } from '../../index.client'
|
|
4
4
|
import { getBasketToSpecOp, ListOutputsSpecOp } from './ListOutputsSpecOp'
|
|
5
5
|
import { StorageIdb } from '../StorageIdb'
|
|
6
|
-
import { TransactionStatus } from '../../sdk'
|
|
6
|
+
import { TransactionStatus, WERR_NOT_IMPLEMENTED } from '../../sdk'
|
|
7
7
|
|
|
8
8
|
export async function listOutputsIdb(
|
|
9
9
|
storage: StorageIdb,
|
|
@@ -14,6 +14,7 @@ export async function listOutputsIdb(
|
|
|
14
14
|
const userId = verifyId(auth.userId)
|
|
15
15
|
const limit = vargs.limit
|
|
16
16
|
const offset = vargs.offset
|
|
17
|
+
if (offset < 0) throw new WERR_NOT_IMPLEMENTED('Negative offset not supported in IndexedDB')
|
|
17
18
|
|
|
18
19
|
const r: ListOutputsResult = {
|
|
19
20
|
totalOutputs: 0,
|
|
@@ -13,7 +13,12 @@ export async function listOutputs(
|
|
|
13
13
|
const trx: sdk.TrxToken | undefined = undefined
|
|
14
14
|
const userId = verifyId(auth.userId)
|
|
15
15
|
const limit = vargs.limit
|
|
16
|
-
|
|
16
|
+
let offset = vargs.offset
|
|
17
|
+
let orderBy: 'asc' | 'desc' = 'asc'
|
|
18
|
+
if (offset < 0) {
|
|
19
|
+
offset = -offset - 1
|
|
20
|
+
orderBy = 'desc'
|
|
21
|
+
}
|
|
17
22
|
|
|
18
23
|
const k = dsk.toDb(trx)
|
|
19
24
|
|
|
@@ -23,14 +28,14 @@ export async function listOutputs(
|
|
|
23
28
|
}
|
|
24
29
|
|
|
25
30
|
/*
|
|
26
|
-
|
|
31
|
+
ValidListOutputsArgs {
|
|
27
32
|
basket: BasketStringUnder300Bytes
|
|
28
33
|
|
|
29
|
-
tags
|
|
30
|
-
tagQueryMode
|
|
34
|
+
tags: OutputTagStringUnder300Bytes[]
|
|
35
|
+
tagQueryMode: 'all' | 'any' // default any
|
|
31
36
|
|
|
32
|
-
limit
|
|
33
|
-
offset
|
|
37
|
+
limit: PositiveIntegerDefault10Max10000 // default 10
|
|
38
|
+
offset: number // default 0
|
|
34
39
|
}
|
|
35
40
|
*/
|
|
36
41
|
|
|
@@ -166,7 +171,7 @@ export async function listOutputs(
|
|
|
166
171
|
// Sort order when limit and offset are possible must be ascending for determinism.
|
|
167
172
|
if (!specOp || !specOp.ignoreLimit) q.limit(limit).offset(offset)
|
|
168
173
|
|
|
169
|
-
q.orderBy('outputId',
|
|
174
|
+
q.orderBy('outputId', orderBy)
|
|
170
175
|
|
|
171
176
|
let outputs: TableOutput[] = await q
|
|
172
177
|
|
|
@@ -3,7 +3,8 @@ import {
|
|
|
3
3
|
Beef,
|
|
4
4
|
ListOutputsArgs,
|
|
5
5
|
OriginatorDomainNameStringUnder250Bytes,
|
|
6
|
-
OutputTagStringUnder300Bytes
|
|
6
|
+
OutputTagStringUnder300Bytes,
|
|
7
|
+
WalletOutput
|
|
7
8
|
} from '@bsv/sdk'
|
|
8
9
|
import { _tu, TestWalletProviderNoSetup } from '../../utils/TestUtilsWalletStorage'
|
|
9
10
|
import path from 'path'
|
|
@@ -340,4 +341,75 @@ describe('listOutputs test', () => {
|
|
|
340
341
|
})
|
|
341
342
|
}
|
|
342
343
|
})
|
|
344
|
+
|
|
345
|
+
test('13 offsets', async () => {
|
|
346
|
+
let i = -1
|
|
347
|
+
for (const { wallet } of ctxs) {
|
|
348
|
+
i++
|
|
349
|
+
let totalOutputs: number = 0
|
|
350
|
+
const limit = 4
|
|
351
|
+
let allOutputs: WalletOutput[] = []
|
|
352
|
+
{
|
|
353
|
+
const args: ListOutputsArgs = {
|
|
354
|
+
basket: 'default'
|
|
355
|
+
}
|
|
356
|
+
const r = await wallet.listOutputs(args)
|
|
357
|
+
totalOutputs = r.totalOutputs
|
|
358
|
+
}
|
|
359
|
+
{
|
|
360
|
+
const args: ListOutputsArgs = {
|
|
361
|
+
basket: 'default',
|
|
362
|
+
offset: 0,
|
|
363
|
+
limit: totalOutputs
|
|
364
|
+
}
|
|
365
|
+
const r = await wallet.listOutputs(args)
|
|
366
|
+
expect(r.totalOutputs).toBe(totalOutputs)
|
|
367
|
+
expect(r.outputs.length).toBe(totalOutputs)
|
|
368
|
+
expect(r.totalOutputs).toBe(totalOutputs)
|
|
369
|
+
allOutputs = r.outputs
|
|
370
|
+
}
|
|
371
|
+
{
|
|
372
|
+
const args: ListOutputsArgs = {
|
|
373
|
+
basket: 'default',
|
|
374
|
+
offset: totalOutputs - limit,
|
|
375
|
+
limit
|
|
376
|
+
}
|
|
377
|
+
const r = await wallet.listOutputs(args)
|
|
378
|
+
expect(r.totalOutputs).toBe(totalOutputs)
|
|
379
|
+
expect(r.outputs.length).toBe(limit)
|
|
380
|
+
expect(r.outputs[0].outpoint).toBe(allOutputs[totalOutputs - limit].outpoint)
|
|
381
|
+
expect(r.outputs[1].outpoint).toBe(allOutputs[totalOutputs - limit + 1].outpoint)
|
|
382
|
+
expect(r.outputs[2].outpoint).toBe(allOutputs[totalOutputs - limit + 2].outpoint)
|
|
383
|
+
expect(r.outputs[3].outpoint).toBe(allOutputs[totalOutputs - limit + 3].outpoint)
|
|
384
|
+
}
|
|
385
|
+
if (i === 1) {
|
|
386
|
+
const args: ListOutputsArgs = {
|
|
387
|
+
basket: 'default',
|
|
388
|
+
offset: -1,
|
|
389
|
+
limit
|
|
390
|
+
}
|
|
391
|
+
const r = await wallet.listOutputs(args)
|
|
392
|
+
expect(r.totalOutputs).toBe(totalOutputs)
|
|
393
|
+
expect(r.outputs.length).toBe(limit)
|
|
394
|
+
expect(r.outputs[0].outpoint).toBe(allOutputs[totalOutputs - 1].outpoint)
|
|
395
|
+
expect(r.outputs[1].outpoint).toBe(allOutputs[totalOutputs - 2].outpoint)
|
|
396
|
+
expect(r.outputs[2].outpoint).toBe(allOutputs[totalOutputs - 3].outpoint)
|
|
397
|
+
expect(r.outputs[3].outpoint).toBe(allOutputs[totalOutputs - 4].outpoint)
|
|
398
|
+
}
|
|
399
|
+
if (i === 1) {
|
|
400
|
+
const args: ListOutputsArgs = {
|
|
401
|
+
basket: 'default',
|
|
402
|
+
offset: -3,
|
|
403
|
+
limit
|
|
404
|
+
}
|
|
405
|
+
const r = await wallet.listOutputs(args)
|
|
406
|
+
expect(r.totalOutputs).toBe(totalOutputs)
|
|
407
|
+
expect(r.outputs.length).toBe(limit)
|
|
408
|
+
expect(r.outputs[0].outpoint).toBe(allOutputs[totalOutputs - 3].outpoint)
|
|
409
|
+
expect(r.outputs[1].outpoint).toBe(allOutputs[totalOutputs - 4].outpoint)
|
|
410
|
+
expect(r.outputs[2].outpoint).toBe(allOutputs[totalOutputs - 5].outpoint)
|
|
411
|
+
expect(r.outputs[3].outpoint).toBe(allOutputs[totalOutputs - 6].outpoint)
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
})
|
|
343
415
|
})
|