@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.
Files changed (88) hide show
  1. package/dist/btp/btp-claim-types.d.ts +24 -2
  2. package/dist/btp/btp-claim-types.d.ts.map +1 -1
  3. package/dist/btp/btp-claim-types.js +115 -9
  4. package/dist/btp/btp-claim-types.js.map +1 -1
  5. package/dist/btp/inbound-claim-validator.d.ts +5 -1
  6. package/dist/btp/inbound-claim-validator.d.ts.map +1 -1
  7. package/dist/btp/inbound-claim-validator.js +52 -10
  8. package/dist/btp/inbound-claim-validator.js.map +1 -1
  9. package/dist/config/config-loader.d.ts.map +1 -1
  10. package/dist/config/config-loader.js +3 -0
  11. package/dist/config/config-loader.js.map +1 -1
  12. package/dist/config/types.d.ts +15 -0
  13. package/dist/config/types.d.ts.map +1 -1
  14. package/dist/config/types.js +45 -0
  15. package/dist/config/types.js.map +1 -1
  16. package/dist/core/connector-node.d.ts.map +1 -1
  17. package/dist/core/connector-node.js +57 -12
  18. package/dist/core/connector-node.js.map +1 -1
  19. package/dist/core/packet-handler.d.ts +10 -1
  20. package/dist/core/packet-handler.d.ts.map +1 -1
  21. package/dist/core/packet-handler.js +67 -2
  22. package/dist/core/packet-handler.js.map +1 -1
  23. package/dist/settlement/channel-manager.d.ts +3 -2
  24. package/dist/settlement/channel-manager.d.ts.map +1 -1
  25. package/dist/settlement/channel-manager.js +18 -6
  26. package/dist/settlement/channel-manager.js.map +1 -1
  27. package/dist/settlement/claim-receiver.d.ts +16 -3
  28. package/dist/settlement/claim-receiver.d.ts.map +1 -1
  29. package/dist/settlement/claim-receiver.js +434 -117
  30. package/dist/settlement/claim-receiver.js.map +1 -1
  31. package/dist/settlement/claim-sender.d.ts +4 -2
  32. package/dist/settlement/claim-sender.d.ts.map +1 -1
  33. package/dist/settlement/claim-sender.js +38 -0
  34. package/dist/settlement/claim-sender.js.map +1 -1
  35. package/dist/settlement/mina-payment-channel-sdk.d.ts +73 -0
  36. package/dist/settlement/mina-payment-channel-sdk.d.ts.map +1 -0
  37. package/dist/settlement/mina-payment-channel-sdk.js +538 -0
  38. package/dist/settlement/mina-payment-channel-sdk.js.map +1 -0
  39. package/dist/settlement/per-packet-claim-service.d.ts +12 -6
  40. package/dist/settlement/per-packet-claim-service.d.ts.map +1 -1
  41. package/dist/settlement/per-packet-claim-service.js +205 -40
  42. package/dist/settlement/per-packet-claim-service.js.map +1 -1
  43. package/dist/settlement/privacy/index.d.ts +3 -0
  44. package/dist/settlement/privacy/index.d.ts.map +1 -0
  45. package/dist/settlement/privacy/index.js +11 -0
  46. package/dist/settlement/privacy/index.js.map +1 -0
  47. package/dist/settlement/privacy/nip59-claim-wrapper.d.ts +60 -0
  48. package/dist/settlement/privacy/nip59-claim-wrapper.d.ts.map +1 -0
  49. package/dist/settlement/privacy/nip59-claim-wrapper.js +361 -0
  50. package/dist/settlement/privacy/nip59-claim-wrapper.js.map +1 -0
  51. package/dist/settlement/provider/chain-provider-registry.d.ts +20 -0
  52. package/dist/settlement/provider/chain-provider-registry.d.ts.map +1 -0
  53. package/dist/settlement/provider/chain-provider-registry.js +53 -0
  54. package/dist/settlement/provider/chain-provider-registry.js.map +1 -0
  55. package/dist/settlement/provider/evm-payment-channel-provider.d.ts +31 -0
  56. package/dist/settlement/provider/evm-payment-channel-provider.d.ts.map +1 -0
  57. package/dist/settlement/provider/evm-payment-channel-provider.js +207 -0
  58. package/dist/settlement/provider/evm-payment-channel-provider.js.map +1 -0
  59. package/dist/settlement/provider/index.d.ts +6 -0
  60. package/dist/settlement/provider/index.d.ts.map +1 -0
  61. package/dist/settlement/provider/index.js +16 -0
  62. package/dist/settlement/provider/index.js.map +1 -0
  63. package/dist/settlement/provider/mina-payment-channel-provider.d.ts +43 -0
  64. package/dist/settlement/provider/mina-payment-channel-provider.d.ts.map +1 -0
  65. package/dist/settlement/provider/mina-payment-channel-provider.js +330 -0
  66. package/dist/settlement/provider/mina-payment-channel-provider.js.map +1 -0
  67. package/dist/settlement/provider/payment-channel-provider.d.ts +79 -0
  68. package/dist/settlement/provider/payment-channel-provider.d.ts.map +1 -0
  69. package/dist/settlement/provider/payment-channel-provider.js +3 -0
  70. package/dist/settlement/provider/payment-channel-provider.js.map +1 -0
  71. package/dist/settlement/provider/solana-payment-channel-provider.d.ts +38 -0
  72. package/dist/settlement/provider/solana-payment-channel-provider.d.ts.map +1 -0
  73. package/dist/settlement/provider/solana-payment-channel-provider.js +262 -0
  74. package/dist/settlement/provider/solana-payment-channel-provider.js.map +1 -0
  75. package/dist/settlement/settlement-executor.d.ts +11 -7
  76. package/dist/settlement/settlement-executor.d.ts.map +1 -1
  77. package/dist/settlement/settlement-executor.js +74 -65
  78. package/dist/settlement/settlement-executor.js.map +1 -1
  79. package/dist/settlement/settlement-monitor.d.ts.map +1 -1
  80. package/dist/settlement/settlement-monitor.js.map +1 -1
  81. package/dist/settlement/solana-payment-channel-sdk.d.ts +75 -0
  82. package/dist/settlement/solana-payment-channel-sdk.d.ts.map +1 -0
  83. package/dist/settlement/solana-payment-channel-sdk.js +600 -0
  84. package/dist/settlement/solana-payment-channel-sdk.js.map +1 -0
  85. package/dist/settlement/types.d.ts +1 -1
  86. package/dist/settlement/types.d.ts.map +1 -1
  87. package/dist/settlement/types.js.map +1 -1
  88. package/package.json +12 -1
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVMPaymentChannelProvider = void 0;
4
+ exports.createEVMProviderFactory = createEVMProviderFactory;
5
+ function safeBigInt(value, fieldName) {
6
+ try {
7
+ return BigInt(value);
8
+ }
9
+ catch {
10
+ const sanitized = value.length > 32 ? `${value.slice(0, 32)}...` : value;
11
+ throw new Error(`Invalid ${fieldName}: expected a numeric string, received "${sanitized}"`);
12
+ }
13
+ }
14
+ class EVMPaymentChannelProvider {
15
+ _sdk;
16
+ _tokenAddress;
17
+ _logger;
18
+ chainType = 'evm';
19
+ chainId;
20
+ constructor(_sdk, chainId, _tokenAddress, _logger) {
21
+ this._sdk = _sdk;
22
+ this._tokenAddress = _tokenAddress;
23
+ this._logger = _logger;
24
+ if (!chainId) {
25
+ throw new Error('EVMPaymentChannelProvider: chainId must not be empty');
26
+ }
27
+ if (!_tokenAddress) {
28
+ throw new Error('EVMPaymentChannelProvider: tokenAddress must not be empty');
29
+ }
30
+ this.chainId = chainId;
31
+ }
32
+ async openChannel(participant, settlementTimeout) {
33
+ this._logger.info('EVMPaymentChannelProvider: opening channel', {
34
+ participant,
35
+ settlementTimeout,
36
+ chainId: this.chainId,
37
+ });
38
+ const result = await this._sdk.openChannel(participant, this._tokenAddress, settlementTimeout, 0n);
39
+ return { channelId: result.channelId, txHash: result.txHash };
40
+ }
41
+ async deposit(channelId, amount) {
42
+ this._logger.info('EVMPaymentChannelProvider: depositing', {
43
+ channelId,
44
+ amount,
45
+ chainId: this.chainId,
46
+ });
47
+ await this._sdk.deposit(channelId, this._tokenAddress, safeBigInt(amount, 'deposit amount'));
48
+ return { txHash: '' };
49
+ }
50
+ async claimFromChannel(channelId, balanceProof, signature) {
51
+ this._logger.info('EVMPaymentChannelProvider: claiming from channel', {
52
+ channelId,
53
+ nonce: balanceProof.nonce,
54
+ chainId: this.chainId,
55
+ });
56
+ const sdkProof = this.toSdkBalanceProof(balanceProof);
57
+ await this._sdk.claimFromChannel(channelId, this._tokenAddress, sdkProof, signature);
58
+ return { txHash: '' };
59
+ }
60
+ async closeChannel(channelId) {
61
+ this._logger.info('EVMPaymentChannelProvider: closing channel', {
62
+ channelId,
63
+ chainId: this.chainId,
64
+ });
65
+ await this._sdk.closeChannel(channelId, this._tokenAddress);
66
+ return { txHash: '' };
67
+ }
68
+ async settleChannel(channelId) {
69
+ this._logger.info('EVMPaymentChannelProvider: settling channel', {
70
+ channelId,
71
+ chainId: this.chainId,
72
+ });
73
+ await this._sdk.settleChannel(channelId, this._tokenAddress);
74
+ return { txHash: '' };
75
+ }
76
+ async signBalanceProof(params) {
77
+ this._logger.debug('EVMPaymentChannelProvider: signing balance proof', {
78
+ channelId: params.channelId,
79
+ nonce: params.nonce,
80
+ chainId: this.chainId,
81
+ });
82
+ return this._sdk.signBalanceProof(params.channelId, params.nonce, safeBigInt(params.transferredAmount, 'transferredAmount'), safeBigInt(params.lockedAmount, 'lockedAmount'), params.locksRoot);
83
+ }
84
+ async verifyBalanceProof(params) {
85
+ this._logger.debug('EVMPaymentChannelProvider: verifying balance proof', {
86
+ channelId: params.channelId,
87
+ nonce: params.nonce,
88
+ chainId: this.chainId,
89
+ });
90
+ const sdkProof = this.toSdkBalanceProof(params);
91
+ return this._sdk.verifyBalanceProof(sdkProof, params.signature, params.signerAddress);
92
+ }
93
+ async getChannelState(channelId) {
94
+ const state = await this._sdk.getChannelState(channelId, this._tokenAddress);
95
+ return this.toProviderChannelState(state);
96
+ }
97
+ subscribeToEvents(channelId, callback) {
98
+ this._logger.debug('EVMPaymentChannelProvider: subscribing to events', {
99
+ channelId,
100
+ chainId: this.chainId,
101
+ });
102
+ let unsubscribed = false;
103
+ const forwardEvent = (type, eventChannelId, data) => {
104
+ if (unsubscribed)
105
+ return;
106
+ if (eventChannelId !== channelId)
107
+ return;
108
+ const event = {
109
+ type,
110
+ channelId: eventChannelId,
111
+ data,
112
+ };
113
+ callback(event);
114
+ };
115
+ const onRegError = (eventName, err) => {
116
+ this._logger.warn('EVMPaymentChannelProvider: event registration failed', {
117
+ eventName,
118
+ channelId,
119
+ chainId: this.chainId,
120
+ error: err instanceof Error ? err.message : String(err),
121
+ });
122
+ };
123
+ void this._sdk
124
+ .onChannelOpened(this._tokenAddress, (evt) => {
125
+ forwardEvent('channel_opened', evt.channelId, {
126
+ participant1: evt.participant1,
127
+ participant2: evt.participant2,
128
+ settlementTimeout: evt.settlementTimeout,
129
+ });
130
+ })
131
+ .catch((err) => onRegError('ChannelOpened', err));
132
+ void this._sdk
133
+ .onChannelClosed(this._tokenAddress, (evt) => {
134
+ forwardEvent('channel_closed', evt.channelId, {
135
+ closingParticipant: evt.closingParticipant,
136
+ });
137
+ })
138
+ .catch((err) => onRegError('ChannelClosed', err));
139
+ void this._sdk
140
+ .onChannelSettled(this._tokenAddress, (evt) => {
141
+ forwardEvent('channel_settled', evt.channelId, {
142
+ participant1Amount: evt.participant1Amount.toString(),
143
+ participant2Amount: evt.participant2Amount.toString(),
144
+ });
145
+ })
146
+ .catch((err) => onRegError('ChannelSettled', err));
147
+ void this._sdk
148
+ .onChannelCooperativeSettled(this._tokenAddress, (evt) => {
149
+ forwardEvent('channel_settled', evt.channelId, {
150
+ participant1Amount: evt.participant1Amount.toString(),
151
+ participant2Amount: evt.participant2Amount.toString(),
152
+ cooperative: true,
153
+ });
154
+ })
155
+ .catch((err) => onRegError('ChannelCooperativeSettled', err));
156
+ return {
157
+ unsubscribe: () => {
158
+ unsubscribed = true;
159
+ this._sdk.removeAllListeners();
160
+ this._logger.debug('EVMPaymentChannelProvider: unsubscribed from events', {
161
+ channelId,
162
+ chainId: this.chainId,
163
+ });
164
+ },
165
+ };
166
+ }
167
+ async getSigningContext() {
168
+ const [chainId, tokenNetworkAddress, signerAddress] = await Promise.all([
169
+ this._sdk.getChainId(),
170
+ this._sdk.getTokenNetworkAddress(this._tokenAddress),
171
+ this._sdk.getSignerAddress(),
172
+ ]);
173
+ return { chainId, tokenNetworkAddress, signerAddress };
174
+ }
175
+ toSdkBalanceProof(params) {
176
+ return {
177
+ channelId: params.channelId,
178
+ nonce: params.nonce,
179
+ transferredAmount: safeBigInt(params.transferredAmount, 'transferredAmount'),
180
+ lockedAmount: safeBigInt(params.lockedAmount, 'lockedAmount'),
181
+ locksRoot: params.locksRoot,
182
+ };
183
+ }
184
+ toProviderChannelState(state) {
185
+ return {
186
+ channelId: state.channelId,
187
+ status: state.status,
188
+ participants: [...state.participants],
189
+ deposit: state.myDeposit + state.theirDeposit,
190
+ };
191
+ }
192
+ }
193
+ exports.EVMPaymentChannelProvider = EVMPaymentChannelProvider;
194
+ function createEVMProviderFactory(sdk, logger) {
195
+ return (config) => {
196
+ if (config.chainType !== 'evm') {
197
+ throw new Error(`EVM factory received non-EVM config: ${config.chainType}`);
198
+ }
199
+ if (!/^[\w-]+$/.test(config.keyId)) {
200
+ throw new Error('EVM factory received invalid keyId: expected alphanumeric string with hyphens/underscores');
201
+ }
202
+ const chainId = `evm:${config.keyId}`;
203
+ const tokenAddress = config.registryAddress;
204
+ return new EVMPaymentChannelProvider(sdk, chainId, tokenAddress, logger);
205
+ };
206
+ }
207
+ //# sourceMappingURL=evm-payment-channel-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm-payment-channel-provider.js","sourceRoot":"","sources":["../../../src/settlement/provider/evm-payment-channel-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { type PaymentChannelProvider, type ProviderChannelState, type ProviderEventType, type ProviderEvent, type ProviderEventCallback, type ProviderEventSubscription, type OpenChannelResult, type TxResult, type BalanceProofParams, type VerifyBalanceProofParams, type ProviderConfig, type EVMProviderConfig, type SolanaProviderConfig, type MinaProviderConfig, } from './payment-channel-provider';
2
+ export { ChainProviderRegistry, ChainProviderAlreadyRegisteredError, type RegistryPeerConfig, type ChainProviderFactory, } from './chain-provider-registry';
3
+ export { EVMPaymentChannelProvider, createEVMProviderFactory, } from './evm-payment-channel-provider';
4
+ export { SolanaPaymentChannelProvider, createSolanaProviderFactory, } from './solana-payment-channel-provider';
5
+ export { MinaPaymentChannelProvider, createMinaProviderFactory, type MinaProviderOptions, } from './mina-payment-channel-provider';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/settlement/provider/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,qBAAqB,EACrB,mCAAmC,EACnC,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,KAAK,mBAAmB,GACzB,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMinaProviderFactory = exports.MinaPaymentChannelProvider = exports.createSolanaProviderFactory = exports.SolanaPaymentChannelProvider = exports.createEVMProviderFactory = exports.EVMPaymentChannelProvider = exports.ChainProviderAlreadyRegisteredError = exports.ChainProviderRegistry = void 0;
4
+ var chain_provider_registry_1 = require("./chain-provider-registry");
5
+ Object.defineProperty(exports, "ChainProviderRegistry", { enumerable: true, get: function () { return chain_provider_registry_1.ChainProviderRegistry; } });
6
+ Object.defineProperty(exports, "ChainProviderAlreadyRegisteredError", { enumerable: true, get: function () { return chain_provider_registry_1.ChainProviderAlreadyRegisteredError; } });
7
+ var evm_payment_channel_provider_1 = require("./evm-payment-channel-provider");
8
+ Object.defineProperty(exports, "EVMPaymentChannelProvider", { enumerable: true, get: function () { return evm_payment_channel_provider_1.EVMPaymentChannelProvider; } });
9
+ Object.defineProperty(exports, "createEVMProviderFactory", { enumerable: true, get: function () { return evm_payment_channel_provider_1.createEVMProviderFactory; } });
10
+ var solana_payment_channel_provider_1 = require("./solana-payment-channel-provider");
11
+ Object.defineProperty(exports, "SolanaPaymentChannelProvider", { enumerable: true, get: function () { return solana_payment_channel_provider_1.SolanaPaymentChannelProvider; } });
12
+ Object.defineProperty(exports, "createSolanaProviderFactory", { enumerable: true, get: function () { return solana_payment_channel_provider_1.createSolanaProviderFactory; } });
13
+ var mina_payment_channel_provider_1 = require("./mina-payment-channel-provider");
14
+ Object.defineProperty(exports, "MinaPaymentChannelProvider", { enumerable: true, get: function () { return mina_payment_channel_provider_1.MinaPaymentChannelProvider; } });
15
+ Object.defineProperty(exports, "createMinaProviderFactory", { enumerable: true, get: function () { return mina_payment_channel_provider_1.createMinaProviderFactory; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/settlement/provider/index.ts"],"names":[],"mappings":";;;AAyBA,qEAKmC;AAJjC,gIAAA,qBAAqB,OAAA;AACrB,8IAAA,mCAAmC,OAAA;AAKrC,+EAGwC;AAFtC,yIAAA,yBAAyB,OAAA;AACzB,wIAAA,wBAAwB,OAAA;AAG1B,qFAG2C;AAFzC,+IAAA,4BAA4B,OAAA;AAC5B,8IAAA,2BAA2B,OAAA;AAG7B,iFAIyC;AAHvC,2IAAA,0BAA0B,OAAA;AAC1B,0IAAA,yBAAyB,OAAA"}
@@ -0,0 +1,43 @@
1
+ import type { Logger } from '../../utils/logger';
2
+ import type { BlockchainType } from '../../btp/btp-claim-types';
3
+ import type { PaymentChannelProvider, ProviderChannelState, ProviderEventCallback, ProviderEventSubscription, OpenChannelResult, TxResult, BalanceProofParams, VerifyBalanceProofParams } from './payment-channel-provider';
4
+ import type { ChainProviderFactory } from './chain-provider-registry';
5
+ import { MinaPaymentChannelSDK } from '../mina-payment-channel-sdk';
6
+ export interface MinaProviderOptions {
7
+ tokenId?: string;
8
+ network?: string;
9
+ }
10
+ export declare class MinaPaymentChannelProvider implements PaymentChannelProvider {
11
+ private readonly _sdk;
12
+ private readonly _zkAppAddress;
13
+ private readonly _logger;
14
+ readonly chainType: BlockchainType;
15
+ readonly chainId: string;
16
+ private readonly _tokenId;
17
+ private readonly _network;
18
+ private _signerPublicKey;
19
+ constructor(_sdk: MinaPaymentChannelSDK, chainId: string, _zkAppAddress: string, signerKey: string, _logger: Logger, options?: MinaProviderOptions);
20
+ private _preCompile;
21
+ openChannel(participant: string, settlementTimeout: number): Promise<OpenChannelResult>;
22
+ deposit(channelId: string, amount: string): Promise<TxResult>;
23
+ claimFromChannel(channelId: string, balanceProof: BalanceProofParams, signature: string): Promise<TxResult>;
24
+ closeChannel(channelId: string, finalBalanceA?: bigint, finalBalanceB?: bigint, salt?: bigint, nonce?: bigint, signatureA?: string, signatureB?: string): Promise<TxResult>;
25
+ settleChannel(channelId: string, balanceA?: bigint, balanceB?: bigint, salt?: bigint, participantA?: string, participantB?: string, nonce?: bigint): Promise<TxResult>;
26
+ signBalanceProof(params: BalanceProofParams): Promise<string>;
27
+ verifyBalanceProof(params: VerifyBalanceProofParams): Promise<boolean>;
28
+ getChannelState(channelId: string): Promise<ProviderChannelState>;
29
+ subscribeToEvents(channelId: string, callback: ProviderEventCallback): ProviderEventSubscription;
30
+ getMinaContext(): Promise<{
31
+ zkAppAddress: string;
32
+ tokenId: string;
33
+ network: string;
34
+ signerAddress: string;
35
+ }>;
36
+ private _ensureSignerPublicKey;
37
+ private _toProviderChannelState;
38
+ private _diffState;
39
+ private _wrapError;
40
+ private _warnIfEVMFields;
41
+ }
42
+ export declare function createMinaProviderFactory(logger: Logger, signerKey: string): ChainProviderFactory;
43
+ //# sourceMappingURL=mina-payment-channel-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mina-payment-channel-provider.d.ts","sourceRoot":"","sources":["../../../src/settlement/provider/mina-payment-channel-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MinaPaymentChannelProvider = void 0;
4
+ exports.createMinaProviderFactory = createMinaProviderFactory;
5
+ const mina_payment_channel_sdk_1 = require("../mina-payment-channel-sdk");
6
+ const MINA_CHANNEL_STATE = {
7
+ UNINITIALIZED: 0,
8
+ OPEN: 1,
9
+ CLOSING: 2,
10
+ SETTLED: 3,
11
+ };
12
+ function safeBigInt(value, fieldName) {
13
+ try {
14
+ return BigInt(value);
15
+ }
16
+ catch {
17
+ const sanitized = value.length > 32 ? `${value.slice(0, 32)}...` : value;
18
+ throw new Error(`Invalid ${fieldName}: expected a numeric string, received "${sanitized}"`);
19
+ }
20
+ }
21
+ class MinaPaymentChannelProvider {
22
+ _sdk;
23
+ _zkAppAddress;
24
+ _logger;
25
+ chainType = 'mina';
26
+ chainId;
27
+ _tokenId;
28
+ _network;
29
+ _signerPublicKey = null;
30
+ constructor(_sdk, chainId, _zkAppAddress, signerKey, _logger, options) {
31
+ this._sdk = _sdk;
32
+ this._zkAppAddress = _zkAppAddress;
33
+ this._logger = _logger;
34
+ if (!chainId) {
35
+ throw new Error('MinaPaymentChannelProvider: chainId must not be empty');
36
+ }
37
+ if (!_zkAppAddress) {
38
+ throw new Error('MinaPaymentChannelProvider: zkAppAddress must not be empty');
39
+ }
40
+ if (!signerKey) {
41
+ throw new Error('MinaPaymentChannelProvider: signerKey must not be empty');
42
+ }
43
+ this.chainId = chainId;
44
+ this._tokenId = options?.tokenId ?? 'MINA';
45
+ this._network = options?.network ?? chainId.split(':')[1] ?? 'devnet';
46
+ void this._preCompile();
47
+ }
48
+ async _preCompile() {
49
+ try {
50
+ await this._sdk.compileContract();
51
+ this._logger.info({ event: 'zkapp_compiled', chainId: this.chainId, zkAppAddress: this._zkAppAddress }, 'Mina zkApp circuit pre-compiled successfully');
52
+ }
53
+ catch (err) {
54
+ this._logger.error({
55
+ event: 'zkapp_compile_error',
56
+ chainId: this.chainId,
57
+ zkAppAddress: this._zkAppAddress,
58
+ error: err instanceof Error ? err.message : String(err),
59
+ }, 'Failed to pre-compile Mina zkApp circuit');
60
+ }
61
+ }
62
+ async openChannel(participant, settlementTimeout) {
63
+ this._logger.info({ event: 'open_channel', participant, settlementTimeout, chainId: this.chainId }, 'Opening Mina payment channel');
64
+ try {
65
+ const signerPublicKey = await this._ensureSignerPublicKey();
66
+ const result = await this._sdk.openChannel(signerPublicKey, participant, settlementTimeout, this._tokenId);
67
+ return { channelId: result.zkAppAddress, txHash: result.txHash };
68
+ }
69
+ catch (err) {
70
+ throw this._wrapError(err, 'openChannel', 'new');
71
+ }
72
+ }
73
+ async deposit(channelId, amount) {
74
+ this._logger.info({ event: 'deposit', channelId, amount, chainId: this.chainId }, 'Depositing into Mina payment channel');
75
+ try {
76
+ const result = await this._sdk.deposit(channelId, safeBigInt(amount, 'deposit amount'));
77
+ return { txHash: result.txHash };
78
+ }
79
+ catch (err) {
80
+ throw this._wrapError(err, 'deposit', channelId);
81
+ }
82
+ }
83
+ async claimFromChannel(channelId, balanceProof, signature) {
84
+ this._logger.info({ event: 'claim_from_channel', channelId, nonce: balanceProof.nonce, chainId: this.chainId }, 'Claiming from Mina payment channel');
85
+ this._warnIfEVMFields(balanceProof);
86
+ try {
87
+ const transferredAmount = safeBigInt(balanceProof.transferredAmount, 'transferredAmount');
88
+ const nonce = safeBigInt(String(balanceProof.nonce), 'nonce');
89
+ const result = await this._sdk.claimFromChannel(channelId, transferredAmount, 0n, 0n, nonce, signature, signature);
90
+ return { txHash: result.txHash };
91
+ }
92
+ catch (err) {
93
+ throw this._wrapError(err, 'claimFromChannel', channelId);
94
+ }
95
+ }
96
+ async closeChannel(channelId, finalBalanceA, finalBalanceB, salt, nonce, signatureA, signatureB) {
97
+ this._logger.info({ event: 'close_channel', channelId, chainId: this.chainId }, 'Closing Mina payment channel');
98
+ try {
99
+ const result = await this._sdk.closeChannel(channelId, finalBalanceA ?? 0n, finalBalanceB ?? 0n, salt ?? 0n, nonce ?? 0n, signatureA ?? '{"r":"0","s":"0"}', signatureB ?? '{"r":"0","s":"0"}');
100
+ return { txHash: result.txHash };
101
+ }
102
+ catch (err) {
103
+ throw this._wrapError(err, 'closeChannel', channelId);
104
+ }
105
+ }
106
+ async settleChannel(channelId, balanceA, balanceB, salt, participantA, participantB, nonce) {
107
+ this._logger.info({ event: 'settle_channel', channelId, chainId: this.chainId }, 'Settling Mina payment channel');
108
+ try {
109
+ const result = await this._sdk.settleChannel(channelId, balanceA ?? 0n, balanceB ?? 0n, salt ?? 0n, participantA ?? '', participantB ?? '', nonce ?? 0n);
110
+ return { txHash: result.txHash };
111
+ }
112
+ catch (err) {
113
+ throw this._wrapError(err, 'settleChannel', channelId);
114
+ }
115
+ }
116
+ async signBalanceProof(params) {
117
+ this._logger.debug({
118
+ event: 'sign_balance_proof',
119
+ channelId: params.channelId,
120
+ nonce: params.nonce,
121
+ chainId: this.chainId,
122
+ }, 'Signing Mina balance proof');
123
+ this._warnIfEVMFields(params);
124
+ try {
125
+ const transferredAmount = safeBigInt(params.transferredAmount, 'transferredAmount');
126
+ const nonce = safeBigInt(String(params.nonce), 'nonce');
127
+ return await this._sdk.signBalanceProof(params.channelId, transferredAmount, 0n, 0n, nonce);
128
+ }
129
+ catch (err) {
130
+ throw this._wrapError(err, 'signBalanceProof', params.channelId);
131
+ }
132
+ }
133
+ async verifyBalanceProof(params) {
134
+ this._logger.debug({
135
+ event: 'verify_balance_proof',
136
+ channelId: params.channelId,
137
+ nonce: params.nonce,
138
+ signerAddress: params.signerAddress,
139
+ chainId: this.chainId,
140
+ }, 'Verifying Mina balance proof');
141
+ this._warnIfEVMFields(params);
142
+ try {
143
+ const nonce = safeBigInt(String(params.nonce), 'nonce');
144
+ return await this._sdk.verifyBalanceProof(params.channelId, params.signerAddress, params.signature, nonce);
145
+ }
146
+ catch (err) {
147
+ this._logger.warn({
148
+ event: 'verify_balance_proof_error',
149
+ channelId: params.channelId,
150
+ nonce: params.nonce,
151
+ chainId: this.chainId,
152
+ error: err instanceof Error ? err.message : String(err),
153
+ }, 'Balance proof verification failed with error');
154
+ return false;
155
+ }
156
+ }
157
+ async getChannelState(channelId) {
158
+ try {
159
+ const state = await this._sdk.getChannelState(channelId);
160
+ return this._toProviderChannelState(channelId, state);
161
+ }
162
+ catch (err) {
163
+ throw this._wrapError(err, 'getChannelState', channelId);
164
+ }
165
+ }
166
+ subscribeToEvents(channelId, callback) {
167
+ this._logger.debug({ event: 'subscribe_events', channelId, chainId: this.chainId }, 'Subscribing to Mina channel events');
168
+ let previousState;
169
+ let unsubscribed = false;
170
+ const subscription = this._sdk.subscribeToChannel(channelId, (currentState) => {
171
+ if (unsubscribed)
172
+ return;
173
+ const eventType = this._diffState(previousState, currentState);
174
+ previousState = currentState;
175
+ if (eventType) {
176
+ const event = {
177
+ type: eventType,
178
+ channelId,
179
+ data: {
180
+ channelState: currentState.channelState,
181
+ depositTotal: currentState.depositTotal.toString(),
182
+ nonceField: currentState.nonceField.toString(),
183
+ balanceCommitment: currentState.balanceCommitment,
184
+ },
185
+ };
186
+ callback(event);
187
+ }
188
+ });
189
+ return {
190
+ unsubscribe: () => {
191
+ unsubscribed = true;
192
+ subscription.unsubscribe();
193
+ this._logger.debug({ event: 'unsubscribe_events', channelId, chainId: this.chainId }, 'Unsubscribed from Mina channel events');
194
+ },
195
+ };
196
+ }
197
+ async getMinaContext() {
198
+ const signerPublicKey = await this._ensureSignerPublicKey();
199
+ return {
200
+ zkAppAddress: this._zkAppAddress,
201
+ tokenId: this._tokenId,
202
+ network: this._network,
203
+ signerAddress: signerPublicKey,
204
+ };
205
+ }
206
+ async _ensureSignerPublicKey() {
207
+ if (!this._signerPublicKey) {
208
+ this._signerPublicKey = await this._sdk.getSignerPublicKey();
209
+ }
210
+ return this._signerPublicKey;
211
+ }
212
+ _toProviderChannelState(channelId, state) {
213
+ let status;
214
+ switch (state.channelState) {
215
+ case MINA_CHANNEL_STATE.OPEN:
216
+ status = 'opened';
217
+ break;
218
+ case MINA_CHANNEL_STATE.CLOSING:
219
+ status = 'closed';
220
+ break;
221
+ case MINA_CHANNEL_STATE.SETTLED:
222
+ status = 'settled';
223
+ break;
224
+ default:
225
+ this._logger.warn({
226
+ event: 'unexpected_channel_state',
227
+ channelId,
228
+ channelState: state.channelState,
229
+ chainId: this.chainId,
230
+ }, `Unexpected Mina channel state ${state.channelState}, defaulting to 'opened'`);
231
+ status = 'opened';
232
+ break;
233
+ }
234
+ return {
235
+ channelId,
236
+ status,
237
+ participants: [state.participantA, state.participantB],
238
+ deposit: state.depositTotal,
239
+ };
240
+ }
241
+ _diffState(previous, current) {
242
+ if (!previous) {
243
+ return undefined;
244
+ }
245
+ if (previous.channelState !== MINA_CHANNEL_STATE.SETTLED &&
246
+ current.channelState === MINA_CHANNEL_STATE.SETTLED) {
247
+ return 'channel_settled';
248
+ }
249
+ if (previous.channelState !== MINA_CHANNEL_STATE.CLOSING &&
250
+ current.channelState === MINA_CHANNEL_STATE.CLOSING) {
251
+ return 'channel_closed';
252
+ }
253
+ if (previous.channelState === MINA_CHANNEL_STATE.UNINITIALIZED &&
254
+ current.channelState === MINA_CHANNEL_STATE.OPEN) {
255
+ return 'channel_opened';
256
+ }
257
+ if (current.nonceField < previous.nonceField) {
258
+ this._logger.warn({
259
+ event: 'state_rollback_detected',
260
+ field: 'nonceField',
261
+ previous: previous.nonceField.toString(),
262
+ current: current.nonceField.toString(),
263
+ chainId: this.chainId,
264
+ }, 'Nonce decreased between polls -- possible chain reorg');
265
+ }
266
+ if (current.depositTotal < previous.depositTotal) {
267
+ this._logger.warn({
268
+ event: 'state_rollback_detected',
269
+ field: 'depositTotal',
270
+ previous: previous.depositTotal.toString(),
271
+ current: current.depositTotal.toString(),
272
+ chainId: this.chainId,
273
+ }, 'Deposit decreased between polls -- possible chain reorg');
274
+ }
275
+ if (current.nonceField > previous.nonceField) {
276
+ return 'channel_claimed';
277
+ }
278
+ if (current.depositTotal > previous.depositTotal) {
279
+ return 'channel_deposited';
280
+ }
281
+ return undefined;
282
+ }
283
+ _wrapError(err, method, channelId) {
284
+ if (err instanceof mina_payment_channel_sdk_1.MinaChannelError) {
285
+ return new Error(`MinaPaymentChannelProvider [${this.chainId}] ${method} channel ${channelId}: ` +
286
+ `${err.errorName} (code ${err.code}): ${err.message}`, { cause: err });
287
+ }
288
+ if (err instanceof Error) {
289
+ return new Error(`MinaPaymentChannelProvider [${this.chainId}] ${method} channel ${channelId}: ${err.message}`, { cause: err });
290
+ }
291
+ return new Error(`MinaPaymentChannelProvider [${this.chainId}] ${method} channel ${channelId}: ${String(err)}`, { cause: err });
292
+ }
293
+ _warnIfEVMFields(params) {
294
+ if (params.lockedAmount && params.lockedAmount !== '0') {
295
+ this._logger.warn({
296
+ event: 'ignored_field',
297
+ field: 'lockedAmount',
298
+ value: params.lockedAmount,
299
+ chainId: this.chainId,
300
+ }, 'lockedAmount is not supported on Mina channels and will be ignored');
301
+ }
302
+ if (params.locksRoot && params.locksRoot !== '' && params.locksRoot !== '0x') {
303
+ this._logger.warn({
304
+ event: 'ignored_field',
305
+ field: 'locksRoot',
306
+ value: params.locksRoot,
307
+ chainId: this.chainId,
308
+ }, 'locksRoot is not supported on Mina channels and will be ignored');
309
+ }
310
+ }
311
+ }
312
+ exports.MinaPaymentChannelProvider = MinaPaymentChannelProvider;
313
+ function createMinaProviderFactory(logger, signerKey) {
314
+ if (!signerKey) {
315
+ throw new Error('createMinaProviderFactory: signerKey must not be empty');
316
+ }
317
+ return (config) => {
318
+ if (config.chainType !== 'mina') {
319
+ throw new Error(`Mina factory received non-Mina config: ${config.chainType}`);
320
+ }
321
+ const sdk = new mina_payment_channel_sdk_1.MinaPaymentChannelSDK(config.graphqlUrl, config.zkAppAddress, logger, signerKey);
322
+ const network = config.network ?? 'devnet';
323
+ const chainId = `mina:${network}`;
324
+ return new MinaPaymentChannelProvider(sdk, chainId, config.zkAppAddress, signerKey, logger, {
325
+ tokenId: config.tokenId,
326
+ network,
327
+ });
328
+ };
329
+ }
330
+ //# sourceMappingURL=mina-payment-channel-provider.js.map