@atomiqlabs/chain-starknet 4.0.0-dev.3 → 4.0.0-dev.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -201
- package/dist/index.d.ts +39 -38
- package/dist/index.js +55 -54
- package/dist/starknet/StarknetChainType.d.ts +13 -13
- package/dist/starknet/StarknetChainType.js +2 -2
- package/dist/starknet/StarknetInitializer.d.ts +28 -27
- package/dist/starknet/StarknetInitializer.js +69 -69
- package/dist/starknet/btcrelay/BtcRelayAbi.d.ts +250 -250
- package/dist/starknet/btcrelay/BtcRelayAbi.js +341 -341
- package/dist/starknet/btcrelay/StarknetBtcRelay.d.ts +186 -186
- package/dist/starknet/btcrelay/StarknetBtcRelay.js +379 -379
- package/dist/starknet/btcrelay/headers/StarknetBtcHeader.d.ts +31 -31
- package/dist/starknet/btcrelay/headers/StarknetBtcHeader.js +74 -74
- package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.d.ts +51 -51
- package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.js +113 -113
- package/dist/starknet/chain/StarknetAction.d.ts +19 -19
- package/dist/starknet/chain/StarknetAction.js +73 -73
- package/dist/starknet/chain/StarknetChainInterface.d.ts +54 -52
- package/dist/starknet/chain/StarknetChainInterface.js +97 -91
- package/dist/starknet/chain/StarknetModule.d.ts +9 -14
- package/dist/starknet/chain/StarknetModule.js +13 -13
- package/dist/starknet/chain/modules/ERC20Abi.d.ts +755 -755
- package/dist/starknet/chain/modules/ERC20Abi.js +1032 -1032
- package/dist/starknet/chain/modules/StarknetAccounts.d.ts +6 -6
- package/dist/starknet/chain/modules/StarknetAccounts.js +24 -24
- package/dist/starknet/chain/modules/StarknetAddresses.d.ts +9 -9
- package/dist/starknet/chain/modules/StarknetAddresses.js +26 -26
- package/dist/starknet/chain/modules/StarknetBlocks.d.ts +20 -20
- package/dist/starknet/chain/modules/StarknetBlocks.js +64 -64
- package/dist/starknet/chain/modules/StarknetEvents.d.ts +44 -44
- package/dist/starknet/chain/modules/StarknetEvents.js +88 -88
- package/dist/starknet/chain/modules/StarknetFees.d.ts +82 -77
- package/dist/starknet/chain/modules/StarknetFees.js +121 -114
- package/dist/starknet/chain/modules/StarknetSignatures.d.ts +29 -29
- package/dist/starknet/chain/modules/StarknetSignatures.js +72 -72
- package/dist/starknet/chain/modules/StarknetTokens.d.ts +69 -69
- package/dist/starknet/chain/modules/StarknetTokens.js +102 -98
- package/dist/starknet/chain/modules/StarknetTransactions.d.ts +111 -93
- package/dist/starknet/chain/modules/StarknetTransactions.js +381 -255
- package/dist/starknet/contract/StarknetContractBase.d.ts +13 -13
- package/dist/starknet/contract/StarknetContractBase.js +20 -16
- package/dist/starknet/contract/StarknetContractModule.d.ts +8 -8
- package/dist/starknet/contract/StarknetContractModule.js +11 -11
- package/dist/starknet/contract/modules/StarknetContractEvents.d.ts +51 -51
- package/dist/starknet/contract/modules/StarknetContractEvents.js +97 -97
- package/dist/starknet/events/StarknetChainEvents.d.ts +21 -21
- package/dist/starknet/events/StarknetChainEvents.js +52 -52
- package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +84 -90
- package/dist/starknet/events/StarknetChainEventsBrowser.js +307 -292
- package/dist/starknet/provider/RpcProviderWithRetries.d.ts +41 -21
- package/dist/starknet/provider/RpcProviderWithRetries.js +70 -32
- package/dist/starknet/spv_swap/SpvVaultContractAbi.d.ts +488 -488
- package/dist/starknet/spv_swap/SpvVaultContractAbi.js +656 -656
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.d.ts +89 -66
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +477 -382
- package/dist/starknet/spv_swap/StarknetSpvVaultData.d.ts +49 -49
- package/dist/starknet/spv_swap/StarknetSpvVaultData.js +145 -145
- package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.d.ts +25 -25
- package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.js +72 -72
- package/dist/starknet/swaps/EscrowManagerAbi.d.ts +431 -434
- package/dist/starknet/swaps/EscrowManagerAbi.js +583 -587
- package/dist/starknet/swaps/StarknetSwapContract.d.ts +197 -190
- package/dist/starknet/swaps/StarknetSwapContract.js +440 -409
- package/dist/starknet/swaps/StarknetSwapData.d.ts +74 -67
- package/dist/starknet/swaps/StarknetSwapData.js +325 -290
- package/dist/starknet/swaps/StarknetSwapModule.d.ts +10 -10
- package/dist/starknet/swaps/StarknetSwapModule.js +11 -11
- package/dist/starknet/swaps/handlers/IHandler.d.ts +13 -13
- package/dist/starknet/swaps/handlers/IHandler.js +2 -2
- package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +13 -13
- package/dist/starknet/swaps/handlers/claim/ClaimHandlers.js +13 -13
- package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +21 -21
- package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +44 -44
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +24 -24
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +48 -48
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +25 -25
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +40 -40
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +20 -20
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +30 -30
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +45 -45
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +52 -52
- package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -17
- package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +27 -27
- package/dist/starknet/swaps/modules/StarknetLpVault.d.ts +69 -69
- package/dist/starknet/swaps/modules/StarknetLpVault.js +122 -122
- package/dist/starknet/swaps/modules/StarknetSwapClaim.d.ts +53 -53
- package/dist/starknet/swaps/modules/StarknetSwapClaim.js +100 -100
- package/dist/starknet/swaps/modules/StarknetSwapInit.d.ts +94 -86
- package/dist/starknet/swaps/modules/StarknetSwapInit.js +235 -224
- package/dist/starknet/swaps/modules/StarknetSwapRefund.d.ts +62 -62
- package/dist/starknet/swaps/modules/StarknetSwapRefund.js +128 -128
- package/dist/starknet/wallet/StarknetBrowserSigner.d.ts +5 -0
- package/dist/starknet/wallet/StarknetBrowserSigner.js +11 -0
- package/dist/starknet/wallet/StarknetKeypairWallet.d.ts +7 -7
- package/dist/starknet/wallet/StarknetKeypairWallet.js +35 -30
- package/dist/starknet/wallet/StarknetPersistentSigner.d.ts +33 -0
- package/dist/starknet/wallet/StarknetPersistentSigner.js +244 -0
- package/dist/starknet/wallet/StarknetSigner.d.ts +18 -12
- package/dist/starknet/wallet/StarknetSigner.js +69 -46
- package/dist/starknet/wallet/accounts/StarknetKeypairWallet.d.ts +7 -0
- package/dist/starknet/wallet/accounts/StarknetKeypairWallet.js +35 -0
- package/dist/utils/Utils.d.ts +39 -37
- package/dist/utils/Utils.js +264 -261
- package/package.json +45 -37
- package/src/index.ts +48 -47
- package/src/starknet/StarknetChainType.ts +28 -28
- package/src/starknet/StarknetInitializer.ts +110 -108
- package/src/starknet/btcrelay/BtcRelayAbi.ts +338 -338
- package/src/starknet/btcrelay/StarknetBtcRelay.ts +494 -494
- package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +100 -100
- package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +141 -141
- package/src/starknet/chain/StarknetAction.ts +85 -85
- package/src/starknet/chain/StarknetChainInterface.ts +165 -149
- package/src/starknet/chain/StarknetModule.ts +19 -19
- package/src/starknet/chain/modules/ERC20Abi.ts +1029 -1029
- package/src/starknet/chain/modules/StarknetAccounts.ts +25 -25
- package/src/starknet/chain/modules/StarknetAddresses.ts +22 -22
- package/src/starknet/chain/modules/StarknetBlocks.ts +75 -74
- package/src/starknet/chain/modules/StarknetEvents.ts +104 -104
- package/src/starknet/chain/modules/StarknetFees.ts +162 -154
- package/src/starknet/chain/modules/StarknetSignatures.ts +91 -91
- package/src/starknet/chain/modules/StarknetTokens.ts +120 -116
- package/src/starknet/chain/modules/StarknetTransactions.ts +424 -277
- package/src/starknet/contract/StarknetContractBase.ts +30 -26
- package/src/starknet/contract/StarknetContractModule.ts +16 -16
- package/src/starknet/contract/modules/StarknetContractEvents.ts +134 -134
- package/src/starknet/events/StarknetChainEvents.ts +67 -67
- package/src/starknet/events/StarknetChainEventsBrowser.ts +420 -410
- package/src/starknet/provider/RpcProviderWithRetries.ts +83 -43
- package/src/starknet/spv_swap/SpvVaultContractAbi.ts +656 -656
- package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +591 -483
- package/src/starknet/spv_swap/StarknetSpvVaultData.ts +195 -195
- package/src/starknet/spv_swap/StarknetSpvWithdrawalData.ts +79 -79
- package/src/starknet/swaps/EscrowManagerAbi.ts +582 -586
- package/src/starknet/swaps/StarknetSwapContract.ts +668 -628
- package/src/starknet/swaps/StarknetSwapData.ts +455 -403
- package/src/starknet/swaps/StarknetSwapModule.ts +17 -17
- package/src/starknet/swaps/handlers/IHandler.ts +20 -20
- package/src/starknet/swaps/handlers/claim/ClaimHandlers.ts +23 -23
- package/src/starknet/swaps/handlers/claim/HashlockClaimHandler.ts +53 -53
- package/src/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +73 -73
- package/src/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +67 -67
- package/src/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +50 -50
- package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +102 -102
- package/src/starknet/swaps/handlers/refund/TimelockRefundHandler.ts +38 -38
- package/src/starknet/swaps/modules/StarknetLpVault.ts +147 -147
- package/src/starknet/swaps/modules/StarknetSwapClaim.ts +141 -141
- package/src/starknet/swaps/modules/StarknetSwapInit.ts +300 -286
- package/src/starknet/swaps/modules/StarknetSwapRefund.ts +196 -196
- package/src/starknet/wallet/StarknetBrowserSigner.ts +12 -0
- package/src/starknet/wallet/StarknetPersistentSigner.ts +311 -0
- package/src/starknet/wallet/StarknetSigner.ts +84 -55
- package/src/starknet/wallet/{StarknetKeypairWallet.ts → accounts/StarknetKeypairWallet.ts} +44 -39
- package/src/utils/Utils.ts +262 -252
|
@@ -1,128 +1,128 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StarknetSwapRefund = void 0;
|
|
4
|
-
const base_1 = require("@atomiqlabs/base");
|
|
5
|
-
const Utils_1 = require("../../../utils/Utils");
|
|
6
|
-
const StarknetSwapModule_1 = require("../StarknetSwapModule");
|
|
7
|
-
const StarknetAction_1 = require("../../chain/StarknetAction");
|
|
8
|
-
const StarknetFees_1 = require("../../chain/modules/StarknetFees");
|
|
9
|
-
const Refund = [
|
|
10
|
-
{ name: 'Swap hash', type: 'felt' },
|
|
11
|
-
{ name: 'Timeout', type: 'timestamp' }
|
|
12
|
-
];
|
|
13
|
-
class StarknetSwapRefund extends StarknetSwapModule_1.StarknetSwapModule {
|
|
14
|
-
/**
|
|
15
|
-
* Action for generic Refund instruction
|
|
16
|
-
*
|
|
17
|
-
* @param signer
|
|
18
|
-
* @param swapData
|
|
19
|
-
* @param witness
|
|
20
|
-
* @param handlerGas
|
|
21
|
-
* @constructor
|
|
22
|
-
* @private
|
|
23
|
-
*/
|
|
24
|
-
Refund(signer, swapData, witness, handlerGas) {
|
|
25
|
-
return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness), (0, StarknetFees_1.starknetGasAdd)(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, handlerGas));
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Action for cooperative refunding with signature
|
|
29
|
-
*
|
|
30
|
-
* @param sender
|
|
31
|
-
* @param swapData
|
|
32
|
-
* @param timeout
|
|
33
|
-
* @param signature
|
|
34
|
-
* @constructor
|
|
35
|
-
* @private
|
|
36
|
-
*/
|
|
37
|
-
RefundWithSignature(sender, swapData, timeout, signature) {
|
|
38
|
-
return new StarknetAction_1.StarknetAction(sender, this.root, this.swapContract.populateTransaction.cooperative_refund(swapData.toEscrowStruct(), signature, BigInt(timeout)), swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND);
|
|
39
|
-
}
|
|
40
|
-
async signSwapRefund(signer, swapData, authorizationTimeout) {
|
|
41
|
-
const authPrefix = "refund";
|
|
42
|
-
const authTimeout = Math.floor(Date.now() / 1000) + authorizationTimeout;
|
|
43
|
-
const signature = await this.root.Signatures.signTypedMessage(signer, Refund, "Refund", {
|
|
44
|
-
"Swap hash": "0x" + swapData.getEscrowHash(),
|
|
45
|
-
"Timeout": (0, Utils_1.toHex)(authTimeout)
|
|
46
|
-
});
|
|
47
|
-
return {
|
|
48
|
-
prefix: authPrefix,
|
|
49
|
-
timeout: authTimeout.toString(10),
|
|
50
|
-
signature: signature
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
async isSignatureValid(swapData, timeout, prefix, signature) {
|
|
54
|
-
if (prefix !== "refund")
|
|
55
|
-
throw new base_1.SignatureVerificationError("Invalid prefix");
|
|
56
|
-
const expiryTimestamp = BigInt(timeout);
|
|
57
|
-
const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
|
|
58
|
-
const isExpired = (expiryTimestamp - currentTimestamp) < BigInt(this.contract.authGracePeriod);
|
|
59
|
-
if (isExpired)
|
|
60
|
-
throw new base_1.SignatureVerificationError("Authorization expired!");
|
|
61
|
-
const valid = await this.root.Signatures.isValidSignature(signature, swapData.claimer, Refund, "Refund", {
|
|
62
|
-
"Swap hash": "0x" + swapData.getEscrowHash(),
|
|
63
|
-
"Timeout": (0, Utils_1.toHex)(expiryTimestamp)
|
|
64
|
-
});
|
|
65
|
-
if (!valid) {
|
|
66
|
-
throw new base_1.SignatureVerificationError("Invalid signature!");
|
|
67
|
-
}
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Creates transactions required for refunding timed out swap
|
|
72
|
-
*
|
|
73
|
-
* @param signer
|
|
74
|
-
* @param swapData swap data to refund
|
|
75
|
-
* @param check whether to check if swap is already expired and refundable
|
|
76
|
-
* @param feeRate fee rate to be used for the transactions
|
|
77
|
-
* @param witnessData
|
|
78
|
-
*/
|
|
79
|
-
async txsRefund(signer, swapData, check, feeRate, witnessData) {
|
|
80
|
-
const refundHandler = this.contract.refundHandlersByAddress[swapData.refundHandler.toLowerCase()];
|
|
81
|
-
if (refundHandler == null)
|
|
82
|
-
throw new Error("Invalid refund handler");
|
|
83
|
-
if (check && !await (0, Utils_1.tryWithRetries)(() => this.contract.isRequestRefundable(swapData.offerer.toString(), swapData), this.retryPolicy)) {
|
|
84
|
-
throw new base_1.SwapDataVerificationError("Not refundable yet!");
|
|
85
|
-
}
|
|
86
|
-
feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
|
|
87
|
-
const { initialTxns, witness } = await refundHandler.getWitness(signer, swapData, witnessData, feeRate);
|
|
88
|
-
const action = this.Refund(signer, swapData, witness, refundHandler.getGas(swapData));
|
|
89
|
-
await action.addToTxs(initialTxns, feeRate);
|
|
90
|
-
this.logger.debug("txsRefund(): creating refund transaction, swap: " + swapData.getClaimHash());
|
|
91
|
-
return initialTxns;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
|
|
95
|
-
*
|
|
96
|
-
* @param signer
|
|
97
|
-
* @param swapData swap data to refund
|
|
98
|
-
* @param timeout signature timeout
|
|
99
|
-
* @param prefix signature prefix of the counterparty
|
|
100
|
-
* @param signature signature of the counterparty
|
|
101
|
-
* @param check whether to check if swap is committed before attempting refund
|
|
102
|
-
* @param feeRate fee rate to be used for the transactions
|
|
103
|
-
*/
|
|
104
|
-
async txsRefundWithAuthorization(signer, swapData, timeout, prefix, signature, check, feeRate) {
|
|
105
|
-
if (check && !await (0, Utils_1.tryWithRetries)(() => this.contract.isCommited(swapData), this.retryPolicy)) {
|
|
106
|
-
throw new base_1.SwapDataVerificationError("Not correctly committed");
|
|
107
|
-
}
|
|
108
|
-
await (0, Utils_1.tryWithRetries)(() => this.isSignatureValid(swapData, timeout, prefix, signature), this.retryPolicy, (e) => e instanceof base_1.SignatureVerificationError);
|
|
109
|
-
const action = this.RefundWithSignature(signer, swapData, timeout, JSON.parse(signature));
|
|
110
|
-
feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
|
|
111
|
-
this.logger.debug("txsRefundWithAuthorization(): creating refund transaction, swap: " + swapData.getClaimHash() +
|
|
112
|
-
" auth expiry: " + timeout + " signature: " + signature);
|
|
113
|
-
return [await action.tx(feeRate)];
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
|
|
117
|
-
* ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
|
|
118
|
-
*/
|
|
119
|
-
async getRefundFee(swapData, feeRate) {
|
|
120
|
-
feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
|
|
121
|
-
return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, feeRate);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
exports.StarknetSwapRefund = StarknetSwapRefund;
|
|
125
|
-
StarknetSwapRefund.GasCosts = {
|
|
126
|
-
REFUND: { l1DataGas: 750, l2Gas: 4000000, l1Gas: 0 },
|
|
127
|
-
REFUND_PAY_OUT: { l1DataGas: 900, l2Gas: 6000000, l1Gas: 0 }
|
|
128
|
-
};
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StarknetSwapRefund = void 0;
|
|
4
|
+
const base_1 = require("@atomiqlabs/base");
|
|
5
|
+
const Utils_1 = require("../../../utils/Utils");
|
|
6
|
+
const StarknetSwapModule_1 = require("../StarknetSwapModule");
|
|
7
|
+
const StarknetAction_1 = require("../../chain/StarknetAction");
|
|
8
|
+
const StarknetFees_1 = require("../../chain/modules/StarknetFees");
|
|
9
|
+
const Refund = [
|
|
10
|
+
{ name: 'Swap hash', type: 'felt' },
|
|
11
|
+
{ name: 'Timeout', type: 'timestamp' }
|
|
12
|
+
];
|
|
13
|
+
class StarknetSwapRefund extends StarknetSwapModule_1.StarknetSwapModule {
|
|
14
|
+
/**
|
|
15
|
+
* Action for generic Refund instruction
|
|
16
|
+
*
|
|
17
|
+
* @param signer
|
|
18
|
+
* @param swapData
|
|
19
|
+
* @param witness
|
|
20
|
+
* @param handlerGas
|
|
21
|
+
* @constructor
|
|
22
|
+
* @private
|
|
23
|
+
*/
|
|
24
|
+
Refund(signer, swapData, witness, handlerGas) {
|
|
25
|
+
return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness), (0, StarknetFees_1.starknetGasAdd)(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, handlerGas));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Action for cooperative refunding with signature
|
|
29
|
+
*
|
|
30
|
+
* @param sender
|
|
31
|
+
* @param swapData
|
|
32
|
+
* @param timeout
|
|
33
|
+
* @param signature
|
|
34
|
+
* @constructor
|
|
35
|
+
* @private
|
|
36
|
+
*/
|
|
37
|
+
RefundWithSignature(sender, swapData, timeout, signature) {
|
|
38
|
+
return new StarknetAction_1.StarknetAction(sender, this.root, this.swapContract.populateTransaction.cooperative_refund(swapData.toEscrowStruct(), signature, BigInt(timeout)), swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND);
|
|
39
|
+
}
|
|
40
|
+
async signSwapRefund(signer, swapData, authorizationTimeout) {
|
|
41
|
+
const authPrefix = "refund";
|
|
42
|
+
const authTimeout = Math.floor(Date.now() / 1000) + authorizationTimeout;
|
|
43
|
+
const signature = await this.root.Signatures.signTypedMessage(signer, Refund, "Refund", {
|
|
44
|
+
"Swap hash": "0x" + swapData.getEscrowHash(),
|
|
45
|
+
"Timeout": (0, Utils_1.toHex)(authTimeout)
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
prefix: authPrefix,
|
|
49
|
+
timeout: authTimeout.toString(10),
|
|
50
|
+
signature: signature
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async isSignatureValid(swapData, timeout, prefix, signature) {
|
|
54
|
+
if (prefix !== "refund")
|
|
55
|
+
throw new base_1.SignatureVerificationError("Invalid prefix");
|
|
56
|
+
const expiryTimestamp = BigInt(timeout);
|
|
57
|
+
const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
|
|
58
|
+
const isExpired = (expiryTimestamp - currentTimestamp) < BigInt(this.contract.authGracePeriod);
|
|
59
|
+
if (isExpired)
|
|
60
|
+
throw new base_1.SignatureVerificationError("Authorization expired!");
|
|
61
|
+
const valid = await this.root.Signatures.isValidSignature(signature, swapData.claimer, Refund, "Refund", {
|
|
62
|
+
"Swap hash": "0x" + swapData.getEscrowHash(),
|
|
63
|
+
"Timeout": (0, Utils_1.toHex)(expiryTimestamp)
|
|
64
|
+
});
|
|
65
|
+
if (!valid) {
|
|
66
|
+
throw new base_1.SignatureVerificationError("Invalid signature!");
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Creates transactions required for refunding timed out swap
|
|
72
|
+
*
|
|
73
|
+
* @param signer
|
|
74
|
+
* @param swapData swap data to refund
|
|
75
|
+
* @param check whether to check if swap is already expired and refundable
|
|
76
|
+
* @param feeRate fee rate to be used for the transactions
|
|
77
|
+
* @param witnessData
|
|
78
|
+
*/
|
|
79
|
+
async txsRefund(signer, swapData, check, feeRate, witnessData) {
|
|
80
|
+
const refundHandler = this.contract.refundHandlersByAddress[swapData.refundHandler.toLowerCase()];
|
|
81
|
+
if (refundHandler == null)
|
|
82
|
+
throw new Error("Invalid refund handler");
|
|
83
|
+
if (check && !await (0, Utils_1.tryWithRetries)(() => this.contract.isRequestRefundable(swapData.offerer.toString(), swapData), this.retryPolicy)) {
|
|
84
|
+
throw new base_1.SwapDataVerificationError("Not refundable yet!");
|
|
85
|
+
}
|
|
86
|
+
feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
|
|
87
|
+
const { initialTxns, witness } = await refundHandler.getWitness(signer, swapData, witnessData, feeRate);
|
|
88
|
+
const action = this.Refund(signer, swapData, witness, refundHandler.getGas(swapData));
|
|
89
|
+
await action.addToTxs(initialTxns, feeRate);
|
|
90
|
+
this.logger.debug("txsRefund(): creating refund transaction, swap: " + swapData.getClaimHash());
|
|
91
|
+
return initialTxns;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Creates transactions required for refunding the swap with authorization signature, also unwraps WSOL to SOL
|
|
95
|
+
*
|
|
96
|
+
* @param signer
|
|
97
|
+
* @param swapData swap data to refund
|
|
98
|
+
* @param timeout signature timeout
|
|
99
|
+
* @param prefix signature prefix of the counterparty
|
|
100
|
+
* @param signature signature of the counterparty
|
|
101
|
+
* @param check whether to check if swap is committed before attempting refund
|
|
102
|
+
* @param feeRate fee rate to be used for the transactions
|
|
103
|
+
*/
|
|
104
|
+
async txsRefundWithAuthorization(signer, swapData, timeout, prefix, signature, check, feeRate) {
|
|
105
|
+
if (check && !await (0, Utils_1.tryWithRetries)(() => this.contract.isCommited(swapData), this.retryPolicy)) {
|
|
106
|
+
throw new base_1.SwapDataVerificationError("Not correctly committed");
|
|
107
|
+
}
|
|
108
|
+
await (0, Utils_1.tryWithRetries)(() => this.isSignatureValid(swapData, timeout, prefix, signature), this.retryPolicy, (e) => e instanceof base_1.SignatureVerificationError);
|
|
109
|
+
const action = this.RefundWithSignature(signer, swapData, timeout, JSON.parse(signature));
|
|
110
|
+
feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
|
|
111
|
+
this.logger.debug("txsRefundWithAuthorization(): creating refund transaction, swap: " + swapData.getClaimHash() +
|
|
112
|
+
" auth expiry: " + timeout + " signature: " + signature);
|
|
113
|
+
return [await action.tx(feeRate)];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get the estimated solana transaction fee of the refund transaction, in the worst case scenario in case where the
|
|
117
|
+
* ATA needs to be initialized again (i.e. adding the ATA rent exempt lamports to the fee)
|
|
118
|
+
*/
|
|
119
|
+
async getRefundFee(swapData, feeRate) {
|
|
120
|
+
feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
|
|
121
|
+
return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, feeRate);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.StarknetSwapRefund = StarknetSwapRefund;
|
|
125
|
+
StarknetSwapRefund.GasCosts = {
|
|
126
|
+
REFUND: { l1DataGas: 750, l2Gas: 4000000, l1Gas: 0 },
|
|
127
|
+
REFUND_PAY_OUT: { l1DataGas: 900, l2Gas: 6000000, l1Gas: 0 }
|
|
128
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StarknetBrowserSigner = void 0;
|
|
4
|
+
const StarknetSigner_1 = require("./StarknetSigner");
|
|
5
|
+
class StarknetBrowserSigner extends StarknetSigner_1.StarknetSigner {
|
|
6
|
+
constructor(account) {
|
|
7
|
+
super(account, false);
|
|
8
|
+
this.signTransaction = null;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.StarknetBrowserSigner = StarknetBrowserSigner;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Account, DeployAccountContractPayload, Provider } from "starknet";
|
|
2
|
-
export declare class StarknetKeypairWallet extends Account {
|
|
3
|
-
readonly publicKey: string;
|
|
4
|
-
constructor(provider: Provider, privateKey: string);
|
|
5
|
-
getDeploymentData(): DeployAccountContractPayload;
|
|
6
|
-
static generateRandomPrivateKey(): string;
|
|
7
|
-
}
|
|
1
|
+
import { Account, DeployAccountContractPayload, Provider } from "starknet";
|
|
2
|
+
export declare class StarknetKeypairWallet extends Account {
|
|
3
|
+
readonly publicKey: string;
|
|
4
|
+
constructor(provider: Provider, privateKey: string);
|
|
5
|
+
getDeploymentData(): DeployAccountContractPayload;
|
|
6
|
+
static generateRandomPrivateKey(): string;
|
|
7
|
+
}
|
|
@@ -1,30 +1,35 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StarknetKeypairWallet = void 0;
|
|
4
|
-
const starknet_1 = require("starknet");
|
|
5
|
-
const Utils_1 = require("../../utils/Utils");
|
|
6
|
-
const buffer_1 = require("buffer");
|
|
7
|
-
const OZaccountClassHash = '0x00261c293c8084cd79086214176b33e5911677cec55104fddc8d25b0b736dcad';
|
|
8
|
-
//Openzeppelin Account wallet
|
|
9
|
-
class StarknetKeypairWallet extends starknet_1.Account {
|
|
10
|
-
constructor(provider, privateKey) {
|
|
11
|
-
const publicKey = starknet_1.ec.starkCurve.getStarkKey((0, Utils_1.toHex)(privateKey));
|
|
12
|
-
// Calculate future address of the account
|
|
13
|
-
const OZaccountConstructorCallData = starknet_1.CallData.compile({ publicKey });
|
|
14
|
-
const OZcontractAddress = starknet_1.hash.calculateContractAddressFromHash(publicKey, OZaccountClassHash, OZaccountConstructorCallData, 0);
|
|
15
|
-
super(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StarknetKeypairWallet = void 0;
|
|
4
|
+
const starknet_1 = require("starknet");
|
|
5
|
+
const Utils_1 = require("../../utils/Utils");
|
|
6
|
+
const buffer_1 = require("buffer");
|
|
7
|
+
const OZaccountClassHash = '0x00261c293c8084cd79086214176b33e5911677cec55104fddc8d25b0b736dcad';
|
|
8
|
+
//Openzeppelin Account wallet
|
|
9
|
+
class StarknetKeypairWallet extends starknet_1.Account {
|
|
10
|
+
constructor(provider, privateKey) {
|
|
11
|
+
const publicKey = starknet_1.ec.starkCurve.getStarkKey((0, Utils_1.toHex)(privateKey));
|
|
12
|
+
// Calculate future address of the account
|
|
13
|
+
const OZaccountConstructorCallData = starknet_1.CallData.compile({ publicKey });
|
|
14
|
+
const OZcontractAddress = starknet_1.hash.calculateContractAddressFromHash(publicKey, OZaccountClassHash, OZaccountConstructorCallData, 0);
|
|
15
|
+
super({
|
|
16
|
+
provider,
|
|
17
|
+
address: OZcontractAddress,
|
|
18
|
+
signer: privateKey,
|
|
19
|
+
cairoVersion: "1"
|
|
20
|
+
});
|
|
21
|
+
this.publicKey = publicKey;
|
|
22
|
+
}
|
|
23
|
+
getDeploymentData() {
|
|
24
|
+
return {
|
|
25
|
+
classHash: OZaccountClassHash,
|
|
26
|
+
constructorCalldata: starknet_1.CallData.compile({ publicKey: this.publicKey }),
|
|
27
|
+
addressSalt: this.publicKey,
|
|
28
|
+
contractAddress: this.address
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
static generateRandomPrivateKey() {
|
|
32
|
+
return "0x" + buffer_1.Buffer.from(starknet_1.ec.starkCurve.utils.randomPrivateKey()).toString("hex");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.StarknetKeypairWallet = StarknetKeypairWallet;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { StarknetSigner } from "./StarknetSigner";
|
|
2
|
+
import { StarknetTx } from "../chain/modules/StarknetTransactions";
|
|
3
|
+
import { StarknetChainInterface } from "../chain/StarknetChainInterface";
|
|
4
|
+
import { Account } from "starknet";
|
|
5
|
+
export type StarknetPersistentSignerConfig = {
|
|
6
|
+
waitBeforeBump?: number;
|
|
7
|
+
minFeeIncreaseAbsolute?: bigint;
|
|
8
|
+
minFeeIncreasePpm?: bigint;
|
|
9
|
+
minTipIncreaseAbsolute?: bigint;
|
|
10
|
+
minTipIncreasePpm?: bigint;
|
|
11
|
+
};
|
|
12
|
+
export declare class StarknetPersistentSigner extends StarknetSigner {
|
|
13
|
+
private pendingTxs;
|
|
14
|
+
private confirmedNonce;
|
|
15
|
+
private pendingNonce;
|
|
16
|
+
private feeBumper;
|
|
17
|
+
private stopped;
|
|
18
|
+
private readonly directory;
|
|
19
|
+
private readonly config;
|
|
20
|
+
private readonly chainInterface;
|
|
21
|
+
private readonly logger;
|
|
22
|
+
constructor(account: Account, chainInterface: StarknetChainInterface, directory: string, config?: StarknetPersistentSignerConfig);
|
|
23
|
+
private load;
|
|
24
|
+
private priorSavePromise;
|
|
25
|
+
private saveCount;
|
|
26
|
+
private save;
|
|
27
|
+
private checkPastTransactions;
|
|
28
|
+
private startFeeBumper;
|
|
29
|
+
init(): Promise<void>;
|
|
30
|
+
stop(): Promise<void>;
|
|
31
|
+
private readonly sendTransactionQueue;
|
|
32
|
+
sendTransaction(transaction: StarknetTx, onBeforePublish?: (txId: string, rawTx: string) => Promise<void>): Promise<string>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StarknetPersistentSigner = void 0;
|
|
4
|
+
const StarknetSigner_1 = require("./StarknetSigner");
|
|
5
|
+
const StarknetTransactions_1 = require("../chain/modules/StarknetTransactions");
|
|
6
|
+
const Utils_1 = require("../../utils/Utils");
|
|
7
|
+
const starknet_1 = require("starknet");
|
|
8
|
+
const promises_1 = require("fs/promises");
|
|
9
|
+
const StarknetFees_1 = require("../chain/modules/StarknetFees");
|
|
10
|
+
const transaction_1 = require("@scure/btc-signer/transaction");
|
|
11
|
+
const promise_queue_ts_1 = require("promise-queue-ts");
|
|
12
|
+
const WAIT_BEFORE_BUMP = 15 * 1000;
|
|
13
|
+
const MIN_FEE_INCREASE_ABSOLUTE = 1n * 1000000n; //0.001GWei
|
|
14
|
+
const MIN_FEE_INCREASE_PPM = 110000n; // +11%
|
|
15
|
+
const MIN_TIP_INCREASE_ABSOLUTE = 1n * 1000000000n; //1GWei
|
|
16
|
+
const MIN_TIP_INCREASE_PPM = 110000n; // +11%
|
|
17
|
+
class StarknetPersistentSigner extends StarknetSigner_1.StarknetSigner {
|
|
18
|
+
constructor(account, chainInterface, directory, config) {
|
|
19
|
+
var _a, _b, _c, _d, _e;
|
|
20
|
+
super(account, true);
|
|
21
|
+
this.pendingTxs = new Map();
|
|
22
|
+
this.stopped = false;
|
|
23
|
+
this.saveCount = 0;
|
|
24
|
+
this.sendTransactionQueue = new promise_queue_ts_1.PromiseQueue();
|
|
25
|
+
this.signTransaction = null;
|
|
26
|
+
this.chainInterface = chainInterface;
|
|
27
|
+
this.directory = directory;
|
|
28
|
+
this.config = config ?? {};
|
|
29
|
+
(_a = this.config).minFeeIncreaseAbsolute ?? (_a.minFeeIncreaseAbsolute = MIN_FEE_INCREASE_ABSOLUTE);
|
|
30
|
+
(_b = this.config).minFeeIncreasePpm ?? (_b.minFeeIncreasePpm = MIN_FEE_INCREASE_PPM);
|
|
31
|
+
(_c = this.config).minTipIncreaseAbsolute ?? (_c.minTipIncreaseAbsolute = MIN_TIP_INCREASE_ABSOLUTE);
|
|
32
|
+
(_d = this.config).minTipIncreasePpm ?? (_d.minTipIncreasePpm = MIN_TIP_INCREASE_PPM);
|
|
33
|
+
(_e = this.config).waitBeforeBump ?? (_e.waitBeforeBump = WAIT_BEFORE_BUMP);
|
|
34
|
+
this.logger = (0, Utils_1.getLogger)("StarknetPersistentSigner(" + this.account.address + "): ");
|
|
35
|
+
}
|
|
36
|
+
async load() {
|
|
37
|
+
const fileExists = await (0, promises_1.access)(this.directory + "/txs.json", promises_1.constants.F_OK).then(() => true).catch(() => false);
|
|
38
|
+
if (!fileExists)
|
|
39
|
+
return;
|
|
40
|
+
const res = await (0, promises_1.readFile)(this.directory + "/txs.json");
|
|
41
|
+
if (res != null) {
|
|
42
|
+
const pendingTxs = JSON.parse(res.toString());
|
|
43
|
+
for (let nonceStr in pendingTxs) {
|
|
44
|
+
const nonceData = pendingTxs[nonceStr];
|
|
45
|
+
const nonce = BigInt(nonceStr);
|
|
46
|
+
if (this.confirmedNonce >= nonce)
|
|
47
|
+
continue; //Already confirmed
|
|
48
|
+
if (this.pendingNonce < nonce) {
|
|
49
|
+
this.pendingNonce = nonce;
|
|
50
|
+
}
|
|
51
|
+
const parsedPendingTxns = nonceData.txs.map(StarknetTransactions_1.StarknetTransactions.deserializeTx);
|
|
52
|
+
this.pendingTxs.set(nonce, {
|
|
53
|
+
txs: parsedPendingTxns,
|
|
54
|
+
lastBumped: nonceData.lastBumped
|
|
55
|
+
});
|
|
56
|
+
for (let tx of parsedPendingTxns) {
|
|
57
|
+
this.chainInterface.Transactions._knownTxSet.add(tx.txId);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async save() {
|
|
63
|
+
const pendingTxs = {};
|
|
64
|
+
for (let [nonce, data] of this.pendingTxs) {
|
|
65
|
+
pendingTxs[nonce.toString(10)] = {
|
|
66
|
+
lastBumped: data.lastBumped,
|
|
67
|
+
txs: data.txs.map(StarknetTransactions_1.StarknetTransactions.serializeTx)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const requiredSaveCount = ++this.saveCount;
|
|
71
|
+
if (this.priorSavePromise != null) {
|
|
72
|
+
await this.priorSavePromise;
|
|
73
|
+
}
|
|
74
|
+
if (requiredSaveCount === this.saveCount) {
|
|
75
|
+
this.priorSavePromise = (0, promises_1.writeFile)(this.directory + "/txs.json", JSON.stringify(pendingTxs));
|
|
76
|
+
await this.priorSavePromise;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async checkPastTransactions() {
|
|
80
|
+
let _gasPrice = null;
|
|
81
|
+
let _safeBlockNonce = null;
|
|
82
|
+
for (let [nonce, data] of this.pendingTxs) {
|
|
83
|
+
if (!data.sending && data.lastBumped < Date.now() - this.config.waitBeforeBump) {
|
|
84
|
+
_safeBlockNonce = await this.chainInterface.Transactions.getNonce(this.account.address, starknet_1.BlockTag.LATEST);
|
|
85
|
+
this.confirmedNonce = _safeBlockNonce;
|
|
86
|
+
if (_safeBlockNonce > nonce) {
|
|
87
|
+
this.pendingTxs.delete(nonce);
|
|
88
|
+
data.txs.forEach(tx => this.chainInterface.Transactions._knownTxSet.delete(tx.txId));
|
|
89
|
+
this.logger.info("checkPastTransactions(): Tx confirmed, required fee bumps: ", data.txs.length);
|
|
90
|
+
this.save();
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const lastTx = data.txs[data.txs.length - 1];
|
|
94
|
+
if (_gasPrice == null) {
|
|
95
|
+
const feeRate = await this.chainInterface.Fees.getFeeRate();
|
|
96
|
+
_gasPrice = StarknetFees_1.StarknetFees.extractFromFeeRateString(feeRate);
|
|
97
|
+
}
|
|
98
|
+
let l1GasCost = BigInt(lastTx.details.resourceBounds.l1_gas.max_price_per_unit);
|
|
99
|
+
let l2GasCost = BigInt(lastTx.details.resourceBounds.l2_gas.max_price_per_unit);
|
|
100
|
+
let l1DataGasCost = BigInt(lastTx.details.resourceBounds.l1_data_gas.max_price_per_unit);
|
|
101
|
+
let tip = BigInt(lastTx.details.tip);
|
|
102
|
+
let feeBumped = false;
|
|
103
|
+
if (_gasPrice.l1GasCost > l1GasCost) {
|
|
104
|
+
//Bump by minimum allowed or to the actual _gasPrice.l1GasCost
|
|
105
|
+
l1GasCost = (0, Utils_1.bigIntMax)(_gasPrice.l1GasCost, this.config.minFeeIncreaseAbsolute + (l1GasCost * (1000000n + this.config.minFeeIncreasePpm) / 1000000n));
|
|
106
|
+
feeBumped = true;
|
|
107
|
+
}
|
|
108
|
+
if (_gasPrice.l1DataGasCost > l1DataGasCost) {
|
|
109
|
+
//Bump by minimum allowed or to the actual _gasPrice.l1GasCost
|
|
110
|
+
l1DataGasCost = (0, Utils_1.bigIntMax)(_gasPrice.l1DataGasCost, this.config.minFeeIncreaseAbsolute + (l1DataGasCost * (1000000n + this.config.minFeeIncreasePpm) / 1000000n));
|
|
111
|
+
feeBumped = true;
|
|
112
|
+
}
|
|
113
|
+
if (_gasPrice.l2GasCost > l2GasCost || feeBumped) { //In case the fees for l1 and l1Data were bumped, we also need to bump the l2GasFee regardless
|
|
114
|
+
l2GasCost = (0, Utils_1.bigIntMax)(_gasPrice.l2GasCost, this.config.minFeeIncreaseAbsolute + (l2GasCost * (1000000n + this.config.minFeeIncreasePpm) / 1000000n));
|
|
115
|
+
feeBumped = true;
|
|
116
|
+
}
|
|
117
|
+
if (feeBumped)
|
|
118
|
+
tip = this.config.minTipIncreaseAbsolute + (tip * (1000000n + this.config.minTipIncreasePpm) / 1000000n);
|
|
119
|
+
if (!feeBumped) {
|
|
120
|
+
//Not fee bumped
|
|
121
|
+
this.logger.debug("checkPastTransactions(): Tx yet unconfirmed but not increasing fee for ", lastTx.txId);
|
|
122
|
+
//Rebroadcast the tx
|
|
123
|
+
await this.chainInterface.Transactions.sendTransaction(lastTx).catch(e => {
|
|
124
|
+
if (e.baseError?.code === 52) { //Invalid transaction nonce
|
|
125
|
+
this.logger.debug("checkPastTransactions(): Tx re-broadcast success, tx already confirmed: ", lastTx.txId);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (e.baseError?.code === 59) { //Transaction already in the mempool
|
|
129
|
+
this.logger.debug("checkPastTransactions(): Tx re-broadcast success, tx already known to the RPC: ", lastTx.txId);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.logger.error("checkPastTransactions(): Tx re-broadcast error", e);
|
|
133
|
+
});
|
|
134
|
+
data.lastBumped = Date.now();
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const newTx = (0, transaction_1.cloneDeep)(lastTx);
|
|
138
|
+
delete newTx.signed;
|
|
139
|
+
delete newTx.txId;
|
|
140
|
+
newTx.details.tip = tip;
|
|
141
|
+
newTx.details.resourceBounds.l1_gas.max_price_per_unit = l1GasCost;
|
|
142
|
+
newTx.details.resourceBounds.l2_gas.max_price_per_unit = l2GasCost;
|
|
143
|
+
newTx.details.resourceBounds.l1_data_gas.max_price_per_unit = l1DataGasCost;
|
|
144
|
+
await this._signTransaction(newTx);
|
|
145
|
+
this.logger.info(`checkPastTransactions(): Bump fee for tx ${lastTx.txId} -> ${newTx.txId}`);
|
|
146
|
+
//Double check pending txns still has nonce after async signTransaction was called
|
|
147
|
+
if (!this.pendingTxs.has(nonce))
|
|
148
|
+
continue;
|
|
149
|
+
for (let callback of this.chainInterface.Transactions._cbksBeforeTxReplace) {
|
|
150
|
+
try {
|
|
151
|
+
await callback(StarknetTransactions_1.StarknetTransactions.serializeTx(lastTx), lastTx.txId, StarknetTransactions_1.StarknetTransactions.serializeTx(newTx), newTx.txId);
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
this.logger.error("checkPastTransactions(): beforeTxReplace callback error: ", e);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
data.txs.push(newTx);
|
|
158
|
+
data.lastBumped = Date.now();
|
|
159
|
+
this.save();
|
|
160
|
+
this.chainInterface.Transactions._knownTxSet.add(newTx.txId);
|
|
161
|
+
//TODO: Better error handling when sending tx
|
|
162
|
+
await this.chainInterface.Transactions.sendTransaction(newTx).catch(e => {
|
|
163
|
+
if (e.baseError?.code === 52) { //Invalid transaction nonce
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
this.logger.error("checkPastTransactions(): Fee-bumped tx broadcast error", e);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
startFeeBumper() {
|
|
172
|
+
let func;
|
|
173
|
+
func = async () => {
|
|
174
|
+
try {
|
|
175
|
+
await this.checkPastTransactions();
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
this.logger.error("startFeeBumper(): Error when check past transactions: ", e);
|
|
179
|
+
}
|
|
180
|
+
if (this.stopped)
|
|
181
|
+
return;
|
|
182
|
+
this.feeBumper = setTimeout(func, 1000);
|
|
183
|
+
};
|
|
184
|
+
func();
|
|
185
|
+
}
|
|
186
|
+
async init() {
|
|
187
|
+
try {
|
|
188
|
+
await (0, promises_1.mkdir)(this.directory);
|
|
189
|
+
}
|
|
190
|
+
catch (e) { }
|
|
191
|
+
const nonce = await this.chainInterface.Transactions.getNonce(this.account.address, starknet_1.BlockTag.LATEST);
|
|
192
|
+
this.confirmedNonce = nonce - 1n;
|
|
193
|
+
this.pendingNonce = nonce - 1n;
|
|
194
|
+
await this.load();
|
|
195
|
+
this.startFeeBumper();
|
|
196
|
+
}
|
|
197
|
+
stop() {
|
|
198
|
+
this.stopped = true;
|
|
199
|
+
if (this.feeBumper != null) {
|
|
200
|
+
clearTimeout(this.feeBumper);
|
|
201
|
+
this.feeBumper = null;
|
|
202
|
+
}
|
|
203
|
+
return Promise.resolve();
|
|
204
|
+
}
|
|
205
|
+
sendTransaction(transaction, onBeforePublish) {
|
|
206
|
+
return this.sendTransactionQueue.enqueue(async () => {
|
|
207
|
+
if (transaction.details.nonce != null) {
|
|
208
|
+
if (transaction.details.nonce !== this.pendingNonce + 1n)
|
|
209
|
+
throw new Error("Invalid transaction nonce!");
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
transaction.details.nonce = this.pendingNonce + 1n;
|
|
213
|
+
}
|
|
214
|
+
const signedTx = await this._signTransaction(transaction);
|
|
215
|
+
if (onBeforePublish != null) {
|
|
216
|
+
try {
|
|
217
|
+
await onBeforePublish(signedTx.txId, StarknetTransactions_1.StarknetTransactions.serializeTx(signedTx));
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
this.logger.error("sendTransaction(): Error when calling onBeforePublish function: ", e);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const pendingTxObject = { txs: [signedTx], lastBumped: Date.now(), sending: true };
|
|
224
|
+
this.pendingNonce++;
|
|
225
|
+
this.logger.debug("sendTransaction(): Incrementing pending nonce to: ", this.pendingNonce);
|
|
226
|
+
this.pendingTxs.set(transaction.details.nonce, pendingTxObject);
|
|
227
|
+
this.save();
|
|
228
|
+
this.chainInterface.Transactions._knownTxSet.add(signedTx.txId);
|
|
229
|
+
try {
|
|
230
|
+
const result = await this.chainInterface.Transactions.sendTransaction(signedTx);
|
|
231
|
+
pendingTxObject.sending = false;
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
catch (e) {
|
|
235
|
+
this.chainInterface.Transactions._knownTxSet.delete(signedTx.txId);
|
|
236
|
+
this.pendingTxs.delete(transaction.details.nonce);
|
|
237
|
+
this.pendingNonce--;
|
|
238
|
+
this.logger.debug("sendTransaction(): Error when broadcasting transaction, reverting pending nonce to: ", this.pendingNonce);
|
|
239
|
+
throw e;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
exports.StarknetPersistentSigner = StarknetPersistentSigner;
|