@did-btcr2/aggregation 0.1.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/LICENSE +373 -0
- package/README.md +19 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/browser.js +24017 -0
- package/dist/browser.mjs +24011 -0
- package/dist/cjs/index.js +5690 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/beacon-strategy.js +76 -0
- package/dist/esm/beacon-strategy.js.map +1 -0
- package/dist/esm/cohort.js +316 -0
- package/dist/esm/cohort.js.map +1 -0
- package/dist/esm/conditions.js +102 -0
- package/dist/esm/conditions.js.map +1 -0
- package/dist/esm/errors.js +22 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/fallback-spend.js +132 -0
- package/dist/esm/fallback-spend.js.map +1 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logger.js +15 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/messages/base.js +36 -0
- package/dist/esm/messages/base.js.map +1 -0
- package/dist/esm/messages/bodies.js +149 -0
- package/dist/esm/messages/bodies.js.map +1 -0
- package/dist/esm/messages/constants.js +37 -0
- package/dist/esm/messages/constants.js.map +1 -0
- package/dist/esm/messages/factories.js +139 -0
- package/dist/esm/messages/factories.js.map +1 -0
- package/dist/esm/messages/guards.js +40 -0
- package/dist/esm/messages/guards.js.map +1 -0
- package/dist/esm/messages/index.js +6 -0
- package/dist/esm/messages/index.js.map +1 -0
- package/dist/esm/participant.js +588 -0
- package/dist/esm/participant.js.map +1 -0
- package/dist/esm/phases.js +45 -0
- package/dist/esm/phases.js.map +1 -0
- package/dist/esm/recovery-policy.js +156 -0
- package/dist/esm/recovery-policy.js.map +1 -0
- package/dist/esm/recovery-spend.js +106 -0
- package/dist/esm/recovery-spend.js.map +1 -0
- package/dist/esm/runner/aggregation-runner.js +75 -0
- package/dist/esm/runner/aggregation-runner.js.map +1 -0
- package/dist/esm/runner/events.js +2 -0
- package/dist/esm/runner/events.js.map +1 -0
- package/dist/esm/runner/index.js +6 -0
- package/dist/esm/runner/index.js.map +1 -0
- package/dist/esm/runner/participant-runner.js +407 -0
- package/dist/esm/runner/participant-runner.js.map +1 -0
- package/dist/esm/runner/service-runner.js +701 -0
- package/dist/esm/runner/service-runner.js.map +1 -0
- package/dist/esm/runner/typed-emitter.js +80 -0
- package/dist/esm/runner/typed-emitter.js.map +1 -0
- package/dist/esm/service.js +774 -0
- package/dist/esm/service.js.map +1 -0
- package/dist/esm/signer.js +33 -0
- package/dist/esm/signer.js.map +1 -0
- package/dist/esm/signing-session.js +195 -0
- package/dist/esm/signing-session.js.map +1 -0
- package/dist/esm/transport/didcomm.js +41 -0
- package/dist/esm/transport/didcomm.js.map +1 -0
- package/dist/esm/transport/error.js +12 -0
- package/dist/esm/transport/error.js.map +1 -0
- package/dist/esm/transport/factory.js +29 -0
- package/dist/esm/transport/factory.js.map +1 -0
- package/dist/esm/transport/http/client.js +342 -0
- package/dist/esm/transport/http/client.js.map +1 -0
- package/dist/esm/transport/http/envelope.js +126 -0
- package/dist/esm/transport/http/envelope.js.map +1 -0
- package/dist/esm/transport/http/errors.js +11 -0
- package/dist/esm/transport/http/errors.js.map +1 -0
- package/dist/esm/transport/http/inbox-buffer.js +45 -0
- package/dist/esm/transport/http/inbox-buffer.js.map +1 -0
- package/dist/esm/transport/http/index.js +12 -0
- package/dist/esm/transport/http/index.js.map +1 -0
- package/dist/esm/transport/http/nonce-cache.js +38 -0
- package/dist/esm/transport/http/nonce-cache.js.map +1 -0
- package/dist/esm/transport/http/protocol.js +28 -0
- package/dist/esm/transport/http/protocol.js.map +1 -0
- package/dist/esm/transport/http/rate-limiter.js +45 -0
- package/dist/esm/transport/http/rate-limiter.js.map +1 -0
- package/dist/esm/transport/http/request-auth.js +100 -0
- package/dist/esm/transport/http/request-auth.js.map +1 -0
- package/dist/esm/transport/http/server.js +475 -0
- package/dist/esm/transport/http/server.js.map +1 -0
- package/dist/esm/transport/http/sse-stream.js +110 -0
- package/dist/esm/transport/http/sse-stream.js.map +1 -0
- package/dist/esm/transport/http/sse-writer.js +25 -0
- package/dist/esm/transport/http/sse-writer.js.map +1 -0
- package/dist/esm/transport/in-memory.js +149 -0
- package/dist/esm/transport/in-memory.js.map +1 -0
- package/dist/esm/transport/index.js +8 -0
- package/dist/esm/transport/index.js.map +1 -0
- package/dist/esm/transport/nostr.js +491 -0
- package/dist/esm/transport/nostr.js.map +1 -0
- package/dist/esm/transport/transport.js +2 -0
- package/dist/esm/transport/transport.js.map +1 -0
- package/dist/types/beacon-strategy.d.ts +56 -0
- package/dist/types/beacon-strategy.d.ts.map +1 -0
- package/dist/types/cohort.d.ts +188 -0
- package/dist/types/cohort.d.ts.map +1 -0
- package/dist/types/conditions.d.ts +86 -0
- package/dist/types/conditions.d.ts.map +1 -0
- package/dist/types/errors.d.ts +14 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/fallback-spend.d.ts +94 -0
- package/dist/types/fallback-spend.d.ts.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger.d.ts +22 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/messages/base.d.ts +58 -0
- package/dist/types/messages/base.d.ts.map +1 -0
- package/dist/types/messages/bodies.d.ts +177 -0
- package/dist/types/messages/bodies.d.ts.map +1 -0
- package/dist/types/messages/constants.d.ts +31 -0
- package/dist/types/messages/constants.d.ts.map +1 -0
- package/dist/types/messages/factories.d.ts +217 -0
- package/dist/types/messages/factories.d.ts.map +1 -0
- package/dist/types/messages/guards.d.ts +11 -0
- package/dist/types/messages/guards.d.ts.map +1 -0
- package/dist/types/messages/index.d.ts +6 -0
- package/dist/types/messages/index.d.ts.map +1 -0
- package/dist/types/participant.d.ts +162 -0
- package/dist/types/participant.d.ts.map +1 -0
- package/dist/types/phases.d.ts +55 -0
- package/dist/types/phases.d.ts.map +1 -0
- package/dist/types/recovery-policy.d.ts +132 -0
- package/dist/types/recovery-policy.d.ts.map +1 -0
- package/dist/types/recovery-spend.d.ts +94 -0
- package/dist/types/recovery-spend.d.ts.map +1 -0
- package/dist/types/runner/aggregation-runner.d.ts +72 -0
- package/dist/types/runner/aggregation-runner.d.ts.map +1 -0
- package/dist/types/runner/events.d.ts +147 -0
- package/dist/types/runner/events.d.ts.map +1 -0
- package/dist/types/runner/index.d.ts +6 -0
- package/dist/types/runner/index.d.ts.map +1 -0
- package/dist/types/runner/participant-runner.d.ts +122 -0
- package/dist/types/runner/participant-runner.d.ts.map +1 -0
- package/dist/types/runner/service-runner.d.ts +228 -0
- package/dist/types/runner/service-runner.d.ts.map +1 -0
- package/dist/types/runner/typed-emitter.d.ts +41 -0
- package/dist/types/runner/typed-emitter.d.ts.map +1 -0
- package/dist/types/service.d.ts +177 -0
- package/dist/types/service.d.ts.map +1 -0
- package/dist/types/signer.d.ts +50 -0
- package/dist/types/signer.d.ts.map +1 -0
- package/dist/types/signing-session.d.ts +81 -0
- package/dist/types/signing-session.d.ts.map +1 -0
- package/dist/types/transport/didcomm.d.ts +23 -0
- package/dist/types/transport/didcomm.d.ts.map +1 -0
- package/dist/types/transport/error.d.ts +8 -0
- package/dist/types/transport/error.d.ts.map +1 -0
- package/dist/types/transport/factory.d.ts +28 -0
- package/dist/types/transport/factory.d.ts.map +1 -0
- package/dist/types/transport/http/client.d.ts +56 -0
- package/dist/types/transport/http/client.d.ts.map +1 -0
- package/dist/types/transport/http/envelope.d.ts +64 -0
- package/dist/types/transport/http/envelope.d.ts.map +1 -0
- package/dist/types/transport/http/errors.d.ts +9 -0
- package/dist/types/transport/http/errors.d.ts.map +1 -0
- package/dist/types/transport/http/inbox-buffer.d.ts +32 -0
- package/dist/types/transport/http/inbox-buffer.d.ts.map +1 -0
- package/dist/types/transport/http/index.d.ts +12 -0
- package/dist/types/transport/http/index.d.ts.map +1 -0
- package/dist/types/transport/http/nonce-cache.d.ts +26 -0
- package/dist/types/transport/http/nonce-cache.d.ts.map +1 -0
- package/dist/types/transport/http/protocol.d.ts +53 -0
- package/dist/types/transport/http/protocol.d.ts.map +1 -0
- package/dist/types/transport/http/rate-limiter.d.ts +41 -0
- package/dist/types/transport/http/rate-limiter.d.ts.map +1 -0
- package/dist/types/transport/http/request-auth.d.ts +50 -0
- package/dist/types/transport/http/request-auth.d.ts.map +1 -0
- package/dist/types/transport/http/server.d.ts +118 -0
- package/dist/types/transport/http/server.d.ts.map +1 -0
- package/dist/types/transport/http/sse-stream.d.ts +34 -0
- package/dist/types/transport/http/sse-stream.d.ts.map +1 -0
- package/dist/types/transport/http/sse-writer.d.ts +12 -0
- package/dist/types/transport/http/sse-writer.d.ts.map +1 -0
- package/dist/types/transport/in-memory.d.ts +64 -0
- package/dist/types/transport/in-memory.d.ts.map +1 -0
- package/dist/types/transport/index.d.ts +8 -0
- package/dist/types/transport/index.d.ts.map +1 -0
- package/dist/types/transport/nostr.d.ts +153 -0
- package/dist/types/transport/nostr.d.ts.map +1 -0
- package/dist/types/transport/transport.d.ts +62 -0
- package/dist/types/transport/transport.d.ts.map +1 -0
- package/package.json +128 -0
- package/src/beacon-strategy.ts +142 -0
- package/src/cohort.ts +422 -0
- package/src/conditions.ts +172 -0
- package/src/errors.ts +25 -0
- package/src/fallback-spend.ts +223 -0
- package/src/index.ts +23 -0
- package/src/logger.ts +33 -0
- package/src/messages/base.ts +80 -0
- package/src/messages/bodies.ts +328 -0
- package/src/messages/constants.ts +40 -0
- package/src/messages/factories.ts +297 -0
- package/src/messages/guards.ts +61 -0
- package/src/messages/index.ts +5 -0
- package/src/participant.ts +779 -0
- package/src/phases.ts +91 -0
- package/src/recovery-policy.ts +237 -0
- package/src/recovery-spend.ts +192 -0
- package/src/runner/aggregation-runner.ts +125 -0
- package/src/runner/events.ts +129 -0
- package/src/runner/index.ts +5 -0
- package/src/runner/participant-runner.ts +488 -0
- package/src/runner/service-runner.ts +891 -0
- package/src/runner/typed-emitter.ts +87 -0
- package/src/service.ts +1000 -0
- package/src/signer.ts +67 -0
- package/src/signing-session.ts +290 -0
- package/src/transport/didcomm.ts +59 -0
- package/src/transport/error.ts +13 -0
- package/src/transport/factory.ts +65 -0
- package/src/transport/http/client.ts +409 -0
- package/src/transport/http/envelope.ts +204 -0
- package/src/transport/http/errors.ts +11 -0
- package/src/transport/http/inbox-buffer.ts +53 -0
- package/src/transport/http/index.ts +11 -0
- package/src/transport/http/nonce-cache.ts +43 -0
- package/src/transport/http/protocol.ts +57 -0
- package/src/transport/http/rate-limiter.ts +75 -0
- package/src/transport/http/request-auth.ts +164 -0
- package/src/transport/http/server.ts +617 -0
- package/src/transport/http/sse-stream.ts +121 -0
- package/src/transport/http/sse-writer.ts +23 -0
- package/src/transport/in-memory.ts +178 -0
- package/src/transport/index.ts +7 -0
- package/src/transport/nostr.ts +576 -0
- package/src/transport/transport.ts +79 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
import { canonicalHash } from '@did-btcr2/common';
|
|
2
|
+
import { schnorr } from '@noble/curves/secp256k1.js';
|
|
3
|
+
import { bytesToHex, hexToBytes } from '@noble/hashes/utils';
|
|
4
|
+
import { Script, Transaction } from '@scure/btc-signer';
|
|
5
|
+
import { getBeaconStrategy } from './beacon-strategy.js';
|
|
6
|
+
import { AggregationCohort } from './cohort.js';
|
|
7
|
+
import { AggregationParticipantError } from './errors.js';
|
|
8
|
+
import { fallbackSighash } from './fallback-spend.js';
|
|
9
|
+
import { buildFallbackLeaf } from './recovery-policy.js';
|
|
10
|
+
import { isCohortAdvertMessage } from './messages/bodies.js';
|
|
11
|
+
import { AGGREGATION_WIRE_VERSION } from './messages/base.js';
|
|
12
|
+
import { AGGREGATED_NONCE, AUTHORIZATION_REQUEST, COHORT_ADVERT, COHORT_OPT_IN_ACCEPT, COHORT_READY, DISTRIBUTE_AGGREGATED_DATA, FALLBACK_AUTHORIZATION_REQUEST, } from './messages/constants.js';
|
|
13
|
+
import { createCohortOptInMessage, createFallbackSignatureMessage, createNonceContributionMessage, createSignatureAuthorizationMessage, createSubmitNonIncludedMessage, createSubmitUpdateMessage, createValidationAckMessage, } from './messages/factories.js';
|
|
14
|
+
import { ParticipantCohortPhase } from './phases.js';
|
|
15
|
+
import { BeaconSigningSession } from './signing-session.js';
|
|
16
|
+
/**
|
|
17
|
+
* True if `tx` has an OP_RETURN output whose payload equals the 32-byte signal
|
|
18
|
+
* `signalHex`. A member binds its fallback signature to the exact signal it
|
|
19
|
+
* validated, so a coordinator that drives the fallback output selection cannot
|
|
20
|
+
* anchor a different announcement (a stale signal, or one whose CAS/SMT root
|
|
21
|
+
* omits the member's update) under the member's signature.
|
|
22
|
+
*/
|
|
23
|
+
function txEmbedsSignal(tx, signalHex) {
|
|
24
|
+
let expected;
|
|
25
|
+
try {
|
|
26
|
+
expected = hexToBytes(signalHex);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (expected.length === 0)
|
|
32
|
+
return false;
|
|
33
|
+
for (let i = 0; i < tx.outputsLength; i++) {
|
|
34
|
+
const script = tx.getOutput(i)?.script;
|
|
35
|
+
if (!script)
|
|
36
|
+
continue;
|
|
37
|
+
let decoded;
|
|
38
|
+
try {
|
|
39
|
+
decoded = Script.decode(script);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (decoded.length === 2 && decoded[0] === 'RETURN' && decoded[1] instanceof Uint8Array) {
|
|
45
|
+
const payload = decoded[1];
|
|
46
|
+
if (payload.length === expected.length && payload.every((b, j) => b === expected[j]))
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sans-I/O state machine for an Aggregation Participant.
|
|
54
|
+
*
|
|
55
|
+
* Manages multiple cohorts simultaneously. The client app drives the state
|
|
56
|
+
* machine via `receive()` (for incoming messages) and explicit action methods
|
|
57
|
+
* (for user decisions). All outgoing messages are returned for the caller to
|
|
58
|
+
* send via whatever transport.
|
|
59
|
+
*
|
|
60
|
+
* @class AggregationParticipant
|
|
61
|
+
*/
|
|
62
|
+
export class AggregationParticipant {
|
|
63
|
+
did;
|
|
64
|
+
/** MuSig2 signing capability. The raw secret never lives as a field here. */
|
|
65
|
+
#signer;
|
|
66
|
+
/** Per-cohort state, keyed by cohortId. */
|
|
67
|
+
#cohortStates = new Map();
|
|
68
|
+
constructor({ did, signer }) {
|
|
69
|
+
this.did = did;
|
|
70
|
+
this.#signer = signer;
|
|
71
|
+
}
|
|
72
|
+
/** The participant's compressed (33-byte) MuSig2 public key. Not secret. */
|
|
73
|
+
get publicKey() {
|
|
74
|
+
return this.#signer.publicKey;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Process an incoming message. Updates internal state but never produces
|
|
78
|
+
* outgoing messages: those come exclusively from action methods.
|
|
79
|
+
*/
|
|
80
|
+
receive(message) {
|
|
81
|
+
// Reject messages whose wire version doesn't match what this build speaks.
|
|
82
|
+
if (message.version === undefined || message.version !== AGGREGATION_WIRE_VERSION) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const type = message.type;
|
|
86
|
+
switch (type) {
|
|
87
|
+
case COHORT_ADVERT:
|
|
88
|
+
this.#handleCohortAdvert(message);
|
|
89
|
+
break;
|
|
90
|
+
case COHORT_OPT_IN_ACCEPT:
|
|
91
|
+
this.#handleOptInAccept(message);
|
|
92
|
+
break;
|
|
93
|
+
case COHORT_READY:
|
|
94
|
+
this.#handleCohortReady(message);
|
|
95
|
+
break;
|
|
96
|
+
case DISTRIBUTE_AGGREGATED_DATA:
|
|
97
|
+
this.#handleDistributeAggregatedData(message);
|
|
98
|
+
break;
|
|
99
|
+
case AUTHORIZATION_REQUEST:
|
|
100
|
+
this.#handleAuthorizationRequest(message);
|
|
101
|
+
break;
|
|
102
|
+
case AGGREGATED_NONCE:
|
|
103
|
+
this.#handleAggregatedNonce(message);
|
|
104
|
+
break;
|
|
105
|
+
case FALLBACK_AUTHORIZATION_REQUEST:
|
|
106
|
+
this.#handleFallbackAuthorizationRequest(message);
|
|
107
|
+
break;
|
|
108
|
+
default:
|
|
109
|
+
// Unknown message type, silently ignore
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Cohorts the participant has discovered but not yet joined. */
|
|
114
|
+
get discoveredCohorts() {
|
|
115
|
+
const map = new Map();
|
|
116
|
+
for (const [id, state] of this.#cohortStates) {
|
|
117
|
+
if (state.phase === ParticipantCohortPhase.Discovered && state.advert) {
|
|
118
|
+
map.set(id, state.advert);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return map;
|
|
122
|
+
}
|
|
123
|
+
#handleCohortAdvert(message) {
|
|
124
|
+
// Validate the wire shape (incl. minParticipants range) before trusting it,
|
|
125
|
+
// rather than reading fields with `?? 0` fallbacks (see ADR 039).
|
|
126
|
+
if (!isCohortAdvertMessage(message))
|
|
127
|
+
return;
|
|
128
|
+
const { cohortId, network, communicationPk, ...conditions } = message.body;
|
|
129
|
+
if (this.#cohortStates.has(cohortId))
|
|
130
|
+
return; // Already known
|
|
131
|
+
const advert = {
|
|
132
|
+
cohortId,
|
|
133
|
+
serviceDid: message.from,
|
|
134
|
+
network,
|
|
135
|
+
serviceCommunicationPk: communicationPk,
|
|
136
|
+
...conditions,
|
|
137
|
+
};
|
|
138
|
+
this.#cohortStates.set(cohortId, {
|
|
139
|
+
phase: ParticipantCohortPhase.Discovered,
|
|
140
|
+
cohortId,
|
|
141
|
+
serviceDid: message.from,
|
|
142
|
+
advert,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* User action: join a discovered cohort.
|
|
147
|
+
* Returns the opt-in message to send.
|
|
148
|
+
*/
|
|
149
|
+
joinCohort(cohortId) {
|
|
150
|
+
const state = this.#cohortStates.get(cohortId);
|
|
151
|
+
if (!state || state.phase !== ParticipantCohortPhase.Discovered) {
|
|
152
|
+
throw new AggregationParticipantError(`Cannot join cohort ${cohortId}: not in Discovered phase.`, 'INVALID_PHASE', { cohortId, phase: state?.phase });
|
|
153
|
+
}
|
|
154
|
+
// Create local cohort to track our view. Carry the advertised recovery
|
|
155
|
+
// params so validateMembership recomputes the same script-tree beacon
|
|
156
|
+
// address the service derived (ADR 042); a mismatch rejects the cohort.
|
|
157
|
+
const advert = state.advert;
|
|
158
|
+
const cohort = new AggregationCohort({
|
|
159
|
+
id: cohortId,
|
|
160
|
+
serviceDid: state.serviceDid,
|
|
161
|
+
minParticipants: advert.minParticipants,
|
|
162
|
+
network: advert.network,
|
|
163
|
+
beaconType: advert.beaconType,
|
|
164
|
+
recoveryKey: advert.recoveryKey ? hexToBytes(advert.recoveryKey) : undefined,
|
|
165
|
+
recoverySequence: advert.recoverySequence,
|
|
166
|
+
fundingModel: advert.fundingModel,
|
|
167
|
+
fallbackThreshold: advert.fallbackThreshold,
|
|
168
|
+
});
|
|
169
|
+
state.cohort = cohort;
|
|
170
|
+
state.phase = ParticipantCohortPhase.OptedIn;
|
|
171
|
+
const optInMessage = createCohortOptInMessage({
|
|
172
|
+
from: this.did,
|
|
173
|
+
to: state.serviceDid,
|
|
174
|
+
cohortId,
|
|
175
|
+
participantPk: this.publicKey,
|
|
176
|
+
communicationPk: this.publicKey,
|
|
177
|
+
});
|
|
178
|
+
return [optInMessage];
|
|
179
|
+
}
|
|
180
|
+
#handleOptInAccept(message) {
|
|
181
|
+
// Acknowledgment from service, no state change needed
|
|
182
|
+
void message;
|
|
183
|
+
}
|
|
184
|
+
/** Cohorts that have been finalized: beacon address available. */
|
|
185
|
+
get joinedCohorts() {
|
|
186
|
+
const map = new Map();
|
|
187
|
+
for (const [id, state] of this.#cohortStates) {
|
|
188
|
+
if (state.cohort && state.cohort.beaconAddress) {
|
|
189
|
+
map.set(id, {
|
|
190
|
+
cohortId: id,
|
|
191
|
+
serviceDid: state.serviceDid,
|
|
192
|
+
beaconAddress: state.cohort.beaconAddress,
|
|
193
|
+
cohortKeys: state.cohort.cohortKeys,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return map;
|
|
198
|
+
}
|
|
199
|
+
#handleCohortReady(message) {
|
|
200
|
+
const cohortId = message.body?.cohortId;
|
|
201
|
+
if (!cohortId)
|
|
202
|
+
return;
|
|
203
|
+
const state = this.#cohortStates.get(cohortId);
|
|
204
|
+
if (!state || !state.cohort)
|
|
205
|
+
return;
|
|
206
|
+
if (state.phase !== ParticipantCohortPhase.OptedIn)
|
|
207
|
+
return;
|
|
208
|
+
const beaconAddress = message.body?.beaconAddress;
|
|
209
|
+
const cohortKeys = message.body?.cohortKeys;
|
|
210
|
+
if (!beaconAddress || !cohortKeys)
|
|
211
|
+
return;
|
|
212
|
+
const participantPkHex = bytesToHex(this.publicKey);
|
|
213
|
+
const cohortKeysHex = cohortKeys.map(k => bytesToHex(new Uint8Array(k)));
|
|
214
|
+
state.cohort.validateMembership(participantPkHex, cohortKeysHex, beaconAddress);
|
|
215
|
+
state.phase = ParticipantCohortPhase.CohortReady;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* User action: submit a signed BTCR2 update for inclusion in the cohort's
|
|
219
|
+
* aggregated signal.
|
|
220
|
+
*/
|
|
221
|
+
submitUpdate(cohortId, signedUpdate) {
|
|
222
|
+
const state = this.#cohortStates.get(cohortId);
|
|
223
|
+
if (!state || state.phase !== ParticipantCohortPhase.CohortReady) {
|
|
224
|
+
throw new AggregationParticipantError(`Cannot submit update to cohort ${cohortId}: not in CohortReady phase.`, 'INVALID_PHASE', { cohortId, phase: state?.phase });
|
|
225
|
+
}
|
|
226
|
+
state.submittedUpdate = signedUpdate;
|
|
227
|
+
state.included = true;
|
|
228
|
+
state.phase = ParticipantCohortPhase.UpdateSubmitted;
|
|
229
|
+
const message = createSubmitUpdateMessage({
|
|
230
|
+
from: this.did,
|
|
231
|
+
to: state.serviceDid,
|
|
232
|
+
cohortId,
|
|
233
|
+
signedUpdate: signedUpdate,
|
|
234
|
+
});
|
|
235
|
+
return [message];
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* User action: decline to submit an update this round (cooperative
|
|
239
|
+
* non-inclusion). The member stays in the cohort and still signs; it will be
|
|
240
|
+
* absent from the CAS Announcement Map, or carry a non-inclusion leaf in the
|
|
241
|
+
* SMT. Returns the SUBMIT_NONINCLUDED message to send.
|
|
242
|
+
*/
|
|
243
|
+
declineUpdate(cohortId) {
|
|
244
|
+
const state = this.#cohortStates.get(cohortId);
|
|
245
|
+
if (!state || state.phase !== ParticipantCohortPhase.CohortReady) {
|
|
246
|
+
throw new AggregationParticipantError(`Cannot decline in cohort ${cohortId}: not in CohortReady phase.`, 'INVALID_PHASE', { cohortId, phase: state?.phase });
|
|
247
|
+
}
|
|
248
|
+
// Leave submittedUpdate unset; included=false is the load-bearing signal that
|
|
249
|
+
// the validation handler uses to validate the non-inclusion slot.
|
|
250
|
+
state.included = false;
|
|
251
|
+
state.phase = ParticipantCohortPhase.NonIncluded;
|
|
252
|
+
const message = createSubmitNonIncludedMessage({
|
|
253
|
+
from: this.did,
|
|
254
|
+
to: state.serviceDid,
|
|
255
|
+
cohortId,
|
|
256
|
+
});
|
|
257
|
+
return [message];
|
|
258
|
+
}
|
|
259
|
+
/** Aggregated data awaiting user validation. */
|
|
260
|
+
get pendingValidations() {
|
|
261
|
+
const map = new Map();
|
|
262
|
+
for (const [id, state] of this.#cohortStates) {
|
|
263
|
+
if (state.phase === ParticipantCohortPhase.AwaitingValidation && state.validation) {
|
|
264
|
+
map.set(id, state.validation);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return map;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* The validated aggregated data retained for a cohort, regardless of phase.
|
|
271
|
+
* Unlike {@link pendingValidations} (which lists only cohorts still awaiting
|
|
272
|
+
* the validate decision), this returns the stored validation, including the
|
|
273
|
+
* participant's sidecar (the CAS Announcement map or its SMT inclusion proof),
|
|
274
|
+
* so it is still readable once the cohort reaches Complete. Returns
|
|
275
|
+
* undefined before aggregated data has been received.
|
|
276
|
+
*/
|
|
277
|
+
getValidation(cohortId) {
|
|
278
|
+
return this.#cohortStates.get(cohortId)?.validation;
|
|
279
|
+
}
|
|
280
|
+
#handleDistributeAggregatedData(message) {
|
|
281
|
+
const cohortId = message.body?.cohortId;
|
|
282
|
+
if (!cohortId)
|
|
283
|
+
return;
|
|
284
|
+
const state = this.#cohortStates.get(cohortId);
|
|
285
|
+
// A submitter is in UpdateSubmitted; a decliner (cooperative non-inclusion)
|
|
286
|
+
// is in NonIncluded. Both validate their own slot in the distributed data.
|
|
287
|
+
if (!state || (state.phase !== ParticipantCohortPhase.UpdateSubmitted && state.phase !== ParticipantCohortPhase.NonIncluded))
|
|
288
|
+
return;
|
|
289
|
+
const declined = state.included === false;
|
|
290
|
+
// A submitter must have its update stored; a decliner has none by design.
|
|
291
|
+
if (!declined && !state.submittedUpdate)
|
|
292
|
+
return;
|
|
293
|
+
const beaconType = message.body?.beaconType;
|
|
294
|
+
if (!beaconType)
|
|
295
|
+
return;
|
|
296
|
+
const strategy = getBeaconStrategy(beaconType);
|
|
297
|
+
if (!strategy)
|
|
298
|
+
return;
|
|
299
|
+
const signalBytesHex = message.body?.signalBytesHex ?? '';
|
|
300
|
+
// Decliner validates its non-inclusion slot (CAS absence / SMT non-inclusion
|
|
301
|
+
// proof); submitter validates inclusion against its update hash.
|
|
302
|
+
const expectedHash = declined ? '' : canonicalHash(state.submittedUpdate);
|
|
303
|
+
const result = strategy.validateParticipantView({
|
|
304
|
+
participantDid: this.did,
|
|
305
|
+
included: !declined,
|
|
306
|
+
submittedUpdate: declined ? undefined : state.submittedUpdate,
|
|
307
|
+
expectedHash: declined ? undefined : expectedHash,
|
|
308
|
+
body: message.body,
|
|
309
|
+
});
|
|
310
|
+
state.validation = {
|
|
311
|
+
cohortId,
|
|
312
|
+
beaconType,
|
|
313
|
+
signalBytesHex,
|
|
314
|
+
expectedHash,
|
|
315
|
+
matches: result.matches,
|
|
316
|
+
casAnnouncement: result.casAnnouncement,
|
|
317
|
+
smtProof: result.smtProof,
|
|
318
|
+
included: !declined,
|
|
319
|
+
};
|
|
320
|
+
state.phase = ParticipantCohortPhase.AwaitingValidation;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* User action: approve aggregated data and send validation ack.
|
|
324
|
+
*/
|
|
325
|
+
approveValidation(cohortId) {
|
|
326
|
+
const state = this.#cohortStates.get(cohortId);
|
|
327
|
+
if (!state || state.phase !== ParticipantCohortPhase.AwaitingValidation) {
|
|
328
|
+
throw new AggregationParticipantError(`Cannot approve validation for cohort ${cohortId}: not in AwaitingValidation phase.`, 'INVALID_PHASE', { cohortId, phase: state?.phase });
|
|
329
|
+
}
|
|
330
|
+
state.phase = ParticipantCohortPhase.ValidationSent;
|
|
331
|
+
return [createValidationAckMessage({
|
|
332
|
+
from: this.did,
|
|
333
|
+
to: state.serviceDid,
|
|
334
|
+
cohortId,
|
|
335
|
+
approved: true,
|
|
336
|
+
})];
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* User action: reject aggregated data and send rejection ack.
|
|
340
|
+
*/
|
|
341
|
+
rejectValidation(cohortId) {
|
|
342
|
+
const state = this.#cohortStates.get(cohortId);
|
|
343
|
+
if (!state || state.phase !== ParticipantCohortPhase.AwaitingValidation) {
|
|
344
|
+
throw new AggregationParticipantError(`Cannot reject validation for cohort ${cohortId}: not in AwaitingValidation phase.`, 'INVALID_PHASE', { cohortId, phase: state?.phase });
|
|
345
|
+
}
|
|
346
|
+
state.phase = ParticipantCohortPhase.Failed;
|
|
347
|
+
return [createValidationAckMessage({
|
|
348
|
+
from: this.did,
|
|
349
|
+
to: state.serviceDid,
|
|
350
|
+
cohortId,
|
|
351
|
+
approved: false,
|
|
352
|
+
})];
|
|
353
|
+
}
|
|
354
|
+
/** Signing requests awaiting user approval. */
|
|
355
|
+
get pendingSigningRequests() {
|
|
356
|
+
const map = new Map();
|
|
357
|
+
for (const [id, state] of this.#cohortStates) {
|
|
358
|
+
if (state.phase === ParticipantCohortPhase.AwaitingSigning && state.signingRequest) {
|
|
359
|
+
map.set(id, state.signingRequest);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return map;
|
|
363
|
+
}
|
|
364
|
+
#handleAuthorizationRequest(message) {
|
|
365
|
+
const cohortId = message.body?.cohortId;
|
|
366
|
+
if (!cohortId)
|
|
367
|
+
return;
|
|
368
|
+
const state = this.#cohortStates.get(cohortId);
|
|
369
|
+
if (!state || !state.cohort)
|
|
370
|
+
return;
|
|
371
|
+
if (state.phase !== ParticipantCohortPhase.ValidationSent)
|
|
372
|
+
return;
|
|
373
|
+
const sessionId = message.body?.sessionId;
|
|
374
|
+
const pendingTxHex = message.body?.pendingTx;
|
|
375
|
+
const prevOutScriptHex = message.body?.prevOutScriptHex;
|
|
376
|
+
const prevOutValue = message.body?.prevOutValue;
|
|
377
|
+
if (!sessionId || !pendingTxHex || !prevOutScriptHex || !prevOutValue)
|
|
378
|
+
return;
|
|
379
|
+
state.signingRequest = {
|
|
380
|
+
cohortId,
|
|
381
|
+
sessionId,
|
|
382
|
+
pendingTxHex,
|
|
383
|
+
prevOutScriptHex,
|
|
384
|
+
prevOutValue,
|
|
385
|
+
};
|
|
386
|
+
state.phase = ParticipantCohortPhase.AwaitingSigning;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Bind a signing approval to the announcement the member validated: a beacon
|
|
390
|
+
* transaction MUST carry an OP_RETURN with the exact 32-byte signal stored when
|
|
391
|
+
* the aggregated data was distributed. Both the optimistic nonce approval and
|
|
392
|
+
* the fallback approval sign with SIGHASH_DEFAULT (committing to every output)
|
|
393
|
+
* while the coordinator drives output selection, so without this check a
|
|
394
|
+
* coordinator could anchor a different signal under the member's signature.
|
|
395
|
+
*/
|
|
396
|
+
#assertTxAnchorsValidatedSignal(cohortId, state, tx) {
|
|
397
|
+
const signalHex = state.validation?.signalBytesHex;
|
|
398
|
+
if (!signalHex) {
|
|
399
|
+
throw new AggregationParticipantError(`Cohort ${cohortId} has no validated signal to bind the signature to.`, 'MISSING_STATE', { cohortId });
|
|
400
|
+
}
|
|
401
|
+
if (!txEmbedsSignal(tx, signalHex)) {
|
|
402
|
+
throw new AggregationParticipantError(`Transaction for cohort ${cohortId} does not anchor the validated signal.`, 'SIGNAL_MISMATCH', { cohortId });
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* User action: approve signing and generate nonce contribution.
|
|
407
|
+
*/
|
|
408
|
+
approveNonce(cohortId) {
|
|
409
|
+
const state = this.#cohortStates.get(cohortId);
|
|
410
|
+
if (!state || state.phase !== ParticipantCohortPhase.AwaitingSigning) {
|
|
411
|
+
throw new AggregationParticipantError(`Cannot approve nonce for cohort ${cohortId}: not in AwaitingSigning phase.`, 'INVALID_PHASE', { cohortId, phase: state?.phase });
|
|
412
|
+
}
|
|
413
|
+
if (!state.signingRequest || !state.cohort) {
|
|
414
|
+
throw new AggregationParticipantError(`Cohort ${cohortId} missing signing request or cohort state.`, 'MISSING_STATE', { cohortId });
|
|
415
|
+
}
|
|
416
|
+
// allowUnknownOutputs: a beacon transaction carries an OP_RETURN signal
|
|
417
|
+
// output, which scure does not classify as a known (spendable) output type;
|
|
418
|
+
// re-parsing the raw tx would otherwise throw.
|
|
419
|
+
const tx = Transaction.fromRaw(hexToBytes(state.signingRequest.pendingTxHex), { allowUnknownOutputs: true });
|
|
420
|
+
// Refuse to sign unless the tx anchors the signal this member validated.
|
|
421
|
+
this.#assertTxAnchorsValidatedSignal(cohortId, state, tx);
|
|
422
|
+
// Derive UTXO metadata for Taproot sighash (BIP-341). Use the script
|
|
423
|
+
// supplied by the service in AUTHORIZATION_REQUEST rather than reading
|
|
424
|
+
// the change output: input and change may use different scripts in future
|
|
425
|
+
// beacon designs, and the prevOutScript must be the UTXO script, not the
|
|
426
|
+
// change script.
|
|
427
|
+
const prevOutScripts = [hexToBytes(state.signingRequest.prevOutScriptHex)];
|
|
428
|
+
const prevOutValues = [BigInt(state.signingRequest.prevOutValue)];
|
|
429
|
+
const session = new BeaconSigningSession({
|
|
430
|
+
id: state.signingRequest.sessionId,
|
|
431
|
+
cohort: state.cohort,
|
|
432
|
+
pendingTx: tx,
|
|
433
|
+
prevOutScripts,
|
|
434
|
+
prevOutValues,
|
|
435
|
+
});
|
|
436
|
+
state.signingSession = session;
|
|
437
|
+
const nonceContribution = this.#signer.withSecret(secretKey => session.generateNonceContribution(this.publicKey, secretKey));
|
|
438
|
+
state.phase = ParticipantCohortPhase.NonceSent;
|
|
439
|
+
return [createNonceContributionMessage({
|
|
440
|
+
from: this.did,
|
|
441
|
+
to: state.serviceDid,
|
|
442
|
+
cohortId,
|
|
443
|
+
sessionId: session.id,
|
|
444
|
+
nonceContribution,
|
|
445
|
+
})];
|
|
446
|
+
}
|
|
447
|
+
#handleAggregatedNonce(message) {
|
|
448
|
+
const cohortId = message.body?.cohortId;
|
|
449
|
+
if (!cohortId)
|
|
450
|
+
return;
|
|
451
|
+
const state = this.#cohortStates.get(cohortId);
|
|
452
|
+
if (!state || !state.signingSession)
|
|
453
|
+
return;
|
|
454
|
+
if (state.phase !== ParticipantCohortPhase.NonceSent)
|
|
455
|
+
return;
|
|
456
|
+
const aggregatedNonce = message.body?.aggregatedNonce;
|
|
457
|
+
if (!aggregatedNonce)
|
|
458
|
+
return;
|
|
459
|
+
state.signingSession.aggregatedNonce = aggregatedNonce;
|
|
460
|
+
state.phase = ParticipantCohortPhase.AwaitingPartialSig;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* User action: generate and return the partial signature.
|
|
464
|
+
* In most UIs this is automatic after AwaitingPartialSig, but exposing it
|
|
465
|
+
* as an explicit action lets the client UI confirm before signing if desired.
|
|
466
|
+
*/
|
|
467
|
+
generatePartialSignature(cohortId) {
|
|
468
|
+
const state = this.#cohortStates.get(cohortId);
|
|
469
|
+
if (!state || state.phase !== ParticipantCohortPhase.AwaitingPartialSig) {
|
|
470
|
+
throw new AggregationParticipantError(`Cannot generate partial signature for cohort ${cohortId}: not in AwaitingPartialSig phase.`, 'INVALID_PHASE', { cohortId, phase: state?.phase });
|
|
471
|
+
}
|
|
472
|
+
if (!state.signingSession) {
|
|
473
|
+
throw new AggregationParticipantError(`No signing session for cohort ${cohortId}.`, 'MISSING_STATE', { cohortId });
|
|
474
|
+
}
|
|
475
|
+
const signingSession = state.signingSession;
|
|
476
|
+
const partialSig = this.#signer.withSecret(secretKey => signingSession.generatePartialSignature(secretKey));
|
|
477
|
+
state.phase = ParticipantCohortPhase.Complete;
|
|
478
|
+
return [createSignatureAuthorizationMessage({
|
|
479
|
+
from: this.did,
|
|
480
|
+
to: state.serviceDid,
|
|
481
|
+
cohortId,
|
|
482
|
+
sessionId: state.signingSession.id,
|
|
483
|
+
partialSignature: partialSig,
|
|
484
|
+
})];
|
|
485
|
+
}
|
|
486
|
+
/** Fallback signing requests awaiting user approval (UI: review the fallback spend). */
|
|
487
|
+
get pendingFallbackRequests() {
|
|
488
|
+
const map = new Map();
|
|
489
|
+
for (const [id, state] of this.#cohortStates) {
|
|
490
|
+
if (state.phase === ParticipantCohortPhase.AwaitingFallbackSig && state.fallbackRequest) {
|
|
491
|
+
map.set(id, state.fallbackRequest);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return map;
|
|
495
|
+
}
|
|
496
|
+
#handleFallbackAuthorizationRequest(message) {
|
|
497
|
+
const cohortId = message.body?.cohortId;
|
|
498
|
+
if (!cohortId)
|
|
499
|
+
return;
|
|
500
|
+
const state = this.#cohortStates.get(cohortId);
|
|
501
|
+
if (!state || !state.cohort)
|
|
502
|
+
return;
|
|
503
|
+
// The service can fall back at any point after the member validated. This
|
|
504
|
+
// includes the local Complete phase a member reaches the moment it sends its
|
|
505
|
+
// optimistic partial signature: the cohort has NOT finalized (the service
|
|
506
|
+
// only falls back before optimistic completion), and those members are
|
|
507
|
+
// exactly the k signers the fallback needs. Signing both the optimistic
|
|
508
|
+
// partial sig and the fallback sig is safe - both authorize the same outputs,
|
|
509
|
+
// and only one witness can ever confirm the single UTXO. A genuinely failed
|
|
510
|
+
// member is excluded. Ignore a duplicate request already being processed.
|
|
511
|
+
const acceptFrom = [
|
|
512
|
+
ParticipantCohortPhase.ValidationSent,
|
|
513
|
+
ParticipantCohortPhase.AwaitingSigning,
|
|
514
|
+
ParticipantCohortPhase.NonceSent,
|
|
515
|
+
ParticipantCohortPhase.AwaitingPartialSig,
|
|
516
|
+
ParticipantCohortPhase.Complete,
|
|
517
|
+
];
|
|
518
|
+
if (!acceptFrom.includes(state.phase))
|
|
519
|
+
return;
|
|
520
|
+
const sessionId = message.body?.sessionId;
|
|
521
|
+
const pendingTxHex = message.body?.pendingTx;
|
|
522
|
+
const prevOutScriptHex = message.body?.prevOutScriptHex;
|
|
523
|
+
const prevOutValue = message.body?.prevOutValue;
|
|
524
|
+
const fallbackLeafScriptHex = message.body?.fallbackLeafScriptHex;
|
|
525
|
+
if (!sessionId || !pendingTxHex || !prevOutScriptHex || !prevOutValue || !fallbackLeafScriptHex)
|
|
526
|
+
return;
|
|
527
|
+
state.fallbackRequest = { cohortId, sessionId, pendingTxHex, prevOutScriptHex, prevOutValue, fallbackLeafScriptHex };
|
|
528
|
+
// The optimistic path is abandoned; wipe any retained secret nonce for it.
|
|
529
|
+
state.signingSession?.clearSecrets();
|
|
530
|
+
state.phase = ParticipantCohortPhase.AwaitingFallbackSig;
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* User action: authorize the fallback spend. Recomputes the k-of-n fallback
|
|
534
|
+
* leaf from the member's OWN cohort state (not the service-provided script),
|
|
535
|
+
* computes the BIP-341 script-path sighash over the requested transaction, and
|
|
536
|
+
* returns a standalone BIP-340 signature (no nonce round). The member completes
|
|
537
|
+
* once it has contributed; the service needs only k of these.
|
|
538
|
+
*/
|
|
539
|
+
approveFallback(cohortId) {
|
|
540
|
+
const state = this.#cohortStates.get(cohortId);
|
|
541
|
+
if (!state || state.phase !== ParticipantCohortPhase.AwaitingFallbackSig) {
|
|
542
|
+
throw new AggregationParticipantError(`Cannot approve fallback for cohort ${cohortId}: not in AwaitingFallbackSig phase.`, 'INVALID_PHASE', { cohortId, phase: state?.phase });
|
|
543
|
+
}
|
|
544
|
+
if (!state.fallbackRequest || !state.cohort) {
|
|
545
|
+
throw new AggregationParticipantError(`Cohort ${cohortId} missing fallback request or cohort state.`, 'MISSING_STATE', { cohortId });
|
|
546
|
+
}
|
|
547
|
+
const req = state.fallbackRequest;
|
|
548
|
+
const tx = Transaction.fromRaw(hexToBytes(req.pendingTxHex), { allowUnknownOutputs: true });
|
|
549
|
+
const prevOutScript = hexToBytes(req.prevOutScriptHex);
|
|
550
|
+
const prevOutValue = BigInt(req.prevOutValue);
|
|
551
|
+
// Refuse to sign unless the fallback tx anchors the signal this member
|
|
552
|
+
// validated (the coordinator drives output selection on the fallback path).
|
|
553
|
+
this.#assertTxAnchorsValidatedSignal(cohortId, state, tx);
|
|
554
|
+
// Recompute the fallback leaf from our own cohort keys so a malicious service
|
|
555
|
+
// cannot induce a signature over a different leaf than the one the funded
|
|
556
|
+
// address commits to.
|
|
557
|
+
const fallbackLeaf = buildFallbackLeaf({
|
|
558
|
+
cohortKeys: state.cohort.cohortKeys,
|
|
559
|
+
fallbackThreshold: state.cohort.effectiveFallbackThreshold,
|
|
560
|
+
});
|
|
561
|
+
const sighash = fallbackSighash(tx, 0, prevOutScript, prevOutValue, fallbackLeaf);
|
|
562
|
+
const signature = this.#signer.withSecret(secretKey => schnorr.sign(sighash, secretKey));
|
|
563
|
+
state.phase = ParticipantCohortPhase.Complete;
|
|
564
|
+
return [createFallbackSignatureMessage({
|
|
565
|
+
from: this.did,
|
|
566
|
+
to: state.serviceDid,
|
|
567
|
+
cohortId,
|
|
568
|
+
sessionId: req.sessionId,
|
|
569
|
+
signerPk: this.publicKey.slice(1),
|
|
570
|
+
fallbackSignature: signature,
|
|
571
|
+
})];
|
|
572
|
+
}
|
|
573
|
+
getCohortPhase(cohortId) {
|
|
574
|
+
return this.#cohortStates.get(cohortId)?.phase;
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Zeroize any retained MuSig2 secret nonces across all cohorts. The raw
|
|
578
|
+
* signing key is never held here (it lives behind the {@link AggregationSigner}
|
|
579
|
+
* and is wiped per-operation), but an abandoned signing session can still hold
|
|
580
|
+
* a secret nonce; call this on teardown to clear it deterministically.
|
|
581
|
+
*/
|
|
582
|
+
clearSecrets() {
|
|
583
|
+
for (const state of this.#cohortStates.values()) {
|
|
584
|
+
state.signingSession?.clearSecrets();
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
//# sourceMappingURL=participant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"participant.js","sourceRoot":"","sources":["../../src/participant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export var ServiceCohortPhase;
|
|
2
|
+
(function (ServiceCohortPhase) {
|
|
3
|
+
ServiceCohortPhase["Created"] = "Created";
|
|
4
|
+
ServiceCohortPhase["Advertised"] = "Advertised";
|
|
5
|
+
ServiceCohortPhase["CohortSet"] = "CohortSet";
|
|
6
|
+
ServiceCohortPhase["CollectingUpdates"] = "CollectingUpdates";
|
|
7
|
+
ServiceCohortPhase["UpdatesCollected"] = "UpdatesCollected";
|
|
8
|
+
ServiceCohortPhase["DataDistributed"] = "DataDistributed";
|
|
9
|
+
ServiceCohortPhase["Validated"] = "Validated";
|
|
10
|
+
ServiceCohortPhase["SigningStarted"] = "SigningStarted";
|
|
11
|
+
ServiceCohortPhase["NoncesCollected"] = "NoncesCollected";
|
|
12
|
+
ServiceCohortPhase["AwaitingPartialSigs"] = "AwaitingPartialSigs";
|
|
13
|
+
/** Optimistic n-of-n key path abandoned; collecting k-of-n fallback signatures (ADR 042). */
|
|
14
|
+
ServiceCohortPhase["FallbackRequested"] = "FallbackRequested";
|
|
15
|
+
ServiceCohortPhase["Complete"] = "Complete";
|
|
16
|
+
ServiceCohortPhase["Failed"] = "Failed";
|
|
17
|
+
})(ServiceCohortPhase || (ServiceCohortPhase = {}));
|
|
18
|
+
export var ParticipantCohortPhase;
|
|
19
|
+
(function (ParticipantCohortPhase) {
|
|
20
|
+
ParticipantCohortPhase["Discovered"] = "Discovered";
|
|
21
|
+
ParticipantCohortPhase["OptedIn"] = "OptedIn";
|
|
22
|
+
ParticipantCohortPhase["CohortReady"] = "CohortReady";
|
|
23
|
+
ParticipantCohortPhase["UpdateSubmitted"] = "UpdateSubmitted";
|
|
24
|
+
/** Member declined to submit an update this round (cooperative non-inclusion); still signs. */
|
|
25
|
+
ParticipantCohortPhase["NonIncluded"] = "NonIncluded";
|
|
26
|
+
ParticipantCohortPhase["AwaitingValidation"] = "AwaitingValidation";
|
|
27
|
+
ParticipantCohortPhase["ValidationSent"] = "ValidationSent";
|
|
28
|
+
ParticipantCohortPhase["AwaitingSigning"] = "AwaitingSigning";
|
|
29
|
+
ParticipantCohortPhase["NonceSent"] = "NonceSent";
|
|
30
|
+
ParticipantCohortPhase["AwaitingPartialSig"] = "AwaitingPartialSig";
|
|
31
|
+
/** Service fell back to the k-of-n script path; member can sign the fallback (ADR 042). */
|
|
32
|
+
ParticipantCohortPhase["AwaitingFallbackSig"] = "AwaitingFallbackSig";
|
|
33
|
+
ParticipantCohortPhase["Complete"] = "Complete";
|
|
34
|
+
ParticipantCohortPhase["Failed"] = "Failed";
|
|
35
|
+
})(ParticipantCohortPhase || (ParticipantCohortPhase = {}));
|
|
36
|
+
export var SigningSessionPhase;
|
|
37
|
+
(function (SigningSessionPhase) {
|
|
38
|
+
SigningSessionPhase["AwaitingNonceContributions"] = "AwaitingNonceContributions";
|
|
39
|
+
SigningSessionPhase["NonceContributionsReceived"] = "NonceContributionsReceived";
|
|
40
|
+
SigningSessionPhase["AwaitingPartialSignatures"] = "AwaitingPartialSignatures";
|
|
41
|
+
SigningSessionPhase["PartialSignaturesReceived"] = "PartialSignaturesReceived";
|
|
42
|
+
SigningSessionPhase["Complete"] = "Complete";
|
|
43
|
+
SigningSessionPhase["Failed"] = "Failed";
|
|
44
|
+
})(SigningSessionPhase || (SigningSessionPhase = {}));
|
|
45
|
+
//# sourceMappingURL=phases.js.map
|