@solidus-network/sdk 0.5.0 → 0.6.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.
- package/dist/chain/bbs.d.ts +5 -15
- package/dist/chain/bbs.d.ts.map +1 -1
- package/dist/chain/bbs.js +4 -21
- package/dist/chain/bbs.js.map +1 -1
- package/dist/chain/credentials.d.ts.map +1 -1
- package/dist/chain/credentials.js +6 -22
- package/dist/chain/credentials.js.map +1 -1
- package/dist/chain/derivation.d.ts +59 -0
- package/dist/chain/derivation.d.ts.map +1 -0
- package/dist/chain/derivation.js +149 -0
- package/dist/chain/derivation.js.map +1 -0
- package/dist/chain/did.d.ts +6 -0
- package/dist/chain/did.d.ts.map +1 -1
- package/dist/chain/did.js +7 -19
- package/dist/chain/did.js.map +1 -1
- package/dist/chain/index.d.ts.map +1 -1
- package/dist/chain/index.js +15 -1
- package/dist/chain/index.js.map +1 -1
- package/dist/chain/podbundle.d.ts +30 -0
- package/dist/chain/podbundle.d.ts.map +1 -0
- package/dist/chain/podbundle.js +74 -0
- package/dist/chain/podbundle.js.map +1 -0
- package/dist/chain/podsync.d.ts +30 -0
- package/dist/chain/podsync.d.ts.map +1 -0
- package/dist/chain/podsync.js +106 -0
- package/dist/chain/podsync.js.map +1 -0
- package/dist/chain/recovery.d.ts +54 -0
- package/dist/chain/recovery.d.ts.map +1 -0
- package/dist/chain/recovery.js +115 -0
- package/dist/chain/recovery.js.map +1 -0
- package/dist/chain/transaction.d.ts +19 -0
- package/dist/chain/transaction.d.ts.map +1 -1
- package/dist/chain/transaction.js +32 -0
- package/dist/chain/transaction.js.map +1 -1
- package/dist/chain/transfer.d.ts +1 -1
- package/dist/chain/transfer.d.ts.map +1 -1
- package/dist/chain/transfer.js +17 -2
- package/dist/chain/transfer.js.map +1 -1
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/chain/bbs.d.ts
CHANGED
|
@@ -6,12 +6,14 @@
|
|
|
6
6
|
* and `solidus_bbsVerifyCredentialProof`) which runs the IRTF
|
|
7
7
|
* `draft-irtf-cfrg-bbs-signatures` ProofVerify routine via zkryptium.
|
|
8
8
|
*
|
|
9
|
-
* Client-side proof generation
|
|
10
|
-
* package (
|
|
9
|
+
* Client-side signing and proof generation live in the shipped
|
|
10
|
+
* `@solidus-network/bbs` package (pure JS via `@digitalbazaar/bbs-signatures`,
|
|
11
|
+
* byte-compatible with zkryptium) — this SDK stays verification-only so it
|
|
12
|
+
* carries no BBS crypto dependency.
|
|
11
13
|
*/
|
|
12
14
|
import type { RpcClient } from './rpc.js';
|
|
13
15
|
import type { ChainConfig } from './index.js';
|
|
14
|
-
import { bytesToHex } from './transaction.js';
|
|
16
|
+
import { bytesToHex, type RpcReceipt } from './transaction.js';
|
|
15
17
|
/**
|
|
16
18
|
* One disclosed message in a BBS+ proof. `index` is the zero-based position
|
|
17
19
|
* in the original signed vector. `message` is hex-encoded bytes.
|
|
@@ -52,17 +54,6 @@ export interface BbsCredentialRecord {
|
|
|
52
54
|
bbs_pubkey?: string | null;
|
|
53
55
|
bbs_message_count?: number | null;
|
|
54
56
|
}
|
|
55
|
-
interface RpcReceipt {
|
|
56
|
-
tx_hash: string;
|
|
57
|
-
status: string;
|
|
58
|
-
block_height: number;
|
|
59
|
-
fee_paid: number;
|
|
60
|
-
events: Array<{
|
|
61
|
-
type: string;
|
|
62
|
-
credentialId?: string;
|
|
63
|
-
[key: string]: unknown;
|
|
64
|
-
}>;
|
|
65
|
-
}
|
|
66
57
|
export declare function createChainBbs(rpc: RpcClient, config: ChainConfig): {
|
|
67
58
|
/**
|
|
68
59
|
* Issue a BBS+ credential by submitting a `CredentialIssueBbs` transaction.
|
|
@@ -124,5 +115,4 @@ export declare const toHex: typeof bytesToHex;
|
|
|
124
115
|
* disclosed-message field or header/ph value).
|
|
125
116
|
*/
|
|
126
117
|
export declare function utf8ToHex(s: string): string;
|
|
127
|
-
export {};
|
|
128
118
|
//# sourceMappingURL=bbs.d.ts.map
|
package/dist/chain/bbs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bbs.d.ts","sourceRoot":"","sources":["../../src/chain/bbs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bbs.d.ts","sourceRoot":"","sources":["../../src/chain/bbs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAwB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAIpF;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AA2BD,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW;IAE9D;;;;;;;;;OASG;4BAC2B;QAC5B,gBAAgB,EAAE,MAAM,CAAA;QACxB,UAAU,EAAE,MAAM,CAAA;QAClB,cAAc,EAAE,MAAM,CAAA;QACtB,WAAW,EAAE,UAAU,CAAA;QACvB,SAAS,EAAE,UAAU,CAAA;QACrB,eAAe,EAAE,MAAM,CAAA;KACxB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE,CAAC;IAwC1E;;;;OAIG;wBACuB;QACxB,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;QACxC,iBAAiB,EAAE,MAAM,CAAA;KAC1B,GAAG,OAAO,CAAC,OAAO,CAAC;IAYpB;;;;;;;OAOG;kCACiC;QAClC,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;KACzC,GAAG,OAAO,CAAC,wBAAwB,CAAC;EAqCxC;AAID;;GAEG;AACH,eAAO,MAAM,KAAK,mBAAa,CAAA;AAE/B;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C"}
|
package/dist/chain/bbs.js
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { bytesToHex, submitWithNonceRetry } from './transaction.js';
|
|
2
2
|
// ---------- helpers ----------
|
|
3
|
-
async function pollReceipt(rpc, txHash) {
|
|
4
|
-
const maxAttempts = 20;
|
|
5
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
6
|
-
const receipt = await rpc.call('solidus_getReceipt', [txHash]);
|
|
7
|
-
if (receipt)
|
|
8
|
-
return receipt;
|
|
9
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
10
|
-
}
|
|
11
|
-
throw new Error(`Transaction ${txHash} not confirmed after 10 seconds`);
|
|
12
|
-
}
|
|
13
3
|
function validateDisclosed(disclosed, totalMessageCount) {
|
|
14
4
|
const seen = new Set();
|
|
15
5
|
for (const dm of disclosed) {
|
|
@@ -53,8 +43,6 @@ export function createChainBbs(rpc, config) {
|
|
|
53
43
|
params.bbsMessageCount > 64) {
|
|
54
44
|
throw new Error(`bbsMessageCount must be an integer in [1, 64], got ${params.bbsMessageCount}`);
|
|
55
45
|
}
|
|
56
|
-
const address = await getAddressFromKey(params.issuerPrivateKey);
|
|
57
|
-
const nonce = await rpc.call('solidus_getNonce', [address]);
|
|
58
46
|
const payload = {
|
|
59
47
|
CredentialIssueBbs: {
|
|
60
48
|
subject_did: params.subjectDid,
|
|
@@ -64,16 +52,11 @@ export function createChainBbs(rpc, config) {
|
|
|
64
52
|
bbs_message_count: params.bbsMessageCount,
|
|
65
53
|
},
|
|
66
54
|
};
|
|
67
|
-
const
|
|
68
|
-
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(tx)]);
|
|
69
|
-
const receipt = await pollReceipt(rpc, txHash);
|
|
70
|
-
if (!receipt.status.startsWith('success')) {
|
|
71
|
-
throw new Error(`CredentialIssueBbs failed: ${receipt.status}`);
|
|
72
|
-
}
|
|
55
|
+
const receipt = await submitWithNonceRetry(rpc, params.issuerPrivateKey, payload, 'CredentialIssueBbs');
|
|
73
56
|
const issuedEvent = receipt.events.find((e) => e.type === 'CredentialIssued');
|
|
74
57
|
const credentialId = issuedEvent?.credentialId ??
|
|
75
|
-
`urn:solidus:credential:${
|
|
76
|
-
return { txHash, credentialId, receipt };
|
|
58
|
+
`urn:solidus:credential:${receipt.tx_hash}`;
|
|
59
|
+
return { txHash: receipt.tx_hash, credentialId, receipt };
|
|
77
60
|
},
|
|
78
61
|
/**
|
|
79
62
|
* Verify a BBS+ selective-disclosure proof statelessly. Delegates to
|
package/dist/chain/bbs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bbs.js","sourceRoot":"","sources":["../../src/chain/bbs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bbs.js","sourceRoot":"","sources":["../../src/chain/bbs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/chain/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACrG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/chain/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACrG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAgG7C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW;kBAElD,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;iBA8DtD,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;yBAyB5B,MAAM,aAAa,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;sBAK5C,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;EAQnE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { bytesToHex, submitWithNonceRetry } from './transaction.js';
|
|
2
2
|
import { blake3 } from '@noble/hashes/blake3';
|
|
3
3
|
// ---------- helpers ----------
|
|
4
4
|
/**
|
|
@@ -70,10 +70,6 @@ function recordToVC(record) {
|
|
|
70
70
|
export function createChainCredentials(rpc, config) {
|
|
71
71
|
return {
|
|
72
72
|
async issue(params) {
|
|
73
|
-
// Use the issuer's private key to sign the transaction
|
|
74
|
-
const signerKey = params.issuerPrivateKey;
|
|
75
|
-
const address = await getAddressFromKey(signerKey);
|
|
76
|
-
const nonce = await rpc.call('solidus_getNonce', [address]);
|
|
77
73
|
// Compute BLAKE3 hash of the credential payload
|
|
78
74
|
const payloadHash = hashCredentialPayload(params);
|
|
79
75
|
// Build CredentialIssue payload (Rust serde tagged enum)
|
|
@@ -84,17 +80,12 @@ export function createChainCredentials(rpc, config) {
|
|
|
84
80
|
hash: Array.from(payloadHash),
|
|
85
81
|
},
|
|
86
82
|
};
|
|
87
|
-
//
|
|
88
|
-
const
|
|
89
|
-
// Submit and wait for receipt
|
|
90
|
-
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(tx)]);
|
|
91
|
-
const receipt = await pollReceipt(rpc, txHash);
|
|
92
|
-
if (!receipt.status.startsWith('success')) {
|
|
93
|
-
throw new Error(`CredentialIssue failed: ${receipt.status}`);
|
|
94
|
-
}
|
|
83
|
+
// Sign with the issuer's key; submit and wait for receipt
|
|
84
|
+
const receipt = await submitWithNonceRetry(rpc, params.issuerPrivateKey, payload, 'CredentialIssue');
|
|
95
85
|
// Extract credential ID from the CredentialIssued event
|
|
96
86
|
const issuedEvent = receipt.events.find((e) => e.type === 'CredentialIssued');
|
|
97
|
-
const credentialId = issuedEvent?.credentialId ??
|
|
87
|
+
const credentialId = issuedEvent?.credentialId ??
|
|
88
|
+
`urn:solidus:credential:${receipt.tx_hash}`;
|
|
98
89
|
// Query back the credential to get the full record
|
|
99
90
|
const records = await rpc.call('solidus_credentialsBySubject', [params.subjectDid]);
|
|
100
91
|
const record = records.find((r) => r.id === credentialId);
|
|
@@ -143,15 +134,8 @@ export function createChainCredentials(rpc, config) {
|
|
|
143
134
|
};
|
|
144
135
|
},
|
|
145
136
|
async revoke(credentialId, issuerKey) {
|
|
146
|
-
const address = await getAddressFromKey(issuerKey);
|
|
147
|
-
const nonce = await rpc.call('solidus_getNonce', [address]);
|
|
148
137
|
const payload = { CredentialRevoke: { credential_id: credentialId } };
|
|
149
|
-
|
|
150
|
-
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(tx)]);
|
|
151
|
-
const receipt = await pollReceipt(rpc, txHash);
|
|
152
|
-
if (!receipt.status.startsWith('success')) {
|
|
153
|
-
throw new Error(`CredentialRevoke failed: ${receipt.status}`);
|
|
154
|
-
}
|
|
138
|
+
await submitWithNonceRetry(rpc, issuerKey, payload, 'CredentialRevoke');
|
|
155
139
|
},
|
|
156
140
|
async query(subjectDid) {
|
|
157
141
|
const records = await rpc.call('solidus_credentialsBySubject', [subjectDid]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/chain/credentials.ts"],"names":[],"mappings":"AAUA,OAAO,
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/chain/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export interface DerivedKeypair {
|
|
2
|
+
/** 32-byte private key, hex. Never log or transmit. */
|
|
3
|
+
privateKey: string;
|
|
4
|
+
/** 32-byte ed25519 public key, hex. */
|
|
5
|
+
publicKey: string;
|
|
6
|
+
privateKeyBytes: Uint8Array;
|
|
7
|
+
publicKeyBytes: Uint8Array;
|
|
8
|
+
/** Chain address: base58(BLAKE3(publicKey)[0..20]). */
|
|
9
|
+
address: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Derive value account `index` (0, 1, 2, …). Value keys hold and move
|
|
13
|
+
* funds; the identity key never can (the chain's DID-anchor guard
|
|
14
|
+
* rejects it), so spend flows must route through these.
|
|
15
|
+
*/
|
|
16
|
+
export declare function deriveValueKeyFromSeed(seed64: Uint8Array, index: number): Promise<DerivedKeypair>;
|
|
17
|
+
/**
|
|
18
|
+
* Derive the pairwise key for one verifier. The wallet MUST derive under
|
|
19
|
+
* the verifier's own AUTHENTICATED identity (bound to the TLS origin) —
|
|
20
|
+
* never a verifier_id copied blindly from a challenge, or verifier A can
|
|
21
|
+
* request B's pseudonym and collude (§5.4 authenticity caveat).
|
|
22
|
+
*/
|
|
23
|
+
export declare function derivePairwiseKeyFromSeed(seed64: Uint8Array, verifierId: Uint8Array | string): Promise<DerivedKeypair>;
|
|
24
|
+
/**
|
|
25
|
+
* AES-256-GCM key for encrypting the credential bundle at rest in the
|
|
26
|
+
* user's pod (fallback prover substrate + multi-device sync). Only the
|
|
27
|
+
* device ever derives this — Solidus never has it.
|
|
28
|
+
*/
|
|
29
|
+
export declare function derivePodWrapKey(seed64: Uint8Array): Uint8Array;
|
|
30
|
+
/**
|
|
31
|
+
* Mechanism-C per-holder secret (BBS+ native pseudonyms) — SEAM ONLY.
|
|
32
|
+
* Derivable today so the hierarchy is frozen; nothing consumes it until
|
|
33
|
+
* mechanism C ships (vendored pseudonym crypto + blind issuance + audit).
|
|
34
|
+
*/
|
|
35
|
+
export declare function derivePidFromSeed(seed64: Uint8Array): Uint8Array;
|
|
36
|
+
/**
|
|
37
|
+
* Pairwise DID string: `did:solidus:{network}:{address}` (same format as
|
|
38
|
+
* `chain/did.ts`). A pairwise DID is a STRING the wallet presents for
|
|
39
|
+
* re-recognition — it is NEVER registered on-chain (an on-chain anchor
|
|
40
|
+
* would itself be a correlation handle, BD-7).
|
|
41
|
+
*/
|
|
42
|
+
export declare function pairwiseDid(network: string, publicKeyBytes: Uint8Array): string;
|
|
43
|
+
export interface ValueAccount {
|
|
44
|
+
index: number;
|
|
45
|
+
address: string;
|
|
46
|
+
publicKey: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* BIP-44-style value-account discovery on seed import: derive accounts
|
|
50
|
+
* 0, 1, 2, … and probe each address for use, stopping after `gap`
|
|
51
|
+
* consecutive unused indices. Deterministic from the seed alone; the
|
|
52
|
+
* probe is injected (e.g. `balance > 0 || nonce > 0` via RPC) so this
|
|
53
|
+
* module stays transport-free.
|
|
54
|
+
*/
|
|
55
|
+
export declare function scanValueAccounts(seed64: Uint8Array, isUsed: (address: string) => Promise<boolean>, opts?: {
|
|
56
|
+
gap?: number;
|
|
57
|
+
maxIndex?: number;
|
|
58
|
+
}): Promise<ValueAccount[]>;
|
|
59
|
+
//# sourceMappingURL=derivation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivation.d.ts","sourceRoot":"","sources":["../../src/chain/derivation.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,UAAU,CAAA;IAC3B,cAAc,EAAE,UAAU,CAAA;IAC1B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAA;CAChB;AAqCD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAMzB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,UAAU,GAAG,MAAM,GAC9B,OAAO,CAAC,cAAc,CAAC,CAQzB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAG/D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAGhE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,GAAG,MAAM,CAG/E;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAC7C,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBzB"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-seed HKDF key hierarchy (privacy rebuild §5.1).
|
|
3
|
+
*
|
|
4
|
+
* Everything a wallet needs derives from the single 64-byte BIP-39 seed:
|
|
5
|
+
*
|
|
6
|
+
* identity_priv = seed64[0..32] (UNCHANGED — the DID anchor key, BD-4)
|
|
7
|
+
* value_priv(i) = HKDF(SHA-512, seed64, ∅, "solidus.value.v1" ‖ u32le(i), 32)
|
|
8
|
+
* pairwise_priv(v) = HKDF(SHA-512, seed64, ∅, "solidus.pairwise.v1" ‖ verifier_id, 32)
|
|
9
|
+
* pod_wrap_key = HKDF(SHA-512, seed64, ∅, "solidus.pod.bundlewrap.v1", 32)
|
|
10
|
+
* pid = HKDF(SHA-512, seed64, ∅, "solidus.bbs.pid.v1", 32) (mechanism-C seam)
|
|
11
|
+
*
|
|
12
|
+
* The IKM is the FULL 64-byte seed (binds derived keys to the whole seed,
|
|
13
|
+
* not the identity prefix); salt is empty per RFC 5869; all domain
|
|
14
|
+
* separation lives in the versioned `info`. Outputs are 32 bytes — valid
|
|
15
|
+
* ed25519 private scalars (`@noble/ed25519` clamps on getPublicKey),
|
|
16
|
+
* exactly as `seed.slice(0, 32)` is used for the identity key today.
|
|
17
|
+
*
|
|
18
|
+
* Pure crypto — no RPC, node, or postgres imports (stub-mode-safe;
|
|
19
|
+
* browser-safe). Mirrored byte-identically in identity-FE
|
|
20
|
+
* `src/lib/crypto.ts` (the frontend cannot import this SDK); identity-BE
|
|
21
|
+
* wraps these functions directly. All three are locked by the same
|
|
22
|
+
* frozen golden vectors.
|
|
23
|
+
*
|
|
24
|
+
* On-chain honesty (a.2 scope): multiple value accounts give
|
|
25
|
+
* ADDRESS-LEVEL separation only — they can still be clustered by funding
|
|
26
|
+
* source, timing, and amounts. That is layer (c), out of scope here.
|
|
27
|
+
*/
|
|
28
|
+
import { hkdf } from '@noble/hashes/hkdf';
|
|
29
|
+
import { sha512 } from '@noble/hashes/sha512';
|
|
30
|
+
import * as ed from '@noble/ed25519';
|
|
31
|
+
import { addressFromPublicKey, bytesToHex } from './transaction.js';
|
|
32
|
+
const VALUE_INFO_TAG = 'solidus.value.v1';
|
|
33
|
+
const PAIRWISE_INFO_TAG = 'solidus.pairwise.v1';
|
|
34
|
+
const POD_WRAP_INFO_TAG = 'solidus.pod.bundlewrap.v1';
|
|
35
|
+
const PID_INFO_TAG = 'solidus.bbs.pid.v1';
|
|
36
|
+
function assertSeed64(seed64) {
|
|
37
|
+
if (seed64.length !== 64) {
|
|
38
|
+
throw new Error(`seed must be the 64-byte BIP-39 seed, got ${seed64.length} bytes`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function u32le(n) {
|
|
42
|
+
const b = new Uint8Array(4);
|
|
43
|
+
new DataView(b.buffer).setUint32(0, n, true);
|
|
44
|
+
return b;
|
|
45
|
+
}
|
|
46
|
+
function info(tag, suffix = new Uint8Array(0)) {
|
|
47
|
+
const t = new TextEncoder().encode(tag);
|
|
48
|
+
const out = new Uint8Array(t.length + suffix.length);
|
|
49
|
+
out.set(t, 0);
|
|
50
|
+
out.set(suffix, t.length);
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
function derive32(seed64, infoBytes) {
|
|
54
|
+
return hkdf(sha512, seed64, new Uint8Array(0), infoBytes, 32);
|
|
55
|
+
}
|
|
56
|
+
async function toKeypair(privateKeyBytes) {
|
|
57
|
+
const publicKeyBytes = await ed.getPublicKeyAsync(privateKeyBytes);
|
|
58
|
+
return {
|
|
59
|
+
privateKey: bytesToHex(privateKeyBytes),
|
|
60
|
+
publicKey: bytesToHex(publicKeyBytes),
|
|
61
|
+
privateKeyBytes,
|
|
62
|
+
publicKeyBytes,
|
|
63
|
+
address: addressFromPublicKey(publicKeyBytes),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Derive value account `index` (0, 1, 2, …). Value keys hold and move
|
|
68
|
+
* funds; the identity key never can (the chain's DID-anchor guard
|
|
69
|
+
* rejects it), so spend flows must route through these.
|
|
70
|
+
*/
|
|
71
|
+
export async function deriveValueKeyFromSeed(seed64, index) {
|
|
72
|
+
assertSeed64(seed64);
|
|
73
|
+
if (!Number.isInteger(index) || index < 0) {
|
|
74
|
+
throw new Error(`value account index must be a non-negative integer, got ${index}`);
|
|
75
|
+
}
|
|
76
|
+
return toKeypair(derive32(seed64, info(VALUE_INFO_TAG, u32le(index))));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Derive the pairwise key for one verifier. The wallet MUST derive under
|
|
80
|
+
* the verifier's own AUTHENTICATED identity (bound to the TLS origin) —
|
|
81
|
+
* never a verifier_id copied blindly from a challenge, or verifier A can
|
|
82
|
+
* request B's pseudonym and collude (§5.4 authenticity caveat).
|
|
83
|
+
*/
|
|
84
|
+
export async function derivePairwiseKeyFromSeed(seed64, verifierId) {
|
|
85
|
+
assertSeed64(seed64);
|
|
86
|
+
const idBytes = typeof verifierId === 'string' ? new TextEncoder().encode(verifierId) : verifierId;
|
|
87
|
+
if (idBytes.length === 0) {
|
|
88
|
+
throw new Error('verifierId must be non-empty');
|
|
89
|
+
}
|
|
90
|
+
return toKeypair(derive32(seed64, info(PAIRWISE_INFO_TAG, idBytes)));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* AES-256-GCM key for encrypting the credential bundle at rest in the
|
|
94
|
+
* user's pod (fallback prover substrate + multi-device sync). Only the
|
|
95
|
+
* device ever derives this — Solidus never has it.
|
|
96
|
+
*/
|
|
97
|
+
export function derivePodWrapKey(seed64) {
|
|
98
|
+
assertSeed64(seed64);
|
|
99
|
+
return derive32(seed64, info(POD_WRAP_INFO_TAG));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Mechanism-C per-holder secret (BBS+ native pseudonyms) — SEAM ONLY.
|
|
103
|
+
* Derivable today so the hierarchy is frozen; nothing consumes it until
|
|
104
|
+
* mechanism C ships (vendored pseudonym crypto + blind issuance + audit).
|
|
105
|
+
*/
|
|
106
|
+
export function derivePidFromSeed(seed64) {
|
|
107
|
+
assertSeed64(seed64);
|
|
108
|
+
return derive32(seed64, info(PID_INFO_TAG));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Pairwise DID string: `did:solidus:{network}:{address}` (same format as
|
|
112
|
+
* `chain/did.ts`). A pairwise DID is a STRING the wallet presents for
|
|
113
|
+
* re-recognition — it is NEVER registered on-chain (an on-chain anchor
|
|
114
|
+
* would itself be a correlation handle, BD-7).
|
|
115
|
+
*/
|
|
116
|
+
export function pairwiseDid(network, publicKeyBytes) {
|
|
117
|
+
if (!network)
|
|
118
|
+
throw new Error('network must be non-empty');
|
|
119
|
+
return `did:solidus:${network}:${addressFromPublicKey(publicKeyBytes)}`;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* BIP-44-style value-account discovery on seed import: derive accounts
|
|
123
|
+
* 0, 1, 2, … and probe each address for use, stopping after `gap`
|
|
124
|
+
* consecutive unused indices. Deterministic from the seed alone; the
|
|
125
|
+
* probe is injected (e.g. `balance > 0 || nonce > 0` via RPC) so this
|
|
126
|
+
* module stays transport-free.
|
|
127
|
+
*/
|
|
128
|
+
export async function scanValueAccounts(seed64, isUsed, opts) {
|
|
129
|
+
assertSeed64(seed64);
|
|
130
|
+
const gap = opts?.gap ?? 20;
|
|
131
|
+
const maxIndex = opts?.maxIndex ?? 1000;
|
|
132
|
+
if (!Number.isInteger(gap) || gap < 1) {
|
|
133
|
+
throw new Error(`gap must be a positive integer, got ${gap}`);
|
|
134
|
+
}
|
|
135
|
+
const found = [];
|
|
136
|
+
let consecutiveUnused = 0;
|
|
137
|
+
for (let index = 0; index <= maxIndex && consecutiveUnused < gap; index++) {
|
|
138
|
+
const key = await deriveValueKeyFromSeed(seed64, index);
|
|
139
|
+
if (await isUsed(key.address)) {
|
|
140
|
+
found.push({ index, address: key.address, publicKey: key.publicKey });
|
|
141
|
+
consecutiveUnused = 0;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
consecutiveUnused++;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return found;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=derivation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivation.js","sourceRoot":"","sources":["../../src/chain/derivation.ts"],"names":[],"mappings":"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"}
|
package/dist/chain/did.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import type { DID, DIDDocument } from '@solidus-network/types';
|
|
|
9
9
|
import type { RpcClient } from './rpc.js';
|
|
10
10
|
import type { ChainConfig } from './index.js';
|
|
11
11
|
import { type ChainTransaction } from './transaction.js';
|
|
12
|
+
import type { RecoveryPolicy } from './recovery.js';
|
|
12
13
|
/**
|
|
13
14
|
* W3C DID Resolution result — preserves the deactivated state separately
|
|
14
15
|
* from the document. Mirrors the shape defined in
|
|
@@ -31,6 +32,11 @@ export interface DIDResolutionResult {
|
|
|
31
32
|
contentType: 'application/did+json';
|
|
32
33
|
error?: 'notFound' | 'invalidDid';
|
|
33
34
|
};
|
|
35
|
+
/** DID social-recovery state (sub-project #1/#2). `recovery_nonce` is what a guardian must bind
|
|
36
|
+
* its approval to (see `recoverySigningMessage`); `recovery_policy` is the current guardian set.
|
|
37
|
+
* Both omitted when the resolved DID has no recovery policy configured. */
|
|
38
|
+
recovery_policy?: RecoveryPolicy;
|
|
39
|
+
recovery_nonce?: number;
|
|
34
40
|
}
|
|
35
41
|
/**
|
|
36
42
|
* Options for {@link createChainDid}().buildCreate — produces a signed
|
package/dist/chain/did.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../../src/chain/did.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAsB,MAAM,gBAAgB,CAAA;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../../src/chain/did.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAsB,MAAM,gBAAgB,CAAA;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAuCnD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B,mBAAmB,EAAE;QACnB,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB;;;;4CAIoC;QACpC,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,qBAAqB,EAAE;QACrB,WAAW,EAAE,sBAAsB,CAAA;QACnC,KAAK,CAAC,EAAE,UAAU,GAAG,YAAY,CAAA;KAClC,CAAA;IACD;;gFAE4E;IAC5E,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAuDD;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW;wBAU/B,qBAAqB,KAAG,OAAO,CAAC,gBAAgB,CAAC;6BA4C5C,gBAAgB,GAAG,MAAM,KAAG,OAAO,CAAC,GAAG,CAAC;IAwD5E;;;;;;;;;OASG;sBACqB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;iBAgB1B,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAUvD;;;;;;;;OAQG;6BAC4B,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;oBAmC9C,MAAM,aAAa,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D;;;;;;;;;;;;;;;;;OAiBG;uBAEI,MAAM,iBACI,MAAM,aACV,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;EAUnB"}
|
package/dist/chain/did.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildTransaction,
|
|
1
|
+
import { buildTransaction, addressFromPublicKey, hexToBytes, hexToArray, bytesToHex, pollReceipt, submitWithNonceRetry, } from './transaction.js';
|
|
2
2
|
import * as ed from '@noble/ed25519';
|
|
3
3
|
import bs58 from 'bs58';
|
|
4
4
|
// ---------- helpers ----------
|
|
@@ -209,19 +209,14 @@ export function createChainDid(rpc, config) {
|
|
|
209
209
|
didResolutionMetadata: {
|
|
210
210
|
contentType: 'application/did+json',
|
|
211
211
|
},
|
|
212
|
+
// Surface the recovery policy + nonce (sub-project #1/#2) so callers can read the current
|
|
213
|
+
// nonce and bind a guardian approval to it. Omitted when the DID has no policy.
|
|
214
|
+
...(doc.recovery_policy != null ? { recovery_policy: doc.recovery_policy } : {}),
|
|
215
|
+
...(doc.recovery_nonce !== undefined ? { recovery_nonce: doc.recovery_nonce } : {}),
|
|
212
216
|
};
|
|
213
217
|
},
|
|
214
218
|
async deactivate(did, signerKey) {
|
|
215
|
-
|
|
216
|
-
const address = await getAddressFromKey(signerKey);
|
|
217
|
-
const nonce = await rpc.call('solidus_getNonce', [address]);
|
|
218
|
-
const payload = { DidDeactivate: { did } };
|
|
219
|
-
const tx = await buildTransaction(signerKey, nonce, payload);
|
|
220
|
-
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(tx)]);
|
|
221
|
-
const receipt = await pollReceipt(rpc, txHash);
|
|
222
|
-
if (!receipt.status.startsWith('success')) {
|
|
223
|
-
throw new Error(`DidDeactivate failed: ${receipt.status}`);
|
|
224
|
-
}
|
|
219
|
+
await submitWithNonceRetry(rpc, signerKey, { DidDeactivate: { did } }, 'DidDeactivate');
|
|
225
220
|
},
|
|
226
221
|
/**
|
|
227
222
|
* Reassign a DID's controller to a different DID (W3C DID Core
|
|
@@ -242,20 +237,13 @@ export function createChainDid(rpc, config) {
|
|
|
242
237
|
* current controller.
|
|
243
238
|
*/
|
|
244
239
|
async setController(did, newController, signerKey) {
|
|
245
|
-
const address = await getAddressFromKey(signerKey);
|
|
246
|
-
const nonce = await rpc.call('solidus_getNonce', [address]);
|
|
247
240
|
const payload = {
|
|
248
241
|
DidUpdate: {
|
|
249
242
|
did,
|
|
250
243
|
patches: [{ SetController: newController }],
|
|
251
244
|
},
|
|
252
245
|
};
|
|
253
|
-
|
|
254
|
-
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(tx)]);
|
|
255
|
-
const receipt = await pollReceipt(rpc, txHash);
|
|
256
|
-
if (!receipt.status.startsWith('success')) {
|
|
257
|
-
throw new Error(`SetController failed: ${receipt.status}`);
|
|
258
|
-
}
|
|
246
|
+
await submitWithNonceRetry(rpc, signerKey, payload, 'SetController');
|
|
259
247
|
},
|
|
260
248
|
};
|
|
261
249
|
}
|
package/dist/chain/did.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did.js","sourceRoot":"","sources":["../../src/chain/did.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"did.js","sourceRoot":"","sources":["../../src/chain/did.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chain/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAA;IACxB,gDAAgD;IAChD,OAAO,EAAE,SAAS,GAAG,SAAS,CAAA;IAC9B,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chain/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAA;IACxB,gDAAgD;IAChD,OAAO,EAAE,SAAS,GAAG,SAAS,CAAA;IAC9B,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CA6BjE"}
|
package/dist/chain/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { createChainAuth } from './auth.js';
|
|
|
11
11
|
import { createChainBbs } from './bbs.js';
|
|
12
12
|
import { createChainInfo } from './chainInfo.js';
|
|
13
13
|
import { createChainTransfer } from './transfer.js';
|
|
14
|
+
import { pollReceipt } from './transaction.js';
|
|
14
15
|
export function createChainClient(config) {
|
|
15
16
|
const rpc = new RpcClient(config.rpcUrl);
|
|
16
17
|
return {
|
|
@@ -19,8 +20,21 @@ export function createChainClient(config) {
|
|
|
19
20
|
auth: createChainAuth(rpc, config),
|
|
20
21
|
bbs: createChainBbs(rpc, config),
|
|
21
22
|
chain: {
|
|
22
|
-
transfer: createChainTransfer(rpc),
|
|
23
|
+
transfer: createChainTransfer(rpc, config.network),
|
|
23
24
|
getBalance: async (address) => rpc.call('solidus_getBalance', [address]),
|
|
25
|
+
sendTransaction: async (signedTx) => {
|
|
26
|
+
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(signedTx)]);
|
|
27
|
+
const receipt = await pollReceipt(rpc, txHash);
|
|
28
|
+
if (!receipt.status.startsWith('success')) {
|
|
29
|
+
throw new Error(`Transaction failed: ${receipt.status}`);
|
|
30
|
+
}
|
|
31
|
+
return { txHash, status: receipt.status };
|
|
32
|
+
},
|
|
33
|
+
getNonce: async (address) => rpc.call('solidus_getNonce', [address]),
|
|
34
|
+
getRecoveryInfo: async (did) => {
|
|
35
|
+
const doc = await rpc.call('solidus_didResolve', [did]);
|
|
36
|
+
return { recoveryPolicy: doc?.recovery_policy ?? null, recoveryNonce: doc?.recovery_nonce ?? 0 };
|
|
37
|
+
},
|
|
24
38
|
},
|
|
25
39
|
getChainInfo: createChainInfo(rpc),
|
|
26
40
|
};
|
package/dist/chain/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chain/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chain/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAqB,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAcjE,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACxC,OAAO;QACL,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC;QAChC,WAAW,EAAE,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC;QAChD,IAAI,EAAE,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC;QAClC,GAAG,EAAE,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC;QAChC,KAAK,EAAE;YACL,QAAQ,EAAE,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC;YAClD,UAAU,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAS,oBAAoB,EAAE,CAAC,OAAO,CAAC,CAAC;YACxF,eAAe,EAAE,KAAK,EAAE,QAAiB,EAAE,EAAE;gBAC3C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAS,yBAAyB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC5F,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;gBAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC1D,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;YAC3C,CAAC;YACD,QAAQ,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAS,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC;YACpF,eAAe,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;gBACrC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAGhB,oBAAoB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,IAAI,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,IAAI,CAAC,EAAE,CAAA;YAClG,CAAC;SACF;QACD,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC;KACnC,CAAA;AACH,CAAC"}
|