@atomiqlabs/chain-starknet 2.0.0 → 3.0.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -201
- package/dist/index.d.ts +38 -38
- package/dist/index.js +54 -54
- package/dist/starknet/StarknetChainType.d.ts +13 -13
- package/dist/starknet/StarknetChainType.js +2 -2
- package/dist/starknet/StarknetInitializer.d.ts +19 -19
- package/dist/starknet/StarknetInitializer.js +64 -64
- 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 +27 -27
- package/dist/starknet/chain/StarknetAction.js +73 -73
- package/dist/starknet/chain/StarknetChainInterface.d.ts +52 -52
- package/dist/starknet/chain/StarknetChainInterface.js +91 -91
- package/dist/starknet/chain/StarknetModule.d.ts +14 -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 +19 -19
- package/dist/starknet/chain/modules/StarknetBlocks.js +49 -49
- 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 +55 -55
- package/dist/starknet/chain/modules/StarknetFees.js +100 -100
- 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 +67 -67
- package/dist/starknet/chain/modules/StarknetTokens.js +98 -98
- package/dist/starknet/chain/modules/StarknetTransactions.d.ts +93 -93
- package/dist/starknet/chain/modules/StarknetTransactions.js +255 -255
- package/dist/starknet/contract/StarknetContractBase.d.ts +13 -13
- package/dist/starknet/contract/StarknetContractBase.js +16 -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 +91 -91
- package/dist/starknet/events/StarknetChainEventsBrowser.js +294 -294
- package/dist/starknet/provider/RpcProviderWithRetries.d.ts +21 -21
- package/dist/starknet/provider/RpcProviderWithRetries.js +32 -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 +65 -65
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +376 -376
- package/dist/starknet/spv_swap/StarknetSpvVaultData.d.ts +49 -49
- package/dist/starknet/spv_swap/StarknetSpvVaultData.js +144 -144
- package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.d.ts +24 -24
- package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.js +61 -61
- package/dist/starknet/swaps/EscrowManagerAbi.d.ts +434 -405
- package/dist/starknet/swaps/EscrowManagerAbi.js +587 -547
- package/dist/starknet/swaps/StarknetSwapContract.d.ts +196 -196
- package/dist/starknet/swaps/StarknetSwapContract.js +395 -395
- package/dist/starknet/swaps/StarknetSwapData.d.ts +67 -67
- package/dist/starknet/swaps/StarknetSwapData.js +290 -281
- 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 +84 -84
- package/dist/starknet/swaps/modules/StarknetSwapInit.js +164 -164
- package/dist/starknet/swaps/modules/StarknetSwapRefund.d.ts +62 -62
- package/dist/starknet/swaps/modules/StarknetSwapRefund.js +128 -128
- package/dist/starknet/wallet/StarknetKeypairWallet.d.ts +7 -7
- package/dist/starknet/wallet/StarknetKeypairWallet.js +30 -30
- package/dist/starknet/wallet/StarknetSigner.d.ts +12 -12
- package/dist/starknet/wallet/StarknetSigner.js +46 -46
- package/dist/utils/Utils.d.ts +37 -37
- package/dist/utils/Utils.js +257 -257
- package/package.json +37 -37
- package/src/index.ts +47 -47
- package/src/starknet/StarknetChainType.ts +28 -28
- package/src/starknet/StarknetInitializer.ts +95 -95
- package/src/starknet/btcrelay/BtcRelayAbi.ts +338 -338
- package/src/starknet/btcrelay/StarknetBtcRelay.ts +491 -491
- package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +100 -100
- package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +141 -141
- package/src/starknet/chain/StarknetAction.ts +90 -90
- package/src/starknet/chain/StarknetChainInterface.ts +149 -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 +58 -58
- package/src/starknet/chain/modules/StarknetEvents.ts +104 -104
- package/src/starknet/chain/modules/StarknetFees.ts +132 -132
- package/src/starknet/chain/modules/StarknetSignatures.ts +90 -90
- package/src/starknet/chain/modules/StarknetTokens.ts +116 -116
- package/src/starknet/chain/modules/StarknetTransactions.ts +277 -278
- package/src/starknet/contract/StarknetContractBase.ts +26 -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 +412 -412
- package/src/starknet/provider/RpcProviderWithRetries.ts +43 -43
- package/src/starknet/spv_swap/SpvVaultContractAbi.ts +656 -656
- package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +477 -477
- package/src/starknet/spv_swap/StarknetSpvVaultData.ts +194 -194
- package/src/starknet/spv_swap/StarknetSpvWithdrawalData.ts +68 -68
- package/src/starknet/swaps/EscrowManagerAbi.ts +586 -546
- package/src/starknet/swaps/StarknetSwapContract.ts +605 -605
- package/src/starknet/swaps/StarknetSwapData.ts +403 -394
- 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 +225 -225
- package/src/starknet/swaps/modules/StarknetSwapRefund.ts +197 -197
- package/src/starknet/wallet/StarknetKeypairWallet.ts +39 -39
- package/src/starknet/wallet/StarknetSigner.ts +55 -55
- package/src/utils/Utils.ts +248 -248
|
@@ -1,133 +1,133 @@
|
|
|
1
|
-
import {getLogger, toBigInt, toHex} from "../../../utils/Utils";
|
|
2
|
-
import {Provider} from "starknet";
|
|
3
|
-
import {StarknetTokens} from "./StarknetTokens";
|
|
4
|
-
|
|
5
|
-
const MAX_FEE_AGE = 5000;
|
|
6
|
-
|
|
7
|
-
export class StarknetFees {
|
|
8
|
-
|
|
9
|
-
private readonly logger = getLogger("StarknetFees: ");
|
|
10
|
-
|
|
11
|
-
private readonly feeDA: "L1" | "L2";
|
|
12
|
-
private readonly nonceDA: "L1" | "L2";
|
|
13
|
-
private readonly provider: Provider;
|
|
14
|
-
private readonly gasToken: "ETH" | "STRK";
|
|
15
|
-
private readonly maxFeeRate: bigint;
|
|
16
|
-
private readonly feeMultiplierPPM: bigint;
|
|
17
|
-
|
|
18
|
-
private blockFeeCache: {
|
|
19
|
-
timestamp: number,
|
|
20
|
-
feeRate: Promise<bigint>
|
|
21
|
-
} = null;
|
|
22
|
-
|
|
23
|
-
constructor(
|
|
24
|
-
provider: Provider,
|
|
25
|
-
gasToken: "ETH" | "STRK" = "STRK",
|
|
26
|
-
maxFeeRate: number = gasToken==="ETH" ? 100_000_000_000 /*100 GWei*/ : 1_000_000_000_000_000 /*100 * 10000 GWei*/,
|
|
27
|
-
feeMultiplier: number = 1.25,
|
|
28
|
-
da?: {fee?: "L1" | "L2", nonce?: "L1" | "L2"}
|
|
29
|
-
) {
|
|
30
|
-
this.provider = provider;
|
|
31
|
-
this.gasToken = gasToken;
|
|
32
|
-
this.maxFeeRate = BigInt(maxFeeRate);
|
|
33
|
-
this.feeDA = da?.fee ?? "L1";
|
|
34
|
-
this.nonceDA = da?.nonce ?? "L1";
|
|
35
|
-
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier*1000000));
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Gets starknet fee rate
|
|
40
|
-
*
|
|
41
|
-
* @private
|
|
42
|
-
* @returns {Promise<BN>} L1 gas price denominated in Wei
|
|
43
|
-
*/
|
|
44
|
-
private async _getFeeRate(): Promise<bigint> {
|
|
45
|
-
const block = await this.provider.getBlockWithTxHashes("latest");
|
|
46
|
-
let l1GasCost = toBigInt(this.gasToken==="ETH" ? block.l1_gas_price.price_in_wei : block.l1_gas_price.price_in_fri);
|
|
47
|
-
l1GasCost = l1GasCost * this.feeMultiplierPPM / 1000000n;
|
|
48
|
-
|
|
49
|
-
this.logger.debug("_getFeeRate(): L1 fee rate: "+l1GasCost.toString(10));
|
|
50
|
-
|
|
51
|
-
return l1GasCost;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Gets the gas price with caching, format: <gas price in Wei>;<transaction version: v1/v3>
|
|
56
|
-
*
|
|
57
|
-
* @private
|
|
58
|
-
*/
|
|
59
|
-
public async getFeeRate(): Promise<string> {
|
|
60
|
-
if(this.blockFeeCache==null || Date.now() - this.blockFeeCache.timestamp > MAX_FEE_AGE) {
|
|
61
|
-
let obj = {
|
|
62
|
-
timestamp: Date.now(),
|
|
63
|
-
feeRate: null
|
|
64
|
-
};
|
|
65
|
-
obj.feeRate = this._getFeeRate().catch(e => {
|
|
66
|
-
if(this.blockFeeCache===obj) this.blockFeeCache=null;
|
|
67
|
-
throw e;
|
|
68
|
-
});
|
|
69
|
-
this.blockFeeCache = obj;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
let feeRate = await this.blockFeeCache.feeRate;
|
|
73
|
-
if(feeRate>this.maxFeeRate) feeRate = this.maxFeeRate;
|
|
74
|
-
|
|
75
|
-
const fee = feeRate.toString(10)+";"+(this.gasToken === "ETH" ? "v1" : "v3");
|
|
76
|
-
|
|
77
|
-
this.logger.debug("getFeeRate(): calculated fee: "+fee);
|
|
78
|
-
|
|
79
|
-
return fee;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
public getDefaultGasToken(): string {
|
|
83
|
-
return this.gasToken==="ETH" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Calculates the total gas fee fee paid for a given gas limit at a given fee rate
|
|
88
|
-
*
|
|
89
|
-
* @param gas
|
|
90
|
-
* @param feeRate
|
|
91
|
-
*/
|
|
92
|
-
public static getGasFee(gas: number, feeRate: string): bigint {
|
|
93
|
-
if(feeRate==null) return 0n;
|
|
94
|
-
|
|
95
|
-
const arr = feeRate.split(";");
|
|
96
|
-
const gasPrice = BigInt(arr[0]);
|
|
97
|
-
|
|
98
|
-
return gasPrice * BigInt(gas);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
public static getGasToken(feeRate: string): string {
|
|
102
|
-
if(feeRate==null) return null;
|
|
103
|
-
|
|
104
|
-
const arr = feeRate.split(";");
|
|
105
|
-
const txVersion = arr[1] as "v1" | 'v3';
|
|
106
|
-
|
|
107
|
-
return txVersion==="v1" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
getFeeDetails(L1GasLimit: number, L2GasLimit: number, feeRate: string) {
|
|
111
|
-
if(feeRate==null) return null;
|
|
112
|
-
|
|
113
|
-
const arr = feeRate.split(";");
|
|
114
|
-
const gasPrice = BigInt(arr[0]);
|
|
115
|
-
const version = arr[1] as "v1" | "v3";
|
|
116
|
-
|
|
117
|
-
const maxFee = toHex(BigInt(L1GasLimit) * gasPrice, 16);
|
|
118
|
-
|
|
119
|
-
return {
|
|
120
|
-
maxFee: maxFee,
|
|
121
|
-
version: version==="v1" ? "0x1" : "0x3" as "0x1" | "0x3",
|
|
122
|
-
resourceBounds: {
|
|
123
|
-
l1_gas: {max_amount: toHex(L1GasLimit, 16), max_price_per_unit: toHex(gasPrice, 16)},
|
|
124
|
-
l2_gas: {max_amount: "0x0", max_price_per_unit: "0x0"}
|
|
125
|
-
},
|
|
126
|
-
tip: "0x0",
|
|
127
|
-
paymasterData: [],
|
|
128
|
-
nonceDataAvailabilityMode: this.nonceDA,
|
|
129
|
-
feeDataAvailabilityMode: this.feeDA
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
1
|
+
import {getLogger, toBigInt, toHex} from "../../../utils/Utils";
|
|
2
|
+
import {Provider} from "starknet";
|
|
3
|
+
import {StarknetTokens} from "./StarknetTokens";
|
|
4
|
+
|
|
5
|
+
const MAX_FEE_AGE = 5000;
|
|
6
|
+
|
|
7
|
+
export class StarknetFees {
|
|
8
|
+
|
|
9
|
+
private readonly logger = getLogger("StarknetFees: ");
|
|
10
|
+
|
|
11
|
+
private readonly feeDA: "L1" | "L2";
|
|
12
|
+
private readonly nonceDA: "L1" | "L2";
|
|
13
|
+
private readonly provider: Provider;
|
|
14
|
+
private readonly gasToken: "ETH" | "STRK";
|
|
15
|
+
private readonly maxFeeRate: bigint;
|
|
16
|
+
private readonly feeMultiplierPPM: bigint;
|
|
17
|
+
|
|
18
|
+
private blockFeeCache: {
|
|
19
|
+
timestamp: number,
|
|
20
|
+
feeRate: Promise<bigint>
|
|
21
|
+
} = null;
|
|
22
|
+
|
|
23
|
+
constructor(
|
|
24
|
+
provider: Provider,
|
|
25
|
+
gasToken: "ETH" | "STRK" = "STRK",
|
|
26
|
+
maxFeeRate: number = gasToken==="ETH" ? 100_000_000_000 /*100 GWei*/ : 1_000_000_000_000_000 /*100 * 10000 GWei*/,
|
|
27
|
+
feeMultiplier: number = 1.25,
|
|
28
|
+
da?: {fee?: "L1" | "L2", nonce?: "L1" | "L2"}
|
|
29
|
+
) {
|
|
30
|
+
this.provider = provider;
|
|
31
|
+
this.gasToken = gasToken;
|
|
32
|
+
this.maxFeeRate = BigInt(maxFeeRate);
|
|
33
|
+
this.feeDA = da?.fee ?? "L1";
|
|
34
|
+
this.nonceDA = da?.nonce ?? "L1";
|
|
35
|
+
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier*1000000));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Gets starknet fee rate
|
|
40
|
+
*
|
|
41
|
+
* @private
|
|
42
|
+
* @returns {Promise<BN>} L1 gas price denominated in Wei
|
|
43
|
+
*/
|
|
44
|
+
private async _getFeeRate(): Promise<bigint> {
|
|
45
|
+
const block = await this.provider.getBlockWithTxHashes("latest");
|
|
46
|
+
let l1GasCost = toBigInt(this.gasToken==="ETH" ? block.l1_gas_price.price_in_wei : block.l1_gas_price.price_in_fri);
|
|
47
|
+
l1GasCost = l1GasCost * this.feeMultiplierPPM / 1000000n;
|
|
48
|
+
|
|
49
|
+
this.logger.debug("_getFeeRate(): L1 fee rate: "+l1GasCost.toString(10));
|
|
50
|
+
|
|
51
|
+
return l1GasCost;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Gets the gas price with caching, format: <gas price in Wei>;<transaction version: v1/v3>
|
|
56
|
+
*
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
public async getFeeRate(): Promise<string> {
|
|
60
|
+
if(this.blockFeeCache==null || Date.now() - this.blockFeeCache.timestamp > MAX_FEE_AGE) {
|
|
61
|
+
let obj = {
|
|
62
|
+
timestamp: Date.now(),
|
|
63
|
+
feeRate: null
|
|
64
|
+
};
|
|
65
|
+
obj.feeRate = this._getFeeRate().catch(e => {
|
|
66
|
+
if(this.blockFeeCache===obj) this.blockFeeCache=null;
|
|
67
|
+
throw e;
|
|
68
|
+
});
|
|
69
|
+
this.blockFeeCache = obj;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let feeRate = await this.blockFeeCache.feeRate;
|
|
73
|
+
if(feeRate>this.maxFeeRate) feeRate = this.maxFeeRate;
|
|
74
|
+
|
|
75
|
+
const fee = feeRate.toString(10)+";"+(this.gasToken === "ETH" ? "v1" : "v3");
|
|
76
|
+
|
|
77
|
+
this.logger.debug("getFeeRate(): calculated fee: "+fee);
|
|
78
|
+
|
|
79
|
+
return fee;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public getDefaultGasToken(): string {
|
|
83
|
+
return this.gasToken==="ETH" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Calculates the total gas fee fee paid for a given gas limit at a given fee rate
|
|
88
|
+
*
|
|
89
|
+
* @param gas
|
|
90
|
+
* @param feeRate
|
|
91
|
+
*/
|
|
92
|
+
public static getGasFee(gas: number, feeRate: string): bigint {
|
|
93
|
+
if(feeRate==null) return 0n;
|
|
94
|
+
|
|
95
|
+
const arr = feeRate.split(";");
|
|
96
|
+
const gasPrice = BigInt(arr[0]);
|
|
97
|
+
|
|
98
|
+
return gasPrice * BigInt(gas);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public static getGasToken(feeRate: string): string {
|
|
102
|
+
if(feeRate==null) return null;
|
|
103
|
+
|
|
104
|
+
const arr = feeRate.split(";");
|
|
105
|
+
const txVersion = arr[1] as "v1" | 'v3';
|
|
106
|
+
|
|
107
|
+
return txVersion==="v1" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
getFeeDetails(L1GasLimit: number, L2GasLimit: number, feeRate: string) {
|
|
111
|
+
if(feeRate==null) return null;
|
|
112
|
+
|
|
113
|
+
const arr = feeRate.split(";");
|
|
114
|
+
const gasPrice = BigInt(arr[0]);
|
|
115
|
+
const version = arr[1] as "v1" | "v3";
|
|
116
|
+
|
|
117
|
+
const maxFee = toHex(BigInt(L1GasLimit) * gasPrice, 16);
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
maxFee: maxFee,
|
|
121
|
+
version: version==="v1" ? "0x1" : "0x3" as "0x1" | "0x3",
|
|
122
|
+
resourceBounds: {
|
|
123
|
+
l1_gas: {max_amount: toHex(L1GasLimit, 16), max_price_per_unit: toHex(gasPrice, 16)},
|
|
124
|
+
l2_gas: {max_amount: "0x0", max_price_per_unit: "0x0"}
|
|
125
|
+
},
|
|
126
|
+
tip: "0x0",
|
|
127
|
+
paymasterData: [],
|
|
128
|
+
nonceDataAvailabilityMode: this.nonceDA,
|
|
129
|
+
feeDataAvailabilityMode: this.feeDA
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
133
|
}
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
import {Buffer} from "buffer";
|
|
2
|
-
import {StarknetModule} from "../StarknetModule";
|
|
3
|
-
import {StarknetSigner} from "../../wallet/StarknetSigner";
|
|
4
|
-
import {
|
|
5
|
-
Account, cairo,
|
|
6
|
-
shortString,
|
|
7
|
-
stark,
|
|
8
|
-
StarknetDomain, StarknetType,
|
|
9
|
-
TypedData
|
|
10
|
-
} from "starknet";
|
|
11
|
-
import {StarknetChainInterface} from "../StarknetChainInterface";
|
|
12
|
-
import {toHex} from "../../../utils/Utils";
|
|
13
|
-
import {sha256} from "@noble/hashes/sha2";
|
|
14
|
-
|
|
15
|
-
const StarknetDomain = [
|
|
16
|
-
{ name: 'name', type: 'shortstring' },
|
|
17
|
-
{ name: 'version', type: 'shortstring' },
|
|
18
|
-
{ name: 'chainId', type: 'shortstring' },
|
|
19
|
-
{ name: 'revision', type: 'shortstring' },
|
|
20
|
-
];
|
|
21
|
-
|
|
22
|
-
const DataHash = [
|
|
23
|
-
{ name: 'Data hash', type: 'u256' }
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
export class StarknetSignatures extends StarknetModule {
|
|
27
|
-
|
|
28
|
-
private readonly domain: StarknetDomain;
|
|
29
|
-
|
|
30
|
-
constructor(root: StarknetChainInterface, domainName: string = "atomiq.exchange") {
|
|
31
|
-
super(root);
|
|
32
|
-
this.domain = {
|
|
33
|
-
name: domainName,
|
|
34
|
-
version: '1',
|
|
35
|
-
chainId: shortString.decodeShortString(root.starknetChainId),
|
|
36
|
-
revision: '1'
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
public getTypedMessage(type: StarknetType[], typeName: string, message: object): TypedData {
|
|
41
|
-
return {
|
|
42
|
-
types: {
|
|
43
|
-
StarknetDomain,
|
|
44
|
-
[typeName]: type,
|
|
45
|
-
},
|
|
46
|
-
primaryType: typeName,
|
|
47
|
-
domain: this.domain,
|
|
48
|
-
message
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public async signTypedMessage(signer: StarknetSigner, type: StarknetType[], typeName: string, message: object): Promise<string> {
|
|
53
|
-
const signature = await signer.account.signMessage(this.getTypedMessage(type, typeName, message));
|
|
54
|
-
return JSON.stringify(stark.formatSignature(signature));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
public async isValidSignature(signature: string, address: string, type: StarknetType[], typeName: string, message: object) {
|
|
58
|
-
return new Account(this.provider, address, null).verifyMessage(
|
|
59
|
-
this.getTypedMessage(type, typeName, message),
|
|
60
|
-
JSON.parse(signature)
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
///////////////////
|
|
65
|
-
//// Data signatures
|
|
66
|
-
/**
|
|
67
|
-
* Produces a signature over the sha256 of a specified data Buffer, only works with providers which
|
|
68
|
-
* expose their private key (i.e. backend based, not browser wallet based)
|
|
69
|
-
*
|
|
70
|
-
* @param signer
|
|
71
|
-
* @param data data to sign
|
|
72
|
-
*/
|
|
73
|
-
public getDataSignature(signer: StarknetSigner, data: Buffer): Promise<string> {
|
|
74
|
-
const buff = Buffer.from(sha256(data));
|
|
75
|
-
return this.signTypedMessage(signer, DataHash, 'DataHash', {"Data hash": cairo.uint256(toHex(buff))});
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Checks whether a signature is a valid signature produced by the account over a data message (computes
|
|
80
|
-
* sha256 hash of the message)
|
|
81
|
-
*
|
|
82
|
-
* @param data signed data
|
|
83
|
-
* @param signature data signature
|
|
84
|
-
* @param address public key of the signer
|
|
85
|
-
*/
|
|
86
|
-
public isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean> {
|
|
87
|
-
const buff = Buffer.from(sha256(data));
|
|
88
|
-
return this.isValidSignature(signature, address, DataHash, 'DataHash', {"Data hash": cairo.uint256(toHex(buff))});
|
|
89
|
-
}
|
|
90
|
-
|
|
1
|
+
import {Buffer} from "buffer";
|
|
2
|
+
import {StarknetModule} from "../StarknetModule";
|
|
3
|
+
import {StarknetSigner} from "../../wallet/StarknetSigner";
|
|
4
|
+
import {
|
|
5
|
+
Account, cairo,
|
|
6
|
+
shortString,
|
|
7
|
+
stark,
|
|
8
|
+
StarknetDomain, StarknetType,
|
|
9
|
+
TypedData
|
|
10
|
+
} from "starknet";
|
|
11
|
+
import {StarknetChainInterface} from "../StarknetChainInterface";
|
|
12
|
+
import {toHex} from "../../../utils/Utils";
|
|
13
|
+
import {sha256} from "@noble/hashes/sha2";
|
|
14
|
+
|
|
15
|
+
const StarknetDomain = [
|
|
16
|
+
{ name: 'name', type: 'shortstring' },
|
|
17
|
+
{ name: 'version', type: 'shortstring' },
|
|
18
|
+
{ name: 'chainId', type: 'shortstring' },
|
|
19
|
+
{ name: 'revision', type: 'shortstring' },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
const DataHash = [
|
|
23
|
+
{ name: 'Data hash', type: 'u256' }
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
export class StarknetSignatures extends StarknetModule {
|
|
27
|
+
|
|
28
|
+
private readonly domain: StarknetDomain;
|
|
29
|
+
|
|
30
|
+
constructor(root: StarknetChainInterface, domainName: string = "atomiq.exchange") {
|
|
31
|
+
super(root);
|
|
32
|
+
this.domain = {
|
|
33
|
+
name: domainName,
|
|
34
|
+
version: '1',
|
|
35
|
+
chainId: shortString.decodeShortString(root.starknetChainId),
|
|
36
|
+
revision: '1'
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public getTypedMessage(type: StarknetType[], typeName: string, message: object): TypedData {
|
|
41
|
+
return {
|
|
42
|
+
types: {
|
|
43
|
+
StarknetDomain,
|
|
44
|
+
[typeName]: type,
|
|
45
|
+
},
|
|
46
|
+
primaryType: typeName,
|
|
47
|
+
domain: this.domain,
|
|
48
|
+
message
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public async signTypedMessage(signer: StarknetSigner, type: StarknetType[], typeName: string, message: object): Promise<string> {
|
|
53
|
+
const signature = await signer.account.signMessage(this.getTypedMessage(type, typeName, message));
|
|
54
|
+
return JSON.stringify(stark.formatSignature(signature));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public async isValidSignature(signature: string, address: string, type: StarknetType[], typeName: string, message: object) {
|
|
58
|
+
return new Account(this.provider, address, null).verifyMessage(
|
|
59
|
+
this.getTypedMessage(type, typeName, message),
|
|
60
|
+
JSON.parse(signature)
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
///////////////////
|
|
65
|
+
//// Data signatures
|
|
66
|
+
/**
|
|
67
|
+
* Produces a signature over the sha256 of a specified data Buffer, only works with providers which
|
|
68
|
+
* expose their private key (i.e. backend based, not browser wallet based)
|
|
69
|
+
*
|
|
70
|
+
* @param signer
|
|
71
|
+
* @param data data to sign
|
|
72
|
+
*/
|
|
73
|
+
public getDataSignature(signer: StarknetSigner, data: Buffer): Promise<string> {
|
|
74
|
+
const buff = Buffer.from(sha256(data));
|
|
75
|
+
return this.signTypedMessage(signer, DataHash, 'DataHash', {"Data hash": cairo.uint256(toHex(buff))});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Checks whether a signature is a valid signature produced by the account over a data message (computes
|
|
80
|
+
* sha256 hash of the message)
|
|
81
|
+
*
|
|
82
|
+
* @param data signed data
|
|
83
|
+
* @param signature data signature
|
|
84
|
+
* @param address public key of the signer
|
|
85
|
+
*/
|
|
86
|
+
public isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean> {
|
|
87
|
+
const buff = Buffer.from(sha256(data));
|
|
88
|
+
return this.isValidSignature(signature, address, DataHash, 'DataHash', {"Data hash": cairo.uint256(toHex(buff))});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
91
|
}
|