@shieldedtech/moth-wallet 0.2.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/README.md +62 -0
- package/dist/contract/args-parser.d.ts +29 -0
- package/dist/contract/args-parser.d.ts.map +1 -0
- package/dist/contract/args-parser.js +123 -0
- package/dist/contract/args-parser.js.map +1 -0
- package/dist/contract/artifact-loader.d.ts +26 -0
- package/dist/contract/artifact-loader.d.ts.map +1 -0
- package/dist/contract/artifact-loader.js +129 -0
- package/dist/contract/artifact-loader.js.map +1 -0
- package/dist/contract/call.d.ts +32 -0
- package/dist/contract/call.d.ts.map +1 -0
- package/dist/contract/call.js +245 -0
- package/dist/contract/call.js.map +1 -0
- package/dist/contract/deploy.d.ts +36 -0
- package/dist/contract/deploy.d.ts.map +1 -0
- package/dist/contract/deploy.js +388 -0
- package/dist/contract/deploy.js.map +1 -0
- package/dist/contract/fungible-token.d.ts +40 -0
- package/dist/contract/fungible-token.d.ts.map +1 -0
- package/dist/contract/fungible-token.js +88 -0
- package/dist/contract/fungible-token.js.map +1 -0
- package/dist/contract/initial-private-state.d.ts +18 -0
- package/dist/contract/initial-private-state.d.ts.map +1 -0
- package/dist/contract/initial-private-state.js +44 -0
- package/dist/contract/initial-private-state.js.map +1 -0
- package/dist/contract/maintenance.d.ts +72 -0
- package/dist/contract/maintenance.d.ts.map +1 -0
- package/dist/contract/maintenance.js +430 -0
- package/dist/contract/maintenance.js.map +1 -0
- package/dist/contract/state.d.ts +16 -0
- package/dist/contract/state.d.ts.map +1 -0
- package/dist/contract/state.js +18 -0
- package/dist/contract/state.js.map +1 -0
- package/dist/contract/witness-loader.d.ts +3 -0
- package/dist/contract/witness-loader.d.ts.map +1 -0
- package/dist/contract/witness-loader.js +27 -0
- package/dist/contract/witness-loader.js.map +1 -0
- package/dist/daemon/api-keys.d.ts +66 -0
- package/dist/daemon/api-keys.d.ts.map +1 -0
- package/dist/daemon/api-keys.js +222 -0
- package/dist/daemon/api-keys.js.map +1 -0
- package/dist/daemon/audit-log.d.ts +65 -0
- package/dist/daemon/audit-log.d.ts.map +1 -0
- package/dist/daemon/audit-log.js +73 -0
- package/dist/daemon/audit-log.js.map +1 -0
- package/dist/daemon/client.d.ts +63 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +214 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/confirmation-queue.d.ts +46 -0
- package/dist/daemon/confirmation-queue.d.ts.map +1 -0
- package/dist/daemon/confirmation-queue.js +92 -0
- package/dist/daemon/confirmation-queue.js.map +1 -0
- package/dist/daemon/index.d.ts +23 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +26 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/protocol.d.ts +40 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +104 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/server.d.ts +158 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +297 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/wallet-handlers.d.ts +37 -0
- package/dist/daemon/wallet-handlers.d.ts.map +1 -0
- package/dist/daemon/wallet-handlers.js +533 -0
- package/dist/daemon/wallet-handlers.js.map +1 -0
- package/dist/daemon/wallet-rpc-parsers.d.ts +14 -0
- package/dist/daemon/wallet-rpc-parsers.d.ts.map +1 -0
- package/dist/daemon/wallet-rpc-parsers.js +259 -0
- package/dist/daemon/wallet-rpc-parsers.js.map +1 -0
- package/dist/daemon/wallet-rpc-types.d.ts +138 -0
- package/dist/daemon/wallet-rpc-types.d.ts.map +1 -0
- package/dist/daemon/wallet-rpc-types.js +11 -0
- package/dist/daemon/wallet-rpc-types.js.map +1 -0
- package/dist/diagnostics/fs-timing-store.d.ts +29 -0
- package/dist/diagnostics/fs-timing-store.d.ts.map +1 -0
- package/dist/diagnostics/fs-timing-store.js +81 -0
- package/dist/diagnostics/fs-timing-store.js.map +1 -0
- package/dist/diagnostics/timings.d.ts +64 -0
- package/dist/diagnostics/timings.d.ts.map +1 -0
- package/dist/diagnostics/timings.js +100 -0
- package/dist/diagnostics/timings.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/network/indexer-client.d.ts +66 -0
- package/dist/network/indexer-client.d.ts.map +1 -0
- package/dist/network/indexer-client.js +112 -0
- package/dist/network/indexer-client.js.map +1 -0
- package/dist/network/node-client.d.ts +27 -0
- package/dist/network/node-client.d.ts.map +1 -0
- package/dist/network/node-client.js +94 -0
- package/dist/network/node-client.js.map +1 -0
- package/dist/proof/client.d.ts +15 -0
- package/dist/proof/client.d.ts.map +1 -0
- package/dist/proof/client.js +77 -0
- package/dist/proof/client.js.map +1 -0
- package/dist/proof/provider.d.ts +12 -0
- package/dist/proof/provider.d.ts.map +1 -0
- package/dist/proof/provider.js +96 -0
- package/dist/proof/provider.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/midnight-provider.d.ts +11 -0
- package/dist/providers/midnight-provider.d.ts.map +1 -0
- package/dist/providers/midnight-provider.js +30 -0
- package/dist/providers/midnight-provider.js.map +1 -0
- package/dist/storage/adapter.d.ts +8 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +2 -0
- package/dist/storage/adapter.js.map +1 -0
- package/dist/storage/fs-adapter.d.ts +14 -0
- package/dist/storage/fs-adapter.d.ts.map +1 -0
- package/dist/storage/fs-adapter.js +126 -0
- package/dist/storage/fs-adapter.js.map +1 -0
- package/dist/storage/safe-path.d.ts +13 -0
- package/dist/storage/safe-path.d.ts.map +1 -0
- package/dist/storage/safe-path.js +35 -0
- package/dist/storage/safe-path.js.map +1 -0
- package/dist/sync/activity.d.ts +53 -0
- package/dist/sync/activity.d.ts.map +1 -0
- package/dist/sync/activity.js +92 -0
- package/dist/sync/activity.js.map +1 -0
- package/dist/sync/dust-registration-estimate.d.ts +54 -0
- package/dist/sync/dust-registration-estimate.d.ts.map +1 -0
- package/dist/sync/dust-registration-estimate.js +103 -0
- package/dist/sync/dust-registration-estimate.js.map +1 -0
- package/dist/sync/node-sync-store.d.ts +10 -0
- package/dist/sync/node-sync-store.d.ts.map +1 -0
- package/dist/sync/node-sync-store.js +42 -0
- package/dist/sync/node-sync-store.js.map +1 -0
- package/dist/sync/operations.d.ts +138 -0
- package/dist/sync/operations.d.ts.map +1 -0
- package/dist/sync/operations.js +395 -0
- package/dist/sync/operations.js.map +1 -0
- package/dist/sync/preseed-parts.d.ts +18 -0
- package/dist/sync/preseed-parts.d.ts.map +1 -0
- package/dist/sync/preseed-parts.js +33 -0
- package/dist/sync/preseed-parts.js.map +1 -0
- package/dist/sync/preseed.d.ts +95 -0
- package/dist/sync/preseed.d.ts.map +1 -0
- package/dist/sync/preseed.js +365 -0
- package/dist/sync/preseed.js.map +1 -0
- package/dist/sync/progress.d.ts +45 -0
- package/dist/sync/progress.d.ts.map +1 -0
- package/dist/sync/progress.js +51 -0
- package/dist/sync/progress.js.map +1 -0
- package/dist/sync/sdk-dedup.d.ts +53 -0
- package/dist/sync/sdk-dedup.d.ts.map +1 -0
- package/dist/sync/sdk-dedup.js +134 -0
- package/dist/sync/sdk-dedup.js.map +1 -0
- package/dist/sync/sync-store.d.ts +33 -0
- package/dist/sync/sync-store.d.ts.map +1 -0
- package/dist/sync/sync-store.js +45 -0
- package/dist/sync/sync-store.js.map +1 -0
- package/dist/sync/wallet-sync.d.ts +153 -0
- package/dist/sync/wallet-sync.d.ts.map +1 -0
- package/dist/sync/wallet-sync.js +943 -0
- package/dist/sync/wallet-sync.js.map +1 -0
- package/dist/types/errors.d.ts +18 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +33 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/exit-codes.d.ts +8 -0
- package/dist/types/exit-codes.d.ts.map +1 -0
- package/dist/types/exit-codes.js +7 -0
- package/dist/types/exit-codes.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/network.d.ts +65 -0
- package/dist/types/network.d.ts.map +1 -0
- package/dist/types/network.js +108 -0
- package/dist/types/network.js.map +1 -0
- package/dist/types/tokens.d.ts +3 -0
- package/dist/types/tokens.d.ts.map +1 -0
- package/dist/types/tokens.js +11 -0
- package/dist/types/tokens.js.map +1 -0
- package/dist/types/transaction.d.ts +13 -0
- package/dist/types/transaction.d.ts.map +1 -0
- package/dist/types/transaction.js +2 -0
- package/dist/types/transaction.js.map +1 -0
- package/dist/types/wallet.d.ts +82 -0
- package/dist/types/wallet.d.ts.map +1 -0
- package/dist/types/wallet.js +2 -0
- package/dist/types/wallet.js.map +1 -0
- package/dist/wallet/address-validate.d.ts +7 -0
- package/dist/wallet/address-validate.d.ts.map +1 -0
- package/dist/wallet/address-validate.js +28 -0
- package/dist/wallet/address-validate.js.map +1 -0
- package/dist/wallet/address.d.ts +32 -0
- package/dist/wallet/address.d.ts.map +1 -0
- package/dist/wallet/address.js +107 -0
- package/dist/wallet/address.js.map +1 -0
- package/dist/wallet/app-secret.d.ts +15 -0
- package/dist/wallet/app-secret.d.ts.map +1 -0
- package/dist/wallet/app-secret.js +45 -0
- package/dist/wallet/app-secret.js.map +1 -0
- package/dist/wallet/balance-format.d.ts +12 -0
- package/dist/wallet/balance-format.d.ts.map +1 -0
- package/dist/wallet/balance-format.js +51 -0
- package/dist/wallet/balance-format.js.map +1 -0
- package/dist/wallet/batch-transfer.d.ts +36 -0
- package/dist/wallet/batch-transfer.d.ts.map +1 -0
- package/dist/wallet/batch-transfer.js +93 -0
- package/dist/wallet/batch-transfer.js.map +1 -0
- package/dist/wallet/keystore.d.ts +16 -0
- package/dist/wallet/keystore.d.ts.map +1 -0
- package/dist/wallet/keystore.js +76 -0
- package/dist/wallet/keystore.js.map +1 -0
- package/dist/wallet/manager.d.ts +77 -0
- package/dist/wallet/manager.d.ts.map +1 -0
- package/dist/wallet/manager.js +474 -0
- package/dist/wallet/manager.js.map +1 -0
- package/dist/wallet/mnemonic.d.ts +5 -0
- package/dist/wallet/mnemonic.d.ts.map +1 -0
- package/dist/wallet/mnemonic.js +28 -0
- package/dist/wallet/mnemonic.js.map +1 -0
- package/dist/wallet/sign-message.d.ts +20 -0
- package/dist/wallet/sign-message.d.ts.map +1 -0
- package/dist/wallet/sign-message.js +58 -0
- package/dist/wallet/sign-message.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
// Shared RPC handler factory for the wallet daemon. Both the TUI host
|
|
2
|
+
// (packages/tui/src/hooks/useDaemonHost.ts) and the headless host
|
|
3
|
+
// (packages/cli/src/commands/daemon/serve.ts) call this with the same
|
|
4
|
+
// dependency bundle and get the same Record<string, RpcHandler> back.
|
|
5
|
+
//
|
|
6
|
+
// Until this file existed, each host had its own copy of every
|
|
7
|
+
// handler body. Each new verb meant editing two files in lockstep.
|
|
8
|
+
// This factory takes the verb count from O(2N) edits down to O(N).
|
|
9
|
+
import { resolve as resolvePath } from 'node:path';
|
|
10
|
+
import { pathToFileURL } from 'node:url';
|
|
11
|
+
import { Buffer } from 'node:buffer';
|
|
12
|
+
import * as ledger from '@midnight-ntwrk/ledger-v8';
|
|
13
|
+
import { DaemonProtocolError } from './protocol.js';
|
|
14
|
+
import { parseSubmitTransactionParams, parseTransferTokensParams, parseCallCircuitParams, parseDeployContractParams, parseDustRegisterParams, parseDustDeregisterParams, parseInsertVerifierKeyParams, parseInsertVerifierKeysBatchParams, shortenAddress, shortenHex, } from './wallet-rpc-parsers.js';
|
|
15
|
+
import { sendTokensWithKeys, designateForDustWithKeys, dedesignateFromDustWithKeys } from '../sync/operations.js';
|
|
16
|
+
import { callCircuit } from '../contract/call.js';
|
|
17
|
+
import { deployContract } from '../contract/deploy.js';
|
|
18
|
+
import { insertVerifierKey, insertVerifierKeys } from '../contract/maintenance.js';
|
|
19
|
+
import { loadContractArtifact } from '../contract/artifact-loader.js';
|
|
20
|
+
import { parseArgs, toPositionalArgs } from '../contract/args-parser.js';
|
|
21
|
+
import { resolveInitialPrivateState } from '../contract/initial-private-state.js';
|
|
22
|
+
import { clearSyncCache } from '../sync/wallet-sync.js';
|
|
23
|
+
import { NIGHT_DENOMINATION, formatBalance } from '../wallet/balance-format.js';
|
|
24
|
+
const NIGHT_TOKEN_ID = '0'.repeat(64);
|
|
25
|
+
// callCircuit / deployContract / insertVerifierKey all take a
|
|
26
|
+
// CallOptions-style `keys: DerivedKeys` field that is unused at
|
|
27
|
+
// runtime; we pass an empty stand-in so we don't have to keep the
|
|
28
|
+
// BIP-39 seed available. The actual key material flows via
|
|
29
|
+
// walletKeys. See docs/spec/wallet-service/05-key-management.md
|
|
30
|
+
// D-KM-3.
|
|
31
|
+
const DUMMY_DERIVED_KEYS = {
|
|
32
|
+
nightExternal: new Uint8Array(),
|
|
33
|
+
nightInternal: new Uint8Array(),
|
|
34
|
+
dust: new Uint8Array(),
|
|
35
|
+
zswap: new Uint8Array(),
|
|
36
|
+
metadata: new Uint8Array(),
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Build the wallet daemon's RPC handler map. Same map for both hosting
|
|
40
|
+
* sites; differences are entirely in the deps object.
|
|
41
|
+
*/
|
|
42
|
+
export function buildWalletHandlers(deps) {
|
|
43
|
+
const { walletName, network, getFacade, getWalletKeys, getBalances, queue } = deps;
|
|
44
|
+
const log = deps.log ?? (() => { });
|
|
45
|
+
const auditLog = deps.auditLog;
|
|
46
|
+
/** Resolve facade + walletKeys or throw INTERNAL_ERROR. */
|
|
47
|
+
const requireReady = () => {
|
|
48
|
+
const facade = getFacade();
|
|
49
|
+
const walletKeys = getWalletKeys();
|
|
50
|
+
if (!facade || !walletKeys) {
|
|
51
|
+
throw new DaemonProtocolError('INTERNAL_ERROR', 'wallet facade not ready — host is still initializing');
|
|
52
|
+
}
|
|
53
|
+
return { facade, walletKeys };
|
|
54
|
+
};
|
|
55
|
+
/** Wrap a section that may throw into an INTERNAL_ERROR with a
|
|
56
|
+
* verb-prefixed message. DaemonProtocolError throws are re-thrown
|
|
57
|
+
* unchanged so handler-side INVALID_PARAMS / UNAUTHORIZED reach
|
|
58
|
+
* the wire intact. */
|
|
59
|
+
const wrap = async (verb, fn) => {
|
|
60
|
+
try {
|
|
61
|
+
return await fn();
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof DaemonProtocolError)
|
|
65
|
+
throw err;
|
|
66
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
67
|
+
throw new DaemonProtocolError('INTERNAL_ERROR', `${verb} failed: ${msg}`);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Single helper that fuses the L3 confirmation step, the wrap()
|
|
72
|
+
* error mapping, and the audit-log emission for every write verb.
|
|
73
|
+
*
|
|
74
|
+
* - Asks the queue for approval; logs `user-denied` and throws
|
|
75
|
+
* UNAUTHORIZED if the user said no.
|
|
76
|
+
* - Tags the decision as `auto-approve` or `user-approve` based on
|
|
77
|
+
* the queue's mode so the audit captures whether a human or the
|
|
78
|
+
* arming flag let it through.
|
|
79
|
+
* - Runs `fn`, then records the resolved outcome — either the
|
|
80
|
+
* result (with optional `extract` for cherry-picking txHash /
|
|
81
|
+
* contractAddress / status) or the error.
|
|
82
|
+
* - Re-throws DaemonProtocolError unchanged; wraps anything else
|
|
83
|
+
* as INTERNAL_ERROR (matching the old `wrap` behavior).
|
|
84
|
+
*
|
|
85
|
+
* Each handler thus becomes a single call:
|
|
86
|
+
*
|
|
87
|
+
* return withAudit(verb, summary, details, async () => {...}, extract);
|
|
88
|
+
*
|
|
89
|
+
* The audit log is optional. When `deps.auditLog` is omitted (e.g.
|
|
90
|
+
* in unit tests), every record() call is a no-op and the surface
|
|
91
|
+
* behaviour is exactly the pre-audit code path.
|
|
92
|
+
*/
|
|
93
|
+
const withAudit = async (verb, summary, details, ctx, fn, extract) => {
|
|
94
|
+
// Captures the connection's transport + apiKeyId once at the
|
|
95
|
+
// start of the call so the audit entry survives ctx mutations
|
|
96
|
+
// (e.g. if a sibling auth call landed mid-op, which shouldn't
|
|
97
|
+
// happen with the per-conn lock but is cheap insurance).
|
|
98
|
+
const connTags = ctx
|
|
99
|
+
? { transport: ctx.remote, apiKeyId: ctx.apiKeyId, connId: ctx.id }
|
|
100
|
+
: {};
|
|
101
|
+
const approved = await queue.request(summary, details);
|
|
102
|
+
if (!approved) {
|
|
103
|
+
auditLog?.recordRpc({
|
|
104
|
+
wallet: walletName,
|
|
105
|
+
network: network.id,
|
|
106
|
+
verb,
|
|
107
|
+
summary,
|
|
108
|
+
details,
|
|
109
|
+
decision: 'user-denied',
|
|
110
|
+
...connTags,
|
|
111
|
+
});
|
|
112
|
+
throw new DaemonProtocolError('UNAUTHORIZED', `user denied ${verb}`);
|
|
113
|
+
}
|
|
114
|
+
const decision = queue.isAutoApprove ? 'auto-approve' : 'user-approve';
|
|
115
|
+
try {
|
|
116
|
+
const result = await fn();
|
|
117
|
+
const extracted = extract?.(result) ?? {};
|
|
118
|
+
auditLog?.recordRpc({
|
|
119
|
+
wallet: walletName,
|
|
120
|
+
network: network.id,
|
|
121
|
+
verb,
|
|
122
|
+
summary,
|
|
123
|
+
details,
|
|
124
|
+
decision,
|
|
125
|
+
...extracted,
|
|
126
|
+
...connTags,
|
|
127
|
+
});
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const isDaemonErr = err instanceof DaemonProtocolError;
|
|
132
|
+
const code = isDaemonErr ? err.code : 'INTERNAL_ERROR';
|
|
133
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
134
|
+
auditLog?.recordRpc({
|
|
135
|
+
wallet: walletName,
|
|
136
|
+
network: network.id,
|
|
137
|
+
verb,
|
|
138
|
+
summary,
|
|
139
|
+
details,
|
|
140
|
+
decision,
|
|
141
|
+
error: { code, message },
|
|
142
|
+
...connTags,
|
|
143
|
+
});
|
|
144
|
+
if (isDaemonErr)
|
|
145
|
+
throw err;
|
|
146
|
+
throw new DaemonProtocolError('INTERNAL_ERROR', `${verb} failed: ${message}`);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
const handlers = {
|
|
150
|
+
// ─────────────────────────────────────────────────────────────────
|
|
151
|
+
// getState
|
|
152
|
+
// ─────────────────────────────────────────────────────────────────
|
|
153
|
+
getState: () => {
|
|
154
|
+
const b = getBalances();
|
|
155
|
+
const f = getFacade();
|
|
156
|
+
if (!b || !f)
|
|
157
|
+
return { ready: false };
|
|
158
|
+
return {
|
|
159
|
+
ready: true,
|
|
160
|
+
walletName,
|
|
161
|
+
networkId: network.id,
|
|
162
|
+
synced: b.synced,
|
|
163
|
+
syncProgress: b.syncProgress,
|
|
164
|
+
balances: {
|
|
165
|
+
shielded: serializeBigintRecord(b.shielded),
|
|
166
|
+
unshielded: serializeBigintRecord(b.unshielded),
|
|
167
|
+
dust: b.dust.toString(),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
},
|
|
171
|
+
// ─────────────────────────────────────────────────────────────────
|
|
172
|
+
// clearSyncCache
|
|
173
|
+
// ─────────────────────────────────────────────────────────────────
|
|
174
|
+
clearSyncCache: async (_params, ctx) => {
|
|
175
|
+
return withAudit('clearSyncCache', `Clear sync cache for ${walletName} on ${network.id}?`, [
|
|
176
|
+
'Removes the local serialized wallet state.',
|
|
177
|
+
'Next sync will start from genesis (slow).',
|
|
178
|
+
], ctx, async () => {
|
|
179
|
+
clearSyncCache(walletName, network.id);
|
|
180
|
+
return { cleared: true };
|
|
181
|
+
});
|
|
182
|
+
},
|
|
183
|
+
// ─────────────────────────────────────────────────────────────────
|
|
184
|
+
// submitTransaction
|
|
185
|
+
// ─────────────────────────────────────────────────────────────────
|
|
186
|
+
submitTransaction: async (rawParams, ctx) => {
|
|
187
|
+
const params = parseSubmitTransactionParams(rawParams);
|
|
188
|
+
const { facade } = requireReady();
|
|
189
|
+
return withAudit('submitTransaction', params.summary ?? 'Submit a pre-built transaction', [
|
|
190
|
+
`Wallet: ${walletName}`,
|
|
191
|
+
`Network: ${network.id}`,
|
|
192
|
+
`Tx size: ${Math.floor(params.hex.length / 2)} bytes`,
|
|
193
|
+
...(params.details ?? []),
|
|
194
|
+
], ctx, async () => {
|
|
195
|
+
let tx;
|
|
196
|
+
try {
|
|
197
|
+
tx = ledger.Transaction.deserialize('signature', 'proof', 'binding', Buffer.from(params.hex, 'hex'));
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
201
|
+
throw new DaemonProtocolError('INVALID_PARAMS', `failed to deserialize hex as FinalizedTransaction: ${msg}`);
|
|
202
|
+
}
|
|
203
|
+
const txId = await facade.submitTransaction(tx);
|
|
204
|
+
return { txId: String(txId) };
|
|
205
|
+
}, (r) => ({ txHash: r.txId }));
|
|
206
|
+
},
|
|
207
|
+
// ─────────────────────────────────────────────────────────────────
|
|
208
|
+
// transferTokens
|
|
209
|
+
// ─────────────────────────────────────────────────────────────────
|
|
210
|
+
transferTokens: async (rawParams, ctx) => {
|
|
211
|
+
const params = parseTransferTokensParams(rawParams);
|
|
212
|
+
const { facade, walletKeys } = requireReady();
|
|
213
|
+
const amountBig = BigInt(params.amount);
|
|
214
|
+
const amountLabel = params.tokenId === NIGHT_TOKEN_ID
|
|
215
|
+
? `${formatBalance(amountBig, NIGHT_DENOMINATION)} NIGHT`
|
|
216
|
+
: `${params.amount} raw (token ${shortenHex(params.tokenId)})`;
|
|
217
|
+
const toLabel = shortenAddress(params.to);
|
|
218
|
+
return withAudit('transferTokens', params.summary ?? `Send ${amountLabel} to ${toLabel}`, [
|
|
219
|
+
`Wallet: ${walletName}`,
|
|
220
|
+
`Network: ${network.id}`,
|
|
221
|
+
`Type: ${params.type}`,
|
|
222
|
+
`Token: ${params.tokenId === NIGHT_TOKEN_ID ? 'NIGHT' : params.tokenId}`,
|
|
223
|
+
`Recipient: ${params.to}`,
|
|
224
|
+
`Amount: ${amountLabel}`,
|
|
225
|
+
...(deps.maxSpendRaw !== undefined
|
|
226
|
+
? [`Spend cap: ${formatBalance(deps.maxSpendRaw, NIGHT_DENOMINATION)} NIGHT per transfer`]
|
|
227
|
+
: []),
|
|
228
|
+
...(params.details ?? []),
|
|
229
|
+
], ctx, async () => {
|
|
230
|
+
// Headless spend cap: with no human to approve, a NIGHT transfer
|
|
231
|
+
// above the operator-set --max-spend is refused. Recorded as a
|
|
232
|
+
// failed decision in the audit log via withAudit's catch.
|
|
233
|
+
if (deps.maxSpendRaw !== undefined &&
|
|
234
|
+
params.tokenId === NIGHT_TOKEN_ID &&
|
|
235
|
+
amountBig > deps.maxSpendRaw) {
|
|
236
|
+
throw new DaemonProtocolError('UNAUTHORIZED', `transfer of ${amountLabel} exceeds the --max-spend cap of ${formatBalance(deps.maxSpendRaw, NIGHT_DENOMINATION)} NIGHT`);
|
|
237
|
+
}
|
|
238
|
+
const txId = await sendTokensWithKeys(facade, walletKeys, network.id, [{
|
|
239
|
+
type: params.type,
|
|
240
|
+
tokenId: params.tokenId,
|
|
241
|
+
amount: amountBig,
|
|
242
|
+
to: params.to,
|
|
243
|
+
}], (stage) => log('info', `[transferTokens] ${stage}`));
|
|
244
|
+
return { txId: String(txId) };
|
|
245
|
+
}, (r) => ({ txHash: r.txId }));
|
|
246
|
+
},
|
|
247
|
+
// ─────────────────────────────────────────────────────────────────
|
|
248
|
+
// callCircuit
|
|
249
|
+
// ─────────────────────────────────────────────────────────────────
|
|
250
|
+
callCircuit: async (rawParams, ctx) => {
|
|
251
|
+
const params = parseCallCircuitParams(rawParams);
|
|
252
|
+
const { facade, walletKeys } = requireReady();
|
|
253
|
+
const artifactAbs = resolvePath(params.artifactPath);
|
|
254
|
+
const witnessesAbs = params.witnessesPath ? resolvePath(params.witnessesPath) : undefined;
|
|
255
|
+
let artifact;
|
|
256
|
+
try {
|
|
257
|
+
artifact = await loadContractArtifact(artifactAbs);
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
261
|
+
throw new DaemonProtocolError('INVALID_PARAMS', `failed to load artifact at ${artifactAbs}: ${msg}`);
|
|
262
|
+
}
|
|
263
|
+
if (!artifact.circuits.includes(params.circuitName)) {
|
|
264
|
+
throw new DaemonProtocolError('INVALID_PARAMS', `artifact has no circuit named "${params.circuitName}". Available: ${artifact.circuits.join(', ')}`);
|
|
265
|
+
}
|
|
266
|
+
const circuitArgs = params.args ? await parseArgs(params.args) : {};
|
|
267
|
+
return withAudit('callCircuit', params.summary ?? `Call ${params.circuitName} on ${shortenAddress(params.contractAddress)}`, [
|
|
268
|
+
`Wallet: ${walletName}`,
|
|
269
|
+
`Network: ${network.id}`,
|
|
270
|
+
`Contract: ${params.contractAddress}`,
|
|
271
|
+
`Circuit: ${params.circuitName}`,
|
|
272
|
+
`Artifact: ${artifact.path}`,
|
|
273
|
+
witnessesAbs ? `Witnesses: ${witnessesAbs}` : 'Witnesses: (none)',
|
|
274
|
+
`Args: ${params.args ?? '(none)'}`,
|
|
275
|
+
...(params.details ?? []),
|
|
276
|
+
], ctx, async () => {
|
|
277
|
+
// Witness provider lives on the daemon-host filesystem;
|
|
278
|
+
// import here so we can include it in the CallOptions below.
|
|
279
|
+
let witnesses;
|
|
280
|
+
if (witnessesAbs) {
|
|
281
|
+
try {
|
|
282
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
283
|
+
const mod = (await import(pathToFileURL(witnessesAbs).href));
|
|
284
|
+
witnesses = mod.default ?? mod;
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
288
|
+
throw new DaemonProtocolError('INTERNAL_ERROR', `failed to import witnesses module at ${witnessesAbs}: ${msg}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const syncedWalletShim = { facade };
|
|
292
|
+
const result = await callCircuit({
|
|
293
|
+
contractAddress: params.contractAddress,
|
|
294
|
+
circuitName: params.circuitName,
|
|
295
|
+
args: circuitArgs,
|
|
296
|
+
keys: DUMMY_DERIVED_KEYS,
|
|
297
|
+
walletKeys,
|
|
298
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
299
|
+
witnesses: witnesses,
|
|
300
|
+
network,
|
|
301
|
+
artifactPath: artifact.path,
|
|
302
|
+
syncedWallet: syncedWalletShim,
|
|
303
|
+
projectDir: params.projectDir ? resolvePath(params.projectDir) : undefined,
|
|
304
|
+
timeoutMs: params.timeoutSec ? params.timeoutSec * 1000 : 120_000,
|
|
305
|
+
});
|
|
306
|
+
return flattenTxResult(result);
|
|
307
|
+
}, (r) => ({
|
|
308
|
+
txHash: r.txHash,
|
|
309
|
+
contractAddress: r.contractAddress ?? undefined,
|
|
310
|
+
status: r.status,
|
|
311
|
+
}));
|
|
312
|
+
},
|
|
313
|
+
// ─────────────────────────────────────────────────────────────────
|
|
314
|
+
// deployContract
|
|
315
|
+
// ─────────────────────────────────────────────────────────────────
|
|
316
|
+
deployContract: async (rawParams, ctx) => {
|
|
317
|
+
const params = parseDeployContractParams(rawParams);
|
|
318
|
+
const { facade, walletKeys } = requireReady();
|
|
319
|
+
const artifactAbs = resolvePath(params.artifactPath);
|
|
320
|
+
const witnessesAbs = params.witnessesPath ? resolvePath(params.witnessesPath) : undefined;
|
|
321
|
+
let artifact;
|
|
322
|
+
try {
|
|
323
|
+
artifact = await loadContractArtifact(artifactAbs);
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
327
|
+
throw new DaemonProtocolError('INVALID_PARAMS', `failed to load artifact at ${artifactAbs}: ${msg}`);
|
|
328
|
+
}
|
|
329
|
+
return withAudit('deployContract', params.summary ?? `Deploy contract from ${shortenAddress(artifact.path)}`, [
|
|
330
|
+
`Wallet: ${walletName}`,
|
|
331
|
+
`Network: ${network.id}`,
|
|
332
|
+
`Artifact: ${artifact.path}`,
|
|
333
|
+
`Circuits: ${artifact.circuits.length} (${artifact.circuits.slice(0, 5).join(', ')}${artifact.circuits.length > 5 ? ', …' : ''})`,
|
|
334
|
+
witnessesAbs ? `Witnesses: ${witnessesAbs}` : 'Witnesses: (none)',
|
|
335
|
+
`Constructor args: ${params.args ?? '(none)'}`,
|
|
336
|
+
...(params.details ?? []),
|
|
337
|
+
], ctx, async () => {
|
|
338
|
+
// Forward constructor args + initial private state, mirroring the
|
|
339
|
+
// in-process `moth deploy` path (same JSON conventions via parseArgs).
|
|
340
|
+
const constructorArgs = toPositionalArgs(params.args ? await parseArgs(params.args) : undefined);
|
|
341
|
+
const initialPrivateState = await resolveInitialPrivateState(params.privateState, witnessesAbs, { onVerbose: (m) => log('info', `[deployContract] ${m}`) });
|
|
342
|
+
const syncedWalletShim = { facade };
|
|
343
|
+
const result = await deployContract({
|
|
344
|
+
artifact,
|
|
345
|
+
walletKeys,
|
|
346
|
+
network,
|
|
347
|
+
syncedWallet: syncedWalletShim,
|
|
348
|
+
witnessPath: witnessesAbs,
|
|
349
|
+
projectDir: params.projectDir ? resolvePath(params.projectDir) : undefined,
|
|
350
|
+
timeoutMs: params.timeoutSec ? params.timeoutSec * 1000 : 120_000,
|
|
351
|
+
args: constructorArgs,
|
|
352
|
+
initialPrivateState,
|
|
353
|
+
onProgress: (stage) => log('info', `[deployContract] ${stage}`),
|
|
354
|
+
});
|
|
355
|
+
return flattenTxResult(result);
|
|
356
|
+
}, (r) => ({
|
|
357
|
+
txHash: r.txHash,
|
|
358
|
+
contractAddress: r.contractAddress ?? undefined,
|
|
359
|
+
status: r.status,
|
|
360
|
+
}));
|
|
361
|
+
},
|
|
362
|
+
// ─────────────────────────────────────────────────────────────────
|
|
363
|
+
// dustRegister / dustDeregister
|
|
364
|
+
// ─────────────────────────────────────────────────────────────────
|
|
365
|
+
dustRegister: async (rawParams, ctx) => {
|
|
366
|
+
const params = parseDustRegisterParams(rawParams);
|
|
367
|
+
const { facade, walletKeys } = requireReady();
|
|
368
|
+
return withAudit('dustRegister', params.summary ?? 'Register NIGHT UTXOs for DUST generation', [
|
|
369
|
+
`Wallet: ${walletName}`,
|
|
370
|
+
`Network: ${network.id}`,
|
|
371
|
+
params.receiver ? `Dust receiver: ${params.receiver}` : 'Dust receiver: (this wallet)',
|
|
372
|
+
'Scope: every currently-unregistered NIGHT UTXO',
|
|
373
|
+
...(params.details ?? []),
|
|
374
|
+
], ctx, async () => {
|
|
375
|
+
const txId = await designateForDustWithKeys(facade, walletKeys, network.id, params.receiver, (stage) => log('info', `[dustRegister] ${stage}`));
|
|
376
|
+
return { txId, registered: txId !== null };
|
|
377
|
+
}, (r) => ({ txHash: r.txId ?? undefined }));
|
|
378
|
+
},
|
|
379
|
+
dustDeregister: async (rawParams, ctx) => {
|
|
380
|
+
const params = parseDustDeregisterParams(rawParams);
|
|
381
|
+
const { facade, walletKeys } = requireReady();
|
|
382
|
+
return withAudit('dustDeregister', params.summary ?? 'Deregister NIGHT UTXOs from DUST generation', [
|
|
383
|
+
`Wallet: ${walletName}`,
|
|
384
|
+
`Network: ${network.id}`,
|
|
385
|
+
'Scope: every currently-registered NIGHT UTXO',
|
|
386
|
+
'Effect: DUST will stop generating from these UTXOs.',
|
|
387
|
+
...(params.details ?? []),
|
|
388
|
+
], ctx, async () => {
|
|
389
|
+
try {
|
|
390
|
+
const txId = await dedesignateFromDustWithKeys(facade, walletKeys, network.id, (stage) => log('info', `[dustDeregister] ${stage}`));
|
|
391
|
+
return { txId };
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
395
|
+
// Map the core's plain-Error "nothing to deregister"
|
|
396
|
+
// condition onto INVALID_PARAMS so the CLI renders
|
|
397
|
+
// INVALID_INPUT.
|
|
398
|
+
if (msg.includes('No registered NIGHT UTXOs')) {
|
|
399
|
+
throw new DaemonProtocolError('INVALID_PARAMS', msg);
|
|
400
|
+
}
|
|
401
|
+
// Anything else: let withAudit's catch wrap it as
|
|
402
|
+
// INTERNAL_ERROR (same shape as the old wrap() path).
|
|
403
|
+
throw err;
|
|
404
|
+
}
|
|
405
|
+
}, (r) => ({ txHash: r.txId }));
|
|
406
|
+
},
|
|
407
|
+
// ─────────────────────────────────────────────────────────────────
|
|
408
|
+
// insertVerifierKey / insertVerifierKeysBatch
|
|
409
|
+
// ─────────────────────────────────────────────────────────────────
|
|
410
|
+
insertVerifierKey: async (rawParams, ctx) => {
|
|
411
|
+
const params = parseInsertVerifierKeyParams(rawParams);
|
|
412
|
+
const { facade, walletKeys } = requireReady();
|
|
413
|
+
const artifactAbs = resolvePath(params.artifactPath);
|
|
414
|
+
const vkAbs = resolvePath(params.verifierKeyPath);
|
|
415
|
+
let artifact;
|
|
416
|
+
try {
|
|
417
|
+
artifact = await loadContractArtifact(artifactAbs);
|
|
418
|
+
}
|
|
419
|
+
catch (err) {
|
|
420
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
421
|
+
throw new DaemonProtocolError('INVALID_PARAMS', `failed to load artifact at ${artifactAbs}: ${msg}`);
|
|
422
|
+
}
|
|
423
|
+
if (!artifact.circuits.includes(params.circuitId)) {
|
|
424
|
+
throw new DaemonProtocolError('INVALID_PARAMS', `artifact has no circuit named "${params.circuitId}". Available: ${artifact.circuits.join(', ')}`);
|
|
425
|
+
}
|
|
426
|
+
return withAudit('insertVerifierKey', params.summary ?? `Insert verifier key for ${params.circuitId} on ${shortenAddress(params.contractAddress)}`, [
|
|
427
|
+
`Wallet: ${walletName}`,
|
|
428
|
+
`Network: ${network.id}`,
|
|
429
|
+
`Contract: ${params.contractAddress}`,
|
|
430
|
+
`Circuit: ${params.circuitId}`,
|
|
431
|
+
`Artifact: ${artifact.path}`,
|
|
432
|
+
`VK file: ${vkAbs}`,
|
|
433
|
+
...(params.details ?? []),
|
|
434
|
+
], ctx, async () => {
|
|
435
|
+
const syncedWalletShim = { facade };
|
|
436
|
+
const result = await insertVerifierKey({
|
|
437
|
+
contractAddress: params.contractAddress,
|
|
438
|
+
circuitId: params.circuitId,
|
|
439
|
+
verifierKeyPath: vkAbs,
|
|
440
|
+
keys: DUMMY_DERIVED_KEYS,
|
|
441
|
+
walletKeys,
|
|
442
|
+
network,
|
|
443
|
+
artifactPath: artifact.path,
|
|
444
|
+
syncedWallet: syncedWalletShim,
|
|
445
|
+
projectDir: params.projectDir ? resolvePath(params.projectDir) : undefined,
|
|
446
|
+
timeoutMs: params.timeoutSec ? params.timeoutSec * 1000 : 120_000,
|
|
447
|
+
});
|
|
448
|
+
return flattenTxResult(result);
|
|
449
|
+
}, (r) => ({ txHash: r.txHash, status: r.status }));
|
|
450
|
+
},
|
|
451
|
+
insertVerifierKeysBatch: async (rawParams, ctx) => {
|
|
452
|
+
const params = parseInsertVerifierKeysBatchParams(rawParams);
|
|
453
|
+
const { facade, walletKeys } = requireReady();
|
|
454
|
+
const artifactAbs = resolvePath(params.artifactPath);
|
|
455
|
+
let artifact;
|
|
456
|
+
try {
|
|
457
|
+
artifact = await loadContractArtifact(artifactAbs);
|
|
458
|
+
}
|
|
459
|
+
catch (err) {
|
|
460
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
461
|
+
throw new DaemonProtocolError('INVALID_PARAMS', `failed to load artifact at ${artifactAbs}: ${msg}`);
|
|
462
|
+
}
|
|
463
|
+
for (const e of params.entries) {
|
|
464
|
+
if (!artifact.circuits.includes(e.circuitId)) {
|
|
465
|
+
throw new DaemonProtocolError('INVALID_PARAMS', `artifact has no circuit named "${e.circuitId}". Available: ${artifact.circuits.join(', ')}`);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return withAudit('insertVerifierKeysBatch', params.summary ?? `Batch-insert ${params.entries.length} verifier key${params.entries.length === 1 ? '' : 's'} on ${shortenAddress(params.contractAddress)}`, [
|
|
469
|
+
`Wallet: ${walletName}`,
|
|
470
|
+
`Network: ${network.id}`,
|
|
471
|
+
`Contract: ${params.contractAddress}`,
|
|
472
|
+
`Artifact: ${artifact.path}`,
|
|
473
|
+
`Circuits: ${params.entries.map((e) => e.circuitId).join(', ')}`,
|
|
474
|
+
params.skipExisting ? 'Mode: skip-already-defined' : 'Mode: insert all',
|
|
475
|
+
...(params.details ?? []),
|
|
476
|
+
], ctx, async () => {
|
|
477
|
+
const syncedWalletShim = { facade };
|
|
478
|
+
const entries = params.entries.map((e) => ({
|
|
479
|
+
circuitId: e.circuitId,
|
|
480
|
+
verifierKeyPath: resolvePath(e.verifierKeyPath),
|
|
481
|
+
}));
|
|
482
|
+
const result = await insertVerifierKeys({
|
|
483
|
+
contractAddress: params.contractAddress,
|
|
484
|
+
entries,
|
|
485
|
+
keys: DUMMY_DERIVED_KEYS,
|
|
486
|
+
walletKeys,
|
|
487
|
+
network,
|
|
488
|
+
artifactPath: artifact.path,
|
|
489
|
+
syncedWallet: syncedWalletShim,
|
|
490
|
+
projectDir: params.projectDir ? resolvePath(params.projectDir) : undefined,
|
|
491
|
+
skipExisting: params.skipExisting,
|
|
492
|
+
timeoutMs: params.timeoutSec ? params.timeoutSec * 1000 : 120_000,
|
|
493
|
+
onProgress: (e) => log('info', `[insertVerifierKeys] ${e.circuitId}: ${e.status}${e.txHash ? ` tx=${e.txHash}` : ''}`),
|
|
494
|
+
});
|
|
495
|
+
return {
|
|
496
|
+
contractAddress: result.contractAddress,
|
|
497
|
+
total: result.total,
|
|
498
|
+
inserted: result.inserted,
|
|
499
|
+
skipped: result.skipped,
|
|
500
|
+
failed: result.failed,
|
|
501
|
+
entries: result.entries,
|
|
502
|
+
};
|
|
503
|
+
}, (r) => ({
|
|
504
|
+
contractAddress: r.contractAddress,
|
|
505
|
+
status: `${r.inserted}/${r.total} inserted (${r.skipped} skipped, ${r.failed} failed)`,
|
|
506
|
+
}));
|
|
507
|
+
},
|
|
508
|
+
};
|
|
509
|
+
// Scope annotations. `getState` is the only read-class verb today;
|
|
510
|
+
// everything else implicitly gets the server's default of 'write'.
|
|
511
|
+
// Adding a new read-only verb? Tag it here so a read-scope key can
|
|
512
|
+
// call it. Adding a write verb? Don't bother — the default already
|
|
513
|
+
// covers it.
|
|
514
|
+
handlers.getState.scope = 'read';
|
|
515
|
+
return handlers;
|
|
516
|
+
}
|
|
517
|
+
function serializeBigintRecord(r) {
|
|
518
|
+
const out = {};
|
|
519
|
+
for (const [k, v] of Object.entries(r))
|
|
520
|
+
out[k] = v.toString();
|
|
521
|
+
return out;
|
|
522
|
+
}
|
|
523
|
+
function flattenTxResult(r) {
|
|
524
|
+
return {
|
|
525
|
+
txHash: r.hash,
|
|
526
|
+
status: r.status,
|
|
527
|
+
blockHash: r.blockHash,
|
|
528
|
+
blockHeight: r.blockHeight,
|
|
529
|
+
contractAddress: r.contractAddress,
|
|
530
|
+
fees: r.fees,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
//# sourceMappingURL=wallet-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-handlers.js","sourceRoot":"","sources":["../../src/daemon/wallet-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DaemonCallCircuitParams, DaemonDeployContractParams, DaemonDustDeregisterParams, DaemonDustRegisterParams, DaemonInsertVerifierKeyParams, DaemonInsertVerifierKeysBatchParams, DaemonSubmitTransactionParams, DaemonTransferTokensParams } from './wallet-rpc-types.js';
|
|
2
|
+
/** Truncate a hex string to <prefix>…<suffix>. */
|
|
3
|
+
export declare function shortenHex(hex: string): string;
|
|
4
|
+
/** Truncate a bech32m-style address. */
|
|
5
|
+
export declare function shortenAddress(addr: string): string;
|
|
6
|
+
export declare function parseSubmitTransactionParams(raw: unknown): DaemonSubmitTransactionParams;
|
|
7
|
+
export declare function parseTransferTokensParams(raw: unknown): DaemonTransferTokensParams;
|
|
8
|
+
export declare function parseCallCircuitParams(raw: unknown): DaemonCallCircuitParams;
|
|
9
|
+
export declare function parseDeployContractParams(raw: unknown): DaemonDeployContractParams;
|
|
10
|
+
export declare function parseDustRegisterParams(raw: unknown): DaemonDustRegisterParams;
|
|
11
|
+
export declare function parseDustDeregisterParams(raw: unknown): DaemonDustDeregisterParams;
|
|
12
|
+
export declare function parseInsertVerifierKeyParams(raw: unknown): DaemonInsertVerifierKeyParams;
|
|
13
|
+
export declare function parseInsertVerifierKeysBatchParams(raw: unknown): DaemonInsertVerifierKeysBatchParams;
|
|
14
|
+
//# sourceMappingURL=wallet-rpc-parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-rpc-parsers.d.ts","sourceRoot":"","sources":["../../src/daemon/wallet-rpc-parsers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,mCAAmC,EACnC,6BAA6B,EAC7B,0BAA0B,EAC3B,MAAM,uBAAuB,CAAC;AA8B/B,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAMD,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,6BAA6B,CAcxF;AAMD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,0BAA0B,CAuClF;AAMD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,uBAAuB,CA2B5E;AAMD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,0BAA0B,CAmBlF;AAMD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAe9E;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,0BAA0B,CAUlF;AAMD,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,6BAA6B,CA2BxF;AAED,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,OAAO,GAAG,mCAAmC,CAqCpG"}
|