@solidus-network/sdk 0.3.0 → 0.6.0
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/chainInfo.d.ts +37 -0
- package/dist/chain/chainInfo.d.ts.map +1 -0
- package/dist/chain/chainInfo.js +22 -0
- package/dist/chain/chainInfo.js.map +1 -0
- package/dist/chain/credentials.d.ts.map +1 -1
- package/dist/chain/credentials.js +3 -16
- package/dist/chain/credentials.js.map +1 -1
- package/dist/chain/did.d.ts +49 -0
- package/dist/chain/did.d.ts.map +1 -1
- package/dist/chain/did.js +115 -49
- package/dist/chain/did.js.map +1 -1
- package/dist/chain/index.d.ts.map +1 -1
- package/dist/chain/index.js +21 -0
- package/dist/chain/index.js.map +1 -1
- 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 +28 -0
- package/dist/chain/transaction.d.ts.map +1 -1
- package/dist/chain/transaction.js +20 -0
- package/dist/chain/transaction.js.map +1 -1
- package/dist/chain/transfer.d.ts +26 -0
- package/dist/chain/transfer.d.ts.map +1 -0
- package/dist/chain/transfer.js +47 -0
- package/dist/chain/transfer.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/stub/credentials.js +1 -1
- package/dist/stub/did.d.ts +19 -0
- package/dist/stub/did.d.ts.map +1 -1
- package/dist/stub/did.js +55 -1
- package/dist/stub/did.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain self-description.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the `solidus_chainInfo` JSON-RPC method so wallets, explorers,
|
|
5
|
+
* indexers, and listing aggregators can discover the chain id, native
|
|
6
|
+
* token metadata, and node version instead of hardcoding them.
|
|
7
|
+
*/
|
|
8
|
+
import type { RpcClient } from './rpc.js';
|
|
9
|
+
/** Native token metadata (mirrors Rust `RpcNativeToken`). */
|
|
10
|
+
export interface NativeToken {
|
|
11
|
+
/** Display symbol — e.g. `"SLDS"`. Uppercase, no `$` prefix. */
|
|
12
|
+
symbol: string;
|
|
13
|
+
/** Display name — e.g. `"Solidus"`. */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Decimal precision (`8` → `1 SLDS = 10^8` base units). */
|
|
16
|
+
decimals: number;
|
|
17
|
+
}
|
|
18
|
+
/** Chain self-description (mirrors Rust `RpcChainInfo`). */
|
|
19
|
+
export interface ChainInfo {
|
|
20
|
+
/** Unique chain identifier from genesis. */
|
|
21
|
+
chainId: string;
|
|
22
|
+
/** Native token metadata. */
|
|
23
|
+
nativeToken: NativeToken;
|
|
24
|
+
/** Hex-encoded genesis block hash, or `''` if no genesis block exists. */
|
|
25
|
+
genesisHash: string;
|
|
26
|
+
/** Height of the latest committed block. */
|
|
27
|
+
latestBlock: number;
|
|
28
|
+
/** Node software version. */
|
|
29
|
+
version: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create the `getChainInfo` accessor bound to an RPC client. The returned
|
|
33
|
+
* function calls `solidus_chainInfo` and maps the snake_case wire format to
|
|
34
|
+
* the camelCase SDK shape.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createChainInfo(rpc: RpcClient): () => Promise<ChainInfo>;
|
|
37
|
+
//# sourceMappingURL=chainInfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainInfo.d.ts","sourceRoot":"","sources":["../../src/chain/chainInfo.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAA;IACd,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAA;IACf,6BAA6B;IAC7B,WAAW,EAAE,WAAW,CAAA;IACxB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAA;IACnB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAA;IACnB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAexE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create the `getChainInfo` accessor bound to an RPC client. The returned
|
|
3
|
+
* function calls `solidus_chainInfo` and maps the snake_case wire format to
|
|
4
|
+
* the camelCase SDK shape.
|
|
5
|
+
*/
|
|
6
|
+
export function createChainInfo(rpc) {
|
|
7
|
+
return async function getChainInfo() {
|
|
8
|
+
const raw = await rpc.call('solidus_chainInfo', []);
|
|
9
|
+
return {
|
|
10
|
+
chainId: raw.chain_id,
|
|
11
|
+
nativeToken: {
|
|
12
|
+
symbol: raw.native_token.symbol,
|
|
13
|
+
name: raw.native_token.name,
|
|
14
|
+
decimals: raw.native_token.decimals,
|
|
15
|
+
},
|
|
16
|
+
genesisHash: raw.genesis_hash,
|
|
17
|
+
latestBlock: raw.latest_block,
|
|
18
|
+
version: raw.version,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=chainInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainInfo.js","sourceRoot":"","sources":["../../src/chain/chainInfo.ts"],"names":[],"mappings":"AA0CA;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAc;IAC5C,OAAO,KAAK,UAAU,YAAY;QAChC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAe,mBAAmB,EAAE,EAAE,CAAC,CAAA;QACjE,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,WAAW,EAAE;gBACX,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM;gBAC/B,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI;gBAC3B,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ;aACpC;YACD,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -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;AAsG7C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW;kBAElD,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;iBAoEtD,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;yBAyB5B,MAAM,aAAa,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;sBAc5C,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;EAQnE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildTransaction, getAddressFromKey, bytesToHex } from './transaction.js';
|
|
1
|
+
import { buildTransaction, getAddressFromKey, bytesToHex, pollReceipt, } from './transaction.js';
|
|
2
2
|
import { blake3 } from '@noble/hashes/blake3';
|
|
3
3
|
// ---------- helpers ----------
|
|
4
4
|
/**
|
|
@@ -60,25 +60,12 @@ function recordToVC(record) {
|
|
|
60
60
|
proof: {
|
|
61
61
|
type: 'Ed25519Signature2020',
|
|
62
62
|
created: new Date(record.issued_ms).toISOString(),
|
|
63
|
-
verificationMethod: `${record.issuer_did}#key-
|
|
63
|
+
verificationMethod: `${record.issuer_did}#key-0`,
|
|
64
64
|
proofPurpose: 'assertionMethod',
|
|
65
65
|
proofValue: record.hash, // On-chain, the proof is the hash itself
|
|
66
66
|
},
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Poll for a transaction receipt, retrying every 500ms for up to 10 seconds.
|
|
71
|
-
*/
|
|
72
|
-
async function pollReceipt(rpc, txHash) {
|
|
73
|
-
const maxAttempts = 20;
|
|
74
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
75
|
-
const receipt = await rpc.call('solidus_getReceipt', [txHash]);
|
|
76
|
-
if (receipt)
|
|
77
|
-
return receipt;
|
|
78
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
79
|
-
}
|
|
80
|
-
throw new Error(`Transaction ${txHash} not confirmed after 10 seconds`);
|
|
81
|
-
}
|
|
82
69
|
// ---------- factory ----------
|
|
83
70
|
export function createChainCredentials(rpc, config) {
|
|
84
71
|
return {
|
|
@@ -130,7 +117,7 @@ export function createChainCredentials(rpc, config) {
|
|
|
130
117
|
proof: {
|
|
131
118
|
type: 'Ed25519Signature2020',
|
|
132
119
|
created: now.toISOString(),
|
|
133
|
-
verificationMethod: `${params.issuerDid}#key-
|
|
120
|
+
verificationMethod: `${params.issuerDid}#key-0`,
|
|
134
121
|
proofPurpose: 'assertionMethod',
|
|
135
122
|
proofValue: bytesToHex(payloadHash),
|
|
136
123
|
},
|
|
@@ -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":"AAUA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EAEjB,UAAU,EACV,WAAW,GACZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAqB7C,gCAAgC;AAEhC;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAe;IACxC,0EAA0E;IAC1E,4DAA4D;IAC5D,MAAM,OAAO,GAA2B;QACtC,eAAe,EAAE,OAAO;QACxB,eAAe,EAAE,OAAO;QACxB,mBAAmB,EAAE,OAAO;QAC5B,mBAAmB,EAAE,OAAO;QAC5B,mBAAmB,EAAE,OAAO;QAC5B,aAAa,EAAE,KAAK;QACpB,oBAAoB,EAAE,YAAY;QAClC,kCAAkC;QAClC,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,KAAK;QACV,UAAU,EAAE,YAAY;KACzB,CAAA;IAED,uEAAuE;IACvE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACzB,IAAI,MAAM;YAAE,OAAO,MAAM,CAAA;IAC3B,CAAC;IAED,yCAAyC;IACzC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAA6B;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC,UAAU;QAC1B,MAAM,EAAE,MAAM,CAAC,SAAS;QACxB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;AAClD,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,MAA2B;IAC7C,OAAO;QACL,UAAU,EAAE,CAAC,sCAAsC,CAAC;QACpD,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,CAAC,sBAAsB,EAAE,MAAM,CAAC,eAAe,GAAG,YAAY,CAAC;QACrE,MAAM,EAAE,MAAM,CAAC,UAAU;QACzB,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;QACnD,iBAAiB,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE;QAC7C,KAAK,EAAE;YACL,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;YACjD,kBAAkB,EAAE,GAAG,MAAM,CAAC,UAAU,QAAQ;YAChD,YAAY,EAAE,iBAAiB;YAC/B,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,yCAAyC;SACnE;KACF,CAAA;AACH,CAAC;AAED,gCAAgC;AAEhC,MAAM,UAAU,sBAAsB,CAAC,GAAc,EAAE,MAAmB;IACxE,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,MAA6B;YACvC,uDAAuD;YACvD,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAA;YACzC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAClD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAS,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;YAEnE,gDAAgD;YAChD,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;YAEjD,yDAAyD;YACzD,MAAM,OAAO,GAAG;gBACd,eAAe,EAAE;oBACf,WAAW,EAAE,MAAM,CAAC,UAAU;oBAC9B,eAAe,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;oBAC/C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;iBAC9B;aACF,CAAA;YAED,6BAA6B;YAC7B,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAE5D,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAS,yBAAyB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACtF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YAC9D,CAAC;YAED,wDAAwD;YACxD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAA;YAC7E,MAAM,YAAY,GACf,WAAW,EAAE,YAAmC,IAAI,0BAA0B,MAAM,EAAE,CAAA;YAEzF,mDAAmD;YACnD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,8BAA8B,EAC9B,CAAC,MAAM,CAAC,UAAU,CAAC,CACpB,CAAA;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,CAAA;YAEzD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,UAAU,CAAC,MAAM,CAAC,CAAA;YAC3B,CAAC;YAED,+CAA+C;YAC/C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa;gBACrC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,aAAa,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE;gBAC3E,CAAC,CAAC,SAAS,CAAA;YAEb,OAAO;gBACL,UAAU,EAAE,CAAC,sCAAsC,CAAC;gBACpD,EAAE,EAAE,YAAY;gBAChB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,MAAM,CAAC,SAAS;gBACxB,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;gBAC5B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,iBAAiB,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE;gBAC9D,KAAK,EAAE;oBACL,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE;oBAC1B,kBAAkB,EAAE,GAAG,MAAM,CAAC,SAAS,QAAQ;oBAC/C,YAAY,EAAE,iBAAiB;oBAC/B,UAAU,EAAE,UAAU,CAAC,WAAW,CAAC;iBACpC;aACF,CAAA;QACH,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,IAAY;YACvB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC3B,0BAA0B,EAC1B,CAAC,IAAI,CAAC,CACP,CAAA;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,sBAAsB;oBAC7B,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;iBAC/D,CAAA;YACH,CAAC;YAED,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,MAAM,EAAE;oBACN,SAAS,EAAE,IAAI,EAAE,gDAAgD;oBACjE,MAAM,EAAE,IAAI,EAAE,0CAA0C;oBACxD,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO;iBAC5B;aACF,CAAA;QACH,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,YAAoB,EAAE,SAAiB;YAClD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAClD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAS,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;YAEnE,MAAM,OAAO,GAAG,EAAE,gBAAgB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,CAAA;YACrE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAE5D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAS,yBAAyB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACtF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YAC/D,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,UAAkB;YAC5B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,8BAA8B,EAC9B,CAAC,UAAU,CAAC,CACb,CAAA;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAC1D,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/chain/did.d.ts
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
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
|
+
import { type ChainTransaction } from './transaction.js';
|
|
12
|
+
import type { RecoveryPolicy } from './recovery.js';
|
|
11
13
|
/**
|
|
12
14
|
* W3C DID Resolution result — preserves the deactivated state separately
|
|
13
15
|
* from the document. Mirrors the shape defined in
|
|
@@ -30,8 +32,55 @@ export interface DIDResolutionResult {
|
|
|
30
32
|
contentType: 'application/did+json';
|
|
31
33
|
error?: 'notFound' | 'invalidDid';
|
|
32
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;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Options for {@link createChainDid}().buildCreate — produces a signed
|
|
43
|
+
* DidCreate transaction without submitting it.
|
|
44
|
+
*
|
|
45
|
+
* Defaults are designed so that the most common case ("I have a key, I
|
|
46
|
+
* want to register its DID") requires only `signerPrivateKey`.
|
|
47
|
+
*/
|
|
48
|
+
export interface BuildDidCreateOptions {
|
|
49
|
+
/**
|
|
50
|
+
* Hex-encoded 32-byte Ed25519 private key that signs the transaction.
|
|
51
|
+
* The chain enforces `signer_pubkey == payload.public_key` (via the
|
|
52
|
+
* `PublicKeyMismatch` invariant), so this key MUST own the `publicKey`
|
|
53
|
+
* field below. If `publicKey` is omitted, it is derived from this key.
|
|
54
|
+
*/
|
|
55
|
+
signerPrivateKey: string;
|
|
56
|
+
/**
|
|
57
|
+
* Hex-encoded 32-byte Ed25519 public key to register. Must match
|
|
58
|
+
* `signerPrivateKey`'s derived pubkey. Omit to use the signer's own
|
|
59
|
+
* pubkey — that is the typical case.
|
|
60
|
+
*/
|
|
61
|
+
publicKey?: string;
|
|
62
|
+
/** Optional service endpoints baked into the DID document at creation. */
|
|
63
|
+
serviceEndpoints?: unknown[];
|
|
64
|
+
/**
|
|
65
|
+
* Override the nonce. Omit to fetch it via `solidus_getNonce`. The
|
|
66
|
+
* override is here for relay paths that already know the nonce (e.g.
|
|
67
|
+
* a frontend that read it just before signing).
|
|
68
|
+
*/
|
|
69
|
+
nonce?: number;
|
|
33
70
|
}
|
|
34
71
|
export declare function createChainDid(rpc: RpcClient, config: ChainConfig): {
|
|
72
|
+
buildCreate: (opts: BuildDidCreateOptions) => Promise<ChainTransaction>;
|
|
73
|
+
submitCreate: (signedTx: ChainTransaction | string) => Promise<DID>;
|
|
74
|
+
/**
|
|
75
|
+
* Convenience wrapper for the case where the SDK's configured
|
|
76
|
+
* `signerPrivateKey` IS the owner of the public key being registered.
|
|
77
|
+
*
|
|
78
|
+
* Throws if the signer doesn't own `publicKey` — the old behavior of
|
|
79
|
+
* "sign with the shared signer, register someone else's key" was a
|
|
80
|
+
* bug (the chain rejects via `PublicKeyMismatch`); use
|
|
81
|
+
* {@link buildCreate} + {@link submitCreate} for the relay pattern
|
|
82
|
+
* (frontend signs locally, backend relays).
|
|
83
|
+
*/
|
|
35
84
|
create(publicKey: string): Promise<DID>;
|
|
36
85
|
resolve(did: string): Promise<DIDDocument | null>;
|
|
37
86
|
/**
|
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;
|
|
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;IAe/D;;;;;;;;;;;;;;;;;OAiBG;uBAEI,MAAM,iBACI,MAAM,aACV,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;EAmBnB"}
|
package/dist/chain/did.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { buildTransaction, getAddressFromKey, addressFromPublicKey, hexToBytes, hexToArray, } from './transaction.js';
|
|
1
|
+
import { buildTransaction, getAddressFromKey, addressFromPublicKey, hexToBytes, hexToArray, bytesToHex, pollReceipt, } from './transaction.js';
|
|
2
|
+
import * as ed from '@noble/ed25519';
|
|
2
3
|
import bs58 from 'bs58';
|
|
3
4
|
// ---------- helpers ----------
|
|
4
5
|
/**
|
|
@@ -8,19 +9,6 @@ import bs58 from 'bs58';
|
|
|
8
9
|
function buildDidString(network, address) {
|
|
9
10
|
return `did:solidus:${network}:${address}`;
|
|
10
11
|
}
|
|
11
|
-
/**
|
|
12
|
-
* Poll for a transaction receipt, retrying every 500ms for up to 10 seconds.
|
|
13
|
-
*/
|
|
14
|
-
async function pollReceipt(rpc, txHash) {
|
|
15
|
-
const maxAttempts = 20; // 20 * 500ms = 10s
|
|
16
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
17
|
-
const receipt = await rpc.call('solidus_getReceipt', [txHash]);
|
|
18
|
-
if (receipt)
|
|
19
|
-
return receipt;
|
|
20
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
21
|
-
}
|
|
22
|
-
throw new Error(`Transaction ${txHash} not confirmed after 10 seconds`);
|
|
23
|
-
}
|
|
24
12
|
/**
|
|
25
13
|
* Convert an RPC DID document to the W3C DIDDocument format expected
|
|
26
14
|
* by the SolidusSDK interface.
|
|
@@ -59,45 +47,119 @@ function mapToW3CDIDDocument(doc) {
|
|
|
59
47
|
updated: new Date(doc.updated_ms).toISOString(),
|
|
60
48
|
};
|
|
61
49
|
}
|
|
62
|
-
// ---------- factory ----------
|
|
63
50
|
export function createChainDid(rpc, config) {
|
|
51
|
+
/**
|
|
52
|
+
* Build a signed `DidCreate` transaction without submitting it.
|
|
53
|
+
*
|
|
54
|
+
* The signed tx is content-addressed and can be relayed by any party
|
|
55
|
+
* (e.g. a frontend signs locally, then POSTs the tx to a backend that
|
|
56
|
+
* relays via {@link submitCreate}). This split honors the chain's
|
|
57
|
+
* `PublicKeyMismatch` invariant: only the holder of `publicKey` can
|
|
58
|
+
* register the DID for that key.
|
|
59
|
+
*/
|
|
60
|
+
async function buildCreate(opts) {
|
|
61
|
+
// 1. Derive signer pubkey + publicKey to register.
|
|
62
|
+
const signerPubBytes = await ed.getPublicKeyAsync(hexToBytes(opts.signerPrivateKey));
|
|
63
|
+
const signerPubHex = bytesToHex(signerPubBytes);
|
|
64
|
+
const publicKey = opts.publicKey ?? signerPubHex;
|
|
65
|
+
// 2. Enforce signer-owns-publicKey at the SDK boundary so the chain
|
|
66
|
+
// never has to. Failing here means the bug is in the caller.
|
|
67
|
+
if (publicKey.toLowerCase() !== signerPubHex.toLowerCase()) {
|
|
68
|
+
throw new Error(`did.buildCreate: signerPrivateKey does not own the supplied publicKey ` +
|
|
69
|
+
`(signer pubkey ${signerPubHex.slice(0, 16)}…, payload pubkey ${publicKey.slice(0, 16)}…). ` +
|
|
70
|
+
`The chain enforces "senders may only register DIDs they control" — ` +
|
|
71
|
+
`pass the user's own private key, or omit publicKey to register the signer's own DID.`);
|
|
72
|
+
}
|
|
73
|
+
// 3. Resolve nonce.
|
|
74
|
+
const senderAddress = addressFromPublicKey(signerPubBytes);
|
|
75
|
+
const nonce = opts.nonce ?? (await rpc.call('solidus_getNonce', [senderAddress]));
|
|
76
|
+
// 4. Build DidCreate payload (Rust serde tagged enum format).
|
|
77
|
+
const payload = {
|
|
78
|
+
DidCreate: {
|
|
79
|
+
public_key: hexToArray(publicKey),
|
|
80
|
+
service_endpoints: opts.serviceEndpoints ?? [],
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
// 5. Sign.
|
|
84
|
+
return buildTransaction(opts.signerPrivateKey, nonce, payload);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Submit a previously-built {@link ChainTransaction} (must wrap a
|
|
88
|
+
* `DidCreate` payload), poll its receipt, and return the DID descriptor.
|
|
89
|
+
*
|
|
90
|
+
* Accepts the tx as an object OR a stringified JSON payload (useful
|
|
91
|
+
* when relaying a tx that arrived as POST body).
|
|
92
|
+
*
|
|
93
|
+
* Defensively re-checks the signer-owns-pubkey invariant before
|
|
94
|
+
* submitting, so a malicious or buggy client can't tee up a tx the
|
|
95
|
+
* chain will reject — we fail fast with a clear error.
|
|
96
|
+
*/
|
|
97
|
+
async function submitCreate(signedTx) {
|
|
98
|
+
const tx = typeof signedTx === 'string' ? JSON.parse(signedTx) : signedTx;
|
|
99
|
+
// Defensive: tx must be DidCreate + signer must own the registered pubkey.
|
|
100
|
+
const payload = tx.payload;
|
|
101
|
+
const payloadPubArr = payload?.DidCreate?.public_key;
|
|
102
|
+
if (!payloadPubArr || !Array.isArray(payloadPubArr) || payloadPubArr.length !== 32) {
|
|
103
|
+
throw new Error(`did.submitCreate: signed tx is not a DidCreate (or its public_key is malformed). ` +
|
|
104
|
+
`Use did.deactivate / did.setController for those operations.`);
|
|
105
|
+
}
|
|
106
|
+
if (!Array.isArray(tx.sender_pubkey) || tx.sender_pubkey.length !== 32) {
|
|
107
|
+
throw new Error(`did.submitCreate: signed tx has a malformed sender_pubkey`);
|
|
108
|
+
}
|
|
109
|
+
for (let i = 0; i < 32; i++) {
|
|
110
|
+
if (tx.sender_pubkey[i] !== payloadPubArr[i]) {
|
|
111
|
+
throw new Error(`did.submitCreate: tx signer does not own the public key in the DidCreate ` +
|
|
112
|
+
`payload (chain would reject with PublicKeyMismatch). Re-sign the tx with ` +
|
|
113
|
+
`the private key that owns the registered public key.`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Submit + poll.
|
|
117
|
+
const txJson = typeof signedTx === 'string' ? signedTx : JSON.stringify(tx);
|
|
118
|
+
const txHash = await rpc.call('solidus_sendTransaction', [txJson]);
|
|
119
|
+
const receipt = await pollReceipt(rpc, txHash);
|
|
120
|
+
if (!receipt.status.startsWith('success')) {
|
|
121
|
+
throw new Error(`DidCreate failed: ${receipt.status}`);
|
|
122
|
+
}
|
|
123
|
+
// The chain builds the DID from the signer's address (which equals
|
|
124
|
+
// the registered public key's address — we just enforced that).
|
|
125
|
+
const pubKeyBytes = Uint8Array.from(payloadPubArr);
|
|
126
|
+
const didAddress = addressFromPublicKey(pubKeyBytes);
|
|
127
|
+
const did = buildDidString(config.network, didAddress);
|
|
128
|
+
const doc = await rpc.call('solidus_didResolve', [did]);
|
|
129
|
+
const now = new Date().toISOString();
|
|
130
|
+
return {
|
|
131
|
+
id: did,
|
|
132
|
+
controller: did,
|
|
133
|
+
created: doc ? new Date(doc.created_ms).toISOString() : now,
|
|
134
|
+
updated: doc ? new Date(doc.updated_ms).toISOString() : now,
|
|
135
|
+
network: config.network,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
64
138
|
return {
|
|
139
|
+
buildCreate,
|
|
140
|
+
submitCreate,
|
|
141
|
+
/**
|
|
142
|
+
* Convenience wrapper for the case where the SDK's configured
|
|
143
|
+
* `signerPrivateKey` IS the owner of the public key being registered.
|
|
144
|
+
*
|
|
145
|
+
* Throws if the signer doesn't own `publicKey` — the old behavior of
|
|
146
|
+
* "sign with the shared signer, register someone else's key" was a
|
|
147
|
+
* bug (the chain rejects via `PublicKeyMismatch`); use
|
|
148
|
+
* {@link buildCreate} + {@link submitCreate} for the relay pattern
|
|
149
|
+
* (frontend signs locally, backend relays).
|
|
150
|
+
*/
|
|
65
151
|
async create(publicKey) {
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
service_endpoints: [],
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
// 4. Build and sign transaction
|
|
78
|
-
const tx = await buildTransaction(config.signerPrivateKey, nonce, payload);
|
|
79
|
-
// 5. Submit via RPC
|
|
80
|
-
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(tx)]);
|
|
81
|
-
// 6. Poll for receipt
|
|
82
|
-
const receipt = await pollReceipt(rpc, txHash);
|
|
83
|
-
if (!receipt.status.startsWith('success')) {
|
|
84
|
-
throw new Error(`DidCreate failed: ${receipt.status}`);
|
|
152
|
+
const signerPubBytes = await ed.getPublicKeyAsync(hexToBytes(config.signerPrivateKey));
|
|
153
|
+
const signerPubHex = bytesToHex(signerPubBytes);
|
|
154
|
+
if (publicKey.toLowerCase() !== signerPubHex.toLowerCase()) {
|
|
155
|
+
throw new Error(`did.create: the SDK's configured signer does not own the supplied publicKey. ` +
|
|
156
|
+
`The chain enforces "senders may only register DIDs they control". ` +
|
|
157
|
+
`Either pass the signer's own pubkey (omit the arg to derive it), or use ` +
|
|
158
|
+
`did.buildCreate({signerPrivateKey: <user's key>, ...}) + did.submitCreate() ` +
|
|
159
|
+
`to relay a tx the user signed themselves.`);
|
|
85
160
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const pubKeyBytes = hexToBytes(publicKey);
|
|
89
|
-
const didAddress = addressFromPublicKey(pubKeyBytes);
|
|
90
|
-
const did = buildDidString(config.network, didAddress);
|
|
91
|
-
// 8. Resolve the created DID to get timestamps
|
|
92
|
-
const doc = await rpc.call('solidus_didResolve', [did]);
|
|
93
|
-
const now = new Date().toISOString();
|
|
94
|
-
return {
|
|
95
|
-
id: did,
|
|
96
|
-
controller: did,
|
|
97
|
-
created: doc ? new Date(doc.created_ms).toISOString() : now,
|
|
98
|
-
updated: doc ? new Date(doc.updated_ms).toISOString() : now,
|
|
99
|
-
network: config.network,
|
|
100
|
-
};
|
|
161
|
+
const tx = await buildCreate({ signerPrivateKey: config.signerPrivateKey, publicKey });
|
|
162
|
+
return submitCreate(tx);
|
|
101
163
|
},
|
|
102
164
|
async resolve(did) {
|
|
103
165
|
// BACKWARD COMPAT: returns null for deactivated DIDs. Use
|
|
@@ -147,6 +209,10 @@ export function createChainDid(rpc, config) {
|
|
|
147
209
|
didResolutionMetadata: {
|
|
148
210
|
contentType: 'application/did+json',
|
|
149
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 } : {}),
|
|
150
216
|
};
|
|
151
217
|
},
|
|
152
218
|
async deactivate(did, signerKey) {
|
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,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,UAAU,
|
|
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":"
|
|
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
|
@@ -9,6 +9,9 @@ import { createChainDid } from './did.js';
|
|
|
9
9
|
import { createChainCredentials } from './credentials.js';
|
|
10
10
|
import { createChainAuth } from './auth.js';
|
|
11
11
|
import { createChainBbs } from './bbs.js';
|
|
12
|
+
import { createChainInfo } from './chainInfo.js';
|
|
13
|
+
import { createChainTransfer } from './transfer.js';
|
|
14
|
+
import { pollReceipt } from './transaction.js';
|
|
12
15
|
export function createChainClient(config) {
|
|
13
16
|
const rpc = new RpcClient(config.rpcUrl);
|
|
14
17
|
return {
|
|
@@ -16,6 +19,24 @@ export function createChainClient(config) {
|
|
|
16
19
|
credentials: createChainCredentials(rpc, config),
|
|
17
20
|
auth: createChainAuth(rpc, config),
|
|
18
21
|
bbs: createChainBbs(rpc, config),
|
|
22
|
+
chain: {
|
|
23
|
+
transfer: createChainTransfer(rpc, config.network),
|
|
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
|
+
},
|
|
38
|
+
},
|
|
39
|
+
getChainInfo: createChainInfo(rpc),
|
|
19
40
|
};
|
|
20
41
|
}
|
|
21
42
|
//# sourceMappingURL=index.js.map
|
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;
|
|
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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type ChainTransaction } from './transaction.js';
|
|
2
|
+
export interface GuardianApproval {
|
|
3
|
+
guardian_did: string;
|
|
4
|
+
signature: number[];
|
|
5
|
+
}
|
|
6
|
+
export interface RecoveryPolicy {
|
|
7
|
+
guardians: string[];
|
|
8
|
+
threshold: number;
|
|
9
|
+
delay_blocks: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The 32-byte BLAKE3 message a guardian signs to approve a recovery. Mirrors the Rust
|
|
13
|
+
* `recovery_signing_message`: BLAKE3( "solidus.did.recover.v1" ‖ (network.len() as u32 LE) ‖ network
|
|
14
|
+
* ‖ (subject_did.len() as u32 LE) ‖ subject_did ‖ new_public_key[32] ‖ recovery_nonce u64 LE ).
|
|
15
|
+
*/
|
|
16
|
+
export declare function recoverySigningMessage(network: string, subjectDid: string, newPublicKey: Uint8Array, recoveryNonce: number | bigint): Uint8Array;
|
|
17
|
+
/**
|
|
18
|
+
* Sign the recovery message as a guardian. Returns the 64-byte Ed25519 signature as a number[],
|
|
19
|
+
* ready to drop into a `GuardianApproval`. The guardian signs the 32-byte hash directly (matching
|
|
20
|
+
* the Rust executor, which recomputes the same hash and verifies against the guardian's on-chain key).
|
|
21
|
+
*/
|
|
22
|
+
export declare function signAsGuardian(guardianPrivateKey: string | Uint8Array, params: {
|
|
23
|
+
network: string;
|
|
24
|
+
subjectDid: string;
|
|
25
|
+
newPublicKey: Uint8Array;
|
|
26
|
+
recoveryNonce: number | bigint;
|
|
27
|
+
}): Promise<number[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Build a signed `DidRecover` transaction. `signerPrivateKey` is the NEW key — the chain enforces
|
|
30
|
+
* `sender_pubkey == new_public_key`, so this throws if the supplied `newPublicKey` is not the
|
|
31
|
+
* signer's own public key (mirroring that guard before a doomed submit).
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildRecover(opts: {
|
|
34
|
+
signerPrivateKey: string;
|
|
35
|
+
subjectDid: string;
|
|
36
|
+
newPublicKey: Uint8Array;
|
|
37
|
+
approvals: GuardianApproval[];
|
|
38
|
+
nonce: number;
|
|
39
|
+
}): Promise<ChainTransaction>;
|
|
40
|
+
/** Relay a signed `DidRecover` tx and poll its receipt. Mirrors `did.submitCreate`. */
|
|
41
|
+
export declare function submitRecover(rpc: {
|
|
42
|
+
call<T>(method: string, params: unknown[]): Promise<T>;
|
|
43
|
+
}, signedTx: ChainTransaction): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Build a signed `DidUpdate` that sets the DID's recovery policy (a k-of-n guardian set). The signer
|
|
46
|
+
* must currently control the DID. Patch key order = Rust field order: guardians, threshold, delay_blocks.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildSetRecoveryPolicy(opts: {
|
|
49
|
+
signerPrivateKey: string;
|
|
50
|
+
did: string;
|
|
51
|
+
policy: RecoveryPolicy;
|
|
52
|
+
nonce: number;
|
|
53
|
+
}): Promise<ChainTransaction>;
|
|
54
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/chain/recovery.ts"],"names":[],"mappings":"AAYA,OAAO,EAA6C,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnG,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAoBD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,UAAU,EACxB,aAAa,EAAE,MAAM,GAAG,MAAM,GAC7B,UAAU,CAaZ;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,kBAAkB,EAAE,MAAM,GAAG,UAAU,EACvC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GACxG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKnB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,UAAU,CAAA;IACxB,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAe5B;AAED,uFAAuF;AACvF,wBAAsB,aAAa,CACjC,GAAG,EAAE;IAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,EAC/D,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,cAAc,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgB5B"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DID social recovery — SDK surface (sub-project #2).
|
|
3
|
+
*
|
|
4
|
+
* Byte-for-byte compatible with the Rust protocol primitive (sub-project #1): the recovery signing
|
|
5
|
+
* message and the `DidRecover` / `SetRecoveryPolicy` payload JSON must match the Rust exactly, or a
|
|
6
|
+
* guardian signature built here will not verify on chain. Parity is locked by shared test vectors
|
|
7
|
+
* generated from Rust (see recovery.test.ts; vectors from solidus-txns commit 21377537).
|
|
8
|
+
*/
|
|
9
|
+
import { blake3 } from '@noble/hashes/blake3';
|
|
10
|
+
import * as ed from '@noble/ed25519';
|
|
11
|
+
// Importing transaction.ts also runs its `ed.etc.sha512Sync = …` side-effect, so @noble/ed25519 is
|
|
12
|
+
// configured for both this module and any consumer that only imports recovery.
|
|
13
|
+
import { buildTransaction, hexToBytes, pollReceipt } from './transaction.js';
|
|
14
|
+
const RECOVER_DOMAIN_SEP = new TextEncoder().encode('solidus.did.recover.v1');
|
|
15
|
+
function u32le(n) {
|
|
16
|
+
const b = new Uint8Array(4);
|
|
17
|
+
new DataView(b.buffer).setUint32(0, n, true);
|
|
18
|
+
return b;
|
|
19
|
+
}
|
|
20
|
+
function u64le(n) {
|
|
21
|
+
const b = new Uint8Array(8);
|
|
22
|
+
new DataView(b.buffer).setBigUint64(0, BigInt(n), true);
|
|
23
|
+
return b;
|
|
24
|
+
}
|
|
25
|
+
function bytesEqual(a, b) {
|
|
26
|
+
if (a.length !== b.length)
|
|
27
|
+
return false;
|
|
28
|
+
for (let i = 0; i < a.length; i++)
|
|
29
|
+
if (a[i] !== b[i])
|
|
30
|
+
return false;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The 32-byte BLAKE3 message a guardian signs to approve a recovery. Mirrors the Rust
|
|
35
|
+
* `recovery_signing_message`: BLAKE3( "solidus.did.recover.v1" ‖ (network.len() as u32 LE) ‖ network
|
|
36
|
+
* ‖ (subject_did.len() as u32 LE) ‖ subject_did ‖ new_public_key[32] ‖ recovery_nonce u64 LE ).
|
|
37
|
+
*/
|
|
38
|
+
export function recoverySigningMessage(network, subjectDid, newPublicKey, recoveryNonce) {
|
|
39
|
+
if (newPublicKey.length !== 32)
|
|
40
|
+
throw new Error('newPublicKey must be 32 bytes');
|
|
41
|
+
const net = new TextEncoder().encode(network);
|
|
42
|
+
const sub = new TextEncoder().encode(subjectDid);
|
|
43
|
+
const parts = [RECOVER_DOMAIN_SEP, u32le(net.length), net, u32le(sub.length), sub, newPublicKey, u64le(recoveryNonce)];
|
|
44
|
+
const total = parts.reduce((n, p) => n + p.length, 0);
|
|
45
|
+
const buf = new Uint8Array(total);
|
|
46
|
+
let off = 0;
|
|
47
|
+
for (const p of parts) {
|
|
48
|
+
buf.set(p, off);
|
|
49
|
+
off += p.length;
|
|
50
|
+
}
|
|
51
|
+
return blake3(buf);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Sign the recovery message as a guardian. Returns the 64-byte Ed25519 signature as a number[],
|
|
55
|
+
* ready to drop into a `GuardianApproval`. The guardian signs the 32-byte hash directly (matching
|
|
56
|
+
* the Rust executor, which recomputes the same hash and verifies against the guardian's on-chain key).
|
|
57
|
+
*/
|
|
58
|
+
export async function signAsGuardian(guardianPrivateKey, params) {
|
|
59
|
+
const sk = typeof guardianPrivateKey === 'string' ? hexToBytes(guardianPrivateKey) : guardianPrivateKey;
|
|
60
|
+
const msg = recoverySigningMessage(params.network, params.subjectDid, params.newPublicKey, params.recoveryNonce);
|
|
61
|
+
const sig = await ed.signAsync(msg, sk);
|
|
62
|
+
return Array.from(sig);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build a signed `DidRecover` transaction. `signerPrivateKey` is the NEW key — the chain enforces
|
|
66
|
+
* `sender_pubkey == new_public_key`, so this throws if the supplied `newPublicKey` is not the
|
|
67
|
+
* signer's own public key (mirroring that guard before a doomed submit).
|
|
68
|
+
*/
|
|
69
|
+
export async function buildRecover(opts) {
|
|
70
|
+
if (opts.newPublicKey.length !== 32)
|
|
71
|
+
throw new Error('newPublicKey must be 32 bytes');
|
|
72
|
+
const signerPub = await ed.getPublicKeyAsync(hexToBytes(opts.signerPrivateKey));
|
|
73
|
+
if (!bytesEqual(signerPub, opts.newPublicKey)) {
|
|
74
|
+
throw new Error('buildRecover: newPublicKey must equal the signer public key (the recovery envelope sender == the new key)');
|
|
75
|
+
}
|
|
76
|
+
// Key order = Rust struct-field order: did, new_public_key, approvals (locked by the parity test).
|
|
77
|
+
const payload = {
|
|
78
|
+
DidRecover: {
|
|
79
|
+
did: opts.subjectDid,
|
|
80
|
+
new_public_key: Array.from(opts.newPublicKey),
|
|
81
|
+
approvals: opts.approvals,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
return buildTransaction(opts.signerPrivateKey, opts.nonce, payload);
|
|
85
|
+
}
|
|
86
|
+
/** Relay a signed `DidRecover` tx and poll its receipt. Mirrors `did.submitCreate`. */
|
|
87
|
+
export async function submitRecover(rpc, signedTx) {
|
|
88
|
+
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(signedTx)]);
|
|
89
|
+
const receipt = await pollReceipt(rpc, txHash);
|
|
90
|
+
if (!receipt.status.startsWith('success')) {
|
|
91
|
+
throw new Error(`DidRecover failed: ${receipt.status}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build a signed `DidUpdate` that sets the DID's recovery policy (a k-of-n guardian set). The signer
|
|
96
|
+
* must currently control the DID. Patch key order = Rust field order: guardians, threshold, delay_blocks.
|
|
97
|
+
*/
|
|
98
|
+
export async function buildSetRecoveryPolicy(opts) {
|
|
99
|
+
const payload = {
|
|
100
|
+
DidUpdate: {
|
|
101
|
+
did: opts.did,
|
|
102
|
+
patches: [
|
|
103
|
+
{
|
|
104
|
+
SetRecoveryPolicy: {
|
|
105
|
+
guardians: opts.policy.guardians,
|
|
106
|
+
threshold: opts.policy.threshold,
|
|
107
|
+
delay_blocks: opts.policy.delay_blocks,
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
return buildTransaction(opts.signerPrivateKey, opts.nonce, payload);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/chain/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,34 @@ export interface ChainTransaction {
|
|
|
4
4
|
payload: unknown;
|
|
5
5
|
signature: number[];
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Shape of `solidus_getReceipt` responses. Exported so relay paths (e.g.
|
|
9
|
+
* `did.submitCreate`) can inspect the receipt before mapping it back to
|
|
10
|
+
* the caller-facing return type.
|
|
11
|
+
*/
|
|
12
|
+
export interface RpcReceipt {
|
|
13
|
+
tx_hash: string;
|
|
14
|
+
status: string;
|
|
15
|
+
block_height: number;
|
|
16
|
+
fee_paid: number;
|
|
17
|
+
events: Array<{
|
|
18
|
+
type: string;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Poll `solidus_getReceipt` until the receipt appears, retrying every
|
|
24
|
+
* 500ms for up to 10 seconds. Throws if the receipt does not arrive in
|
|
25
|
+
* that window — the chain finalizes well inside this budget on healthy
|
|
26
|
+
* testnets.
|
|
27
|
+
*
|
|
28
|
+
* Extracted from `chain/did.ts` and `chain/credentials.ts` (2026-05-19),
|
|
29
|
+
* which each had an identical private copy. Lives here so any future
|
|
30
|
+
* "build + submit + poll" relay primitive can share it.
|
|
31
|
+
*/
|
|
32
|
+
export declare function pollReceipt(rpc: {
|
|
33
|
+
call<T>(method: string, params: unknown[]): Promise<T>;
|
|
34
|
+
}, txHash: string): Promise<RpcReceipt>;
|
|
7
35
|
/**
|
|
8
36
|
* Build and sign a transaction for the Solidus chain.
|
|
9
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/chain/transaction.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,gBAAgB,CAAC,CAuB3B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI9E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAIlE;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMlD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhD"}
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/chain/transaction.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAA;CACxD;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE;IAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,EAC/D,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,gBAAgB,CAAC,CAuB3B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI9E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAIlE;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMlD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhD"}
|
|
@@ -15,6 +15,26 @@ import { blake3 } from '@noble/hashes/blake3';
|
|
|
15
15
|
import bs58 from 'bs58';
|
|
16
16
|
// Configure ed25519 v2 to use sha512 for sync operations
|
|
17
17
|
ed.etc.sha512Sync = (...m) => sha512(ed.etc.concatBytes(...m));
|
|
18
|
+
/**
|
|
19
|
+
* Poll `solidus_getReceipt` until the receipt appears, retrying every
|
|
20
|
+
* 500ms for up to 10 seconds. Throws if the receipt does not arrive in
|
|
21
|
+
* that window — the chain finalizes well inside this budget on healthy
|
|
22
|
+
* testnets.
|
|
23
|
+
*
|
|
24
|
+
* Extracted from `chain/did.ts` and `chain/credentials.ts` (2026-05-19),
|
|
25
|
+
* which each had an identical private copy. Lives here so any future
|
|
26
|
+
* "build + submit + poll" relay primitive can share it.
|
|
27
|
+
*/
|
|
28
|
+
export async function pollReceipt(rpc, txHash) {
|
|
29
|
+
const maxAttempts = 20; // 20 * 500ms = 10s
|
|
30
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
31
|
+
const receipt = await rpc.call('solidus_getReceipt', [txHash]);
|
|
32
|
+
if (receipt)
|
|
33
|
+
return receipt;
|
|
34
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`Transaction ${txHash} not confirmed after 10 seconds`);
|
|
37
|
+
}
|
|
18
38
|
/**
|
|
19
39
|
* Build and sign a transaction for the Solidus chain.
|
|
20
40
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/chain/transaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,yDAAyD;AACzD,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,GAAG,CAAe,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/chain/transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain-backed token transfer primitive.
|
|
3
|
+
*
|
|
4
|
+
* Exposed because relayers and onboarding paths need to seed new
|
|
5
|
+
* accounts with a small amount of native token before those accounts
|
|
6
|
+
* can pay their first tx fee. Without this, a freshly-generated client
|
|
7
|
+
* key can't submit its own DidCreate (the chain charges a fee on every
|
|
8
|
+
* tx, and a brand-new account has zero balance).
|
|
9
|
+
*
|
|
10
|
+
* Higher-level surfaces like `did.buildCreate`/`did.submitCreate` use
|
|
11
|
+
* this as a building block when called via a "fund + relay" wrapper.
|
|
12
|
+
*/
|
|
13
|
+
import type { RpcClient } from './rpc.js';
|
|
14
|
+
import { type RpcReceipt } from './transaction.js';
|
|
15
|
+
export interface TransferOptions {
|
|
16
|
+
/** Hex-encoded 32-byte Ed25519 private key of the sender. */
|
|
17
|
+
signerPrivateKey: string;
|
|
18
|
+
/** Base58 recipient address (20-byte BLAKE3-truncated pubkey). */
|
|
19
|
+
toAddress: string;
|
|
20
|
+
/** Amount in base units (smallest unit of the native token). */
|
|
21
|
+
amount: number;
|
|
22
|
+
/** Optional nonce override; fetched via `solidus_getNonce` when omitted. */
|
|
23
|
+
nonce?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function createChainTransfer(rpc: RpcClient, network: string): (opts: TransferOptions) => Promise<RpcReceipt>;
|
|
26
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/chain/transfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEjF,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,gBAAgB,EAAE,MAAM,CAAA;IACxB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAA;IACjB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,IAOlC,MAAM,eAAe,KAAG,OAAO,CAAC,UAAU,CAAC,CA6C3E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import bs58 from 'bs58';
|
|
2
|
+
import { buildTransaction, pollReceipt } from './transaction.js';
|
|
3
|
+
export function createChainTransfer(rpc, network) {
|
|
4
|
+
/**
|
|
5
|
+
* Submit a `Transfer` transaction, poll its receipt, and return it.
|
|
6
|
+
* Throws on a failed receipt. The signer's address is derived from
|
|
7
|
+
* `signerPrivateKey`; the recipient is a base58 address (the same
|
|
8
|
+
* format `addressFromPublicKey` returns).
|
|
9
|
+
*/
|
|
10
|
+
return async function transfer(opts) {
|
|
11
|
+
const { signerPrivateKey, toAddress, amount } = opts;
|
|
12
|
+
// Decode the base58 address to a 20-byte array — the Rust chain expects
|
|
13
|
+
// `to: [u8; 20]` as a JSON number array in the Transfer payload.
|
|
14
|
+
const toBytes = bs58.decode(toAddress);
|
|
15
|
+
if (toBytes.length !== 20) {
|
|
16
|
+
throw new Error(`chain.transfer: toAddress must decode to 20 bytes (got ${toBytes.length}); pass the base58 address, not the public key`);
|
|
17
|
+
}
|
|
18
|
+
const { getAddressFromKey } = await import('./transaction.js');
|
|
19
|
+
const senderAddress = await getAddressFromKey(signerPrivateKey);
|
|
20
|
+
// Identity/value separation (interim convention — see
|
|
21
|
+
// .claude/plans/2026-06-11-did-payment-unlinkability.md): the SDK never
|
|
22
|
+
// signs a value Transfer from a DID/identity address. If the signer's
|
|
23
|
+
// address has a DID registered on chain, refuse — value must move with a
|
|
24
|
+
// separate payment account so that resolving a DID never exposes payment
|
|
25
|
+
// history. Relayer/sponsor funding accounts are not DIDs, so they pass.
|
|
26
|
+
// The protocol-level decouple that makes this guard redundant is roadmapped
|
|
27
|
+
// in .claude/plans/2026-06-26-did-value-account-decoupling.md.
|
|
28
|
+
const senderDid = `did:solidus:${network}:${senderAddress}`;
|
|
29
|
+
const existingDid = await rpc.call('solidus_didResolve', [senderDid]);
|
|
30
|
+
if (existingDid != null) {
|
|
31
|
+
throw new Error(`chain.transfer: refusing to sign a Transfer from identity address ${senderAddress} — ` +
|
|
32
|
+
`it has a DID registered. Move value with a separate payment account ` +
|
|
33
|
+
`(identity and value must stay unlinkable).`);
|
|
34
|
+
}
|
|
35
|
+
// Resolve nonce.
|
|
36
|
+
const nonce = opts.nonce ?? (await rpc.call('solidus_getNonce', [senderAddress]));
|
|
37
|
+
const payload = { Transfer: { to: Array.from(toBytes), amount } };
|
|
38
|
+
const tx = await buildTransaction(signerPrivateKey, nonce, payload);
|
|
39
|
+
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(tx)]);
|
|
40
|
+
const receipt = await pollReceipt(rpc, txHash);
|
|
41
|
+
if (!receipt.status.startsWith('success')) {
|
|
42
|
+
throw new Error(`Transfer failed: ${receipt.status}`);
|
|
43
|
+
}
|
|
44
|
+
return receipt;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/chain/transfer.ts"],"names":[],"mappings":"AAaA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAA;AAajF,MAAM,UAAU,mBAAmB,CAAC,GAAc,EAAE,OAAe;IACjE;;;;;OAKG;IACH,OAAO,KAAK,UAAU,QAAQ,CAAC,IAAqB;QAClD,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACpD,wEAAwE;QACxE,iEAAiE;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,0DAA0D,OAAO,CAAC,MAAM,gDAAgD,CACzH,CAAA;QACH,CAAC;QAED,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAA;QAC9D,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;QAE/D,sDAAsD;QACtD,wEAAwE;QACxE,sEAAsE;QACtE,yEAAyE;QACzE,yEAAyE;QACzE,wEAAwE;QACxE,4EAA4E;QAC5E,+DAA+D;QAC/D,MAAM,SAAS,GAAG,eAAe,OAAO,IAAI,aAAa,EAAE,CAAA;QAC3D,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,IAAI,CAAU,oBAAoB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;QAC9E,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,qEAAqE,aAAa,KAAK;gBACrF,sEAAsE;gBACtE,4CAA4C,CAC/C,CAAA;QACH,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAS,kBAAkB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;QAEzF,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,CAAA;QACjE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QAEnE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAS,yBAAyB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACtF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,54 @@
|
|
|
1
1
|
import type { DID, DIDDocument, VerifiableCredential, IssueCredentialParams, VerificationResult, AuthResult } from '@solidus-network/types';
|
|
2
|
+
import type { ChainTransaction } from './chain/transaction.js';
|
|
3
|
+
export type { ChainTransaction } from './chain/transaction.js';
|
|
4
|
+
export { addressFromPublicKey, getAddressFromKey } from './chain/transaction.js';
|
|
2
5
|
import type { BbsDisclosedMessage, BbsCredentialProofResult } from './chain/bbs.js';
|
|
6
|
+
import type { ChainInfo } from './chain/chainInfo.js';
|
|
3
7
|
export type { DID, DIDDocument, VerifiableCredential, IssueCredentialParams, VerificationResult, AuthResult, };
|
|
4
8
|
export { runMigrations, closeConnection } from './stub/db.js';
|
|
5
9
|
export { generateKeypair, decodePublicKey } from './stub/crypto.js';
|
|
6
10
|
export type { ChainConfig } from './chain/index.js';
|
|
7
11
|
export { createChainClient } from './chain/index.js';
|
|
12
|
+
export { recoverySigningMessage, signAsGuardian, buildRecover, submitRecover, buildSetRecoveryPolicy, } from './chain/recovery.js';
|
|
13
|
+
export type { GuardianApproval, RecoveryPolicy } from './chain/recovery.js';
|
|
8
14
|
export type { BbsDisclosedMessage, BbsCredentialProofResult, BbsCredentialRecord, } from './chain/bbs.js';
|
|
9
15
|
export { utf8ToHex, toHex } from './chain/bbs.js';
|
|
16
|
+
export type { ChainInfo, NativeToken } from './chain/chainInfo.js';
|
|
10
17
|
export { issueSdJwtVc, verifySdJwtVc, presentSdJwtVc, createStatusListJwt, ed25519PublicKeyToJwk, ed25519PublicKeyFromJwk, } from './sdjwt/index.js';
|
|
11
18
|
export type { IssueSdJwtVcParams, IssuedSdJwtVc, VerifySdJwtVcParams, PresentSdJwtVcParams, PresentationResult, CreateStatusListJwtParams, Ed25519Jwk, VerificationResult as SdJwtVerificationResult, } from './sdjwt/index.js';
|
|
12
19
|
export interface SolidusSDK {
|
|
13
20
|
did: {
|
|
21
|
+
/**
|
|
22
|
+
* Build (and sign) a `DidCreate` transaction without submitting it.
|
|
23
|
+
* Returns a content-addressed signed tx that can be relayed by any
|
|
24
|
+
* party — typically the user signs locally and a backend submits.
|
|
25
|
+
*
|
|
26
|
+
* The chain enforces `signer_pubkey == payload.public_key`
|
|
27
|
+
* (PublicKeyMismatch invariant), so `signerPrivateKey` MUST own the
|
|
28
|
+
* registered public key. When `publicKey` is omitted it is derived
|
|
29
|
+
* from the signing key — the common case.
|
|
30
|
+
*
|
|
31
|
+
* Available in chain mode; stub-mode implementation is minimal but
|
|
32
|
+
* shape-compatible (callers can write tests once and run in either).
|
|
33
|
+
*/
|
|
34
|
+
buildCreate(opts: {
|
|
35
|
+
signerPrivateKey: string;
|
|
36
|
+
publicKey?: string;
|
|
37
|
+
serviceEndpoints?: unknown[];
|
|
38
|
+
nonce?: number;
|
|
39
|
+
}): Promise<ChainTransaction>;
|
|
40
|
+
/**
|
|
41
|
+
* Submit a previously-built `DidCreate` transaction, poll its
|
|
42
|
+
* receipt, and return the DID descriptor. Accepts either the
|
|
43
|
+
* `ChainTransaction` object or a stringified JSON tx (the common
|
|
44
|
+
* shape for relay paths where the tx arrived as an HTTP body).
|
|
45
|
+
*/
|
|
46
|
+
submitCreate(signedTx: ChainTransaction | string): Promise<DID>;
|
|
47
|
+
/**
|
|
48
|
+
* Convenience wrapper for the case where the SDK's configured
|
|
49
|
+
* signer owns the public key being registered. Throws otherwise —
|
|
50
|
+
* use `buildCreate` + `submitCreate` for the relay pattern.
|
|
51
|
+
*/
|
|
14
52
|
create(publicKey: string): Promise<DID>;
|
|
15
53
|
resolve(did: string): Promise<DIDDocument | null>;
|
|
16
54
|
deactivate(did: string, signerKey: string): Promise<void>;
|
|
@@ -58,6 +96,65 @@ export interface SolidusSDK {
|
|
|
58
96
|
disclosedMessages: BbsDisclosedMessage[];
|
|
59
97
|
}): Promise<BbsCredentialProofResult>;
|
|
60
98
|
};
|
|
99
|
+
/**
|
|
100
|
+
* Low-level chain primitives. Used by relayer / onboarding paths that
|
|
101
|
+
* need to seed new accounts with native token before they can pay
|
|
102
|
+
* their first tx fee, or perform plain transfers outside of DID and
|
|
103
|
+
* credential semantics. Available only in chain mode — `undefined` in
|
|
104
|
+
* stub mode.
|
|
105
|
+
*/
|
|
106
|
+
chain?: {
|
|
107
|
+
/**
|
|
108
|
+
* Submit a `Transfer` transaction and wait for its receipt. Throws
|
|
109
|
+
* on a failed receipt. `toAddress` is a base58 address (the format
|
|
110
|
+
* `addressFromPublicKey` returns), not a public key.
|
|
111
|
+
*/
|
|
112
|
+
transfer(opts: {
|
|
113
|
+
signerPrivateKey: string;
|
|
114
|
+
toAddress: string;
|
|
115
|
+
amount: number;
|
|
116
|
+
nonce?: number;
|
|
117
|
+
}): Promise<{
|
|
118
|
+
tx_hash: string;
|
|
119
|
+
status: string;
|
|
120
|
+
block_height: number;
|
|
121
|
+
fee_paid: number;
|
|
122
|
+
events: Array<{
|
|
123
|
+
type: string;
|
|
124
|
+
[key: string]: unknown;
|
|
125
|
+
}>;
|
|
126
|
+
}>;
|
|
127
|
+
/** Balance (in base units) for the given base58 address. */
|
|
128
|
+
getBalance(address: string): Promise<number>;
|
|
129
|
+
/**
|
|
130
|
+
* Relay an ALREADY-SIGNED transaction (the caller signed it client-side) and wait for its
|
|
131
|
+
* receipt. Throws on a failed receipt. Used by relayer paths where the backend must NOT hold
|
|
132
|
+
* the user's key — e.g. DID recovery-policy set: the user signs in the browser, the backend
|
|
133
|
+
* only forwards the signed tx (and may sponsor-fund the sender first).
|
|
134
|
+
*/
|
|
135
|
+
sendTransaction(signedTx: unknown): Promise<{
|
|
136
|
+
txHash: string;
|
|
137
|
+
status: string;
|
|
138
|
+
}>;
|
|
139
|
+
/** The account's current nonce (next expected tx index) for the given base58 address. */
|
|
140
|
+
getNonce(address: string): Promise<number>;
|
|
141
|
+
/** The DID's on-chain recovery policy (guardian set + threshold) and the per-DID recovery nonce
|
|
142
|
+
* that guardian approvals must bind to. `recoveryPolicy` is null until a policy is set. */
|
|
143
|
+
getRecoveryInfo(did: string): Promise<{
|
|
144
|
+
recoveryPolicy: {
|
|
145
|
+
guardians: string[];
|
|
146
|
+
threshold: number;
|
|
147
|
+
delay_blocks: number;
|
|
148
|
+
} | null;
|
|
149
|
+
recoveryNonce: number;
|
|
150
|
+
}>;
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Fetch chain metadata (id, native token, genesis hash, latest height,
|
|
154
|
+
* node version) via the `solidus_chainInfo` RPC method. Available only in
|
|
155
|
+
* chain mode (testnet/mainnet) — `undefined` in stub mode.
|
|
156
|
+
*/
|
|
157
|
+
getChainInfo?(): Promise<ChainInfo>;
|
|
61
158
|
}
|
|
62
159
|
export interface SolidusConfig {
|
|
63
160
|
mode: 'stub' | 'testnet' | 'mainnet';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,GAAG,EAAE,WAAW,EAAE,oBAAoB,EACtC,qBAAqB,EAAE,kBAAkB,EAAE,UAAU,EACtD,MAAM,gBAAgB,CAAA;AAKvB,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EAEzB,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,GAAG,EAAE,WAAW,EAAE,oBAAoB,EACtC,qBAAqB,EAAE,kBAAkB,EAAE,UAAU,EACtD,MAAM,gBAAgB,CAAA;AAKvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAChF,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EAEzB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAErD,YAAY,EACV,GAAG,EAAE,WAAW,EAAE,oBAAoB,EACtC,qBAAqB,EAAE,kBAAkB,EAAE,UAAU,GACtD,CAAA;AACD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACnE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAGpD,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC3E,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACjD,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAMlE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,kBAAkB,CAAA;AACzB,YAAY,EACV,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,UAAU,EACV,kBAAkB,IAAI,uBAAuB,GAC9C,MAAM,kBAAkB,CAAA;AAEzB,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE;QACH;;;;;;;;;;;;WAYG;QACH,WAAW,CAAC,IAAI,EAAE;YAChB,gBAAgB,EAAE,MAAM,CAAA;YACxB,SAAS,CAAC,EAAE,MAAM,CAAA;YAClB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;YAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;SACf,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC7B;;;;;WAKG;QACH,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC/D;;;;WAIG;QACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QACvC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;QACjD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAC1D,CAAA;IACD,WAAW,EAAE;QACX,KAAK,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;QACnE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;QACjD,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9D,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAA;KAC3D,CAAA;IACD,IAAI,EAAE;QACJ,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAChD,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;KACvF,CAAA;IACD;;;OAGG;IACH,GAAG,CAAC,EAAE;QACJ,eAAe,CAAC,MAAM,EAAE;YACtB,gBAAgB,EAAE,MAAM,CAAA;YACxB,UAAU,EAAE,MAAM,CAAA;YAClB,cAAc,EAAE,MAAM,CAAA;YACtB,WAAW,EAAE,UAAU,CAAA;YACvB,SAAS,EAAE,UAAU,CAAA;YACrB,eAAe,EAAE,MAAM,CAAA;SACxB,GAAG,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;QACvE,WAAW,CAAC,MAAM,EAAE;YAClB,QAAQ,EAAE,MAAM,CAAA;YAChB,SAAS,EAAE,MAAM,CAAA;YACjB,SAAS,CAAC,EAAE,MAAM,CAAA;YAClB,KAAK,CAAC,EAAE,MAAM,CAAA;YACd,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;YACxC,iBAAiB,EAAE,MAAM,CAAA;SAC1B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACpB,qBAAqB,CAAC,MAAM,EAAE;YAC5B,YAAY,EAAE,MAAM,CAAA;YACpB,QAAQ,EAAE,MAAM,CAAA;YAChB,SAAS,CAAC,EAAE,MAAM,CAAA;YAClB,KAAK,CAAC,EAAE,MAAM,CAAA;YACd,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;SACzC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAA;KACtC,CAAA;IACD;;;;;;OAMG;IACH,KAAK,CAAC,EAAE;QACN;;;;WAIG;QACH,QAAQ,CAAC,IAAI,EAAE;YACb,gBAAgB,EAAE,MAAM,CAAA;YACxB,SAAS,EAAE,MAAM,CAAA;YACjB,MAAM,EAAE,MAAM,CAAA;YACd,KAAK,CAAC,EAAE,MAAM,CAAA;SACf,GAAG,OAAO,CAAC;YACV,OAAO,EAAE,MAAM,CAAA;YACf,MAAM,EAAE,MAAM,CAAA;YACd,YAAY,EAAE,MAAM,CAAA;YACpB,QAAQ,EAAE,MAAM,CAAA;YAChB,MAAM,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;aAAE,CAAC,CAAA;SACxD,CAAC,CAAA;QACF,4DAA4D;QAC5D,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAC5C;;;;;WAKG;QACH,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAC/E,yFAAyF;QACzF,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAC1C;oGAC4F;QAC5F,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;YACpC,cAAc,EAAE;gBAAE,SAAS,EAAE,MAAM,EAAE,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAC;gBAAC,YAAY,EAAE,MAAM,CAAA;aAAE,GAAG,IAAI,CAAA;YACvF,aAAa,EAAE,MAAM,CAAA;SACtB,CAAC,CAAA;KACH,CAAA;IACD;;;;OAIG;IACH,YAAY,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;IACpC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAoCD,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAiB3D"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { didCreate, didResolve, didDeactivate } from './stub/did.js';
|
|
2
|
+
import { didCreate, didResolve, didDeactivate, didBuildCreate, didSubmitCreate } from './stub/did.js';
|
|
3
3
|
import { credentialsIssue, credentialsVerify, credentialsRevoke, credentialsQuery } from './stub/credentials.js';
|
|
4
4
|
import { getSql } from './stub/db.js';
|
|
5
5
|
import { createChainClient } from './chain/index.js';
|
|
6
|
+
export { addressFromPublicKey, getAddressFromKey } from './chain/transaction.js';
|
|
6
7
|
export { runMigrations, closeConnection } from './stub/db.js';
|
|
7
8
|
export { generateKeypair, decodePublicKey } from './stub/crypto.js';
|
|
8
9
|
export { createChainClient } from './chain/index.js';
|
|
10
|
+
// DID social recovery (sub-projects #1/#2) — set a guardian policy, sign a guardian approval, and
|
|
11
|
+
// build/relay a DidRecover tx, byte-compatible with the Rust protocol primitive.
|
|
12
|
+
export { recoverySigningMessage, signAsGuardian, buildRecover, submitRecover, buildSetRecoveryPolicy, } from './chain/recovery.js';
|
|
9
13
|
export { utf8ToHex, toHex } from './chain/bbs.js';
|
|
10
14
|
// SD-JWT VC (selective-disclosure JWT, VC profile) — required for
|
|
11
15
|
// EUDI Wallet interop.
|
|
@@ -15,6 +19,8 @@ export { issueSdJwtVc, verifySdJwtVc, presentSdJwtVc, createStatusListJwt, ed255
|
|
|
15
19
|
function createStubSdk() {
|
|
16
20
|
return {
|
|
17
21
|
did: {
|
|
22
|
+
buildCreate: didBuildCreate,
|
|
23
|
+
submitCreate: didSubmitCreate,
|
|
18
24
|
create: didCreate,
|
|
19
25
|
resolve: didResolve,
|
|
20
26
|
deactivate: didDeactivate,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAKxC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/stub/credentials.js
CHANGED
|
@@ -13,7 +13,7 @@ function rowToVC(row) {
|
|
|
13
13
|
proof: {
|
|
14
14
|
type: 'Ed25519Signature2020',
|
|
15
15
|
created: row.issued_at.toISOString(),
|
|
16
|
-
verificationMethod: `${row.issuer_did}#key-
|
|
16
|
+
verificationMethod: `${row.issuer_did}#key-0`,
|
|
17
17
|
proofPurpose: 'assertionMethod',
|
|
18
18
|
proofValue: row.proof_value,
|
|
19
19
|
},
|
package/dist/stub/did.d.ts
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
import type { DID, DIDDocument } from '@solidus-network/types';
|
|
2
|
+
import type { ChainTransaction } from '../chain/transaction.js';
|
|
2
3
|
export declare function didCreate(publicKeyHex: string): Promise<DID>;
|
|
3
4
|
export declare function didResolve(did: string): Promise<DIDDocument | null>;
|
|
4
5
|
export declare function didDeactivate(did: string, _signerKey: string): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Stub-mode `buildCreate`. Produces a shape-compatible `ChainTransaction`
|
|
8
|
+
* envelope so callers can write a single relay-style code path that runs
|
|
9
|
+
* unchanged in stub and chain modes. The "signature" is meaningless in
|
|
10
|
+
* stub mode — there is no chain to verify against — but the payload is
|
|
11
|
+
* faithful so that `submitCreate` can extract `public_key`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function didBuildCreate(opts: {
|
|
14
|
+
signerPrivateKey: string;
|
|
15
|
+
publicKey?: string;
|
|
16
|
+
serviceEndpoints?: unknown[];
|
|
17
|
+
nonce?: number;
|
|
18
|
+
}): Promise<ChainTransaction>;
|
|
19
|
+
/**
|
|
20
|
+
* Stub-mode `submitCreate`. Parses the publicKey out of the supplied tx
|
|
21
|
+
* and delegates to the existing `didCreate` to insert the row.
|
|
22
|
+
*/
|
|
23
|
+
export declare function didSubmitCreate(signedTx: ChainTransaction | string): Promise<DID>;
|
|
5
24
|
//# sourceMappingURL=did.d.ts.map
|
package/dist/stub/did.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../../src/stub/did.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../../src/stub/did.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAY/D,wBAAsB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAWlE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAgCzE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlF;AAID;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0B5B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CASvF"}
|
package/dist/stub/did.js
CHANGED
|
@@ -21,7 +21,7 @@ export async function didResolve(did) {
|
|
|
21
21
|
if (rows.length === 0)
|
|
22
22
|
return null;
|
|
23
23
|
const row = rows[0];
|
|
24
|
-
const vmId = `${row.did}#key-
|
|
24
|
+
const vmId = `${row.did}#key-0`;
|
|
25
25
|
return {
|
|
26
26
|
'@context': [
|
|
27
27
|
'https://www.w3.org/ns/did/v1',
|
|
@@ -49,4 +49,58 @@ export async function didDeactivate(did, _signerKey) {
|
|
|
49
49
|
UPDATE stub_dids SET deactivated = true, updated_at = now() WHERE did = ${did}
|
|
50
50
|
`;
|
|
51
51
|
}
|
|
52
|
+
// ---------- buildCreate / submitCreate (stub) ----------
|
|
53
|
+
/**
|
|
54
|
+
* Stub-mode `buildCreate`. Produces a shape-compatible `ChainTransaction`
|
|
55
|
+
* envelope so callers can write a single relay-style code path that runs
|
|
56
|
+
* unchanged in stub and chain modes. The "signature" is meaningless in
|
|
57
|
+
* stub mode — there is no chain to verify against — but the payload is
|
|
58
|
+
* faithful so that `submitCreate` can extract `public_key`.
|
|
59
|
+
*/
|
|
60
|
+
export async function didBuildCreate(opts) {
|
|
61
|
+
if (!opts.signerPrivateKey || opts.signerPrivateKey.length !== 64) {
|
|
62
|
+
throw new Error('didBuildCreate (stub): signerPrivateKey must be a 64-char hex string');
|
|
63
|
+
}
|
|
64
|
+
// Derive the signer pubkey from the privkey hex deterministically. We
|
|
65
|
+
// do NOT run real ed25519 in the stub — for the stub the "pubkey" is
|
|
66
|
+
// simply a marker derived by reversing the privkey bytes. This is
|
|
67
|
+
// sufficient for shape compatibility; chain mode does real signing.
|
|
68
|
+
const signerPubBytes = hexToBytes(opts.signerPrivateKey).reverse();
|
|
69
|
+
const publicKey = opts.publicKey ?? Buffer.from(signerPubBytes).toString('hex');
|
|
70
|
+
if (publicKey.toLowerCase() !== Buffer.from(signerPubBytes).toString('hex').toLowerCase()) {
|
|
71
|
+
throw new Error(`didBuildCreate (stub): signerPrivateKey does not own publicKey (the SDK enforces this invariant in both modes)`);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
sender_pubkey: Array.from(signerPubBytes),
|
|
75
|
+
nonce: opts.nonce ?? 0,
|
|
76
|
+
payload: {
|
|
77
|
+
DidCreate: {
|
|
78
|
+
public_key: Array.from(hexToBytes(publicKey)),
|
|
79
|
+
service_endpoints: opts.serviceEndpoints ?? [],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
signature: Array(64).fill(0),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Stub-mode `submitCreate`. Parses the publicKey out of the supplied tx
|
|
87
|
+
* and delegates to the existing `didCreate` to insert the row.
|
|
88
|
+
*/
|
|
89
|
+
export async function didSubmitCreate(signedTx) {
|
|
90
|
+
const tx = typeof signedTx === 'string' ? JSON.parse(signedTx) : signedTx;
|
|
91
|
+
const payload = tx.payload;
|
|
92
|
+
const payloadPub = payload?.DidCreate?.public_key;
|
|
93
|
+
if (!Array.isArray(payloadPub) || payloadPub.length !== 32) {
|
|
94
|
+
throw new Error('didSubmitCreate (stub): tx is not a DidCreate with a 32-byte public_key');
|
|
95
|
+
}
|
|
96
|
+
const publicKeyHex = Buffer.from(Uint8Array.from(payloadPub)).toString('hex');
|
|
97
|
+
return didCreate(publicKeyHex);
|
|
98
|
+
}
|
|
99
|
+
function hexToBytes(hex) {
|
|
100
|
+
const out = new Uint8Array(hex.length / 2);
|
|
101
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
102
|
+
out[i / 2] = parseInt(hex.substring(i, i + 2), 16);
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
52
106
|
//# sourceMappingURL=did.js.map
|
package/dist/stub/did.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did.js","sourceRoot":"","sources":["../../src/stub/did.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"did.js","sourceRoot":"","sources":["../../src/stub/did.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidus-network/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Solidus Network SDK — DID resolution, verifiable credential issuance and verification, SD-JWT VC (EUDI-compatible), and on-chain queries via JSON-RPC.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"@noble/hashes": "^1.5.0",
|
|
18
18
|
"@sd-jwt/sd-jwt-vc": "^0.19.0",
|
|
19
19
|
"@sd-jwt/types": "^0.19.0",
|
|
20
|
-
"@solidus-network/auth": "0.
|
|
21
|
-
"@solidus-network/types": "0.
|
|
20
|
+
"@solidus-network/auth": "0.6.0",
|
|
21
|
+
"@solidus-network/types": "0.6.0",
|
|
22
22
|
"bs58": "^6.0.0",
|
|
23
23
|
"postgres": "^3.4.4"
|
|
24
24
|
},
|