@atomiqlabs/chain-starknet 5.0.2 → 5.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/starknet/StarknetInitializer.d.ts +9 -1
- package/dist/starknet/StarknetInitializer.js +8 -3
- package/dist/starknet/btcrelay/StarknetBtcRelay.js +5 -5
- package/dist/starknet/chain/StarknetAction.d.ts +2 -10
- package/dist/starknet/chain/StarknetAction.js +21 -21
- package/dist/starknet/chain/modules/StarknetAccounts.js +1 -1
- package/dist/starknet/chain/modules/StarknetFees.d.ts +30 -8
- package/dist/starknet/chain/modules/StarknetFees.js +40 -26
- package/dist/starknet/chain/modules/StarknetSignatures.js +1 -1
- package/dist/starknet/chain/modules/StarknetTokens.d.ts +6 -4
- package/dist/starknet/chain/modules/StarknetTokens.js +2 -2
- package/dist/starknet/chain/modules/StarknetTransactions.js +2 -2
- package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +1 -2
- package/dist/starknet/events/StarknetChainEventsBrowser.js +1 -3
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +8 -8
- package/dist/starknet/spv_swap/StarknetSpvVaultData.js +1 -0
- package/dist/starknet/swaps/EscrowManagerAbi.d.ts +26 -0
- package/dist/starknet/swaps/EscrowManagerAbi.js +36 -0
- package/dist/starknet/swaps/StarknetSwapContract.d.ts +1 -1
- package/dist/starknet/swaps/StarknetSwapContract.js +3 -3
- package/dist/starknet/swaps/StarknetSwapData.js +9 -1
- package/dist/starknet/swaps/handlers/IHandler.d.ts +1 -1
- package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +1 -1
- package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +1 -1
- package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +1 -1
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +1 -1
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +1 -1
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +1 -1
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +1 -1
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +1 -1
- package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +1 -1
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +1 -1
- package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +1 -1
- package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +1 -1
- package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +1 -1
- package/dist/starknet/swaps/modules/StarknetLpVault.js +2 -2
- package/dist/starknet/swaps/modules/StarknetSwapClaim.js +8 -8
- package/dist/starknet/swaps/modules/StarknetSwapInit.js +64 -6
- package/dist/starknet/swaps/modules/StarknetSwapRefund.js +4 -4
- package/dist/utils/Utils.js +12 -8
- package/package.json +2 -2
- package/src/starknet/StarknetInitializer.ts +17 -4
- package/src/starknet/btcrelay/StarknetBtcRelay.ts +9 -6
- package/src/starknet/chain/StarknetAction.ts +15 -20
- package/src/starknet/chain/modules/StarknetAccounts.ts +1 -1
- package/src/starknet/chain/modules/StarknetFees.ts +53 -31
- package/src/starknet/chain/modules/StarknetSignatures.ts +5 -4
- package/src/starknet/chain/modules/StarknetTokens.ts +2 -2
- package/src/starknet/chain/modules/StarknetTransactions.ts +2 -2
- package/src/starknet/events/StarknetChainEventsBrowser.ts +1 -3
- package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +8 -8
- package/src/starknet/spv_swap/StarknetSpvVaultData.ts +1 -0
- package/src/starknet/swaps/EscrowManagerAbi.ts +36 -0
- package/src/starknet/swaps/StarknetSwapContract.ts +4 -4
- package/src/starknet/swaps/StarknetSwapData.ts +10 -2
- package/src/starknet/swaps/handlers/IHandler.ts +1 -1
- package/src/starknet/swaps/handlers/claim/ClaimHandlers.ts +1 -1
- package/src/starknet/swaps/handlers/claim/HashlockClaimHandler.ts +2 -2
- package/src/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +2 -2
- package/src/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +2 -2
- package/src/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +2 -2
- package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +2 -2
- package/src/starknet/swaps/handlers/refund/TimelockRefundHandler.ts +3 -3
- package/src/starknet/swaps/modules/StarknetLpVault.ts +2 -2
- package/src/starknet/swaps/modules/StarknetSwapClaim.ts +10 -10
- package/src/starknet/swaps/modules/StarknetSwapInit.ts +64 -7
- package/src/starknet/swaps/modules/StarknetSwapRefund.ts +6 -7
- package/src/utils/Utils.ts +10 -6
|
@@ -4,6 +4,26 @@ import {StarknetTokens} from "./StarknetTokens";
|
|
|
4
4
|
|
|
5
5
|
const MAX_FEE_AGE = 5000;
|
|
6
6
|
|
|
7
|
+
export type StarknetFeeRate = {
|
|
8
|
+
l1GasCost: bigint;
|
|
9
|
+
l2GasCost: bigint;
|
|
10
|
+
l1DataGasCost: bigint;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type StarknetGas = {
|
|
14
|
+
l1Gas: number,
|
|
15
|
+
l2Gas: number,
|
|
16
|
+
l1DataGas: number
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export function starknetGasMul(gas: StarknetGas, scalar: number): StarknetGas {
|
|
20
|
+
return {l1Gas: gas.l1Gas * scalar, l2Gas: gas.l2Gas * scalar, l1DataGas: gas.l1DataGas * scalar};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function starknetGasAdd(a: StarknetGas, b: StarknetGas): StarknetGas {
|
|
24
|
+
return {l1Gas: a.l1Gas + b.l1Gas, l2Gas: a.l2Gas + b.l2Gas, l1DataGas: a.l1DataGas + b.l1DataGas};
|
|
25
|
+
}
|
|
26
|
+
|
|
7
27
|
export class StarknetFees {
|
|
8
28
|
|
|
9
29
|
private readonly logger = getLogger("StarknetFees: ");
|
|
@@ -11,25 +31,22 @@ export class StarknetFees {
|
|
|
11
31
|
private readonly feeDA: "L1" | "L2";
|
|
12
32
|
private readonly nonceDA: "L1" | "L2";
|
|
13
33
|
private readonly provider: Provider;
|
|
14
|
-
private readonly
|
|
15
|
-
private readonly maxFeeRate: bigint;
|
|
34
|
+
private readonly maxFeeRate: StarknetFeeRate;
|
|
16
35
|
private readonly feeMultiplierPPM: bigint;
|
|
17
36
|
|
|
18
37
|
private blockFeeCache: {
|
|
19
38
|
timestamp: number,
|
|
20
|
-
feeRate: Promise<
|
|
39
|
+
feeRate: Promise<StarknetFeeRate>
|
|
21
40
|
} = null;
|
|
22
41
|
|
|
23
42
|
constructor(
|
|
24
43
|
provider: Provider,
|
|
25
|
-
|
|
26
|
-
maxFeeRate: number = gasToken==="ETH" ? 100_000_000_000 /*100 GWei*/ : 1_000_000_000_000_000 /*100 * 10000 GWei*/,
|
|
44
|
+
maxFeeRate: StarknetFeeRate = {l1GasCost: 1_000_000_000_000_000n, l2GasCost: 1_000_000_000_000_000n, l1DataGasCost: 1_000_000_000_000_000n} /*100 * 10000 GWei*/,
|
|
27
45
|
feeMultiplier: number = 1.25,
|
|
28
46
|
da?: {fee?: "L1" | "L2", nonce?: "L1" | "L2"}
|
|
29
47
|
) {
|
|
30
48
|
this.provider = provider;
|
|
31
|
-
this.
|
|
32
|
-
this.maxFeeRate = BigInt(maxFeeRate);
|
|
49
|
+
this.maxFeeRate = maxFeeRate;
|
|
33
50
|
this.feeDA = da?.fee ?? "L1";
|
|
34
51
|
this.nonceDA = da?.nonce ?? "L1";
|
|
35
52
|
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier*1000000));
|
|
@@ -39,16 +56,20 @@ export class StarknetFees {
|
|
|
39
56
|
* Gets starknet fee rate
|
|
40
57
|
*
|
|
41
58
|
* @private
|
|
42
|
-
* @returns {Promise<
|
|
59
|
+
* @returns {Promise<StarknetFeeRate>} L1 gas price denominated in Wei
|
|
43
60
|
*/
|
|
44
|
-
private async _getFeeRate(): Promise<
|
|
45
|
-
const block = await this.provider.
|
|
46
|
-
|
|
47
|
-
l1GasCost =
|
|
61
|
+
private async _getFeeRate(): Promise<StarknetFeeRate> {
|
|
62
|
+
const block = await this.provider.getBlock("latest");
|
|
63
|
+
|
|
64
|
+
let l1GasCost = toBigInt(block.l1_gas_price.price_in_fri) * this.feeMultiplierPPM / 1000000n;
|
|
65
|
+
let l1DataGasCost = toBigInt(block.l1_data_gas_price.price_in_fri) * this.feeMultiplierPPM / 1000000n;
|
|
66
|
+
let l2GasCost = toBigInt(block.l2_gas_price.price_in_fri) * this.feeMultiplierPPM / 1000000n;
|
|
48
67
|
|
|
49
|
-
this.logger.debug("_getFeeRate(): L1 fee rate: "
|
|
68
|
+
this.logger.debug("_getFeeRate(): L1 fee rate: ",[l1GasCost.toString(10), l1DataGasCost.toString(10), l2GasCost.toString(10)]);
|
|
50
69
|
|
|
51
|
-
return
|
|
70
|
+
return {
|
|
71
|
+
l1GasCost, l2GasCost, l1DataGasCost
|
|
72
|
+
};
|
|
52
73
|
}
|
|
53
74
|
|
|
54
75
|
/**
|
|
@@ -69,10 +90,12 @@ export class StarknetFees {
|
|
|
69
90
|
this.blockFeeCache = obj;
|
|
70
91
|
}
|
|
71
92
|
|
|
72
|
-
let
|
|
73
|
-
if(
|
|
93
|
+
let {l1GasCost, l2GasCost, l1DataGasCost} = await this.blockFeeCache.feeRate;
|
|
94
|
+
if(l1GasCost>this.maxFeeRate.l1GasCost) l1GasCost = this.maxFeeRate.l1GasCost;
|
|
95
|
+
if(l2GasCost>this.maxFeeRate.l2GasCost) l2GasCost = this.maxFeeRate.l2GasCost;
|
|
96
|
+
if(l1DataGasCost>this.maxFeeRate.l1DataGasCost) l1DataGasCost = this.maxFeeRate.l1DataGasCost;
|
|
74
97
|
|
|
75
|
-
const fee =
|
|
98
|
+
const fee = l1GasCost.toString(10)+","+l2GasCost.toString(10)+","+l1DataGasCost.toString(10)+";v3";
|
|
76
99
|
|
|
77
100
|
this.logger.debug("getFeeRate(): calculated fee: "+fee);
|
|
78
101
|
|
|
@@ -80,22 +103,24 @@ export class StarknetFees {
|
|
|
80
103
|
}
|
|
81
104
|
|
|
82
105
|
public getDefaultGasToken(): string {
|
|
83
|
-
return
|
|
106
|
+
return StarknetTokens.ERC20_STRK;
|
|
84
107
|
}
|
|
85
108
|
|
|
86
109
|
/**
|
|
87
|
-
* Calculates the total gas fee
|
|
110
|
+
* Calculates the total gas fee paid for a given gas limit at a given fee rate
|
|
88
111
|
*
|
|
89
112
|
* @param gas
|
|
90
113
|
* @param feeRate
|
|
91
114
|
*/
|
|
92
|
-
public static getGasFee(gas: number, feeRate: string): bigint {
|
|
115
|
+
public static getGasFee(gas: {l1DataGas: number, l2Gas: number, l1Gas: number}, feeRate: string): bigint {
|
|
93
116
|
if(feeRate==null) return 0n;
|
|
94
117
|
|
|
95
118
|
const arr = feeRate.split(";");
|
|
96
|
-
const
|
|
119
|
+
const [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
|
|
97
120
|
|
|
98
|
-
return
|
|
121
|
+
return (BigInt(gas.l1Gas) * BigInt(l1GasCostStr)) +
|
|
122
|
+
(BigInt(gas.l2Gas) * BigInt(l2GasCostStr)) +
|
|
123
|
+
(BigInt(gas.l1DataGas) * BigInt(l1DataGasCostStr));
|
|
99
124
|
}
|
|
100
125
|
|
|
101
126
|
public static getGasToken(feeRate: string): string {
|
|
@@ -107,21 +132,18 @@ export class StarknetFees {
|
|
|
107
132
|
return txVersion==="v1" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
108
133
|
}
|
|
109
134
|
|
|
110
|
-
getFeeDetails(
|
|
135
|
+
getFeeDetails(gas: {l1DataGas: number, l2Gas: number, l1Gas: number}, feeRate: string) {
|
|
111
136
|
if(feeRate==null) return null;
|
|
112
137
|
|
|
113
138
|
const arr = feeRate.split(";");
|
|
114
|
-
const
|
|
115
|
-
const version = arr[1] as "v1" | "v3";
|
|
116
|
-
|
|
117
|
-
const maxFee = toHex(BigInt(L1GasLimit) * gasPrice, 16);
|
|
139
|
+
const [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
|
|
118
140
|
|
|
119
141
|
return {
|
|
120
|
-
|
|
121
|
-
version: version==="v1" ? "0x1" : "0x3" as "0x1" | "0x3",
|
|
142
|
+
version: "0x3" as const,
|
|
122
143
|
resourceBounds: {
|
|
123
|
-
l1_gas: {max_amount: toHex(
|
|
124
|
-
l2_gas: {max_amount:
|
|
144
|
+
l1_gas: {max_amount: toHex(gas.l1Gas, 16), max_price_per_unit: toHex(BigInt(l1GasCostStr), 16)},
|
|
145
|
+
l2_gas: {max_amount: toHex(gas.l2Gas, 16), max_price_per_unit: toHex(BigInt(l2GasCostStr), 16)},
|
|
146
|
+
l1_data_gas: {max_amount: toHex(gas.l1DataGas, 16), max_price_per_unit: toHex(BigInt(l1DataGasCostStr), 16)}
|
|
125
147
|
},
|
|
126
148
|
tip: "0x0",
|
|
127
149
|
paymasterData: [],
|
|
@@ -54,11 +54,12 @@ export class StarknetSignatures extends StarknetModule {
|
|
|
54
54
|
return JSON.stringify(stark.formatSignature(signature));
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
public async isValidSignature(signature: string, address: string, type: StarknetType[], typeName: string, message: object) {
|
|
58
|
-
return
|
|
57
|
+
public async isValidSignature(signature: string, address: string, type: StarknetType[], typeName: string, message: object): Promise<boolean> {
|
|
58
|
+
return this.provider.verifyMessageInStarknet(
|
|
59
59
|
this.getTypedMessage(type, typeName, message),
|
|
60
|
-
JSON.parse(signature)
|
|
61
|
-
|
|
60
|
+
JSON.parse(signature),
|
|
61
|
+
address
|
|
62
|
+
);
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
///////////////////
|
|
@@ -12,8 +12,8 @@ export class StarknetTokens extends StarknetModule {
|
|
|
12
12
|
public static readonly ERC20_STRK = "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d";
|
|
13
13
|
|
|
14
14
|
public static readonly GasCosts = {
|
|
15
|
-
TRANSFER: {
|
|
16
|
-
APPROVE: {
|
|
15
|
+
TRANSFER: {l1DataGas: 400, l2Gas: 4_000_000, l1Gas: 0},
|
|
16
|
+
APPROVE: {l1DataGas: 400, l2Gas: 4_000_000, l1Gas: 0}
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
private getContract(address: string) {
|
|
@@ -42,7 +42,7 @@ export class StarknetTransactions extends StarknetModule {
|
|
|
42
42
|
state = await this._getTxIdStatus(tx.txId);
|
|
43
43
|
if(state==="not_found" && tx.signed!=null) await this.sendSignedTransaction(tx).catch(e => {
|
|
44
44
|
if(e.baseError?.code === 59) return; //Transaction already in the mempool
|
|
45
|
-
|
|
45
|
+
this.logger.error("confirmTransaction(): Error on transaction re-send: ", e);
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
if(state==="rejected") throw new Error("Transaction rejected!");
|
|
@@ -65,7 +65,7 @@ export class StarknetTransactions extends StarknetModule {
|
|
|
65
65
|
let nonce: bigint = await signer.getNonce();
|
|
66
66
|
const latestConfirmedNonce = this.latestConfirmedNonces[signer.getAddress()];
|
|
67
67
|
if(latestConfirmedNonce!=null && latestConfirmedNonce > nonce) {
|
|
68
|
-
|
|
68
|
+
this.logger.debug("prepareTransactions(): Using nonce from local cache!");
|
|
69
69
|
nonce = latestConfirmedNonce;
|
|
70
70
|
}
|
|
71
71
|
if(nonce===BigInt(0) && signer.isWalletAccount()) {
|
|
@@ -34,7 +34,7 @@ export type StarknetTraceCall = {
|
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* Starknet on-chain event handler for front-end systems without access to fs, uses WS or long-polling to subscribe, might lose
|
|
38
38
|
* out on some events if the network is unreliable, front-end systems should take this into consideration and not
|
|
39
39
|
* rely purely on events
|
|
40
40
|
*/
|
|
@@ -44,7 +44,6 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
|
|
|
44
44
|
protected readonly provider: Provider;
|
|
45
45
|
protected readonly starknetSwapContract: StarknetSwapContract;
|
|
46
46
|
protected readonly starknetSpvVaultContract: StarknetSpvVaultContract;
|
|
47
|
-
protected eventListeners: number[] = [];
|
|
48
47
|
protected readonly logger = getLogger("StarknetChainEventsBrowser: ");
|
|
49
48
|
|
|
50
49
|
protected initFunctionName: ExtractAbiFunctionNames<EscrowManagerAbiType> = "initialize";
|
|
@@ -395,7 +394,6 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
|
|
|
395
394
|
async stop(): Promise<void> {
|
|
396
395
|
this.stopped = true;
|
|
397
396
|
if(this.timeout!=null) clearTimeout(this.timeout);
|
|
398
|
-
this.eventListeners = [];
|
|
399
397
|
}
|
|
400
398
|
|
|
401
399
|
registerListener(cbk: EventListener<StarknetSwapData>): void {
|
|
@@ -26,8 +26,8 @@ import {StarknetAddresses} from "../chain/modules/StarknetAddresses";
|
|
|
26
26
|
import {StarknetFees} from "../chain/modules/StarknetFees";
|
|
27
27
|
|
|
28
28
|
const spvVaultContractAddreses = {
|
|
29
|
-
[constants.StarknetChainId.SN_SEPOLIA]: "
|
|
30
|
-
[constants.StarknetChainId.SN_MAIN]: "
|
|
29
|
+
[constants.StarknetChainId.SN_SEPOLIA]: "0x02d581ea838cd5ca46ba08660eddd064d50a0392f618e95310432147928d572e",
|
|
30
|
+
[constants.StarknetChainId.SN_MAIN]: "0x01932042992647771f3d0aa6ee526e65359c891fe05a285faaf4d3ffa373e132"
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
const STARK_PRIME_MOD: bigint = 2n**251n + 17n * 2n**192n + 1n;
|
|
@@ -51,10 +51,10 @@ export class StarknetSpvVaultContract
|
|
|
51
51
|
>
|
|
52
52
|
{
|
|
53
53
|
private static readonly GasCosts = {
|
|
54
|
-
DEPOSIT: {
|
|
55
|
-
OPEN: {
|
|
56
|
-
FRONT: {
|
|
57
|
-
CLAIM: {
|
|
54
|
+
DEPOSIT: {l1DataGas: 400, l2Gas: 4_000_000, l1Gas: 0},
|
|
55
|
+
OPEN: {l1DataGas: 1200, l2Gas: 3_200_000, l1Gas: 0},
|
|
56
|
+
FRONT: {l1DataGas: 800, l2Gas: 12_000_000, l1Gas: 0},
|
|
57
|
+
CLAIM: {l1DataGas: 1000, l2Gas: 400_000_000, l1Gas: 0}
|
|
58
58
|
};
|
|
59
59
|
|
|
60
60
|
readonly chainId = "STARKNET";
|
|
@@ -466,12 +466,12 @@ export class StarknetSpvVaultContract
|
|
|
466
466
|
|
|
467
467
|
async getClaimFee(signer: string, withdrawalData: StarknetSpvWithdrawalData, feeRate?: string): Promise<bigint> {
|
|
468
468
|
feeRate ??= await this.Chain.Fees.getFeeRate();
|
|
469
|
-
return StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.CLAIM
|
|
469
|
+
return StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.CLAIM, feeRate);
|
|
470
470
|
}
|
|
471
471
|
|
|
472
472
|
async getFrontFee(signer: string, withdrawalData: StarknetSpvWithdrawalData, feeRate?: string): Promise<bigint> {
|
|
473
473
|
feeRate ??= await this.Chain.Fees.getFeeRate();
|
|
474
|
-
return StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.FRONT
|
|
474
|
+
return StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.FRONT, feeRate);
|
|
475
475
|
}
|
|
476
476
|
|
|
477
477
|
}
|
|
@@ -148,6 +148,7 @@ export class StarknetSpvVaultData extends SpvVaultData<StarknetSpvWithdrawalData
|
|
|
148
148
|
utxo: this.utxo,
|
|
149
149
|
confirmations: this.confirmations,
|
|
150
150
|
withdrawCount: this.withdrawCount,
|
|
151
|
+
depositCount: this.depositCount,
|
|
151
152
|
initialUtxo: this.initialUtxo
|
|
152
153
|
}
|
|
153
154
|
}
|
|
@@ -18,6 +18,38 @@ export const EscrowManagerAbi = [
|
|
|
18
18
|
}
|
|
19
19
|
]
|
|
20
20
|
},
|
|
21
|
+
{
|
|
22
|
+
"type": "struct",
|
|
23
|
+
"name": "escrow_manager::structs::escrow::EscrowExecution",
|
|
24
|
+
"members": [
|
|
25
|
+
{
|
|
26
|
+
"name": "hash",
|
|
27
|
+
"type": "core::felt252"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "expiry",
|
|
31
|
+
"type": "core::integer::u64"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "fee",
|
|
35
|
+
"type": "core::integer::u256"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"type": "enum",
|
|
41
|
+
"name": "core::option::Option::<escrow_manager::structs::escrow::EscrowExecution>",
|
|
42
|
+
"variants": [
|
|
43
|
+
{
|
|
44
|
+
"name": "Some",
|
|
45
|
+
"type": "escrow_manager::structs::escrow::EscrowExecution"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "None",
|
|
49
|
+
"type": "()"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
21
53
|
{
|
|
22
54
|
"type": "struct",
|
|
23
55
|
"name": "escrow_manager::structs::escrow::EscrowData",
|
|
@@ -69,6 +101,10 @@ export const EscrowManagerAbi = [
|
|
|
69
101
|
{
|
|
70
102
|
"name": "claimer_bounty",
|
|
71
103
|
"type": "core::integer::u256"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"name": "success_action",
|
|
107
|
+
"type": "core::option::Option::<escrow_manager::structs::escrow::EscrowExecution>"
|
|
72
108
|
}
|
|
73
109
|
]
|
|
74
110
|
},
|
|
@@ -34,8 +34,8 @@ const ESCROW_STATE_CLAIMED = 2;
|
|
|
34
34
|
const ESCROW_STATE_REFUNDED = 3;
|
|
35
35
|
|
|
36
36
|
const swapContractAddreses = {
|
|
37
|
-
[constants.StarknetChainId.SN_SEPOLIA]: "
|
|
38
|
-
[constants.StarknetChainId.SN_MAIN]: "
|
|
37
|
+
[constants.StarknetChainId.SN_SEPOLIA]: "0x017bf50dd28b6d823a231355bb25813d4396c8e19d2df03026038714a22f0413",
|
|
38
|
+
[constants.StarknetChainId.SN_MAIN]: "0x04f278e1f19e495c3b1dd35ef307c4f7510768ed95481958fbae588bd173f79a"
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
const defaultClaimAddresses = {
|
|
@@ -132,7 +132,7 @@ export class StarknetSwapContract
|
|
|
132
132
|
|
|
133
133
|
claimHandlersList.forEach(handlerCtor => {
|
|
134
134
|
const handler = new handlerCtor(handlerAddresses.claim[handlerCtor.type]);
|
|
135
|
-
this.claimHandlersByAddress[handler.address] = handler;
|
|
135
|
+
this.claimHandlersByAddress[toHex(handler.address)] = handler;
|
|
136
136
|
this.claimHandlersBySwapType[handlerCtor.type] = handler;
|
|
137
137
|
});
|
|
138
138
|
|
|
@@ -464,7 +464,7 @@ export class StarknetSwapContract
|
|
|
464
464
|
synchronizer?: RelaySynchronizer<StarknetBtcStoredHeader, StarknetTx, any>,
|
|
465
465
|
initAta?: boolean,
|
|
466
466
|
feeRate?: string
|
|
467
|
-
): Promise<StarknetTx[]
|
|
467
|
+
): Promise<StarknetTx[]> {
|
|
468
468
|
return this.Claim.txsClaimWithTxData(
|
|
469
469
|
typeof(signer)==="string" ? signer : signer.getAddress(),
|
|
470
470
|
swapData,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {SwapData, ChainSwapType} from "@atomiqlabs/base";
|
|
2
2
|
import {TimelockRefundHandler} from "./handlers/refund/TimelockRefundHandler";
|
|
3
|
-
import {BigNumberish, cairo, hash} from "starknet";
|
|
3
|
+
import {BigNumberish, cairo, CairoOption, CairoOptionVariant, hash} from "starknet";
|
|
4
4
|
import {toBigInt, toHex} from "../../utils/Utils";
|
|
5
5
|
import {
|
|
6
6
|
StringToPrimitiveType
|
|
@@ -350,7 +350,8 @@ export class StarknetSwapData extends SwapData {
|
|
|
350
350
|
amount: cairo.uint256(toBigInt(this.amount)),
|
|
351
351
|
fee_token: this.feeToken,
|
|
352
352
|
security_deposit: cairo.uint256(toBigInt(this.securityDeposit)),
|
|
353
|
-
claimer_bounty: cairo.uint256(toBigInt(this.claimerBounty))
|
|
353
|
+
claimer_bounty: cairo.uint256(toBigInt(this.claimerBounty)),
|
|
354
|
+
success_action: new CairoOption(CairoOptionVariant.None) //For now enforce no success action
|
|
354
355
|
}
|
|
355
356
|
}
|
|
356
357
|
|
|
@@ -367,6 +368,13 @@ export class StarknetSwapData extends SwapData {
|
|
|
367
368
|
const feeToken = toHex(span.shift());
|
|
368
369
|
const securityDeposit = toBigInt({low: span.shift(), high: span.shift()});
|
|
369
370
|
const claimerBounty = toBigInt({low: span.shift(), high: span.shift()});
|
|
371
|
+
const hasSuccessAction = toBigInt(span.shift()) === 0n;
|
|
372
|
+
if(hasSuccessAction) {
|
|
373
|
+
const executionHash = toHex(span.shift());
|
|
374
|
+
const executionExpiry = toBigInt(span.shift());
|
|
375
|
+
const executionFee = toBigInt({low: span.shift(), high: span.shift()});
|
|
376
|
+
// throw new Error("Success action not allowed!");
|
|
377
|
+
}
|
|
370
378
|
|
|
371
379
|
return new StarknetSwapData(
|
|
372
380
|
offerer,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {StarknetSwapData} from "../StarknetSwapData";
|
|
2
2
|
import {BigNumberish} from "starknet";
|
|
3
|
-
import {StarknetGas} from "../../chain/StarknetAction";
|
|
4
3
|
import {StarknetTx} from "../../chain/modules/StarknetTransactions";
|
|
4
|
+
import {StarknetGas} from "../../chain/modules/StarknetFees";
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
export interface IHandler<TCommitmentData, TWitnessData> {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {HashlockClaimHandler} from "./HashlockClaimHandler";
|
|
2
2
|
import {ChainSwapType} from "@atomiqlabs/base";
|
|
3
|
-
import {StarknetGas} from "../../../chain/StarknetAction";
|
|
4
3
|
import {IHandler} from "../IHandler";
|
|
5
4
|
import {BitcoinTxIdClaimHandler} from "./btc/BitcoinTxIdClaimHandler";
|
|
6
5
|
import {BitcoinOutputClaimHandler} from "./btc/BitcoinOutputClaimHandler";
|
|
7
6
|
import {BitcoinNoncedOutputClaimHandler} from "./btc/BitcoinNoncedOutputClaimHandler";
|
|
8
7
|
import {BigNumberish} from "starknet";
|
|
8
|
+
import {StarknetGas} from "../../../chain/modules/StarknetFees";
|
|
9
9
|
|
|
10
10
|
export interface IClaimHandler<C, W> extends IHandler<C, W> {
|
|
11
11
|
getType(): ChainSwapType;
|
|
@@ -2,17 +2,17 @@ import {StarknetSwapData} from "../../StarknetSwapData";
|
|
|
2
2
|
import {bufferToU32Array, toHex, u32ArrayToBuffer} from "../../../../utils/Utils";
|
|
3
3
|
import {BigNumberish, hash} from "starknet";
|
|
4
4
|
import {ChainSwapType} from "@atomiqlabs/base";
|
|
5
|
-
import {StarknetGas} from "../../../chain/StarknetAction";
|
|
6
5
|
import {Buffer} from "buffer";
|
|
7
6
|
import {sha256} from "@noble/hashes/sha2";
|
|
8
7
|
import {StarknetTx} from "../../../chain/modules/StarknetTransactions";
|
|
9
8
|
import {IClaimHandler} from "./ClaimHandlers";
|
|
9
|
+
import {StarknetGas} from "../../../chain/modules/StarknetFees";
|
|
10
10
|
|
|
11
11
|
export class HashlockClaimHandler implements IClaimHandler<Buffer, string> {
|
|
12
12
|
|
|
13
13
|
public readonly address: string;
|
|
14
14
|
public static readonly type: ChainSwapType = ChainSwapType.HTLC;
|
|
15
|
-
public static readonly gas: StarknetGas = {
|
|
15
|
+
public static readonly gas: StarknetGas = {l1DataGas: 0, l2Gas: 800*40_000, l1Gas: 0};
|
|
16
16
|
|
|
17
17
|
constructor(address: string) {
|
|
18
18
|
this.address = address;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {StarknetSwapData} from "../../../StarknetSwapData";
|
|
2
|
-
import {StarknetGas} from "../../../../chain/StarknetAction";
|
|
3
2
|
import {ChainSwapType} from "@atomiqlabs/base";
|
|
4
3
|
import {BigNumberish, hash} from "starknet";
|
|
5
4
|
import {StarknetTx} from "../../../../chain/modules/StarknetTransactions";
|
|
@@ -8,6 +7,7 @@ import {BitcoinCommitmentData, IBitcoinClaimHandler} from "./IBitcoinClaimHandle
|
|
|
8
7
|
import {BitcoinOutputWitnessData} from "./BitcoinOutputClaimHandler";
|
|
9
8
|
import {Transaction} from "@scure/btc-signer";
|
|
10
9
|
import {Buffer} from "buffer";
|
|
10
|
+
import {StarknetGas} from "../../../../chain/modules/StarknetFees";
|
|
11
11
|
|
|
12
12
|
export type BitcoinNoncedOutputCommitmentData = {
|
|
13
13
|
output: Buffer,
|
|
@@ -27,7 +27,7 @@ function getTransactionNonce(btcTx: Transaction): bigint {
|
|
|
27
27
|
export class BitcoinNoncedOutputClaimHandler extends IBitcoinClaimHandler<BitcoinNoncedOutputCommitmentData, BitcoinOutputWitnessData> {
|
|
28
28
|
|
|
29
29
|
public static readonly type: ChainSwapType = ChainSwapType.CHAIN_NONCED;
|
|
30
|
-
public static readonly gas: StarknetGas = {
|
|
30
|
+
public static readonly gas: StarknetGas = {l1DataGas: 0, l2Gas: 20_000*40_000, l1Gas: 0};
|
|
31
31
|
|
|
32
32
|
protected serializeCommitment(data: BitcoinNoncedOutputCommitmentData & BitcoinCommitmentData): BigNumberish[] {
|
|
33
33
|
return [
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {StarknetSwapData} from "../../../StarknetSwapData";
|
|
2
|
-
import {StarknetGas} from "../../../../chain/StarknetAction";
|
|
3
2
|
import {ChainSwapType} from "@atomiqlabs/base";
|
|
4
3
|
import {BigNumberish, hash} from "starknet";
|
|
5
4
|
import {StarknetTx} from "../../../../chain/modules/StarknetTransactions";
|
|
@@ -7,6 +6,7 @@ import {bufferToByteArray, getLogger, poseidonHashRange, toBigInt} from "../../.
|
|
|
7
6
|
import {BitcoinCommitmentData, BitcoinWitnessData, IBitcoinClaimHandler} from "./IBitcoinClaimHandler";
|
|
8
7
|
import {Transaction} from "@scure/btc-signer";
|
|
9
8
|
import {Buffer} from "buffer";
|
|
9
|
+
import {StarknetGas} from "../../../../chain/modules/StarknetFees";
|
|
10
10
|
|
|
11
11
|
export type BitcoinOutputCommitmentData = {
|
|
12
12
|
output: Buffer,
|
|
@@ -22,7 +22,7 @@ const logger = getLogger("BitcoinOutputClaimHandler: ");
|
|
|
22
22
|
export class BitcoinOutputClaimHandler extends IBitcoinClaimHandler<BitcoinOutputCommitmentData, BitcoinOutputWitnessData> {
|
|
23
23
|
|
|
24
24
|
public static readonly type: ChainSwapType = ChainSwapType.CHAIN;
|
|
25
|
-
public static readonly gas: StarknetGas = {
|
|
25
|
+
public static readonly gas: StarknetGas = {l1DataGas: 0, l2Gas: 20_000 * 40_000, l1Gas: 0};
|
|
26
26
|
|
|
27
27
|
protected serializeCommitment(data: BitcoinOutputCommitmentData & BitcoinCommitmentData): BigNumberish[] {
|
|
28
28
|
return [
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {StarknetSwapData} from "../../../StarknetSwapData";
|
|
2
|
-
import {StarknetGas} from "../../../../chain/StarknetAction";
|
|
3
2
|
import {ChainSwapType} from "@atomiqlabs/base";
|
|
4
3
|
import {BigNumberish} from "starknet";
|
|
5
4
|
import {StarknetTx} from "../../../../chain/modules/StarknetTransactions";
|
|
6
5
|
import {bufferToU32Array, getLogger} from "../../../../../utils/Utils";
|
|
7
6
|
import {BitcoinCommitmentData, BitcoinWitnessData, IBitcoinClaimHandler} from "./IBitcoinClaimHandler";
|
|
8
7
|
import {Buffer} from "buffer";
|
|
8
|
+
import {StarknetGas} from "../../../../chain/modules/StarknetFees";
|
|
9
9
|
|
|
10
10
|
export type BitcoinTxIdCommitmentData = {
|
|
11
11
|
txId: string
|
|
@@ -16,7 +16,7 @@ const logger = getLogger("BitcoinTxIdClaimHandler: ");
|
|
|
16
16
|
export class BitcoinTxIdClaimHandler extends IBitcoinClaimHandler<BitcoinTxIdCommitmentData, BitcoinWitnessData> {
|
|
17
17
|
|
|
18
18
|
public static readonly type: ChainSwapType = ChainSwapType.CHAIN_TXID;
|
|
19
|
-
public static readonly gas: StarknetGas = {
|
|
19
|
+
public static readonly gas: StarknetGas = {l1DataGas: 0, l2Gas: 20_000 * 40_000, l1Gas: 0};
|
|
20
20
|
|
|
21
21
|
protected serializeCommitment(data: BitcoinTxIdCommitmentData & BitcoinCommitmentData): BigNumberish[] {
|
|
22
22
|
return [
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {IClaimHandler} from "../ClaimHandlers";
|
|
2
2
|
import {StarknetSwapData} from "../../../StarknetSwapData";
|
|
3
|
-
import {StarknetGas} from "../../../../chain/StarknetAction";
|
|
4
3
|
import {ChainSwapType, RelaySynchronizer} from "@atomiqlabs/base";
|
|
5
4
|
import {BigNumberish, hash} from "starknet";
|
|
6
5
|
import {StarknetBtcStoredHeader} from "../../../../btcrelay/headers/StarknetBtcStoredHeader";
|
|
7
6
|
import {StarknetTx} from "../../../../chain/modules/StarknetTransactions";
|
|
8
7
|
import {StarknetBtcRelay} from "../../../../btcrelay/StarknetBtcRelay";
|
|
9
8
|
import {bufferToU32Array, getLogger, u32ArrayToBuffer} from "../../../../../utils/Utils";
|
|
9
|
+
import {StarknetGas} from "../../../../chain/modules/StarknetFees";
|
|
10
10
|
|
|
11
11
|
export type BitcoinCommitmentData = {
|
|
12
12
|
btcRelay: StarknetBtcRelay<any>,
|
|
@@ -33,7 +33,7 @@ export abstract class IBitcoinClaimHandler<C, W extends BitcoinWitnessData> impl
|
|
|
33
33
|
|
|
34
34
|
public static readonly address = "";
|
|
35
35
|
public static readonly type: ChainSwapType = ChainSwapType.CHAIN_TXID;
|
|
36
|
-
public static readonly gas: StarknetGas = {
|
|
36
|
+
public static readonly gas: StarknetGas = {l1DataGas: 0, l2Gas: 20_000 * 40_000, l1Gas: 0};
|
|
37
37
|
|
|
38
38
|
protected serializeCommitment(data: BitcoinCommitmentData): BigNumberish[] {
|
|
39
39
|
return [
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {StarknetTx} from "../../../chain/modules/StarknetTransactions";
|
|
2
2
|
import {StarknetSwapData} from "../../StarknetSwapData";
|
|
3
|
-
import {bigNumberishToBuffer
|
|
3
|
+
import {bigNumberishToBuffer} from "../../../../utils/Utils";
|
|
4
4
|
import {BigNumberish} from "starknet";
|
|
5
5
|
import {IHandler} from "../IHandler";
|
|
6
|
-
import {StarknetGas} from "../../../chain/
|
|
6
|
+
import {StarknetGas} from "../../../chain/modules/StarknetFees";
|
|
7
7
|
|
|
8
8
|
export class TimelockRefundHandler implements IHandler<bigint, never> {
|
|
9
9
|
|
|
10
10
|
public readonly address: string;
|
|
11
|
-
public static readonly gas: StarknetGas = {
|
|
11
|
+
public static readonly gas: StarknetGas = {l1DataGas: 0, l2Gas: 4_000_000, l1Gas: 0};
|
|
12
12
|
|
|
13
13
|
constructor(address: string) {
|
|
14
14
|
this.address = address;
|
|
@@ -8,8 +8,8 @@ import {StarknetTx} from "../../chain/modules/StarknetTransactions";
|
|
|
8
8
|
export class StarknetLpVault extends StarknetSwapModule {
|
|
9
9
|
|
|
10
10
|
private static readonly GasCosts = {
|
|
11
|
-
WITHDRAW: {
|
|
12
|
-
DEPOSIT: {l1:
|
|
11
|
+
WITHDRAW: {l1DataGas: 500, l2Gas: 3_200_000, l1Gas: 0},
|
|
12
|
+
DEPOSIT: {l1: 500, l2Gas: 4_000_000, l1Gas: 0}
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
/**
|
|
@@ -2,11 +2,11 @@ import {ChainSwapType, RelaySynchronizer, SwapDataVerificationError} from "@atom
|
|
|
2
2
|
import {toHex} from "../../../utils/Utils";
|
|
3
3
|
import {StarknetSwapModule} from "../StarknetSwapModule";
|
|
4
4
|
import {StarknetSwapData} from "../StarknetSwapData";
|
|
5
|
-
import {StarknetAction
|
|
5
|
+
import {StarknetAction} from "../../chain/StarknetAction";
|
|
6
6
|
import {BigNumberish} from "starknet";
|
|
7
7
|
import {IClaimHandler} from "../handlers/claim/ClaimHandlers";
|
|
8
8
|
import {StarknetTx} from "../../chain/modules/StarknetTransactions";
|
|
9
|
-
import {StarknetFees} from "../../chain/modules/StarknetFees";
|
|
9
|
+
import {StarknetFees, StarknetGas, starknetGasAdd} from "../../chain/modules/StarknetFees";
|
|
10
10
|
import {StarknetBtcStoredHeader} from "../../btcrelay/headers/StarknetBtcStoredHeader";
|
|
11
11
|
import {BitcoinOutputWitnessData} from "../handlers/claim/btc/BitcoinOutputClaimHandler";
|
|
12
12
|
import {BitcoinWitnessData} from "../handlers/claim/btc/IBitcoinClaimHandler";
|
|
@@ -15,8 +15,8 @@ import {Buffer} from "buffer";
|
|
|
15
15
|
export class StarknetSwapClaim extends StarknetSwapModule {
|
|
16
16
|
|
|
17
17
|
private static readonly GasCosts = {
|
|
18
|
-
CLAIM: {
|
|
19
|
-
CLAIM_PAY_OUT: {
|
|
18
|
+
CLAIM: {l1DataGas: 750, l2Gas: 4_000_000, l1Gas: 0},
|
|
19
|
+
CLAIM_PAY_OUT: {l1DataGas: 900, l2Gas: 6_000_000, l1Gas: 0}
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -37,7 +37,7 @@ export class StarknetSwapClaim extends StarknetSwapModule {
|
|
|
37
37
|
): StarknetAction {
|
|
38
38
|
return new StarknetAction(signer, this.root,
|
|
39
39
|
this.swapContract.populateTransaction.claim(swapData.toEscrowStruct(), witness),
|
|
40
|
-
|
|
40
|
+
starknetGasAdd(swapData.payOut ? StarknetSwapClaim.GasCosts.CLAIM_PAY_OUT : StarknetSwapClaim.GasCosts.CLAIM, claimHandlerGas)
|
|
41
41
|
);
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -64,7 +64,7 @@ export class StarknetSwapClaim extends StarknetSwapModule {
|
|
|
64
64
|
throw new SwapDataVerificationError("Not enough time to reliably pay the invoice");
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
const claimHandler: IClaimHandler<Buffer, string> = this.contract.claimHandlersByAddress[swapData.claimHandler
|
|
67
|
+
const claimHandler: IClaimHandler<Buffer, string> = this.contract.claimHandlersByAddress[toHex(swapData.claimHandler)];
|
|
68
68
|
if(claimHandler==null) throw new SwapDataVerificationError("Unknown claim handler!");
|
|
69
69
|
if(claimHandler.getType()!==ChainSwapType.HTLC) throw new SwapDataVerificationError("Invalid claim handler!");
|
|
70
70
|
|
|
@@ -101,7 +101,7 @@ export class StarknetSwapClaim extends StarknetSwapModule {
|
|
|
101
101
|
synchronizer?: RelaySynchronizer<StarknetBtcStoredHeader, StarknetTx, any>,
|
|
102
102
|
feeRate?: string
|
|
103
103
|
): Promise<StarknetTx[] | null> {
|
|
104
|
-
const claimHandler: IClaimHandler<any, BitcoinOutputWitnessData | BitcoinWitnessData> = this.contract.claimHandlersByAddress[swapData.claimHandler
|
|
104
|
+
const claimHandler: IClaimHandler<any, BitcoinOutputWitnessData | BitcoinWitnessData> = this.contract.claimHandlersByAddress[toHex(swapData.claimHandler)];
|
|
105
105
|
if(claimHandler==null) throw new SwapDataVerificationError("Unknown claim handler!");
|
|
106
106
|
if(
|
|
107
107
|
claimHandler.getType()!==ChainSwapType.CHAIN_NONCED &&
|
|
@@ -133,10 +133,10 @@ export class StarknetSwapClaim extends StarknetSwapModule {
|
|
|
133
133
|
|
|
134
134
|
let gasRequired = swapData.payOut ? StarknetSwapClaim.GasCosts.CLAIM_PAY_OUT : StarknetSwapClaim.GasCosts.CLAIM;
|
|
135
135
|
|
|
136
|
-
const claimHandler: IClaimHandler<any, any> = this.contract.claimHandlersByAddress[swapData.claimHandler
|
|
137
|
-
if(claimHandler!=null) gasRequired =
|
|
136
|
+
const claimHandler: IClaimHandler<any, any> = this.contract.claimHandlersByAddress[toHex(swapData.claimHandler)];
|
|
137
|
+
if(claimHandler!=null) gasRequired = starknetGasAdd(gasRequired, claimHandler.getGas(swapData));
|
|
138
138
|
|
|
139
|
-
return StarknetFees.getGasFee(gasRequired
|
|
139
|
+
return StarknetFees.getGasFee(gasRequired, feeRate);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
}
|