@solidus-network/sdk 0.2.0 → 0.5.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 +43 -0
- package/dist/chain/did.d.ts.map +1 -1
- package/dist/chain/did.js +111 -49
- package/dist/chain/did.js.map +1 -1
- package/dist/chain/index.d.ts.map +1 -1
- package/dist/chain/index.js +7 -0
- package/dist/chain/index.js.map +1 -1
- 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 +32 -0
- package/dist/chain/transfer.js.map +1 -0
- package/dist/index.d.ts +76 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/sdjwt/index.d.ts +5 -1
- package/dist/sdjwt/index.d.ts.map +1 -1
- package/dist/sdjwt/index.js +3 -0
- package/dist/sdjwt/index.js.map +1 -1
- package/dist/sdjwt/issue.d.ts.map +1 -1
- package/dist/sdjwt/issue.js +49 -8
- package/dist/sdjwt/issue.js.map +1 -1
- package/dist/sdjwt/present.d.ts +15 -0
- package/dist/sdjwt/present.d.ts.map +1 -0
- package/dist/sdjwt/present.js +80 -0
- package/dist/sdjwt/present.js.map +1 -0
- package/dist/sdjwt/signer.d.ts +16 -0
- package/dist/sdjwt/signer.d.ts.map +1 -1
- package/dist/sdjwt/signer.js +27 -0
- package/dist/sdjwt/signer.js.map +1 -1
- package/dist/sdjwt/status-list.d.ts +61 -0
- package/dist/sdjwt/status-list.d.ts.map +1 -0
- package/dist/sdjwt/status-list.js +63 -0
- package/dist/sdjwt/status-list.js.map +1 -0
- package/dist/sdjwt/types.d.ts +96 -5
- package/dist/sdjwt/types.d.ts.map +1 -1
- package/dist/sdjwt/verify.d.ts +17 -4
- package/dist/sdjwt/verify.d.ts.map +1 -1
- package/dist/sdjwt/verify.js +171 -22
- package/dist/sdjwt/verify.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":"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"}
|
package/dist/chain/did.d.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
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';
|
|
11
12
|
/**
|
|
12
13
|
* W3C DID Resolution result — preserves the deactivated state separately
|
|
13
14
|
* from the document. Mirrors the shape defined in
|
|
@@ -31,7 +32,49 @@ export interface DIDResolutionResult {
|
|
|
31
32
|
error?: 'notFound' | 'invalidDid';
|
|
32
33
|
};
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Options for {@link createChainDid}().buildCreate — produces a signed
|
|
37
|
+
* DidCreate transaction without submitting it.
|
|
38
|
+
*
|
|
39
|
+
* Defaults are designed so that the most common case ("I have a key, I
|
|
40
|
+
* want to register its DID") requires only `signerPrivateKey`.
|
|
41
|
+
*/
|
|
42
|
+
export interface BuildDidCreateOptions {
|
|
43
|
+
/**
|
|
44
|
+
* Hex-encoded 32-byte Ed25519 private key that signs the transaction.
|
|
45
|
+
* The chain enforces `signer_pubkey == payload.public_key` (via the
|
|
46
|
+
* `PublicKeyMismatch` invariant), so this key MUST own the `publicKey`
|
|
47
|
+
* field below. If `publicKey` is omitted, it is derived from this key.
|
|
48
|
+
*/
|
|
49
|
+
signerPrivateKey: string;
|
|
50
|
+
/**
|
|
51
|
+
* Hex-encoded 32-byte Ed25519 public key to register. Must match
|
|
52
|
+
* `signerPrivateKey`'s derived pubkey. Omit to use the signer's own
|
|
53
|
+
* pubkey — that is the typical case.
|
|
54
|
+
*/
|
|
55
|
+
publicKey?: string;
|
|
56
|
+
/** Optional service endpoints baked into the DID document at creation. */
|
|
57
|
+
serviceEndpoints?: unknown[];
|
|
58
|
+
/**
|
|
59
|
+
* Override the nonce. Omit to fetch it via `solidus_getNonce`. The
|
|
60
|
+
* override is here for relay paths that already know the nonce (e.g.
|
|
61
|
+
* a frontend that read it just before signing).
|
|
62
|
+
*/
|
|
63
|
+
nonce?: number;
|
|
64
|
+
}
|
|
34
65
|
export declare function createChainDid(rpc: RpcClient, config: ChainConfig): {
|
|
66
|
+
buildCreate: (opts: BuildDidCreateOptions) => Promise<ChainTransaction>;
|
|
67
|
+
submitCreate: (signedTx: ChainTransaction | string) => Promise<DID>;
|
|
68
|
+
/**
|
|
69
|
+
* Convenience wrapper for the case where the SDK's configured
|
|
70
|
+
* `signerPrivateKey` IS the owner of the public key being registered.
|
|
71
|
+
*
|
|
72
|
+
* Throws if the signer doesn't own `publicKey` — the old behavior of
|
|
73
|
+
* "sign with the shared signer, register someone else's key" was a
|
|
74
|
+
* bug (the chain rejects via `PublicKeyMismatch`); use
|
|
75
|
+
* {@link buildCreate} + {@link submitCreate} for the relay pattern
|
|
76
|
+
* (frontend signs locally, backend relays).
|
|
77
|
+
*/
|
|
35
78
|
create(publicKey: string): Promise<DID>;
|
|
36
79
|
resolve(did: string): Promise<DIDDocument | null>;
|
|
37
80
|
/**
|
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;AAoCzB;;;;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;CACF;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;oBA+B9C,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
|
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,CAajE"}
|
package/dist/chain/index.js
CHANGED
|
@@ -9,6 +9,8 @@ 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';
|
|
12
14
|
export function createChainClient(config) {
|
|
13
15
|
const rpc = new RpcClient(config.rpcUrl);
|
|
14
16
|
return {
|
|
@@ -16,6 +18,11 @@ export function createChainClient(config) {
|
|
|
16
18
|
credentials: createChainCredentials(rpc, config),
|
|
17
19
|
auth: createChainAuth(rpc, config),
|
|
18
20
|
bbs: createChainBbs(rpc, config),
|
|
21
|
+
chain: {
|
|
22
|
+
transfer: createChainTransfer(rpc),
|
|
23
|
+
getBalance: async (address) => rpc.call('solidus_getBalance', [address]),
|
|
24
|
+
},
|
|
25
|
+
getChainInfo: createChainInfo(rpc),
|
|
19
26
|
};
|
|
20
27
|
}
|
|
21
28
|
//# 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;AAenD,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,CAAC;YAClC,UAAU,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAS,oBAAoB,EAAE,CAAC,OAAO,CAAC,CAAC;SACzF;QACD,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC;KACnC,CAAA;AACH,CAAC"}
|
|
@@ -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): (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,IAOjB,MAAM,eAAe,KAAG,OAAO,CAAC,UAAU,CAAC,CA0B3E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import bs58 from 'bs58';
|
|
2
|
+
import { buildTransaction, pollReceipt } from './transaction.js';
|
|
3
|
+
export function createChainTransfer(rpc) {
|
|
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
|
+
// Resolve nonce.
|
|
19
|
+
const { getAddressFromKey } = await import('./transaction.js');
|
|
20
|
+
const senderAddress = await getAddressFromKey(signerPrivateKey);
|
|
21
|
+
const nonce = opts.nonce ?? (await rpc.call('solidus_getNonce', [senderAddress]));
|
|
22
|
+
const payload = { Transfer: { to: Array.from(toBytes), amount } };
|
|
23
|
+
const tx = await buildTransaction(signerPrivateKey, nonce, payload);
|
|
24
|
+
const txHash = await rpc.call('solidus_sendTransaction', [JSON.stringify(tx)]);
|
|
25
|
+
const receipt = await pollReceipt(rpc, txHash);
|
|
26
|
+
if (!receipt.status.startsWith('success')) {
|
|
27
|
+
throw new Error(`Transfer failed: ${receipt.status}`);
|
|
28
|
+
}
|
|
29
|
+
return receipt;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# 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;IAChD;;;;;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,iBAAiB;QACjB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAA;QAC9D,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;QAC/D,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"}
|