@atomiqlabs/chain-starknet 4.0.0-dev.12 → 4.0.0-dev.13
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 +27 -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 +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 +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 +77 -77
- package/dist/starknet/chain/modules/StarknetFees.js +114 -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 +93 -93
- package/dist/starknet/chain/modules/StarknetTransactions.js +261 -260
- 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 +89 -90
- package/dist/starknet/events/StarknetChainEventsBrowser.js +296 -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 +66 -66
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +382 -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 -431
- package/dist/starknet/swaps/EscrowManagerAbi.js +583 -583
- package/dist/starknet/swaps/StarknetSwapContract.d.ts +191 -191
- package/dist/starknet/swaps/StarknetSwapContract.js +424 -424
- package/dist/starknet/swaps/StarknetSwapData.d.ts +74 -74
- package/dist/starknet/swaps/StarknetSwapData.js +325 -325
- 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 -87
- package/dist/starknet/swaps/modules/StarknetSwapInit.js +235 -225
- 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 +35 -30
- package/dist/starknet/wallet/StarknetSigner.d.ts +12 -12
- package/dist/starknet/wallet/StarknetSigner.js +47 -46
- package/dist/utils/Utils.d.ts +37 -37
- package/dist/utils/Utils.js +260 -261
- package/package.json +43 -37
- package/src/index.ts +47 -47
- package/src/starknet/StarknetChainType.ts +28 -28
- package/src/starknet/StarknetInitializer.ts +108 -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 +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 +75 -74
- package/src/starknet/chain/modules/StarknetEvents.ts +104 -104
- package/src/starknet/chain/modules/StarknetFees.ts +154 -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 +285 -283
- 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 +411 -411
- package/src/starknet/provider/RpcProviderWithRetries.ts +43 -43
- package/src/starknet/spv_swap/SpvVaultContractAbi.ts +656 -656
- package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +483 -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 -582
- package/src/starknet/swaps/StarknetSwapContract.ts +647 -647
- package/src/starknet/swaps/StarknetSwapData.ts +455 -455
- 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 -287
- package/src/starknet/swaps/modules/StarknetSwapRefund.ts +196 -196
- package/src/starknet/wallet/StarknetKeypairWallet.ts +44 -39
- package/src/starknet/wallet/StarknetSigner.ts +55 -55
- package/src/utils/Utils.ts +251 -252
|
@@ -1,155 +1,155 @@
|
|
|
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 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
|
-
|
|
27
|
-
export class StarknetFees {
|
|
28
|
-
|
|
29
|
-
private readonly logger = getLogger("StarknetFees: ");
|
|
30
|
-
|
|
31
|
-
private readonly feeDA: "L1" | "L2";
|
|
32
|
-
private readonly nonceDA: "L1" | "L2";
|
|
33
|
-
private readonly provider: Provider;
|
|
34
|
-
private readonly maxFeeRate: StarknetFeeRate;
|
|
35
|
-
private readonly feeMultiplierPPM: bigint;
|
|
36
|
-
|
|
37
|
-
private blockFeeCache: {
|
|
38
|
-
timestamp: number,
|
|
39
|
-
feeRate: Promise<StarknetFeeRate>
|
|
40
|
-
} = null;
|
|
41
|
-
|
|
42
|
-
constructor(
|
|
43
|
-
provider: Provider,
|
|
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*/,
|
|
45
|
-
feeMultiplier: number = 1.25,
|
|
46
|
-
da?: {fee?: "L1" | "L2", nonce?: "L1" | "L2"}
|
|
47
|
-
) {
|
|
48
|
-
this.provider = provider;
|
|
49
|
-
this.maxFeeRate = maxFeeRate;
|
|
50
|
-
this.feeDA = da?.fee ?? "L1";
|
|
51
|
-
this.nonceDA = da?.nonce ?? "L1";
|
|
52
|
-
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier*1000000));
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Gets starknet fee rate
|
|
57
|
-
*
|
|
58
|
-
* @private
|
|
59
|
-
* @returns {Promise<StarknetFeeRate>} L1 gas price denominated in Wei
|
|
60
|
-
*/
|
|
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;
|
|
67
|
-
|
|
68
|
-
this.logger.debug("_getFeeRate(): L1 fee rate: ",[l1GasCost.toString(10), l1DataGasCost.toString(10), l2GasCost.toString(10)]);
|
|
69
|
-
|
|
70
|
-
return {
|
|
71
|
-
l1GasCost, l2GasCost, l1DataGasCost
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Gets the gas price with caching, format: <gas price in Wei>;<transaction version: v1/v3>
|
|
77
|
-
*
|
|
78
|
-
* @private
|
|
79
|
-
*/
|
|
80
|
-
public async getFeeRate(): Promise<string> {
|
|
81
|
-
if(this.blockFeeCache==null || Date.now() - this.blockFeeCache.timestamp > MAX_FEE_AGE) {
|
|
82
|
-
let obj = {
|
|
83
|
-
timestamp: Date.now(),
|
|
84
|
-
feeRate: null
|
|
85
|
-
};
|
|
86
|
-
obj.feeRate = this._getFeeRate().catch(e => {
|
|
87
|
-
if(this.blockFeeCache===obj) this.blockFeeCache=null;
|
|
88
|
-
throw e;
|
|
89
|
-
});
|
|
90
|
-
this.blockFeeCache = obj;
|
|
91
|
-
}
|
|
92
|
-
|
|
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;
|
|
97
|
-
|
|
98
|
-
const fee = l1GasCost.toString(10)+","+l2GasCost.toString(10)+","+l1DataGasCost.toString(10)+";v3";
|
|
99
|
-
|
|
100
|
-
this.logger.debug("getFeeRate(): calculated fee: "+fee);
|
|
101
|
-
|
|
102
|
-
return fee;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
public getDefaultGasToken(): string {
|
|
106
|
-
return StarknetTokens.ERC20_STRK;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Calculates the total gas fee paid for a given gas limit at a given fee rate
|
|
111
|
-
*
|
|
112
|
-
* @param gas
|
|
113
|
-
* @param feeRate
|
|
114
|
-
*/
|
|
115
|
-
public static getGasFee(gas: {l1DataGas: number, l2Gas: number, l1Gas: number}, feeRate: string): bigint {
|
|
116
|
-
if(feeRate==null) return 0n;
|
|
117
|
-
|
|
118
|
-
const arr = feeRate.split(";");
|
|
119
|
-
const [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
|
|
120
|
-
|
|
121
|
-
return (BigInt(gas.l1Gas) * BigInt(l1GasCostStr)) +
|
|
122
|
-
(BigInt(gas.l2Gas) * BigInt(l2GasCostStr)) +
|
|
123
|
-
(BigInt(gas.l1DataGas) * BigInt(l1DataGasCostStr));
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
public static getGasToken(feeRate: string): string {
|
|
127
|
-
if(feeRate==null) return null;
|
|
128
|
-
|
|
129
|
-
const arr = feeRate.split(";");
|
|
130
|
-
const txVersion = arr[1] as "v1" | 'v3';
|
|
131
|
-
|
|
132
|
-
return txVersion==="v1" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
getFeeDetails(gas: {l1DataGas: number, l2Gas: number, l1Gas: number}, feeRate: string) {
|
|
136
|
-
if(feeRate==null) return null;
|
|
137
|
-
|
|
138
|
-
const arr = feeRate.split(";");
|
|
139
|
-
const [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
|
|
140
|
-
|
|
141
|
-
return {
|
|
142
|
-
version: "0x3" as const,
|
|
143
|
-
resourceBounds: {
|
|
144
|
-
l1_gas: {max_amount:
|
|
145
|
-
l2_gas: {max_amount:
|
|
146
|
-
l1_data_gas: {max_amount:
|
|
147
|
-
},
|
|
148
|
-
tip:
|
|
149
|
-
paymasterData: [],
|
|
150
|
-
nonceDataAvailabilityMode: this.nonceDA,
|
|
151
|
-
feeDataAvailabilityMode: this.feeDA
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
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 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
|
+
|
|
27
|
+
export class StarknetFees {
|
|
28
|
+
|
|
29
|
+
private readonly logger = getLogger("StarknetFees: ");
|
|
30
|
+
|
|
31
|
+
private readonly feeDA: "L1" | "L2";
|
|
32
|
+
private readonly nonceDA: "L1" | "L2";
|
|
33
|
+
private readonly provider: Provider;
|
|
34
|
+
private readonly maxFeeRate: StarknetFeeRate;
|
|
35
|
+
private readonly feeMultiplierPPM: bigint;
|
|
36
|
+
|
|
37
|
+
private blockFeeCache: {
|
|
38
|
+
timestamp: number,
|
|
39
|
+
feeRate: Promise<StarknetFeeRate>
|
|
40
|
+
} = null;
|
|
41
|
+
|
|
42
|
+
constructor(
|
|
43
|
+
provider: Provider,
|
|
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*/,
|
|
45
|
+
feeMultiplier: number = 1.25,
|
|
46
|
+
da?: {fee?: "L1" | "L2", nonce?: "L1" | "L2"}
|
|
47
|
+
) {
|
|
48
|
+
this.provider = provider;
|
|
49
|
+
this.maxFeeRate = maxFeeRate;
|
|
50
|
+
this.feeDA = da?.fee ?? "L1";
|
|
51
|
+
this.nonceDA = da?.nonce ?? "L1";
|
|
52
|
+
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier*1000000));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Gets starknet fee rate
|
|
57
|
+
*
|
|
58
|
+
* @private
|
|
59
|
+
* @returns {Promise<StarknetFeeRate>} L1 gas price denominated in Wei
|
|
60
|
+
*/
|
|
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;
|
|
67
|
+
|
|
68
|
+
this.logger.debug("_getFeeRate(): L1 fee rate: ",[l1GasCost.toString(10), l1DataGasCost.toString(10), l2GasCost.toString(10)]);
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
l1GasCost, l2GasCost, l1DataGasCost
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Gets the gas price with caching, format: <gas price in Wei>;<transaction version: v1/v3>
|
|
77
|
+
*
|
|
78
|
+
* @private
|
|
79
|
+
*/
|
|
80
|
+
public async getFeeRate(): Promise<string> {
|
|
81
|
+
if(this.blockFeeCache==null || Date.now() - this.blockFeeCache.timestamp > MAX_FEE_AGE) {
|
|
82
|
+
let obj = {
|
|
83
|
+
timestamp: Date.now(),
|
|
84
|
+
feeRate: null
|
|
85
|
+
};
|
|
86
|
+
obj.feeRate = this._getFeeRate().catch(e => {
|
|
87
|
+
if(this.blockFeeCache===obj) this.blockFeeCache=null;
|
|
88
|
+
throw e;
|
|
89
|
+
});
|
|
90
|
+
this.blockFeeCache = obj;
|
|
91
|
+
}
|
|
92
|
+
|
|
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;
|
|
97
|
+
|
|
98
|
+
const fee = l1GasCost.toString(10)+","+l2GasCost.toString(10)+","+l1DataGasCost.toString(10)+";v3";
|
|
99
|
+
|
|
100
|
+
this.logger.debug("getFeeRate(): calculated fee: "+fee);
|
|
101
|
+
|
|
102
|
+
return fee;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public getDefaultGasToken(): string {
|
|
106
|
+
return StarknetTokens.ERC20_STRK;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Calculates the total gas fee paid for a given gas limit at a given fee rate
|
|
111
|
+
*
|
|
112
|
+
* @param gas
|
|
113
|
+
* @param feeRate
|
|
114
|
+
*/
|
|
115
|
+
public static getGasFee(gas: {l1DataGas: number, l2Gas: number, l1Gas: number}, feeRate: string): bigint {
|
|
116
|
+
if(feeRate==null) return 0n;
|
|
117
|
+
|
|
118
|
+
const arr = feeRate.split(";");
|
|
119
|
+
const [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
|
|
120
|
+
|
|
121
|
+
return (BigInt(gas.l1Gas) * BigInt(l1GasCostStr)) +
|
|
122
|
+
(BigInt(gas.l2Gas) * BigInt(l2GasCostStr)) +
|
|
123
|
+
(BigInt(gas.l1DataGas) * BigInt(l1DataGasCostStr));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public static getGasToken(feeRate: string): string {
|
|
127
|
+
if(feeRate==null) return null;
|
|
128
|
+
|
|
129
|
+
const arr = feeRate.split(";");
|
|
130
|
+
const txVersion = arr[1] as "v1" | 'v3';
|
|
131
|
+
|
|
132
|
+
return txVersion==="v1" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
getFeeDetails(gas: {l1DataGas: number, l2Gas: number, l1Gas: number}, feeRate: string) {
|
|
136
|
+
if(feeRate==null) return null;
|
|
137
|
+
|
|
138
|
+
const arr = feeRate.split(";");
|
|
139
|
+
const [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
version: "0x3" as const,
|
|
143
|
+
resourceBounds: {
|
|
144
|
+
l1_gas: {max_amount: BigInt(gas.l1Gas), max_price_per_unit: BigInt(l1GasCostStr)},
|
|
145
|
+
l2_gas: {max_amount: BigInt(gas.l2Gas), max_price_per_unit: BigInt(l2GasCostStr)},
|
|
146
|
+
l1_data_gas: {max_amount: BigInt(gas.l1DataGas), max_price_per_unit: BigInt(l1DataGasCostStr)}
|
|
147
|
+
},
|
|
148
|
+
tip: 0n,
|
|
149
|
+
paymasterData: [],
|
|
150
|
+
nonceDataAvailabilityMode: this.nonceDA,
|
|
151
|
+
feeDataAvailabilityMode: this.feeDA
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
155
|
}
|
|
@@ -1,92 +1,92 @@
|
|
|
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): Promise<boolean> {
|
|
58
|
-
return this.provider.verifyMessageInStarknet(
|
|
59
|
-
this.getTypedMessage(type, typeName, message),
|
|
60
|
-
JSON.parse(signature),
|
|
61
|
-
address
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
///////////////////
|
|
66
|
-
//// Data signatures
|
|
67
|
-
/**
|
|
68
|
-
* Produces a signature over the sha256 of a specified data Buffer, only works with providers which
|
|
69
|
-
* expose their private key (i.e. backend based, not browser wallet based)
|
|
70
|
-
*
|
|
71
|
-
* @param signer
|
|
72
|
-
* @param data data to sign
|
|
73
|
-
*/
|
|
74
|
-
public getDataSignature(signer: StarknetSigner, data: Buffer): Promise<string> {
|
|
75
|
-
const buff = Buffer.from(sha256(data));
|
|
76
|
-
return this.signTypedMessage(signer, DataHash, 'DataHash', {"Data hash": cairo.uint256(toHex(buff))});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Checks whether a signature is a valid signature produced by the account over a data message (computes
|
|
81
|
-
* sha256 hash of the message)
|
|
82
|
-
*
|
|
83
|
-
* @param data signed data
|
|
84
|
-
* @param signature data signature
|
|
85
|
-
* @param address public key of the signer
|
|
86
|
-
*/
|
|
87
|
-
public isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean> {
|
|
88
|
-
const buff = Buffer.from(sha256(data));
|
|
89
|
-
return this.isValidSignature(signature, address, DataHash, 'DataHash', {"Data hash": cairo.uint256(toHex(buff))});
|
|
90
|
-
}
|
|
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): Promise<boolean> {
|
|
58
|
+
return this.provider.verifyMessageInStarknet(
|
|
59
|
+
this.getTypedMessage(type, typeName, message),
|
|
60
|
+
JSON.parse(signature),
|
|
61
|
+
address
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
///////////////////
|
|
66
|
+
//// Data signatures
|
|
67
|
+
/**
|
|
68
|
+
* Produces a signature over the sha256 of a specified data Buffer, only works with providers which
|
|
69
|
+
* expose their private key (i.e. backend based, not browser wallet based)
|
|
70
|
+
*
|
|
71
|
+
* @param signer
|
|
72
|
+
* @param data data to sign
|
|
73
|
+
*/
|
|
74
|
+
public getDataSignature(signer: StarknetSigner, data: Buffer): Promise<string> {
|
|
75
|
+
const buff = Buffer.from(sha256(data));
|
|
76
|
+
return this.signTypedMessage(signer, DataHash, 'DataHash', {"Data hash": cairo.uint256(toHex(buff))});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Checks whether a signature is a valid signature produced by the account over a data message (computes
|
|
81
|
+
* sha256 hash of the message)
|
|
82
|
+
*
|
|
83
|
+
* @param data signed data
|
|
84
|
+
* @param signature data signature
|
|
85
|
+
* @param address public key of the signer
|
|
86
|
+
*/
|
|
87
|
+
public isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean> {
|
|
88
|
+
const buff = Buffer.from(sha256(data));
|
|
89
|
+
return this.isValidSignature(signature, address, DataHash, 'DataHash', {"Data hash": cairo.uint256(toHex(buff))});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
92
|
}
|