@toon-protocol/connector 2.0.0 → 2.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/dist/btp/btp-claim-types.d.ts +24 -2
- package/dist/btp/btp-claim-types.d.ts.map +1 -1
- package/dist/btp/btp-claim-types.js +115 -9
- package/dist/btp/btp-claim-types.js.map +1 -1
- package/dist/btp/inbound-claim-validator.d.ts +5 -1
- package/dist/btp/inbound-claim-validator.d.ts.map +1 -1
- package/dist/btp/inbound-claim-validator.js +52 -10
- package/dist/btp/inbound-claim-validator.js.map +1 -1
- package/dist/config/config-loader.d.ts.map +1 -1
- package/dist/config/config-loader.js +3 -0
- package/dist/config/config-loader.js.map +1 -1
- package/dist/config/types.d.ts +15 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +45 -0
- package/dist/config/types.js.map +1 -1
- package/dist/core/connector-node.d.ts.map +1 -1
- package/dist/core/connector-node.js +57 -12
- package/dist/core/connector-node.js.map +1 -1
- package/dist/core/packet-handler.d.ts +10 -1
- package/dist/core/packet-handler.d.ts.map +1 -1
- package/dist/core/packet-handler.js +67 -2
- package/dist/core/packet-handler.js.map +1 -1
- package/dist/settlement/channel-manager.d.ts +3 -2
- package/dist/settlement/channel-manager.d.ts.map +1 -1
- package/dist/settlement/channel-manager.js +18 -6
- package/dist/settlement/channel-manager.js.map +1 -1
- package/dist/settlement/claim-receiver.d.ts +16 -3
- package/dist/settlement/claim-receiver.d.ts.map +1 -1
- package/dist/settlement/claim-receiver.js +434 -117
- package/dist/settlement/claim-receiver.js.map +1 -1
- package/dist/settlement/claim-sender.d.ts +4 -2
- package/dist/settlement/claim-sender.d.ts.map +1 -1
- package/dist/settlement/claim-sender.js +38 -0
- package/dist/settlement/claim-sender.js.map +1 -1
- package/dist/settlement/mina-payment-channel-sdk.d.ts +73 -0
- package/dist/settlement/mina-payment-channel-sdk.d.ts.map +1 -0
- package/dist/settlement/mina-payment-channel-sdk.js +538 -0
- package/dist/settlement/mina-payment-channel-sdk.js.map +1 -0
- package/dist/settlement/per-packet-claim-service.d.ts +12 -6
- package/dist/settlement/per-packet-claim-service.d.ts.map +1 -1
- package/dist/settlement/per-packet-claim-service.js +205 -40
- package/dist/settlement/per-packet-claim-service.js.map +1 -1
- package/dist/settlement/privacy/index.d.ts +3 -0
- package/dist/settlement/privacy/index.d.ts.map +1 -0
- package/dist/settlement/privacy/index.js +11 -0
- package/dist/settlement/privacy/index.js.map +1 -0
- package/dist/settlement/privacy/nip59-claim-wrapper.d.ts +60 -0
- package/dist/settlement/privacy/nip59-claim-wrapper.d.ts.map +1 -0
- package/dist/settlement/privacy/nip59-claim-wrapper.js +361 -0
- package/dist/settlement/privacy/nip59-claim-wrapper.js.map +1 -0
- package/dist/settlement/provider/chain-provider-registry.d.ts +20 -0
- package/dist/settlement/provider/chain-provider-registry.d.ts.map +1 -0
- package/dist/settlement/provider/chain-provider-registry.js +53 -0
- package/dist/settlement/provider/chain-provider-registry.js.map +1 -0
- package/dist/settlement/provider/evm-payment-channel-provider.d.ts +31 -0
- package/dist/settlement/provider/evm-payment-channel-provider.d.ts.map +1 -0
- package/dist/settlement/provider/evm-payment-channel-provider.js +207 -0
- package/dist/settlement/provider/evm-payment-channel-provider.js.map +1 -0
- package/dist/settlement/provider/index.d.ts +6 -0
- package/dist/settlement/provider/index.d.ts.map +1 -0
- package/dist/settlement/provider/index.js +16 -0
- package/dist/settlement/provider/index.js.map +1 -0
- package/dist/settlement/provider/mina-payment-channel-provider.d.ts +43 -0
- package/dist/settlement/provider/mina-payment-channel-provider.d.ts.map +1 -0
- package/dist/settlement/provider/mina-payment-channel-provider.js +330 -0
- package/dist/settlement/provider/mina-payment-channel-provider.js.map +1 -0
- package/dist/settlement/provider/payment-channel-provider.d.ts +79 -0
- package/dist/settlement/provider/payment-channel-provider.d.ts.map +1 -0
- package/dist/settlement/provider/payment-channel-provider.js +3 -0
- package/dist/settlement/provider/payment-channel-provider.js.map +1 -0
- package/dist/settlement/provider/solana-payment-channel-provider.d.ts +38 -0
- package/dist/settlement/provider/solana-payment-channel-provider.d.ts.map +1 -0
- package/dist/settlement/provider/solana-payment-channel-provider.js +262 -0
- package/dist/settlement/provider/solana-payment-channel-provider.js.map +1 -0
- package/dist/settlement/settlement-executor.d.ts +11 -7
- package/dist/settlement/settlement-executor.d.ts.map +1 -1
- package/dist/settlement/settlement-executor.js +74 -65
- package/dist/settlement/settlement-executor.js.map +1 -1
- package/dist/settlement/settlement-monitor.d.ts.map +1 -1
- package/dist/settlement/settlement-monitor.js.map +1 -1
- package/dist/settlement/solana-payment-channel-sdk.d.ts +75 -0
- package/dist/settlement/solana-payment-channel-sdk.d.ts.map +1 -0
- package/dist/settlement/solana-payment-channel-sdk.js +600 -0
- package/dist/settlement/solana-payment-channel-sdk.js.map +1 -0
- package/dist/settlement/types.d.ts +1 -1
- package/dist/settlement/types.d.ts.map +1 -1
- package/dist/settlement/types.js.map +1 -1
- package/package.json +12 -1
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.MinaPaymentChannelSDK = exports.MinaChannelError = exports.MINA_ERROR_CODES = void 0;
|
|
37
|
+
exports._resetModuleCaches = _resetModuleCaches;
|
|
38
|
+
exports.MINA_ERROR_CODES = {
|
|
39
|
+
COMPILE_FAILED: 1001,
|
|
40
|
+
TRANSACTION_FAILED: 1002,
|
|
41
|
+
PROOF_GENERATION_FAILED: 1003,
|
|
42
|
+
INVALID_CHANNEL_STATE: 1004,
|
|
43
|
+
ACCOUNT_NOT_FOUND: 1005,
|
|
44
|
+
INVALID_PROOF: 1006,
|
|
45
|
+
ARCHIVE_NODE_ERROR: 1007,
|
|
46
|
+
INVALID_PARAMETERS: 1008,
|
|
47
|
+
O1JS_NOT_AVAILABLE: 9999,
|
|
48
|
+
};
|
|
49
|
+
class MinaChannelError extends Error {
|
|
50
|
+
code;
|
|
51
|
+
errorName;
|
|
52
|
+
constructor(message, code, errorName) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.name = 'MinaChannelError';
|
|
55
|
+
this.code = code;
|
|
56
|
+
this.errorName = errorName;
|
|
57
|
+
Error.captureStackTrace(this, MinaChannelError);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.MinaChannelError = MinaChannelError;
|
|
61
|
+
let o1jsModule = null;
|
|
62
|
+
async function getO1js() {
|
|
63
|
+
if (!o1jsModule) {
|
|
64
|
+
try {
|
|
65
|
+
o1jsModule = await Promise.resolve().then(() => __importStar(require('o1js')));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new MinaChannelError('o1js is required for Mina payment channels but is not installed. ' +
|
|
69
|
+
'Install it with: npm install o1js', exports.MINA_ERROR_CODES.O1JS_NOT_AVAILABLE, 'O1JS_NOT_AVAILABLE');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return o1jsModule;
|
|
73
|
+
}
|
|
74
|
+
let PaymentChannelContract = null;
|
|
75
|
+
async function getPaymentChannelContract() {
|
|
76
|
+
if (!PaymentChannelContract) {
|
|
77
|
+
try {
|
|
78
|
+
const mod = await Promise.resolve().then(() => __importStar(require('@toon-protocol/mina-zkapp')));
|
|
79
|
+
PaymentChannelContract = mod.PaymentChannel;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
throw new MinaChannelError('@toon-protocol/mina-zkapp is required for Mina payment channels but is not installed.', exports.MINA_ERROR_CODES.O1JS_NOT_AVAILABLE, 'O1JS_NOT_AVAILABLE');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return PaymentChannelContract;
|
|
86
|
+
}
|
|
87
|
+
const DEFAULT_POLL_INTERVAL_MS = 30_000;
|
|
88
|
+
function _resetModuleCaches() {
|
|
89
|
+
o1jsModule = null;
|
|
90
|
+
PaymentChannelContract = null;
|
|
91
|
+
}
|
|
92
|
+
class MinaPaymentChannelSDK {
|
|
93
|
+
_zkAppAddress;
|
|
94
|
+
_logger;
|
|
95
|
+
_signerPrivateKey;
|
|
96
|
+
graphqlUrl;
|
|
97
|
+
_compiled = false;
|
|
98
|
+
_verificationKey = null;
|
|
99
|
+
get verificationKey() {
|
|
100
|
+
return this._verificationKey;
|
|
101
|
+
}
|
|
102
|
+
_networkInitialized = false;
|
|
103
|
+
_participantCache = new Map();
|
|
104
|
+
constructor(graphqlUrl, _zkAppAddress, _logger, _signerPrivateKey) {
|
|
105
|
+
this._zkAppAddress = _zkAppAddress;
|
|
106
|
+
this._logger = _logger;
|
|
107
|
+
this._signerPrivateKey = _signerPrivateKey;
|
|
108
|
+
this.graphqlUrl = graphqlUrl;
|
|
109
|
+
}
|
|
110
|
+
_requireSignerKey() {
|
|
111
|
+
if (!this._signerPrivateKey) {
|
|
112
|
+
throw new MinaChannelError('signer private key required for this operation', exports.MINA_ERROR_CODES.INVALID_PARAMETERS, 'INVALID_PARAMETERS');
|
|
113
|
+
}
|
|
114
|
+
return this._signerPrivateKey;
|
|
115
|
+
}
|
|
116
|
+
async _setNetwork() {
|
|
117
|
+
const { Mina } = await getO1js();
|
|
118
|
+
if (!this._networkInitialized) {
|
|
119
|
+
const Network = Mina.Network(this.graphqlUrl);
|
|
120
|
+
Mina.setActiveInstance(Network);
|
|
121
|
+
this._networkInitialized = true;
|
|
122
|
+
}
|
|
123
|
+
return Mina;
|
|
124
|
+
}
|
|
125
|
+
async _getZkApp(channelAddress) {
|
|
126
|
+
const { PublicKey, fetchAccount } = await getO1js();
|
|
127
|
+
const Contract = await getPaymentChannelContract();
|
|
128
|
+
const zkAppPublicKey = PublicKey.fromBase58(channelAddress);
|
|
129
|
+
const result = await fetchAccount({ publicKey: zkAppPublicKey });
|
|
130
|
+
if (result.error) {
|
|
131
|
+
throw new MinaChannelError(`Failed to fetch account at ${channelAddress}: ${String(result.error)}`, exports.MINA_ERROR_CODES.ACCOUNT_NOT_FOUND, 'ACCOUNT_NOT_FOUND');
|
|
132
|
+
}
|
|
133
|
+
return new Contract(zkAppPublicKey);
|
|
134
|
+
}
|
|
135
|
+
_wrapError(err, code, errorName) {
|
|
136
|
+
if (err instanceof MinaChannelError) {
|
|
137
|
+
return err;
|
|
138
|
+
}
|
|
139
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
140
|
+
return new MinaChannelError(message, code, errorName);
|
|
141
|
+
}
|
|
142
|
+
_deserializeSignature(signatureStr, fieldName) {
|
|
143
|
+
let parsed;
|
|
144
|
+
try {
|
|
145
|
+
parsed = JSON.parse(signatureStr);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
throw new MinaChannelError(`Invalid ${fieldName}: expected a JSON string with { r, s } fields, received malformed JSON`, exports.MINA_ERROR_CODES.INVALID_PARAMETERS, 'INVALID_PARAMETERS');
|
|
149
|
+
}
|
|
150
|
+
if (typeof parsed !== 'object' ||
|
|
151
|
+
parsed === null ||
|
|
152
|
+
typeof parsed.r !== 'string' ||
|
|
153
|
+
typeof parsed.s !== 'string') {
|
|
154
|
+
throw new MinaChannelError(`Invalid ${fieldName}: expected an object with string 'r' and 's' fields`, exports.MINA_ERROR_CODES.INVALID_PARAMETERS, 'INVALID_PARAMETERS');
|
|
155
|
+
}
|
|
156
|
+
const { Signature } = o1jsModule;
|
|
157
|
+
return Signature.fromJSON({ r: parsed.r, s: parsed.s });
|
|
158
|
+
}
|
|
159
|
+
async getSignerPublicKey() {
|
|
160
|
+
const signerKeyBase58 = this._requireSignerKey();
|
|
161
|
+
try {
|
|
162
|
+
const { PrivateKey } = await getO1js();
|
|
163
|
+
const privateKey = PrivateKey.fromBase58(signerKeyBase58);
|
|
164
|
+
return privateKey.toPublicKey().toBase58();
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (err instanceof MinaChannelError)
|
|
168
|
+
throw err;
|
|
169
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.INVALID_PARAMETERS, 'INVALID_PARAMETERS');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async compileContract() {
|
|
173
|
+
if (this._compiled) {
|
|
174
|
+
this._logger.debug({ event: 'compile_contract_cached', zkAppAddress: this._zkAppAddress }, 'Mina zkApp circuit already compiled, skipping');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
this._logger.info({ event: 'compile_contract', zkAppAddress: this._zkAppAddress }, 'Compiling Mina zkApp circuit');
|
|
178
|
+
const startTime = Date.now();
|
|
179
|
+
try {
|
|
180
|
+
const Contract = await getPaymentChannelContract();
|
|
181
|
+
const result = await Contract.compile();
|
|
182
|
+
this._verificationKey = result?.verificationKey ?? null;
|
|
183
|
+
this._compiled = true;
|
|
184
|
+
const durationMs = Date.now() - startTime;
|
|
185
|
+
this._logger.info({ event: 'compile_contract_complete', zkAppAddress: this._zkAppAddress, durationMs }, `Mina zkApp circuit compiled in ${durationMs}ms`);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.COMPILE_FAILED, 'COMPILE_FAILED');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async openChannel(participantA, participantB, timeout, tokenId) {
|
|
192
|
+
const signerKeyBase58 = this._requireSignerKey();
|
|
193
|
+
try {
|
|
194
|
+
const { PrivateKey, PublicKey, Field, AccountUpdate, fetchAccount } = await getO1js();
|
|
195
|
+
const Contract = await getPaymentChannelContract();
|
|
196
|
+
const Mina = await this._setNetwork();
|
|
197
|
+
const zkAppPrivateKey = PrivateKey.random();
|
|
198
|
+
const zkAppPublicKey = zkAppPrivateKey.toPublicKey();
|
|
199
|
+
const zkAppAddress = zkAppPublicKey.toBase58();
|
|
200
|
+
const signerPrivateKey = PrivateKey.fromBase58(signerKeyBase58);
|
|
201
|
+
const signerPublicKey = signerPrivateKey.toPublicKey();
|
|
202
|
+
await fetchAccount({ publicKey: signerPublicKey });
|
|
203
|
+
const zkApp = new Contract(zkAppPublicKey);
|
|
204
|
+
const pubA = PublicKey.fromBase58(participantA);
|
|
205
|
+
const pubB = PublicKey.fromBase58(participantB);
|
|
206
|
+
const nonce = Field(0);
|
|
207
|
+
const timeoutField = Field(timeout);
|
|
208
|
+
const tokenIdField = Field(tokenId ?? '1');
|
|
209
|
+
const txn = await Mina.transaction(signerPublicKey, async () => {
|
|
210
|
+
AccountUpdate.fundNewAccount(signerPublicKey);
|
|
211
|
+
await zkApp.deploy();
|
|
212
|
+
await zkApp.initializeChannel(pubA, pubB, nonce, timeoutField, tokenIdField);
|
|
213
|
+
});
|
|
214
|
+
await txn.prove();
|
|
215
|
+
const sentTx = await txn.sign([signerPrivateKey, zkAppPrivateKey]).send();
|
|
216
|
+
const txHash = sentTx.hash ?? '';
|
|
217
|
+
this._participantCache.set(zkAppAddress, { participantA, participantB });
|
|
218
|
+
this._logger.info({ event: 'open_channel', zkAppAddress, txHash }, 'Mina payment channel opened');
|
|
219
|
+
return { zkAppAddress, txHash };
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.TRANSACTION_FAILED, 'TRANSACTION_FAILED');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async deposit(channelAddress, amount) {
|
|
226
|
+
const signerKeyBase58 = this._requireSignerKey();
|
|
227
|
+
try {
|
|
228
|
+
const { PrivateKey, Field, fetchAccount } = await getO1js();
|
|
229
|
+
const Mina = await this._setNetwork();
|
|
230
|
+
const signerPrivateKey = PrivateKey.fromBase58(signerKeyBase58);
|
|
231
|
+
const signerPublicKey = signerPrivateKey.toPublicKey();
|
|
232
|
+
await fetchAccount({ publicKey: signerPublicKey });
|
|
233
|
+
const zkApp = await this._getZkApp(channelAddress);
|
|
234
|
+
const amountField = Field(amount);
|
|
235
|
+
const txn = await Mina.transaction(signerPublicKey, async () => {
|
|
236
|
+
await zkApp.deposit(amountField, signerPublicKey);
|
|
237
|
+
});
|
|
238
|
+
await txn.prove();
|
|
239
|
+
const sentTx = await txn.sign([signerPrivateKey]).send();
|
|
240
|
+
const txHash = sentTx.hash ?? '';
|
|
241
|
+
this._logger.info({ event: 'deposit', channelAddress, amount: amount.toString(), txHash }, 'Deposited into Mina payment channel');
|
|
242
|
+
return { txHash };
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.TRANSACTION_FAILED, 'TRANSACTION_FAILED');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async claimFromChannel(channelAddress, newBalanceA, newBalanceB, salt, nonce, signatureA, signatureB) {
|
|
249
|
+
const signerKeyBase58 = this._requireSignerKey();
|
|
250
|
+
try {
|
|
251
|
+
const { PrivateKey, PublicKey, Field, Poseidon, fetchAccount } = await getO1js();
|
|
252
|
+
const Mina = await this._setNetwork();
|
|
253
|
+
const signerPrivateKey = PrivateKey.fromBase58(signerKeyBase58);
|
|
254
|
+
const signerPublicKey = signerPrivateKey.toPublicKey();
|
|
255
|
+
await fetchAccount({ publicKey: signerPublicKey });
|
|
256
|
+
const zkApp = await this._getZkApp(channelAddress);
|
|
257
|
+
const balA = Field(newBalanceA);
|
|
258
|
+
const balB = Field(newBalanceB);
|
|
259
|
+
const saltField = Field(salt);
|
|
260
|
+
const newNonce = Field(nonce);
|
|
261
|
+
const newBalanceCommitment = Poseidon.hash([balA, balB, saltField]);
|
|
262
|
+
const sigA = this._deserializeSignature(signatureA, 'signatureA');
|
|
263
|
+
const sigB = this._deserializeSignature(signatureB, 'signatureB');
|
|
264
|
+
const cached = this._participantCache.get(channelAddress);
|
|
265
|
+
if (!cached) {
|
|
266
|
+
throw new MinaChannelError('Participant keys not found in cache. The channel must have been opened by this SDK instance, ' +
|
|
267
|
+
'or participant keys must be provided via openChannel().', exports.MINA_ERROR_CODES.ACCOUNT_NOT_FOUND, 'ACCOUNT_NOT_FOUND');
|
|
268
|
+
}
|
|
269
|
+
const participantA = PublicKey.fromBase58(cached.participantA);
|
|
270
|
+
const participantB = PublicKey.fromBase58(cached.participantB);
|
|
271
|
+
const channelNonce = Field(0);
|
|
272
|
+
const txn = await Mina.transaction(signerPublicKey, async () => {
|
|
273
|
+
await zkApp.claimFromChannel(balA, balB, saltField, sigA, sigB, participantA, participantB, channelNonce, newBalanceCommitment, newNonce);
|
|
274
|
+
});
|
|
275
|
+
await txn.prove();
|
|
276
|
+
const sentTx = await txn.sign([signerPrivateKey]).send();
|
|
277
|
+
const txHash = sentTx.hash ?? '';
|
|
278
|
+
this._logger.info({ event: 'claim_from_channel', channelAddress, nonce: nonce.toString(), txHash }, 'Claim submitted to Mina payment channel');
|
|
279
|
+
return { txHash };
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
if (err instanceof MinaChannelError)
|
|
283
|
+
throw err;
|
|
284
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.PROOF_GENERATION_FAILED, 'PROOF_GENERATION_FAILED');
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async closeChannel(channelAddress, finalBalanceA, finalBalanceB, salt, nonce, signatureA, signatureB) {
|
|
288
|
+
const signerKeyBase58 = this._requireSignerKey();
|
|
289
|
+
try {
|
|
290
|
+
const { PrivateKey, Field, fetchAccount } = await getO1js();
|
|
291
|
+
const Mina = await this._setNetwork();
|
|
292
|
+
const signerPrivateKey = PrivateKey.fromBase58(signerKeyBase58);
|
|
293
|
+
const signerPublicKey = signerPrivateKey.toPublicKey();
|
|
294
|
+
await fetchAccount({ publicKey: signerPublicKey });
|
|
295
|
+
const zkApp = await this._getZkApp(channelAddress);
|
|
296
|
+
const balA = Field(finalBalanceA);
|
|
297
|
+
const balB = Field(finalBalanceB);
|
|
298
|
+
const saltField = Field(salt);
|
|
299
|
+
const nonceField = Field(nonce);
|
|
300
|
+
const sigA = this._deserializeSignature(signatureA, 'signatureA');
|
|
301
|
+
const sigB = this._deserializeSignature(signatureB, 'signatureB');
|
|
302
|
+
const txn = await Mina.transaction(signerPublicKey, async () => {
|
|
303
|
+
await zkApp.initiateClose(balA, balB, saltField, nonceField, sigA, sigB);
|
|
304
|
+
});
|
|
305
|
+
await txn.prove();
|
|
306
|
+
const sentTx = await txn.sign([signerPrivateKey]).send();
|
|
307
|
+
const txHash = sentTx.hash ?? '';
|
|
308
|
+
this._logger.info({ event: 'close_channel', channelAddress, txHash }, 'Mina payment channel close initiated');
|
|
309
|
+
return { txHash };
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.TRANSACTION_FAILED, 'TRANSACTION_FAILED');
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async settleChannel(channelAddress, balanceA, balanceB, salt, participantA, participantB, nonce) {
|
|
316
|
+
const signerKeyBase58 = this._requireSignerKey();
|
|
317
|
+
try {
|
|
318
|
+
const { PrivateKey, PublicKey, Field, fetchAccount } = await getO1js();
|
|
319
|
+
const Mina = await this._setNetwork();
|
|
320
|
+
const signerPrivateKey = PrivateKey.fromBase58(signerKeyBase58);
|
|
321
|
+
const signerPublicKey = signerPrivateKey.toPublicKey();
|
|
322
|
+
await fetchAccount({ publicKey: signerPublicKey });
|
|
323
|
+
const zkApp = await this._getZkApp(channelAddress);
|
|
324
|
+
const balA = Field(balanceA);
|
|
325
|
+
const balB = Field(balanceB);
|
|
326
|
+
const saltField = Field(salt);
|
|
327
|
+
const pubA = PublicKey.fromBase58(participantA);
|
|
328
|
+
const pubB = PublicKey.fromBase58(participantB);
|
|
329
|
+
const nonceField = Field(nonce);
|
|
330
|
+
const txn = await Mina.transaction(signerPublicKey, async () => {
|
|
331
|
+
await zkApp.settle(balA, balB, saltField, pubA, pubB, nonceField);
|
|
332
|
+
});
|
|
333
|
+
await txn.prove();
|
|
334
|
+
const sentTx = await txn.sign([signerPrivateKey]).send();
|
|
335
|
+
const txHash = sentTx.hash ?? '';
|
|
336
|
+
this._logger.info({ event: 'settle_channel', channelAddress, txHash }, 'Mina payment channel settled');
|
|
337
|
+
return { txHash };
|
|
338
|
+
}
|
|
339
|
+
catch (err) {
|
|
340
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.TRANSACTION_FAILED, 'TRANSACTION_FAILED');
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
async getChannelState(channelAddress) {
|
|
344
|
+
try {
|
|
345
|
+
const { PublicKey, fetchAccount } = await getO1js();
|
|
346
|
+
const Contract = await getPaymentChannelContract();
|
|
347
|
+
const zkAppPublicKey = PublicKey.fromBase58(channelAddress);
|
|
348
|
+
const result = await fetchAccount({ publicKey: zkAppPublicKey });
|
|
349
|
+
if (result.error) {
|
|
350
|
+
throw new MinaChannelError(`Failed to fetch account at ${channelAddress}: ${String(result.error)}`, exports.MINA_ERROR_CODES.ACCOUNT_NOT_FOUND, 'ACCOUNT_NOT_FOUND');
|
|
351
|
+
}
|
|
352
|
+
const zkApp = new Contract(zkAppPublicKey);
|
|
353
|
+
const channelHash = zkApp.channelHash.get();
|
|
354
|
+
const balanceCommitment = zkApp.balanceCommitment.get();
|
|
355
|
+
const nonceField = zkApp.nonceField.get();
|
|
356
|
+
const channelState = zkApp.channelState.get();
|
|
357
|
+
const depositTotal = zkApp.depositTotal.get();
|
|
358
|
+
const closedAtSlot = zkApp.closedAtSlot.get();
|
|
359
|
+
const settlementTimeout = zkApp.settlementTimeout.get();
|
|
360
|
+
const tokenIdField = zkApp.tokenId_.get();
|
|
361
|
+
const cached = this._participantCache.get(channelAddress);
|
|
362
|
+
return {
|
|
363
|
+
participantA: cached?.participantA ?? '',
|
|
364
|
+
participantB: cached?.participantB ?? '',
|
|
365
|
+
channelState: Number(channelState.toBigInt()),
|
|
366
|
+
depositTotal: depositTotal.toBigInt(),
|
|
367
|
+
balanceCommitment: balanceCommitment.toString(),
|
|
368
|
+
nonceField: nonceField.toBigInt(),
|
|
369
|
+
closedAtSlot: closedAtSlot.toBigInt(),
|
|
370
|
+
settlementTimeout: settlementTimeout.toBigInt(),
|
|
371
|
+
tokenId: tokenIdField.toString(),
|
|
372
|
+
channelHash: channelHash.toString(),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
catch (err) {
|
|
376
|
+
if (err instanceof MinaChannelError)
|
|
377
|
+
throw err;
|
|
378
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.ACCOUNT_NOT_FOUND, 'ACCOUNT_NOT_FOUND');
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
async getChannelEvents(channelAddress) {
|
|
382
|
+
try {
|
|
383
|
+
const zkApp = await this._getZkApp(channelAddress);
|
|
384
|
+
let events = [];
|
|
385
|
+
if (typeof zkApp.fetchEvents === 'function') {
|
|
386
|
+
events = await zkApp.fetchEvents();
|
|
387
|
+
}
|
|
388
|
+
return events.map((event) => ({
|
|
389
|
+
type: String(event.type ?? 'unknown'),
|
|
390
|
+
data: (event.event?.data ?? event.data ?? {}),
|
|
391
|
+
}));
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.ARCHIVE_NODE_ERROR, 'ARCHIVE_NODE_ERROR');
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
async signBalanceProof(channelAddress, balanceA, balanceB, salt, nonce) {
|
|
398
|
+
if (!this._signerPrivateKey) {
|
|
399
|
+
throw new MinaChannelError('signer private key required for signBalanceProof', exports.MINA_ERROR_CODES.INVALID_PARAMETERS, 'INVALID_PARAMETERS');
|
|
400
|
+
}
|
|
401
|
+
try {
|
|
402
|
+
const { PrivateKey, PublicKey, Field, Poseidon, Signature } = await getO1js();
|
|
403
|
+
const commitment = Poseidon.hash([Field(balanceA), Field(balanceB), Field(salt)]);
|
|
404
|
+
const channelPubKey = PublicKey.fromBase58(channelAddress);
|
|
405
|
+
const channelHashField = Poseidon.hash([channelPubKey.x]);
|
|
406
|
+
const privateKey = PrivateKey.fromBase58(this._signerPrivateKey);
|
|
407
|
+
const signature = Signature.create(privateKey, [commitment, Field(nonce), channelHashField]);
|
|
408
|
+
const sigJson = signature.toJSON();
|
|
409
|
+
return JSON.stringify({
|
|
410
|
+
commitment: commitment.toString(),
|
|
411
|
+
signature: { r: sigJson.r, s: sigJson.s },
|
|
412
|
+
nonce: nonce.toString(),
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
catch (err) {
|
|
416
|
+
if (err instanceof MinaChannelError)
|
|
417
|
+
throw err;
|
|
418
|
+
throw this._wrapError(err, exports.MINA_ERROR_CODES.PROOF_GENERATION_FAILED, 'PROOF_GENERATION_FAILED');
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
async verifyBalanceProof(channelAddress, balanceCommitment, proof, nonce) {
|
|
422
|
+
try {
|
|
423
|
+
const { Field, Poseidon, Signature, PublicKey, PrivateKey } = await getO1js();
|
|
424
|
+
let proofData;
|
|
425
|
+
try {
|
|
426
|
+
proofData = JSON.parse(proof);
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
this._logger.warn({ event: 'verify_balance_proof_parse_error', channelAddress }, 'Balance proof is not valid JSON');
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
if (typeof proofData !== 'object' ||
|
|
433
|
+
proofData === null ||
|
|
434
|
+
typeof proofData.commitment !== 'string' ||
|
|
435
|
+
typeof proofData.nonce !== 'string' ||
|
|
436
|
+
typeof proofData.signature !== 'object' ||
|
|
437
|
+
proofData.signature === null ||
|
|
438
|
+
typeof proofData.signature.r !== 'string' ||
|
|
439
|
+
typeof proofData.signature.s !== 'string') {
|
|
440
|
+
this._logger.warn({ event: 'verify_balance_proof_invalid_structure', channelAddress }, 'Balance proof has invalid structure: expected { commitment, signature: { r, s }, nonce }');
|
|
441
|
+
return false;
|
|
442
|
+
}
|
|
443
|
+
if (balanceCommitment && proofData.commitment !== balanceCommitment) {
|
|
444
|
+
this._logger.warn({
|
|
445
|
+
event: 'verify_balance_proof_commitment_mismatch',
|
|
446
|
+
channelAddress,
|
|
447
|
+
expected: balanceCommitment,
|
|
448
|
+
actual: proofData.commitment,
|
|
449
|
+
}, 'Balance proof commitment does not match expected on-chain commitment');
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
if (BigInt(proofData.nonce) !== nonce) {
|
|
453
|
+
this._logger.warn({
|
|
454
|
+
event: 'verify_balance_proof_nonce_mismatch',
|
|
455
|
+
channelAddress,
|
|
456
|
+
expected: nonce.toString(),
|
|
457
|
+
actual: proofData.nonce,
|
|
458
|
+
}, 'Balance proof nonce does not match expected nonce');
|
|
459
|
+
return false;
|
|
460
|
+
}
|
|
461
|
+
const commitment = Field(proofData.commitment);
|
|
462
|
+
const channelPubKey = PublicKey.fromBase58(channelAddress);
|
|
463
|
+
const channelHashField = Poseidon.hash([channelPubKey.x]);
|
|
464
|
+
const message = [commitment, Field(proofData.nonce), channelHashField];
|
|
465
|
+
const signature = Signature.fromJSON({
|
|
466
|
+
r: proofData.signature.r,
|
|
467
|
+
s: proofData.signature.s,
|
|
468
|
+
});
|
|
469
|
+
if (proofData.signerPublicKey) {
|
|
470
|
+
const signerPubKey = PublicKey.fromBase58(proofData.signerPublicKey);
|
|
471
|
+
const isValid = signature.verify(signerPubKey, message);
|
|
472
|
+
return isValid.toBoolean();
|
|
473
|
+
}
|
|
474
|
+
if (this._signerPrivateKey) {
|
|
475
|
+
const privateKey = PrivateKey.fromBase58(this._signerPrivateKey);
|
|
476
|
+
const publicKey = privateKey.toPublicKey();
|
|
477
|
+
const isValid = signature.verify(publicKey, message);
|
|
478
|
+
return isValid.toBoolean();
|
|
479
|
+
}
|
|
480
|
+
this._logger.warn({ event: 'verify_balance_proof_no_key', channelAddress }, 'Cannot verify balance proof: no signer key or public key available');
|
|
481
|
+
return false;
|
|
482
|
+
}
|
|
483
|
+
catch (err) {
|
|
484
|
+
this._logger.warn({
|
|
485
|
+
event: 'verify_balance_proof_error',
|
|
486
|
+
channelAddress,
|
|
487
|
+
error: err instanceof Error ? err.message : String(err),
|
|
488
|
+
}, 'Balance proof verification failed');
|
|
489
|
+
return false;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
subscribeToChannel(channelAddress, callback, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS) {
|
|
493
|
+
let disposed = false;
|
|
494
|
+
let pollInFlight = false;
|
|
495
|
+
let previousState;
|
|
496
|
+
const poll = async () => {
|
|
497
|
+
if (disposed || pollInFlight)
|
|
498
|
+
return;
|
|
499
|
+
pollInFlight = true;
|
|
500
|
+
try {
|
|
501
|
+
const currentState = await this.getChannelState(channelAddress);
|
|
502
|
+
if (disposed)
|
|
503
|
+
return;
|
|
504
|
+
const changed = !previousState ||
|
|
505
|
+
previousState.channelState !== currentState.channelState ||
|
|
506
|
+
previousState.nonceField !== currentState.nonceField ||
|
|
507
|
+
previousState.balanceCommitment !== currentState.balanceCommitment ||
|
|
508
|
+
previousState.depositTotal !== currentState.depositTotal;
|
|
509
|
+
if (changed) {
|
|
510
|
+
previousState = currentState;
|
|
511
|
+
callback(currentState);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
catch (err) {
|
|
515
|
+
this._logger.warn({
|
|
516
|
+
event: 'subscription_poll_error',
|
|
517
|
+
channelAddress,
|
|
518
|
+
error: err instanceof Error ? err.message : String(err),
|
|
519
|
+
}, 'Failed to poll channel state');
|
|
520
|
+
}
|
|
521
|
+
finally {
|
|
522
|
+
pollInFlight = false;
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
void poll();
|
|
526
|
+
const intervalId = setInterval(() => {
|
|
527
|
+
void poll();
|
|
528
|
+
}, pollIntervalMs);
|
|
529
|
+
return {
|
|
530
|
+
unsubscribe: () => {
|
|
531
|
+
disposed = true;
|
|
532
|
+
clearInterval(intervalId);
|
|
533
|
+
},
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
exports.MinaPaymentChannelSDK = MinaPaymentChannelSDK;
|
|
538
|
+
//# sourceMappingURL=mina-payment-channel-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mina-payment-channel-sdk.js","sourceRoot":"","sources":["../../src/settlement/mina-payment-channel-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Database } from 'better-sqlite3';
|
|
2
2
|
import type { Logger } from 'pino';
|
|
3
|
-
import type {
|
|
3
|
+
import type { ChainProviderRegistry } from './provider/chain-provider-registry';
|
|
4
4
|
import type { ChannelManager } from './channel-manager';
|
|
5
|
-
import {
|
|
5
|
+
import { type BTPClaimMessage } from '../btp/btp-claim-types';
|
|
6
|
+
import { type NIP59ClaimWrapper } from './privacy/nip59-claim-wrapper';
|
|
6
7
|
export interface BTPProtocolData {
|
|
7
8
|
protocolName: string;
|
|
8
9
|
contentType: number;
|
|
@@ -10,21 +11,26 @@ export interface BTPProtocolData {
|
|
|
10
11
|
}
|
|
11
12
|
export interface PerPacketClaimResult {
|
|
12
13
|
protocolData: BTPProtocolData;
|
|
13
|
-
claimMessage:
|
|
14
|
+
claimMessage: BTPClaimMessage;
|
|
15
|
+
executionCondition?: Uint8Array;
|
|
14
16
|
}
|
|
15
17
|
export declare class PerPacketClaimService {
|
|
16
|
-
private readonly
|
|
18
|
+
private readonly _registry;
|
|
17
19
|
private readonly channelManager;
|
|
18
20
|
private readonly db;
|
|
19
21
|
private readonly nodeId;
|
|
22
|
+
private readonly peerIdToChainMap?;
|
|
23
|
+
private readonly _nip59Wrapper?;
|
|
24
|
+
private readonly _nodePrivateKey?;
|
|
25
|
+
private readonly _peerNip59PubKeys?;
|
|
20
26
|
private readonly logger;
|
|
21
27
|
private readonly cumulativeTransferred;
|
|
22
28
|
private readonly currentNonce;
|
|
23
29
|
private readonly channelClaimCache;
|
|
24
30
|
private readonly latestClaim;
|
|
25
|
-
constructor(
|
|
31
|
+
constructor(_registry: ChainProviderRegistry, channelManager: ChannelManager, db: Database, logger: Logger, nodeId: string, peerIdToChainMap?: Map<string, string> | undefined, _nip59Wrapper?: NIP59ClaimWrapper | undefined, _nodePrivateKey?: Uint8Array | undefined, _peerNip59PubKeys?: Map<string, Uint8Array> | undefined);
|
|
26
32
|
generateClaimForPacket(toPeerId: string, tokenId: string, amount: bigint): Promise<PerPacketClaimResult | null>;
|
|
27
|
-
getLatestClaim(channelId: string):
|
|
33
|
+
getLatestClaim(channelId: string): BTPClaimMessage | null;
|
|
28
34
|
resetChannel(channelId: string): void;
|
|
29
35
|
private buildChannelContext;
|
|
30
36
|
private recoverFromDb;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"per-packet-claim-service.d.ts","sourceRoot":"","sources":["../../src/settlement/per-packet-claim-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"per-packet-claim-service.d.ts","sourceRoot":"","sources":["../../src/settlement/per-packet-claim-service.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAGhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAEL,KAAK,eAAe,EAOrB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,+BAA+B,CAAC;AAMvC,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AA8BD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,eAAe,CAAC;IAC9B,YAAY,EAAE,eAAe,CAAC;IAE9B,kBAAkB,CAAC,EAAE,UAAU,CAAC;CACjC;AASD,qBAAa,qBAAqB;IAQ9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAEnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAfrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAkC;IACxE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+C;IACjF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2C;gBAGpD,SAAS,EAAE,qBAAqB,EAChC,cAAc,EAAE,cAAc,EAC9B,EAAE,EAAE,QAAQ,EAC7B,MAAM,EAAE,MAAM,EACG,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA,EACtC,aAAa,CAAC,EAAE,iBAAiB,YAAA,EACjC,eAAe,CAAC,EAAE,UAAU,YAAA,EAC5B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,YAAA;IAiBxD,sBAAsB,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAwMvC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAUzD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;YAoBvB,mBAAmB;IAsGjC,OAAO,CAAC,aAAa;IA+FrB,OAAO,CAAC,YAAY;CAsBrB"}
|