@atomiqlabs/chain-starknet 8.1.11 → 8.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.js +72 -3
- package/dist/node/index.d.ts +10 -0
- package/dist/node/index.js +15 -0
- package/dist/starknet/StarknetInitializer.d.ts +39 -6
- package/dist/starknet/StarknetInitializer.js +3 -3
- package/dist/starknet/btcrelay/StarknetBtcRelay.d.ts +7 -6
- package/dist/starknet/btcrelay/StarknetBtcRelay.js +8 -8
- package/dist/starknet/btcrelay/headers/StarknetBtcHeader.d.ts +2 -0
- package/dist/starknet/btcrelay/headers/StarknetBtcHeader.js +2 -0
- package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.d.ts +3 -1
- package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.js +3 -1
- package/dist/starknet/chain/StarknetAction.js +1 -1
- package/dist/starknet/chain/StarknetChainInterface.d.ts +25 -0
- package/dist/starknet/chain/StarknetChainInterface.js +7 -0
- package/dist/starknet/chain/modules/StarknetFees.d.ts +15 -19
- package/dist/starknet/chain/modules/StarknetFees.js +23 -29
- package/dist/starknet/chain/modules/StarknetTransactions.d.ts +32 -6
- package/dist/starknet/chain/modules/StarknetTransactions.js +47 -17
- package/dist/starknet/contract/StarknetContractBase.d.ts +12 -3
- package/dist/starknet/contract/StarknetContractBase.js +2 -2
- package/dist/starknet/contract/modules/StarknetContractEvents.js +1 -1
- package/dist/starknet/events/StarknetChainEvents.d.ts +3 -0
- package/dist/starknet/events/StarknetChainEvents.js +3 -0
- package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +45 -7
- package/dist/starknet/events/StarknetChainEventsBrowser.js +20 -9
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +4 -4
- package/dist/starknet/swaps/StarknetSwapContract.js +5 -5
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +1 -1
- package/dist/starknet/swaps/modules/StarknetSwapClaim.js +2 -2
- package/dist/starknet/swaps/modules/StarknetSwapRefund.js +1 -1
- package/dist/starknet/wallet/StarknetBrowserSigner.d.ts +9 -1
- package/dist/starknet/wallet/StarknetBrowserSigner.js +31 -1
- package/dist/starknet/wallet/StarknetSigner.d.ts +44 -3
- package/dist/starknet/wallet/StarknetSigner.js +52 -2
- package/dist/utils/Utils.d.ts +1 -1
- package/dist/utils/Utils.js +2 -2
- package/node/index.d.ts +1 -0
- package/node/index.js +3 -0
- package/package.json +5 -4
- package/src/index.ts +76 -2
- package/src/node/index.ts +10 -0
- package/src/starknet/StarknetInitializer.ts +40 -1
- package/src/starknet/btcrelay/StarknetBtcRelay.ts +19 -16
- package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +2 -0
- package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +3 -1
- package/src/starknet/chain/StarknetAction.ts +2 -2
- package/src/starknet/chain/StarknetChainInterface.ts +29 -1
- package/src/starknet/chain/modules/StarknetFees.ts +23 -27
- package/src/starknet/chain/modules/StarknetTransactions.ts +59 -18
- package/src/starknet/contract/StarknetContractBase.ts +14 -5
- package/src/starknet/contract/modules/StarknetContractEvents.ts +1 -1
- package/src/starknet/events/StarknetChainEvents.ts +3 -0
- package/src/starknet/events/StarknetChainEventsBrowser.ts +51 -10
- package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +4 -4
- package/src/starknet/swaps/StarknetSwapContract.ts +5 -5
- package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +1 -1
- package/src/starknet/swaps/modules/StarknetSwapClaim.ts +3 -3
- package/src/starknet/swaps/modules/StarknetSwapRefund.ts +2 -2
- package/src/starknet/wallet/StarknetBrowserSigner.ts +39 -2
- package/src/starknet/wallet/StarknetSigner.ts +62 -3
- package/src/utils/Utils.ts +3 -3
|
@@ -1,49 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StarknetFees =
|
|
3
|
+
exports.StarknetFees = void 0;
|
|
4
4
|
const Utils_1 = require("../../../utils/Utils");
|
|
5
5
|
const MAX_FEE_AGE = 5000;
|
|
6
|
-
/**
|
|
7
|
-
* Multiplies all the gas parameters by a specific scalar
|
|
8
|
-
*
|
|
9
|
-
* @param gas
|
|
10
|
-
* @param scalar
|
|
11
|
-
*
|
|
12
|
-
* @category Chain Interface
|
|
13
|
-
*/
|
|
14
|
-
function starknetGasMul(gas, scalar) {
|
|
15
|
-
return { l1Gas: gas.l1Gas * scalar, l2Gas: gas.l2Gas * scalar, l1DataGas: gas.l1DataGas * scalar };
|
|
16
|
-
}
|
|
17
|
-
exports.starknetGasMul = starknetGasMul;
|
|
18
|
-
/**
|
|
19
|
-
* Sums up all the gas parameters
|
|
20
|
-
*
|
|
21
|
-
* @param a
|
|
22
|
-
* @param b
|
|
23
|
-
*
|
|
24
|
-
* @category Chain Interface
|
|
25
|
-
*/
|
|
26
|
-
function starknetGasAdd(a, b) {
|
|
27
|
-
if (b == null)
|
|
28
|
-
return a;
|
|
29
|
-
return { l1Gas: a.l1Gas + b.l1Gas, l2Gas: a.l2Gas + b.l2Gas, l1DataGas: a.l1DataGas + b.l1DataGas };
|
|
30
|
-
}
|
|
31
|
-
exports.starknetGasAdd = starknetGasAdd;
|
|
32
6
|
/**
|
|
33
7
|
* A module for starknet fee estimation
|
|
34
8
|
*
|
|
35
9
|
* @category Chain Interface
|
|
36
10
|
*/
|
|
37
11
|
class StarknetFees {
|
|
12
|
+
/**
|
|
13
|
+
* Multiplies all the gas parameters by a specific scalar
|
|
14
|
+
*
|
|
15
|
+
* @param gas
|
|
16
|
+
* @param scalar
|
|
17
|
+
*/
|
|
18
|
+
static starknetGasMul(gas, scalar) {
|
|
19
|
+
return { l1Gas: gas.l1Gas * scalar, l2Gas: gas.l2Gas * scalar, l1DataGas: gas.l1DataGas * scalar };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Sums up all the gas parameters
|
|
23
|
+
*
|
|
24
|
+
* @param a
|
|
25
|
+
* @param b
|
|
26
|
+
*/
|
|
27
|
+
static starknetGasAdd(a, b) {
|
|
28
|
+
if (b == null)
|
|
29
|
+
return a;
|
|
30
|
+
return { l1Gas: a.l1Gas + b.l1Gas, l2Gas: a.l2Gas + b.l2Gas, l1DataGas: a.l1DataGas + b.l1DataGas };
|
|
31
|
+
}
|
|
38
32
|
/**
|
|
39
33
|
* Constructs a new Starknet fee module
|
|
40
34
|
*
|
|
41
35
|
* @param provider A starknet.js provider to use for fee estimation
|
|
42
|
-
* @param maxFeeRate Fee rate limits in base units
|
|
36
|
+
* @param maxFeeRate Fee rate limits in base units, defaults to L1: 20 PFri, L2: 4 PFri, L1 data: 10 PFri
|
|
43
37
|
* @param feeMultiplier A multiplier to use for the returned fee rates
|
|
44
38
|
* @param da Data-availability mode - currently just L1
|
|
45
39
|
*/
|
|
46
|
-
constructor(provider, maxFeeRate = { l1GasCost: 20000000000000000n, l2GasCost: 4000000000000000n, l1DataGasCost: 10000000000000000n }, feeMultiplier = 1.25, da) {
|
|
40
|
+
constructor(provider, maxFeeRate = { l1GasCost: 20000000000000000n, l2GasCost: 4000000000000000n, l1DataGasCost: 10000000000000000n }, feeMultiplier = 1.25, da = { fee: "L1", nonce: "L1" }) {
|
|
47
41
|
this.logger = (0, Utils_1.getLogger)("StarknetFees: ");
|
|
48
42
|
this.provider = provider;
|
|
49
43
|
this.maxFeeRate = maxFeeRate;
|
|
@@ -7,28 +7,52 @@ export type StarknetTxBase = {
|
|
|
7
7
|
};
|
|
8
8
|
txId?: string;
|
|
9
9
|
};
|
|
10
|
+
/**
|
|
11
|
+
* "INVOKE" type of transaction, used to call smart contracts on Starknet
|
|
12
|
+
*
|
|
13
|
+
* @category Chain Interface
|
|
14
|
+
*/
|
|
10
15
|
export type StarknetTxInvoke = StarknetTxBase & {
|
|
11
16
|
type: "INVOKE";
|
|
12
17
|
tx: Array<Call>;
|
|
13
18
|
signed?: Invocation;
|
|
14
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* Type-guard for the "INVOKE" type of transaction, used to call smart contracts on Starknet
|
|
22
|
+
*
|
|
23
|
+
* @category Chain Interface
|
|
24
|
+
*/
|
|
15
25
|
export declare function isStarknetTxInvoke(obj: any): obj is StarknetTxInvoke;
|
|
26
|
+
/**
|
|
27
|
+
* "DEPLOY_ACCOUNT" type of transaction, used as a first transaction that the account does to deploy its smart
|
|
28
|
+
* account contract on the Starknet
|
|
29
|
+
*
|
|
30
|
+
* @category Chain Interface
|
|
31
|
+
*/
|
|
16
32
|
export type StarknetTxDeployAccount = StarknetTxBase & {
|
|
17
33
|
type: "DEPLOY_ACCOUNT";
|
|
18
34
|
tx: DeployAccountContractPayload;
|
|
19
35
|
signed?: DeployAccountContractTransaction;
|
|
20
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* Type-guard for the "DEPLOY_ACCOUNT" type of transaction, used as a first transaction that the account does
|
|
39
|
+
* to deploy its smart account contract on the Starknet
|
|
40
|
+
*
|
|
41
|
+
* @category Chain Interface
|
|
42
|
+
*/
|
|
21
43
|
export declare function isStarknetTxDeployAccount(obj: any): obj is StarknetTxDeployAccount;
|
|
22
44
|
/**
|
|
23
|
-
*
|
|
45
|
+
* Represents a Starknet transactions, which can either be an "INVOKE" or "DEPLOY_ACCOUNT" type, use the
|
|
46
|
+
* {@link isStarknetTxInvoke} & {@link isStarknetTxDeployAccount} to narrow down the type.
|
|
24
47
|
*
|
|
25
48
|
* @category Chain Interface
|
|
26
49
|
*/
|
|
27
50
|
export type StarknetTx = StarknetTxInvoke | StarknetTxDeployAccount;
|
|
28
51
|
/**
|
|
29
|
-
*
|
|
52
|
+
* Represents a signed Starknet transactions, which can either be an "INVOKE" or "DEPLOY_ACCOUNT" type, use the
|
|
53
|
+
* {@link isStarknetTxInvoke} & {@link isStarknetTxDeployAccount} to narrow down the type.
|
|
30
54
|
*
|
|
31
|
-
* @
|
|
55
|
+
* @remark For Starknet this is just an alias for {@link StarknetTx}
|
|
32
56
|
*
|
|
33
57
|
* @category Chain Interface
|
|
34
58
|
*/
|
|
@@ -66,13 +90,15 @@ export declare class StarknetTransactions extends StarknetModule {
|
|
|
66
90
|
*/
|
|
67
91
|
private confirmTransaction;
|
|
68
92
|
/**
|
|
69
|
-
* Prepares starknet transactions, checks if the account is deployed, assigns nonces if needed
|
|
93
|
+
* Prepares starknet transactions, checks if the account is deployed, assigns nonces if needed
|
|
94
|
+
* & calls beforeTxSigned callback (only if signer is passed!)
|
|
70
95
|
*
|
|
71
96
|
* @param signer
|
|
72
97
|
* @param txs
|
|
73
|
-
* @private
|
|
74
98
|
*/
|
|
75
|
-
|
|
99
|
+
prepareTransactions(txs: (StarknetTx & {
|
|
100
|
+
addedInPrepare?: boolean;
|
|
101
|
+
})[], signer?: StarknetSigner): Promise<void>;
|
|
76
102
|
/**
|
|
77
103
|
* Sends out a signed transaction to the RPC
|
|
78
104
|
*
|
|
@@ -5,6 +5,11 @@ const StarknetModule_1 = require("../StarknetModule");
|
|
|
5
5
|
const starknet_1 = require("starknet");
|
|
6
6
|
const Utils_1 = require("../../../utils/Utils");
|
|
7
7
|
const base_1 = require("@atomiqlabs/base");
|
|
8
|
+
/**
|
|
9
|
+
* Type-guard for the "INVOKE" type of transaction, used to call smart contracts on Starknet
|
|
10
|
+
*
|
|
11
|
+
* @category Chain Interface
|
|
12
|
+
*/
|
|
8
13
|
function isStarknetTxInvoke(obj) {
|
|
9
14
|
return typeof (obj) === "object" &&
|
|
10
15
|
typeof (obj.details) === "object" &&
|
|
@@ -14,6 +19,12 @@ function isStarknetTxInvoke(obj) {
|
|
|
14
19
|
(obj.signed == null || typeof (obj.signed) === "object");
|
|
15
20
|
}
|
|
16
21
|
exports.isStarknetTxInvoke = isStarknetTxInvoke;
|
|
22
|
+
/**
|
|
23
|
+
* Type-guard for the "DEPLOY_ACCOUNT" type of transaction, used as a first transaction that the account does
|
|
24
|
+
* to deploy its smart account contract on the Starknet
|
|
25
|
+
*
|
|
26
|
+
* @category Chain Interface
|
|
27
|
+
*/
|
|
17
28
|
function isStarknetTxDeployAccount(obj) {
|
|
18
29
|
return typeof (obj) === "object" &&
|
|
19
30
|
typeof (obj.details) === "object" &&
|
|
@@ -203,29 +214,45 @@ class StarknetTransactions extends StarknetModule_1.StarknetModule {
|
|
|
203
214
|
return result.txId;
|
|
204
215
|
}
|
|
205
216
|
/**
|
|
206
|
-
* Prepares starknet transactions, checks if the account is deployed, assigns nonces if needed
|
|
217
|
+
* Prepares starknet transactions, checks if the account is deployed, assigns nonces if needed
|
|
218
|
+
* & calls beforeTxSigned callback (only if signer is passed!)
|
|
207
219
|
*
|
|
208
220
|
* @param signer
|
|
209
221
|
* @param txs
|
|
210
|
-
* @private
|
|
211
222
|
*/
|
|
212
|
-
async prepareTransactions(
|
|
213
|
-
|
|
214
|
-
|
|
223
|
+
async prepareTransactions(txs, signer) {
|
|
224
|
+
if (txs.length === 0)
|
|
225
|
+
return;
|
|
226
|
+
const signerAddress = signer?.getAddress() ?? txs[0].details.walletAddress;
|
|
227
|
+
if (signerAddress == null)
|
|
228
|
+
throw new Error("Cannot get tx sender address!");
|
|
229
|
+
let nonce = await this.getNonce(signerAddress);
|
|
230
|
+
const latestPendingNonce = this.latestPendingNonces[(0, Utils_1.toHex)(signerAddress)];
|
|
215
231
|
if (latestPendingNonce != null && latestPendingNonce > nonce) {
|
|
216
232
|
this.logger.debug("prepareTransactions(): Using 'pending' nonce from local cache!");
|
|
217
233
|
nonce = latestPendingNonce;
|
|
218
234
|
}
|
|
219
235
|
//Add deploy account tx
|
|
220
236
|
if (nonce === 0n) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
237
|
+
if (signer != null) {
|
|
238
|
+
const deployPayload = await signer.getDeployPayload();
|
|
239
|
+
if (deployPayload != null) {
|
|
240
|
+
const tx = await this.root.Accounts.getAccountDeployTransaction(deployPayload);
|
|
241
|
+
tx.addedInPrepare = true;
|
|
242
|
+
txs.unshift(tx);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
// Use a 0x0 class hash to indicate that deployment is needed by external signer
|
|
247
|
+
const tx = await this.root.Accounts.getAccountDeployTransaction({
|
|
248
|
+
classHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
249
|
+
contractAddress: signerAddress
|
|
250
|
+
});
|
|
224
251
|
tx.addedInPrepare = true;
|
|
225
252
|
txs.unshift(tx);
|
|
226
253
|
}
|
|
227
254
|
}
|
|
228
|
-
if (!signer.isManagingNoncesInternally) {
|
|
255
|
+
if (signer == null || !signer.isManagingNoncesInternally) {
|
|
229
256
|
if (nonce === 0n) {
|
|
230
257
|
//Just increment the nonce by one and hope the wallet is smart enough to deploy account first
|
|
231
258
|
nonce = 1n;
|
|
@@ -235,18 +262,19 @@ class StarknetTransactions extends StarknetModule_1.StarknetModule {
|
|
|
235
262
|
if (tx.details.nonce != null)
|
|
236
263
|
nonce = BigInt(tx.details.nonce); //Take the nonce from last tx
|
|
237
264
|
if (nonce == null)
|
|
238
|
-
nonce = BigInt(await this.root.provider.getNonceForAddress(
|
|
265
|
+
nonce = BigInt(await this.root.provider.getNonceForAddress(signerAddress)); //Fetch the nonce
|
|
239
266
|
if (tx.details.nonce == null)
|
|
240
267
|
tx.details.nonce = nonce;
|
|
241
268
|
this.logger.debug("prepareTransactions(): transaction prepared (" + (i + 1) + "/" + txs.length + "), nonce: " + tx.details.nonce);
|
|
242
269
|
nonce += BigInt(1);
|
|
243
270
|
}
|
|
244
271
|
}
|
|
245
|
-
|
|
246
|
-
for (let
|
|
247
|
-
|
|
272
|
+
if (signer != null)
|
|
273
|
+
for (let tx of txs) {
|
|
274
|
+
for (let callback of this.cbksBeforeTxSigned) {
|
|
275
|
+
await callback(tx);
|
|
276
|
+
}
|
|
248
277
|
}
|
|
249
|
-
}
|
|
250
278
|
}
|
|
251
279
|
/**
|
|
252
280
|
* Sends out a signed transaction to the RPC
|
|
@@ -282,13 +310,14 @@ class StarknetTransactions extends StarknetModule_1.StarknetModule {
|
|
|
282
310
|
*/
|
|
283
311
|
async sendAndConfirm(signer, _txs, waitForConfirmation, abortSignal, parallel, onBeforePublish) {
|
|
284
312
|
const txs = _txs;
|
|
285
|
-
await this.prepareTransactions(
|
|
313
|
+
await this.prepareTransactions(txs, signer);
|
|
286
314
|
const signedTxs = [];
|
|
287
315
|
//Don't separate the signing process from the sending when using browser-based wallet
|
|
288
316
|
if (signer.signTransaction != null)
|
|
289
317
|
for (let i = 0; i < txs.length; i++) {
|
|
290
318
|
const tx = txs[i];
|
|
291
319
|
const signedTx = await signer.signTransaction(tx);
|
|
320
|
+
(0, Utils_1.calculateHash)(signedTx);
|
|
292
321
|
signedTx.addedInPrepare = tx.addedInPrepare;
|
|
293
322
|
signedTxs.push(signedTx);
|
|
294
323
|
this.logger.debug("sendAndConfirm(): transaction signed (" + (i + 1) + "/" + txs.length + "): " + signedTx.txId);
|
|
@@ -373,9 +402,10 @@ class StarknetTransactions extends StarknetModule_1.StarknetModule {
|
|
|
373
402
|
return txIds;
|
|
374
403
|
}
|
|
375
404
|
async sendSignedAndConfirm(signedTxs, waitForConfirmation, abortSignal, parallel, onBeforePublish) {
|
|
376
|
-
signedTxs.forEach(
|
|
377
|
-
if (
|
|
405
|
+
signedTxs.forEach(tx => {
|
|
406
|
+
if (tx.signed == null)
|
|
378
407
|
throw new Error("Transactions have to be signed!");
|
|
408
|
+
(0, Utils_1.calculateHash)(tx);
|
|
379
409
|
});
|
|
380
410
|
this.logger.debug("sendSignedAndConfirm(): sending transactions, count: " + signedTxs.length +
|
|
381
411
|
" waitForConfirmation: " + waitForConfirmation + " parallel: " + parallel);
|
|
@@ -7,8 +7,17 @@ import { StarknetContractEvents } from "./modules/StarknetContractEvents";
|
|
|
7
7
|
*/
|
|
8
8
|
export declare class StarknetContractBase<T extends Abi> {
|
|
9
9
|
readonly contract: TypedContractV2<T>;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
readonly _Events: StarknetContractEvents<T>;
|
|
14
|
+
/**
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
protected readonly Chain: StarknetChainInterface;
|
|
18
|
+
/**
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
readonly _contractDeploymentHeight?: number;
|
|
13
22
|
constructor(chainInterface: StarknetChainInterface, contractAddress: string, contractAbi: T, contractDeploymentHeight?: number);
|
|
14
23
|
}
|
|
@@ -14,8 +14,8 @@ class StarknetContractBase {
|
|
|
14
14
|
address: contractAddress,
|
|
15
15
|
providerOrAccount: chainInterface.provider
|
|
16
16
|
}).typedv2(contractAbi);
|
|
17
|
-
this.
|
|
18
|
-
this.
|
|
17
|
+
this._Events = new StarknetContractEvents_1.StarknetContractEvents(chainInterface, this, contractAbi);
|
|
18
|
+
this._contractDeploymentHeight = contractDeploymentHeight;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
exports.StarknetContractBase = StarknetContractBase;
|
|
@@ -105,7 +105,7 @@ class StarknetContractEvents extends StarknetEvents_1.StarknetEvents {
|
|
|
105
105
|
return result;
|
|
106
106
|
}
|
|
107
107
|
return null;
|
|
108
|
-
}, Math.max(startHeight ?? 0, this.contract.
|
|
108
|
+
}, Math.max(startHeight ?? 0, this.contract._contractDeploymentHeight ?? 0), abortSignal);
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
exports.StarknetContractEvents = StarknetContractEvents;
|
|
@@ -48,6 +48,9 @@ class StarknetChainEvents extends StarknetChainEventsBrowser_1.StarknetChainEven
|
|
|
48
48
|
saveLastEventData(newState) {
|
|
49
49
|
return fs.writeFile(this.directory + BLOCKHEIGHT_FILENAME, newState.map(value => value.lastTxHash == null ? value.lastBlockNumber.toString(10) : value.lastBlockNumber.toString(10) + ";" + value.lastTxHash).join(","));
|
|
50
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* @inheritDoc
|
|
53
|
+
*/
|
|
51
54
|
async init(noAutomaticPoll) {
|
|
52
55
|
if (noAutomaticPoll)
|
|
53
56
|
return;
|
|
@@ -11,7 +11,13 @@ import { StarknetChainInterface } from "../chain/StarknetChainInterface";
|
|
|
11
11
|
* @category Events
|
|
12
12
|
*/
|
|
13
13
|
export type StarknetEventListenerState = {
|
|
14
|
+
/**
|
|
15
|
+
* Block number of the last processed event
|
|
16
|
+
*/
|
|
14
17
|
lastBlockNumber: number;
|
|
18
|
+
/**
|
|
19
|
+
* Transaction hash of the last processed event
|
|
20
|
+
*/
|
|
15
21
|
lastTxHash?: string;
|
|
16
22
|
};
|
|
17
23
|
/**
|
|
@@ -24,16 +30,49 @@ export type StarknetEventListenerState = {
|
|
|
24
30
|
export declare class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData, StarknetEventListenerState[]> {
|
|
25
31
|
private eventsProcessing;
|
|
26
32
|
private processedEvents;
|
|
33
|
+
/**
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
27
36
|
protected readonly Chain: StarknetChainInterface;
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
28
40
|
protected readonly listeners: EventListener<StarknetSwapData>[];
|
|
41
|
+
/**
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
29
44
|
protected readonly wsChannel?: WebSocketChannel;
|
|
45
|
+
/**
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
30
48
|
protected readonly provider: Provider;
|
|
49
|
+
/**
|
|
50
|
+
* @internal
|
|
51
|
+
*/
|
|
31
52
|
protected readonly starknetSwapContract: StarknetSwapContract;
|
|
53
|
+
/**
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
32
56
|
protected readonly starknetSpvVaultContract: StarknetSpvVaultContract;
|
|
57
|
+
/**
|
|
58
|
+
* @internal
|
|
59
|
+
*/
|
|
33
60
|
protected readonly logger: import("../../utils/Utils").LoggerType;
|
|
61
|
+
/**
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
34
64
|
protected escrowContractSubscription?: SubscriptionStarknetEventsEvent;
|
|
65
|
+
/**
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
35
68
|
protected spvVaultContractSubscription?: SubscriptionStarknetEventsEvent;
|
|
69
|
+
/**
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
36
72
|
protected stopped: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
37
76
|
protected pollIntervalSeconds: number;
|
|
38
77
|
private timeout;
|
|
39
78
|
constructor(chainInterface: StarknetChainInterface, starknetSwapContract: StarknetSwapContract, starknetSpvVaultContract: StarknetSpvVaultContract, pollIntervalSeconds?: number);
|
|
@@ -129,10 +168,7 @@ export declare class StarknetChainEventsBrowser implements ChainEvents<StarknetS
|
|
|
129
168
|
* @private
|
|
130
169
|
*/
|
|
131
170
|
private checkEventsEcrowManager;
|
|
132
|
-
|
|
133
|
-
timestamp: number;
|
|
134
|
-
block_number: number;
|
|
135
|
-
}, lastTxHash?: string, lastBlockNumber?: number): Promise<StarknetEventListenerState>;
|
|
171
|
+
private checkEventsSpvVaults;
|
|
136
172
|
/**
|
|
137
173
|
* @inheritDoc
|
|
138
174
|
*/
|
|
@@ -140,9 +176,12 @@ export declare class StarknetChainEventsBrowser implements ChainEvents<StarknetS
|
|
|
140
176
|
/**
|
|
141
177
|
* Sets up event handlers listening for swap events over websocket
|
|
142
178
|
*
|
|
143
|
-
* @
|
|
179
|
+
* @internal
|
|
144
180
|
*/
|
|
145
181
|
protected setupPoll(lastState?: StarknetEventListenerState[], saveLatestProcessedBlockNumber?: (newState: StarknetEventListenerState[]) => Promise<void>): Promise<void>;
|
|
182
|
+
/**
|
|
183
|
+
* @internal
|
|
184
|
+
*/
|
|
146
185
|
protected wsStarted: boolean;
|
|
147
186
|
/**
|
|
148
187
|
*
|
|
@@ -155,8 +194,7 @@ export declare class StarknetChainEventsBrowser implements ChainEvents<StarknetS
|
|
|
155
194
|
*/
|
|
156
195
|
private subscribeWsSpvVaultEvents;
|
|
157
196
|
/**
|
|
158
|
-
*
|
|
159
|
-
* @protected
|
|
197
|
+
* @internal
|
|
160
198
|
*/
|
|
161
199
|
protected setupWebsocket(): Promise<void>;
|
|
162
200
|
/**
|
|
@@ -19,9 +19,21 @@ class StarknetChainEventsBrowser {
|
|
|
19
19
|
constructor(chainInterface, starknetSwapContract, starknetSpvVaultContract, pollIntervalSeconds = 5) {
|
|
20
20
|
this.eventsProcessing = {};
|
|
21
21
|
this.processedEvents = new Set();
|
|
22
|
+
/**
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
22
25
|
this.listeners = [];
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
23
29
|
this.logger = (0, Utils_1.getLogger)("StarknetChainEventsBrowser: ");
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
24
33
|
this.stopped = true;
|
|
34
|
+
/**
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
25
37
|
this.wsStarted = false;
|
|
26
38
|
this.Chain = chainInterface;
|
|
27
39
|
this.wsChannel = chainInterface.wsChannel;
|
|
@@ -302,7 +314,7 @@ class StarknetChainEventsBrowser {
|
|
|
302
314
|
return { lastTxHash, lastBlockNumber };
|
|
303
315
|
}
|
|
304
316
|
// this.logger.debug("checkEvents(EscrowManager): Requesting logs: "+logStartHeight+"...pending");
|
|
305
|
-
let events = await this.starknetSwapContract.
|
|
317
|
+
let events = await this.starknetSwapContract._Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [], lastBlockNumber, null);
|
|
306
318
|
if (lastTxHash != null) {
|
|
307
319
|
const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
|
|
308
320
|
if (latestProcessedEventIndex !== -1) {
|
|
@@ -335,7 +347,7 @@ class StarknetChainEventsBrowser {
|
|
|
335
347
|
return { lastTxHash, lastBlockNumber };
|
|
336
348
|
}
|
|
337
349
|
// this.logger.debug("checkEvents(SpvVaults): Requesting logs: "+logStartHeight+"...pending");
|
|
338
|
-
let events = await this.starknetSpvVaultContract.
|
|
350
|
+
let events = await this.starknetSpvVaultContract._Events.getContractBlockEvents(["spv_swap_vault::events::Opened", "spv_swap_vault::events::Deposited", "spv_swap_vault::events::Closed", "spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed"], [], lastBlockNumber, null);
|
|
339
351
|
if (lastTxHash != null) {
|
|
340
352
|
const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
|
|
341
353
|
if (latestProcessedEventIndex !== -1) {
|
|
@@ -376,7 +388,7 @@ class StarknetChainEventsBrowser {
|
|
|
376
388
|
/**
|
|
377
389
|
* Sets up event handlers listening for swap events over websocket
|
|
378
390
|
*
|
|
379
|
-
* @
|
|
391
|
+
* @internal
|
|
380
392
|
*/
|
|
381
393
|
async setupPoll(lastState, saveLatestProcessedBlockNumber) {
|
|
382
394
|
let func;
|
|
@@ -404,7 +416,7 @@ class StarknetChainEventsBrowser {
|
|
|
404
416
|
try {
|
|
405
417
|
subscription = await this.wsChannel.subscribeEvents({
|
|
406
418
|
fromAddress: this.starknetSwapContract.contract.address,
|
|
407
|
-
keys: this.starknetSwapContract.
|
|
419
|
+
keys: this.starknetSwapContract._Events.toFilter(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], []),
|
|
408
420
|
finalityStatus: starknet_1.TransactionFinalityStatus.ACCEPTED_ON_L2
|
|
409
421
|
});
|
|
410
422
|
}
|
|
@@ -414,7 +426,7 @@ class StarknetChainEventsBrowser {
|
|
|
414
426
|
}
|
|
415
427
|
} while (subscription == null);
|
|
416
428
|
subscription.on((event) => {
|
|
417
|
-
const parsedEvents = this.starknetSwapContract.
|
|
429
|
+
const parsedEvents = this.starknetSwapContract._Events.toStarknetAbiEvents([event]);
|
|
418
430
|
this.processEvents(parsedEvents, event.block_number).catch(e => {
|
|
419
431
|
console.error(`WS: EscrowContract: Failed to process event ${parsedEvents[0].txHash}:${parsedEvents[0].name}: `, e);
|
|
420
432
|
});
|
|
@@ -432,7 +444,7 @@ class StarknetChainEventsBrowser {
|
|
|
432
444
|
try {
|
|
433
445
|
subscription = await this.wsChannel.subscribeEvents({
|
|
434
446
|
fromAddress: this.starknetSpvVaultContract.contract.address,
|
|
435
|
-
keys: this.starknetSpvVaultContract.
|
|
447
|
+
keys: this.starknetSpvVaultContract._Events.toFilter(["spv_swap_vault::events::Opened", "spv_swap_vault::events::Deposited", "spv_swap_vault::events::Closed", "spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed"], []),
|
|
436
448
|
finalityStatus: starknet_1.TransactionFinalityStatus.ACCEPTED_ON_L2
|
|
437
449
|
});
|
|
438
450
|
}
|
|
@@ -442,7 +454,7 @@ class StarknetChainEventsBrowser {
|
|
|
442
454
|
}
|
|
443
455
|
} while (subscription == null);
|
|
444
456
|
subscription.on((event) => {
|
|
445
|
-
const parsedEvents = this.starknetSpvVaultContract.
|
|
457
|
+
const parsedEvents = this.starknetSpvVaultContract._Events.toStarknetAbiEvents([event]);
|
|
446
458
|
this.processEvents(parsedEvents, event.block_number).catch(e => {
|
|
447
459
|
console.error(`WS: SpvVaultContract: Failed to process event ${parsedEvents[0].txHash}:${parsedEvents[0].name}: `, e);
|
|
448
460
|
});
|
|
@@ -451,8 +463,7 @@ class StarknetChainEventsBrowser {
|
|
|
451
463
|
this.logger.debug("subscribeWsSpvVaultEvents(): Successfully subscribed to spv vault contract WS events");
|
|
452
464
|
}
|
|
453
465
|
/**
|
|
454
|
-
*
|
|
455
|
-
* @protected
|
|
466
|
+
* @internal
|
|
456
467
|
*/
|
|
457
468
|
async setupWebsocket() {
|
|
458
469
|
if (this.wsChannel == null)
|
|
@@ -213,7 +213,7 @@ class StarknetSpvVaultContract extends StarknetContractBase_1.StarknetContractBa
|
|
|
213
213
|
*/
|
|
214
214
|
async getAllVaults(owner) {
|
|
215
215
|
const openedVaults = new Set();
|
|
216
|
-
await this.
|
|
216
|
+
await this._Events.findInContractEventsForward(["spv_swap_vault::events::Opened", "spv_swap_vault::events::Closed"], owner == null ? null : [null, null, owner], (event) => {
|
|
217
217
|
const owner = (0, Utils_1.toHex)(event.params.owner);
|
|
218
218
|
const vaultId = (0, Utils_1.toBigInt)(event.params.vault_id);
|
|
219
219
|
const vaultIdentifier = owner + ":" + vaultId.toString(10);
|
|
@@ -350,7 +350,7 @@ class StarknetSpvVaultContract extends StarknetContractBase_1.StarknetContractBa
|
|
|
350
350
|
}
|
|
351
351
|
}
|
|
352
352
|
});
|
|
353
|
-
await this.
|
|
353
|
+
await this._Events.findInContractEventsForward(events, [lows, highs], async (event) => {
|
|
354
354
|
const txId = (0, Utils_1.bigNumberishToBuffer)(event.params.btc_tx_hash, 32).reverse().toString("hex");
|
|
355
355
|
if (result[txId] == null) {
|
|
356
356
|
this.logger.warn(`getWithdrawalStates(): findInContractEvents-callback: loaded event for ${txId}, but transaction not found in input params!`);
|
|
@@ -374,7 +374,7 @@ class StarknetSpvVaultContract extends StarknetContractBase_1.StarknetContractBa
|
|
|
374
374
|
};
|
|
375
375
|
const events = ["spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed", "spv_swap_vault::events::Closed"];
|
|
376
376
|
const keys = [(0, Utils_1.toHex)(txHashU256.low), (0, Utils_1.toHex)(txHashU256.high)];
|
|
377
|
-
await this.
|
|
377
|
+
await this._Events.findInContractEventsForward(events, keys, async (event) => {
|
|
378
378
|
const eventResult = this.parseWithdrawalEvent(event);
|
|
379
379
|
if (eventResult != null)
|
|
380
380
|
result = eventResult;
|
|
@@ -385,7 +385,7 @@ class StarknetSpvVaultContract extends StarknetContractBase_1.StarknetContractBa
|
|
|
385
385
|
const { height: latestBlockheight } = await this.Chain.getFinalizedBlock();
|
|
386
386
|
const withdrawals = {};
|
|
387
387
|
const eventTypes = ["spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed"];
|
|
388
|
-
await this.
|
|
388
|
+
await this._Events.findInContractEventsForward(eventTypes, [null, null, null, null, recipient], async (_event) => {
|
|
389
389
|
const eventResult = this.parseWithdrawalEvent(_event);
|
|
390
390
|
if (eventResult == null || eventResult.type === base_1.SpvWithdrawalStateType.CLOSED)
|
|
391
391
|
return null;
|
|
@@ -315,13 +315,13 @@ class StarknetSwapContract extends StarknetContractBase_1.StarknetContractBase {
|
|
|
315
315
|
};
|
|
316
316
|
},
|
|
317
317
|
getClaimTxId: async () => {
|
|
318
|
-
const events = await this.
|
|
318
|
+
const events = await this._Events.getContractBlockEvents(["escrow_manager::events::Claim"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
|
|
319
319
|
if (events.length === 0)
|
|
320
320
|
throw new Error("Claim event not found!");
|
|
321
321
|
return events[0].txHash;
|
|
322
322
|
},
|
|
323
323
|
getClaimResult: async () => {
|
|
324
|
-
const events = await this.
|
|
324
|
+
const events = await this._Events.getContractBlockEvents(["escrow_manager::events::Claim"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
|
|
325
325
|
if (events.length === 0)
|
|
326
326
|
throw new Error("Claim event not found!");
|
|
327
327
|
const event = events[0];
|
|
@@ -343,7 +343,7 @@ class StarknetSwapContract extends StarknetContractBase_1.StarknetContractBase {
|
|
|
343
343
|
};
|
|
344
344
|
},
|
|
345
345
|
getRefundTxId: async () => {
|
|
346
|
-
const events = await this.
|
|
346
|
+
const events = await this._Events.getContractBlockEvents(["escrow_manager::events::Refund"], [null, null, null, "0x" + escrowHash], blockHeight, blockHeight);
|
|
347
347
|
if (events.length === 0)
|
|
348
348
|
throw new Error("Refund event not found!");
|
|
349
349
|
return events[0].txHash;
|
|
@@ -475,8 +475,8 @@ class StarknetSwapContract extends StarknetContractBase_1.StarknetContractBase {
|
|
|
475
475
|
}
|
|
476
476
|
};
|
|
477
477
|
//We have to fetch separately the different directions
|
|
478
|
-
await this.
|
|
479
|
-
await this.
|
|
478
|
+
await this._Events.findInContractEventsForward(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [signer, null], processor, startBlockheight);
|
|
479
|
+
await this._Events.findInContractEventsForward(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [null, signer], processor, startBlockheight);
|
|
480
480
|
for (let escrowHash in swapsOpened) {
|
|
481
481
|
const foundSwapData = swapsOpened[escrowHash];
|
|
482
482
|
const data = await foundSwapData.data;
|
|
@@ -27,7 +27,7 @@ class IBitcoinClaimHandler {
|
|
|
27
27
|
const commitmentHash = starknet_1.hash.computePoseidonHashOnElements(serializedData);
|
|
28
28
|
if (!swapData.isClaimData(commitmentHash))
|
|
29
29
|
throw new Error("Invalid commit data");
|
|
30
|
-
const merkleProof = await btcRelay.
|
|
30
|
+
const merkleProof = await btcRelay._bitcoinRpc.getMerkleProof(tx.txid, tx.blockhash);
|
|
31
31
|
if (merkleProof == null)
|
|
32
32
|
throw new Error(`Failed to generate merkle proof for tx: ${tx.txid}!`);
|
|
33
33
|
logger.debug("getWitness(): merkle proof computed: ", merkleProof);
|
|
@@ -17,7 +17,7 @@ class StarknetSwapClaim extends StarknetSwapModule_1.StarknetSwapModule {
|
|
|
17
17
|
* @private
|
|
18
18
|
*/
|
|
19
19
|
Claim(signer, swapData, witness, claimHandlerGas) {
|
|
20
|
-
return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.claim(swapData.toEscrowStruct(), witness),
|
|
20
|
+
return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.claim(swapData.toEscrowStruct(), witness), StarknetFees_1.StarknetFees.starknetGasAdd(swapData.payOut ? StarknetSwapClaim.GasCosts.CLAIM_PAY_OUT : StarknetSwapClaim.GasCosts.CLAIM, claimHandlerGas));
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Creates transactions claiming the swap using a secret (for HTLC swaps)
|
|
@@ -88,7 +88,7 @@ class StarknetSwapClaim extends StarknetSwapModule_1.StarknetSwapModule {
|
|
|
88
88
|
let gasRequired = swapData.payOut ? StarknetSwapClaim.GasCosts.CLAIM_PAY_OUT : StarknetSwapClaim.GasCosts.CLAIM;
|
|
89
89
|
const claimHandler = this.contract.claimHandlersByAddress[(0, Utils_1.toHex)(swapData.claimHandler)];
|
|
90
90
|
if (claimHandler != null)
|
|
91
|
-
gasRequired =
|
|
91
|
+
gasRequired = StarknetFees_1.StarknetFees.starknetGasAdd(gasRequired, claimHandler.getGas(swapData));
|
|
92
92
|
return StarknetFees_1.StarknetFees.getGasFee(gasRequired, feeRate);
|
|
93
93
|
}
|
|
94
94
|
}
|
|
@@ -21,7 +21,7 @@ class StarknetSwapRefund extends StarknetSwapModule_1.StarknetSwapModule {
|
|
|
21
21
|
* @private
|
|
22
22
|
*/
|
|
23
23
|
Refund(signer, swapData, witness, handlerGas) {
|
|
24
|
-
return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness),
|
|
24
|
+
return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness), StarknetFees_1.StarknetFees.starknetGasAdd(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, handlerGas));
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* Action for cooperative refunding with signature
|