@atomiqlabs/chain-starknet 2.0.1 → 3.0.0-beta.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.js +7 -2
- 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/spv_swap/StarknetSpvVaultContract.js +6 -6
- package/dist/starknet/swaps/EscrowManagerAbi.d.ts +29 -0
- package/dist/starknet/swaps/EscrowManagerAbi.js +40 -0
- package/dist/starknet/swaps/StarknetSwapContract.js +2 -2
- package/dist/starknet/swaps/StarknetSwapData.js +10 -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 +5 -5
- package/dist/starknet/swaps/modules/StarknetSwapInit.js +64 -6
- package/dist/starknet/swaps/modules/StarknetSwapRefund.js +4 -4
- package/dist/utils/Utils.js +3 -3
- package/package.json +2 -2
- package/src/starknet/StarknetInitializer.ts +7 -2
- 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/spv_swap/StarknetSpvVaultContract.ts +6 -6
- package/src/starknet/swaps/EscrowManagerAbi.ts +40 -0
- package/src/starknet/swaps/StarknetSwapContract.ts +2 -2
- package/src/starknet/swaps/StarknetSwapData.ts +11 -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 +7 -7
- package/src/starknet/swaps/modules/StarknetSwapInit.ts +65 -8
- package/src/starknet/swaps/modules/StarknetSwapRefund.ts +6 -7
- package/src/utils/Utils.ts +1 -1
|
@@ -27,13 +27,18 @@ exports.StarknetAssets = {
|
|
|
27
27
|
WBTC: {
|
|
28
28
|
address: "0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac",
|
|
29
29
|
decimals: 8
|
|
30
|
-
}
|
|
30
|
+
},
|
|
31
|
+
// TBTC: {
|
|
32
|
+
// address: "0x04daa17763b286d1e59b97c283C0b8C949994C361e426A28F743c67bDfE9a32f",
|
|
33
|
+
// decimals: 18,
|
|
34
|
+
// displayDecimals: 8
|
|
35
|
+
// }
|
|
31
36
|
};
|
|
32
37
|
function initializeStarknet(options, bitcoinRpc, network) {
|
|
33
38
|
const provider = typeof (options.rpcUrl) === "string" ?
|
|
34
39
|
new RpcProviderWithRetries_1.RpcProviderWithRetries({ nodeUrl: options.rpcUrl }) :
|
|
35
40
|
options.rpcUrl;
|
|
36
|
-
const Fees = options.fees ?? new StarknetFees_1.StarknetFees(provider
|
|
41
|
+
const Fees = options.fees ?? new StarknetFees_1.StarknetFees(provider);
|
|
37
42
|
const chainId = options.chainId ??
|
|
38
43
|
(network === base_1.BitcoinNetwork.MAINNET ? starknet_1.constants.StarknetChainId.SN_MAIN : starknet_1.constants.StarknetChainId.SN_SEPOLIA);
|
|
39
44
|
const chainInterface = new StarknetChainInterface_1.StarknetChainInterface(chainId, provider, options.retryPolicy, Fees);
|
|
@@ -22,8 +22,8 @@ function serializeBlockHeader(e) {
|
|
|
22
22
|
hash: buffer_1.Buffer.from(e.getHash(), "hex").reverse()
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
|
-
const GAS_PER_BLOCKHEADER =
|
|
26
|
-
const GAS_PER_BLOCKHEADER_FORK = 1000;
|
|
25
|
+
const GAS_PER_BLOCKHEADER = { l1DataGas: 600, l2Gas: 40000000, l1Gas: 0 };
|
|
26
|
+
const GAS_PER_BLOCKHEADER_FORK = { l1DataGas: 1000, l2Gas: 60000000, l1Gas: 0 };
|
|
27
27
|
const btcRelayAddreses = {
|
|
28
28
|
[base_1.BitcoinNetwork.TESTNET4]: "0x0099b63f39f0cabb767361de3d8d3e97212351a51540e2687c2571f4da490dbe",
|
|
29
29
|
[base_1.BitcoinNetwork.TESTNET]: "0x068601c79da2231d21e015ccfd59c243861156fa523a12c9f987ec28eb8dbc8c",
|
|
@@ -44,21 +44,21 @@ class StarknetBtcRelay extends StarknetContractBase_1.StarknetContractBase {
|
|
|
44
44
|
contractAddress: this.contract.address,
|
|
45
45
|
entrypoint: "submit_main_blockheaders",
|
|
46
46
|
calldata: serializeCalldata(mainHeaders, storedHeader, [])
|
|
47
|
-
},
|
|
47
|
+
}, (0, StarknetFees_1.starknetGasMul)(GAS_PER_BLOCKHEADER, mainHeaders.length));
|
|
48
48
|
}
|
|
49
49
|
SaveShortForkHeaders(signer, forkHeaders, storedHeader) {
|
|
50
50
|
return new StarknetAction_1.StarknetAction(signer, this.Chain, {
|
|
51
51
|
contractAddress: this.contract.address,
|
|
52
52
|
entrypoint: "submit_short_fork_blockheaders",
|
|
53
53
|
calldata: serializeCalldata(forkHeaders, storedHeader, [])
|
|
54
|
-
},
|
|
54
|
+
}, (0, StarknetFees_1.starknetGasMul)(GAS_PER_BLOCKHEADER, forkHeaders.length));
|
|
55
55
|
}
|
|
56
56
|
SaveLongForkHeaders(signer, forkId, forkHeaders, storedHeader, totalForkHeaders = 100) {
|
|
57
57
|
return new StarknetAction_1.StarknetAction(signer, this.Chain, {
|
|
58
58
|
contractAddress: this.contract.address,
|
|
59
59
|
entrypoint: "submit_fork_blockheaders",
|
|
60
60
|
calldata: serializeCalldata(forkHeaders, storedHeader, [(0, Utils_1.toHex)(forkId)])
|
|
61
|
-
},
|
|
61
|
+
}, (0, StarknetFees_1.starknetGasAdd)((0, StarknetFees_1.starknetGasMul)(GAS_PER_BLOCKHEADER, forkHeaders.length), (0, StarknetFees_1.starknetGasMul)(GAS_PER_BLOCKHEADER_FORK, totalForkHeaders)));
|
|
62
62
|
}
|
|
63
63
|
constructor(chainInterface, bitcoinRpc, bitcoinNetwork, contractAddress = btcRelayAddreses[bitcoinNetwork]) {
|
|
64
64
|
super(chainInterface, contractAddress, BtcRelayAbi_1.BtcRelayAbi);
|
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import { Call } from "starknet";
|
|
2
2
|
import { StarknetChainInterface } from "./StarknetChainInterface";
|
|
3
3
|
import { StarknetTx } from "./modules/StarknetTransactions";
|
|
4
|
-
|
|
5
|
-
l1?: number;
|
|
6
|
-
l2?: number;
|
|
7
|
-
};
|
|
8
|
-
export declare function sumStarknetGas(a: StarknetGas, b: StarknetGas): {
|
|
9
|
-
l1: number;
|
|
10
|
-
l2: number;
|
|
11
|
-
};
|
|
4
|
+
import { StarknetGas } from "./modules/StarknetFees";
|
|
12
5
|
export declare class StarknetAction {
|
|
13
|
-
|
|
14
|
-
L2GasLimit: number;
|
|
6
|
+
gas: StarknetGas;
|
|
15
7
|
readonly mainSigner: string;
|
|
16
8
|
private readonly root;
|
|
17
9
|
private readonly instructions;
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StarknetAction =
|
|
4
|
-
|
|
5
|
-
return {
|
|
6
|
-
l1: (a?.l1 ?? 0) + (b?.l1 ?? 0),
|
|
7
|
-
l2: (a?.l2 ?? 0) + (b?.l2 ?? 0)
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
exports.sumStarknetGas = sumStarknetGas;
|
|
3
|
+
exports.StarknetAction = void 0;
|
|
4
|
+
const StarknetFees_1 = require("./modules/StarknetFees");
|
|
11
5
|
class StarknetAction {
|
|
12
6
|
constructor(mainSigner, root, instructions = [], gasLimit, feeRate) {
|
|
13
7
|
this.mainSigner = mainSigner;
|
|
14
8
|
this.root = root;
|
|
15
9
|
this.instructions = Array.isArray(instructions) ? instructions : [instructions];
|
|
16
|
-
this.
|
|
17
|
-
|
|
10
|
+
this.gas = {
|
|
11
|
+
l1Gas: gasLimit?.l1Gas ?? 0,
|
|
12
|
+
l2Gas: gasLimit?.l2Gas ?? 0,
|
|
13
|
+
l1DataGas: gasLimit?.l1DataGas ?? 0,
|
|
14
|
+
};
|
|
18
15
|
this.feeRate = feeRate;
|
|
19
16
|
}
|
|
20
17
|
estimateFeeRate() {
|
|
@@ -22,8 +19,7 @@ class StarknetAction {
|
|
|
22
19
|
}
|
|
23
20
|
addIx(instruction, gasLimit) {
|
|
24
21
|
this.instructions.push(instruction);
|
|
25
|
-
this.
|
|
26
|
-
this.L2GasLimit += gasLimit?.l2 ?? 0;
|
|
22
|
+
this.gas = (0, StarknetFees_1.starknetGasAdd)(this.gas, gasLimit);
|
|
27
23
|
}
|
|
28
24
|
add(action) {
|
|
29
25
|
return this.addAction(action);
|
|
@@ -31,14 +27,18 @@ class StarknetAction {
|
|
|
31
27
|
addAction(action, index = this.instructions.length) {
|
|
32
28
|
if (action.mainSigner !== this.mainSigner)
|
|
33
29
|
throw new Error("Actions need to have the same signer!");
|
|
34
|
-
if (this.
|
|
35
|
-
this.
|
|
36
|
-
if (this.
|
|
37
|
-
this.
|
|
38
|
-
if (this.
|
|
39
|
-
this.
|
|
40
|
-
if (this.
|
|
41
|
-
this.
|
|
30
|
+
if (this.gas.l1Gas == null && action.gas.l1Gas != null)
|
|
31
|
+
this.gas.l1Gas = action.gas.l1Gas;
|
|
32
|
+
if (this.gas.l2Gas == null && action.gas.l2Gas != null)
|
|
33
|
+
this.gas.l2Gas = action.gas.l2Gas;
|
|
34
|
+
if (this.gas.l1DataGas == null && action.gas.l1DataGas != null)
|
|
35
|
+
this.gas.l1DataGas = action.gas.l1DataGas;
|
|
36
|
+
if (this.gas.l1Gas != null && action.gas.l1Gas != null)
|
|
37
|
+
this.gas.l1Gas += action.gas.l1Gas;
|
|
38
|
+
if (this.gas.l2Gas != null && action.gas.l2Gas != null)
|
|
39
|
+
this.gas.l2Gas += action.gas.l2Gas;
|
|
40
|
+
if (this.gas.l1DataGas != null && action.gas.l1DataGas != null)
|
|
41
|
+
this.gas.l1DataGas += action.gas.l1DataGas;
|
|
42
42
|
this.instructions.splice(index, 0, ...action.instructions);
|
|
43
43
|
if (this.feeRate == null)
|
|
44
44
|
this.feeRate = action.feeRate;
|
|
@@ -53,7 +53,7 @@ class StarknetAction {
|
|
|
53
53
|
type: "INVOKE",
|
|
54
54
|
tx: this.instructions,
|
|
55
55
|
details: {
|
|
56
|
-
...this.root.Fees.getFeeDetails(this.
|
|
56
|
+
...this.root.Fees.getFeeDetails(this.gas, feeRate),
|
|
57
57
|
walletAddress: this.mainSigner,
|
|
58
58
|
cairoVersion: "1",
|
|
59
59
|
chainId: this.root.starknetChainId,
|
|
@@ -4,7 +4,7 @@ exports.StarknetAccounts = void 0;
|
|
|
4
4
|
const StarknetModule_1 = require("../StarknetModule");
|
|
5
5
|
class StarknetAccounts extends StarknetModule_1.StarknetModule {
|
|
6
6
|
async getAccountDeployTransaction(deploymentData) {
|
|
7
|
-
const feeDetails = this.root.Fees.getFeeDetails(5000, 0, await this.root.Fees.getFeeRate());
|
|
7
|
+
const feeDetails = this.root.Fees.getFeeDetails({ l1DataGas: 500, l2Gas: 5000 * 40000, l1Gas: 0 }, await this.root.Fees.getFeeRate());
|
|
8
8
|
const details = {
|
|
9
9
|
...feeDetails,
|
|
10
10
|
walletAddress: deploymentData.contractAddress,
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import { Provider } from "starknet";
|
|
2
|
+
export type StarknetFeeRate = {
|
|
3
|
+
l1GasCost: bigint;
|
|
4
|
+
l2GasCost: bigint;
|
|
5
|
+
l1DataGasCost: bigint;
|
|
6
|
+
};
|
|
7
|
+
export type StarknetGas = {
|
|
8
|
+
l1Gas: number;
|
|
9
|
+
l2Gas: number;
|
|
10
|
+
l1DataGas: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function starknetGasMul(gas: StarknetGas, scalar: number): StarknetGas;
|
|
13
|
+
export declare function starknetGasAdd(a: StarknetGas, b: StarknetGas): StarknetGas;
|
|
2
14
|
export declare class StarknetFees {
|
|
3
15
|
private readonly logger;
|
|
4
16
|
private readonly feeDA;
|
|
5
17
|
private readonly nonceDA;
|
|
6
18
|
private readonly provider;
|
|
7
|
-
private readonly gasToken;
|
|
8
19
|
private readonly maxFeeRate;
|
|
9
20
|
private readonly feeMultiplierPPM;
|
|
10
21
|
private blockFeeCache;
|
|
11
|
-
constructor(provider: Provider,
|
|
22
|
+
constructor(provider: Provider, maxFeeRate?: StarknetFeeRate, feeMultiplier?: number, da?: {
|
|
12
23
|
fee?: "L1" | "L2";
|
|
13
24
|
nonce?: "L1" | "L2";
|
|
14
25
|
});
|
|
@@ -16,7 +27,7 @@ export declare class StarknetFees {
|
|
|
16
27
|
* Gets starknet fee rate
|
|
17
28
|
*
|
|
18
29
|
* @private
|
|
19
|
-
* @returns {Promise<
|
|
30
|
+
* @returns {Promise<StarknetFeeRate>} L1 gas price denominated in Wei
|
|
20
31
|
*/
|
|
21
32
|
private _getFeeRate;
|
|
22
33
|
/**
|
|
@@ -27,16 +38,23 @@ export declare class StarknetFees {
|
|
|
27
38
|
getFeeRate(): Promise<string>;
|
|
28
39
|
getDefaultGasToken(): string;
|
|
29
40
|
/**
|
|
30
|
-
* Calculates the total gas fee
|
|
41
|
+
* Calculates the total gas fee paid for a given gas limit at a given fee rate
|
|
31
42
|
*
|
|
32
43
|
* @param gas
|
|
33
44
|
* @param feeRate
|
|
34
45
|
*/
|
|
35
|
-
static getGasFee(gas:
|
|
46
|
+
static getGasFee(gas: {
|
|
47
|
+
l1DataGas: number;
|
|
48
|
+
l2Gas: number;
|
|
49
|
+
l1Gas: number;
|
|
50
|
+
}, feeRate: string): bigint;
|
|
36
51
|
static getGasToken(feeRate: string): string;
|
|
37
|
-
getFeeDetails(
|
|
38
|
-
|
|
39
|
-
|
|
52
|
+
getFeeDetails(gas: {
|
|
53
|
+
l1DataGas: number;
|
|
54
|
+
l2Gas: number;
|
|
55
|
+
l1Gas: number;
|
|
56
|
+
}, feeRate: string): {
|
|
57
|
+
version: "0x3";
|
|
40
58
|
resourceBounds: {
|
|
41
59
|
l1_gas: {
|
|
42
60
|
max_amount: string;
|
|
@@ -46,6 +64,10 @@ export declare class StarknetFees {
|
|
|
46
64
|
max_amount: string;
|
|
47
65
|
max_price_per_unit: string;
|
|
48
66
|
};
|
|
67
|
+
l1_data_gas: {
|
|
68
|
+
max_amount: string;
|
|
69
|
+
max_price_per_unit: string;
|
|
70
|
+
};
|
|
49
71
|
};
|
|
50
72
|
tip: string;
|
|
51
73
|
paymasterData: any[];
|
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StarknetFees = void 0;
|
|
3
|
+
exports.StarknetFees = exports.starknetGasAdd = exports.starknetGasMul = void 0;
|
|
4
4
|
const Utils_1 = require("../../../utils/Utils");
|
|
5
5
|
const StarknetTokens_1 = require("./StarknetTokens");
|
|
6
6
|
const MAX_FEE_AGE = 5000;
|
|
7
|
+
function starknetGasMul(gas, scalar) {
|
|
8
|
+
return { l1Gas: gas.l1Gas * scalar, l2Gas: gas.l2Gas * scalar, l1DataGas: gas.l1DataGas * scalar };
|
|
9
|
+
}
|
|
10
|
+
exports.starknetGasMul = starknetGasMul;
|
|
11
|
+
function starknetGasAdd(a, b) {
|
|
12
|
+
return { l1Gas: a.l1Gas + b.l1Gas, l2Gas: a.l2Gas + b.l2Gas, l1DataGas: a.l1DataGas + b.l1DataGas };
|
|
13
|
+
}
|
|
14
|
+
exports.starknetGasAdd = starknetGasAdd;
|
|
7
15
|
class StarknetFees {
|
|
8
|
-
constructor(provider,
|
|
16
|
+
constructor(provider, maxFeeRate = { l1GasCost: 1000000000000000n, l2GasCost: 1000000000000000n, l1DataGasCost: 1000000000000000n } /*100 * 10000 GWei*/, feeMultiplier = 1.25, da) {
|
|
9
17
|
this.logger = (0, Utils_1.getLogger)("StarknetFees: ");
|
|
10
18
|
this.blockFeeCache = null;
|
|
11
19
|
this.provider = provider;
|
|
12
|
-
this.
|
|
13
|
-
this.maxFeeRate = BigInt(maxFeeRate);
|
|
20
|
+
this.maxFeeRate = maxFeeRate;
|
|
14
21
|
this.feeDA = da?.fee ?? "L1";
|
|
15
22
|
this.nonceDA = da?.nonce ?? "L1";
|
|
16
23
|
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier * 1000000));
|
|
@@ -19,14 +26,17 @@ class StarknetFees {
|
|
|
19
26
|
* Gets starknet fee rate
|
|
20
27
|
*
|
|
21
28
|
* @private
|
|
22
|
-
* @returns {Promise<
|
|
29
|
+
* @returns {Promise<StarknetFeeRate>} L1 gas price denominated in Wei
|
|
23
30
|
*/
|
|
24
31
|
async _getFeeRate() {
|
|
25
|
-
const block = await this.provider.
|
|
26
|
-
let l1GasCost = (0, Utils_1.toBigInt)(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
const block = await this.provider.getBlock("latest");
|
|
33
|
+
let l1GasCost = (0, Utils_1.toBigInt)(block.l1_gas_price.price_in_fri) * this.feeMultiplierPPM / 1000000n;
|
|
34
|
+
let l1DataGasCost = (0, Utils_1.toBigInt)(block.l1_data_gas_price.price_in_fri) * this.feeMultiplierPPM / 1000000n;
|
|
35
|
+
let l2GasCost = (0, Utils_1.toBigInt)(block.l2_gas_price.price_in_fri) * this.feeMultiplierPPM / 1000000n;
|
|
36
|
+
this.logger.debug("_getFeeRate(): L1 fee rate: ", [l1GasCost.toString(10), l1DataGasCost.toString(10), l2GasCost.toString(10)]);
|
|
37
|
+
return {
|
|
38
|
+
l1GasCost, l2GasCost, l1DataGasCost
|
|
39
|
+
};
|
|
30
40
|
}
|
|
31
41
|
/**
|
|
32
42
|
* Gets the gas price with caching, format: <gas price in Wei>;<transaction version: v1/v3>
|
|
@@ -46,18 +56,22 @@ class StarknetFees {
|
|
|
46
56
|
});
|
|
47
57
|
this.blockFeeCache = obj;
|
|
48
58
|
}
|
|
49
|
-
let
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
59
|
+
let { l1GasCost, l2GasCost, l1DataGasCost } = await this.blockFeeCache.feeRate;
|
|
60
|
+
if (l1GasCost > this.maxFeeRate.l1GasCost)
|
|
61
|
+
l1GasCost = this.maxFeeRate.l1GasCost;
|
|
62
|
+
if (l2GasCost > this.maxFeeRate.l2GasCost)
|
|
63
|
+
l2GasCost = this.maxFeeRate.l2GasCost;
|
|
64
|
+
if (l1DataGasCost > this.maxFeeRate.l1DataGasCost)
|
|
65
|
+
l1DataGasCost = this.maxFeeRate.l1DataGasCost;
|
|
66
|
+
const fee = l1GasCost.toString(10) + "," + l2GasCost.toString(10) + "," + l1DataGasCost.toString(10) + ";v3";
|
|
53
67
|
this.logger.debug("getFeeRate(): calculated fee: " + fee);
|
|
54
68
|
return fee;
|
|
55
69
|
}
|
|
56
70
|
getDefaultGasToken() {
|
|
57
|
-
return
|
|
71
|
+
return StarknetTokens_1.StarknetTokens.ERC20_STRK;
|
|
58
72
|
}
|
|
59
73
|
/**
|
|
60
|
-
* Calculates the total gas fee
|
|
74
|
+
* Calculates the total gas fee paid for a given gas limit at a given fee rate
|
|
61
75
|
*
|
|
62
76
|
* @param gas
|
|
63
77
|
* @param feeRate
|
|
@@ -66,8 +80,10 @@ class StarknetFees {
|
|
|
66
80
|
if (feeRate == null)
|
|
67
81
|
return 0n;
|
|
68
82
|
const arr = feeRate.split(";");
|
|
69
|
-
const
|
|
70
|
-
return
|
|
83
|
+
const [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
|
|
84
|
+
return (BigInt(gas.l1Gas) * BigInt(l1GasCostStr)) +
|
|
85
|
+
(BigInt(gas.l2Gas) * BigInt(l2GasCostStr)) +
|
|
86
|
+
(BigInt(gas.l1DataGas) * BigInt(l1DataGasCostStr));
|
|
71
87
|
}
|
|
72
88
|
static getGasToken(feeRate) {
|
|
73
89
|
if (feeRate == null)
|
|
@@ -76,19 +92,17 @@ class StarknetFees {
|
|
|
76
92
|
const txVersion = arr[1];
|
|
77
93
|
return txVersion === "v1" ? StarknetTokens_1.StarknetTokens.ERC20_ETH : StarknetTokens_1.StarknetTokens.ERC20_STRK;
|
|
78
94
|
}
|
|
79
|
-
getFeeDetails(
|
|
95
|
+
getFeeDetails(gas, feeRate) {
|
|
80
96
|
if (feeRate == null)
|
|
81
97
|
return null;
|
|
82
98
|
const arr = feeRate.split(";");
|
|
83
|
-
const
|
|
84
|
-
const version = arr[1];
|
|
85
|
-
const maxFee = (0, Utils_1.toHex)(BigInt(L1GasLimit) * gasPrice, 16);
|
|
99
|
+
const [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
|
|
86
100
|
return {
|
|
87
|
-
|
|
88
|
-
version: version === "v1" ? "0x1" : "0x3",
|
|
101
|
+
version: "0x3",
|
|
89
102
|
resourceBounds: {
|
|
90
|
-
l1_gas: { max_amount: (0, Utils_1.toHex)(
|
|
91
|
-
l2_gas: { max_amount:
|
|
103
|
+
l1_gas: { max_amount: (0, Utils_1.toHex)(gas.l1Gas, 16), max_price_per_unit: (0, Utils_1.toHex)((0, Utils_1.toBigInt)(l1GasCostStr), 16) },
|
|
104
|
+
l2_gas: { max_amount: (0, Utils_1.toHex)(gas.l2Gas, 16), max_price_per_unit: (0, Utils_1.toHex)((0, Utils_1.toBigInt)(l2GasCostStr), 16) },
|
|
105
|
+
l1_data_gas: { max_amount: (0, Utils_1.toHex)(gas.l1DataGas, 16), max_price_per_unit: (0, Utils_1.toHex)((0, Utils_1.toBigInt)(l1DataGasCostStr), 16) }
|
|
92
106
|
},
|
|
93
107
|
tip: "0x0",
|
|
94
108
|
paymasterData: [],
|
|
@@ -41,7 +41,7 @@ class StarknetSignatures extends StarknetModule_1.StarknetModule {
|
|
|
41
41
|
return JSON.stringify(starknet_1.stark.formatSignature(signature));
|
|
42
42
|
}
|
|
43
43
|
async isValidSignature(signature, address, type, typeName, message) {
|
|
44
|
-
return
|
|
44
|
+
return this.provider.verifyMessageInStarknet(this.getTypedMessage(type, typeName, message), JSON.parse(signature), address);
|
|
45
45
|
}
|
|
46
46
|
///////////////////
|
|
47
47
|
//// Data signatures
|
|
@@ -5,12 +5,14 @@ export declare class StarknetTokens extends StarknetModule {
|
|
|
5
5
|
static readonly ERC20_STRK = "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d";
|
|
6
6
|
static readonly GasCosts: {
|
|
7
7
|
TRANSFER: {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
l1DataGas: number;
|
|
9
|
+
l2Gas: number;
|
|
10
|
+
l1Gas: number;
|
|
10
11
|
};
|
|
11
12
|
APPROVE: {
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
l1DataGas: number;
|
|
14
|
+
l2Gas: number;
|
|
15
|
+
l1Gas: number;
|
|
14
16
|
};
|
|
15
17
|
};
|
|
16
18
|
private getContract;
|
|
@@ -93,6 +93,6 @@ exports.StarknetTokens = StarknetTokens;
|
|
|
93
93
|
StarknetTokens.ERC20_ETH = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7";
|
|
94
94
|
StarknetTokens.ERC20_STRK = "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d";
|
|
95
95
|
StarknetTokens.GasCosts = {
|
|
96
|
-
TRANSFER: {
|
|
97
|
-
APPROVE: {
|
|
96
|
+
TRANSFER: { l1DataGas: 400, l2Gas: 4000000, l1Gas: 0 },
|
|
97
|
+
APPROVE: { l1DataGas: 400, l2Gas: 4000000, l1Gas: 0 }
|
|
98
98
|
};
|
|
@@ -360,17 +360,17 @@ class StarknetSpvVaultContract extends StarknetContractBase_1.StarknetContractBa
|
|
|
360
360
|
}
|
|
361
361
|
async getClaimFee(signer, withdrawalData, feeRate) {
|
|
362
362
|
feeRate ?? (feeRate = await this.Chain.Fees.getFeeRate());
|
|
363
|
-
return StarknetFees_1.StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.CLAIM
|
|
363
|
+
return StarknetFees_1.StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.CLAIM, feeRate);
|
|
364
364
|
}
|
|
365
365
|
async getFrontFee(signer, withdrawalData, feeRate) {
|
|
366
366
|
feeRate ?? (feeRate = await this.Chain.Fees.getFeeRate());
|
|
367
|
-
return StarknetFees_1.StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.FRONT
|
|
367
|
+
return StarknetFees_1.StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.FRONT, feeRate);
|
|
368
368
|
}
|
|
369
369
|
}
|
|
370
370
|
exports.StarknetSpvVaultContract = StarknetSpvVaultContract;
|
|
371
371
|
StarknetSpvVaultContract.GasCosts = {
|
|
372
|
-
DEPOSIT: {
|
|
373
|
-
OPEN: {
|
|
374
|
-
FRONT: {
|
|
375
|
-
CLAIM: {
|
|
372
|
+
DEPOSIT: { l1DataGas: 400, l2Gas: 4000000, l1Gas: 0 },
|
|
373
|
+
OPEN: { l1DataGas: 1200, l2Gas: 3200000, l1Gas: 0 },
|
|
374
|
+
FRONT: { l1DataGas: 800, l2Gas: 12000000, l1Gas: 0 },
|
|
375
|
+
CLAIM: { l1DataGas: 1000, l2Gas: 400000000, l1Gas: 0 }
|
|
376
376
|
};
|
|
@@ -12,6 +12,32 @@ export declare const EscrowManagerAbi: readonly [{
|
|
|
12
12
|
readonly name: "high";
|
|
13
13
|
readonly type: "core::integer::u128";
|
|
14
14
|
}];
|
|
15
|
+
}, {
|
|
16
|
+
readonly type: "struct";
|
|
17
|
+
readonly name: "escrow_manager::structs::escrow::EscrowExecution";
|
|
18
|
+
readonly members: readonly [{
|
|
19
|
+
readonly name: "contract";
|
|
20
|
+
readonly type: "core::starknet::contract_address::ContractAddress";
|
|
21
|
+
}, {
|
|
22
|
+
readonly name: "hash";
|
|
23
|
+
readonly type: "core::felt252";
|
|
24
|
+
}, {
|
|
25
|
+
readonly name: "expiry";
|
|
26
|
+
readonly type: "core::integer::u64";
|
|
27
|
+
}, {
|
|
28
|
+
readonly name: "fee";
|
|
29
|
+
readonly type: "core::integer::u256";
|
|
30
|
+
}];
|
|
31
|
+
}, {
|
|
32
|
+
readonly type: "enum";
|
|
33
|
+
readonly name: "core::option::Option::<escrow_manager::structs::escrow::EscrowExecution>";
|
|
34
|
+
readonly variants: readonly [{
|
|
35
|
+
readonly name: "Some";
|
|
36
|
+
readonly type: "escrow_manager::structs::escrow::EscrowExecution";
|
|
37
|
+
}, {
|
|
38
|
+
readonly name: "None";
|
|
39
|
+
readonly type: "()";
|
|
40
|
+
}];
|
|
15
41
|
}, {
|
|
16
42
|
readonly type: "struct";
|
|
17
43
|
readonly name: "escrow_manager::structs::escrow::EscrowData";
|
|
@@ -51,6 +77,9 @@ export declare const EscrowManagerAbi: readonly [{
|
|
|
51
77
|
}, {
|
|
52
78
|
readonly name: "claimer_bounty";
|
|
53
79
|
readonly type: "core::integer::u256";
|
|
80
|
+
}, {
|
|
81
|
+
readonly name: "success_action";
|
|
82
|
+
readonly type: "core::option::Option::<escrow_manager::structs::escrow::EscrowExecution>";
|
|
54
83
|
}];
|
|
55
84
|
}, {
|
|
56
85
|
readonly type: "struct";
|
|
@@ -21,6 +21,42 @@ exports.EscrowManagerAbi = [
|
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
23
|
},
|
|
24
|
+
{
|
|
25
|
+
"type": "struct",
|
|
26
|
+
"name": "escrow_manager::structs::escrow::EscrowExecution",
|
|
27
|
+
"members": [
|
|
28
|
+
{
|
|
29
|
+
"name": "contract",
|
|
30
|
+
"type": "core::starknet::contract_address::ContractAddress"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "hash",
|
|
34
|
+
"type": "core::felt252"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "expiry",
|
|
38
|
+
"type": "core::integer::u64"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "fee",
|
|
42
|
+
"type": "core::integer::u256"
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"type": "enum",
|
|
48
|
+
"name": "core::option::Option::<escrow_manager::structs::escrow::EscrowExecution>",
|
|
49
|
+
"variants": [
|
|
50
|
+
{
|
|
51
|
+
"name": "Some",
|
|
52
|
+
"type": "escrow_manager::structs::escrow::EscrowExecution"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "None",
|
|
56
|
+
"type": "()"
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
},
|
|
24
60
|
{
|
|
25
61
|
"type": "struct",
|
|
26
62
|
"name": "escrow_manager::structs::escrow::EscrowData",
|
|
@@ -72,6 +108,10 @@ exports.EscrowManagerAbi = [
|
|
|
72
108
|
{
|
|
73
109
|
"name": "claimer_bounty",
|
|
74
110
|
"type": "core::integer::u256"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"name": "success_action",
|
|
114
|
+
"type": "core::option::Option::<escrow_manager::structs::escrow::EscrowExecution>"
|
|
75
115
|
}
|
|
76
116
|
]
|
|
77
117
|
},
|
|
@@ -19,8 +19,8 @@ const ESCROW_STATE_COMMITTED = 1;
|
|
|
19
19
|
const ESCROW_STATE_CLAIMED = 2;
|
|
20
20
|
const ESCROW_STATE_REFUNDED = 3;
|
|
21
21
|
const swapContractAddreses = {
|
|
22
|
-
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]: "
|
|
23
|
-
[starknet_1.constants.StarknetChainId.SN_MAIN]: "
|
|
22
|
+
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]: "0x030ae7fc7bbce9b8c888b1117f5573c786dd8e1541c722227b8673ac7dda70c0",
|
|
23
|
+
[starknet_1.constants.StarknetChainId.SN_MAIN]: "0x02e1070519f27ec94dde395c8d72a5fcb144d40a786cf60b9b45395d36cc2f69"
|
|
24
24
|
};
|
|
25
25
|
const defaultClaimAddresses = {
|
|
26
26
|
[starknet_1.constants.StarknetChainId.SN_SEPOLIA]: {
|
|
@@ -258,7 +258,8 @@ class StarknetSwapData extends base_1.SwapData {
|
|
|
258
258
|
amount: starknet_1.cairo.uint256((0, Utils_1.toBigInt)(this.amount)),
|
|
259
259
|
fee_token: this.feeToken,
|
|
260
260
|
security_deposit: starknet_1.cairo.uint256((0, Utils_1.toBigInt)(this.securityDeposit)),
|
|
261
|
-
claimer_bounty: starknet_1.cairo.uint256((0, Utils_1.toBigInt)(this.claimerBounty))
|
|
261
|
+
claimer_bounty: starknet_1.cairo.uint256((0, Utils_1.toBigInt)(this.claimerBounty)),
|
|
262
|
+
success_action: new starknet_1.CairoOption(starknet_1.CairoOptionVariant.None) //For now enforce no success action
|
|
262
263
|
};
|
|
263
264
|
}
|
|
264
265
|
static fromSerializedFeltArray(span, claimHandlerImpl) {
|
|
@@ -274,6 +275,14 @@ class StarknetSwapData extends base_1.SwapData {
|
|
|
274
275
|
const feeToken = (0, Utils_1.toHex)(span.shift());
|
|
275
276
|
const securityDeposit = (0, Utils_1.toBigInt)({ low: span.shift(), high: span.shift() });
|
|
276
277
|
const claimerBounty = (0, Utils_1.toBigInt)({ low: span.shift(), high: span.shift() });
|
|
278
|
+
const hasSuccessAction = (0, Utils_1.toBigInt)(span.shift()) === 0n;
|
|
279
|
+
if (hasSuccessAction) {
|
|
280
|
+
const executionContract = (0, Utils_1.toHex)(span.shift());
|
|
281
|
+
const executionHash = (0, Utils_1.toHex)(span.shift());
|
|
282
|
+
const executionExpiry = (0, Utils_1.toBigInt)(span.shift());
|
|
283
|
+
const executionFee = (0, Utils_1.toBigInt)({ low: span.shift(), high: span.shift() });
|
|
284
|
+
// throw new Error("Success action not allowed!");
|
|
285
|
+
}
|
|
277
286
|
return new StarknetSwapData(offerer, claimer, token, refundHandler, claimHandler, payOut, payIn, reputation, sequence, claimData, refundData, amount, feeToken, securityDeposit, claimerBounty, claimHandlerImpl.getType(), null);
|
|
278
287
|
}
|
|
279
288
|
}
|
|
@@ -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
|
export interface IHandler<TCommitmentData, TWitnessData> {
|
|
6
6
|
readonly address: string;
|
|
7
7
|
getCommitment(data: TCommitmentData): BigNumberish;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ChainSwapType } from "@atomiqlabs/base";
|
|
2
|
-
import { StarknetGas } from "../../../chain/StarknetAction";
|
|
3
2
|
import { IHandler } from "../IHandler";
|
|
4
3
|
import { BigNumberish } from "starknet";
|
|
4
|
+
import { StarknetGas } from "../../../chain/modules/StarknetFees";
|
|
5
5
|
export interface IClaimHandler<C, W> extends IHandler<C, W> {
|
|
6
6
|
getType(): ChainSwapType;
|
|
7
7
|
parseWitnessResult(result: BigNumberish[]): string;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { StarknetSwapData } from "../../StarknetSwapData";
|
|
2
2
|
import { BigNumberish } from "starknet";
|
|
3
3
|
import { ChainSwapType } from "@atomiqlabs/base";
|
|
4
|
-
import { StarknetGas } from "../../../chain/StarknetAction";
|
|
5
4
|
import { Buffer } from "buffer";
|
|
6
5
|
import { StarknetTx } from "../../../chain/modules/StarknetTransactions";
|
|
7
6
|
import { IClaimHandler } from "./ClaimHandlers";
|
|
7
|
+
import { StarknetGas } from "../../../chain/modules/StarknetFees";
|
|
8
8
|
export declare class HashlockClaimHandler implements IClaimHandler<Buffer, string> {
|
|
9
9
|
readonly address: string;
|
|
10
10
|
static readonly type: ChainSwapType;
|
|
@@ -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 { BitcoinCommitmentData, IBitcoinClaimHandler } from "./IBitcoinClaimHandler";
|
|
7
6
|
import { BitcoinOutputWitnessData } from "./BitcoinOutputClaimHandler";
|
|
8
7
|
import { Buffer } from "buffer";
|
|
8
|
+
import { StarknetGas } from "../../../../chain/modules/StarknetFees";
|
|
9
9
|
export type BitcoinNoncedOutputCommitmentData = {
|
|
10
10
|
output: Buffer;
|
|
11
11
|
amount: bigint;
|
|
@@ -45,4 +45,4 @@ class BitcoinNoncedOutputClaimHandler extends IBitcoinClaimHandler_1.IBitcoinCla
|
|
|
45
45
|
}
|
|
46
46
|
exports.BitcoinNoncedOutputClaimHandler = BitcoinNoncedOutputClaimHandler;
|
|
47
47
|
BitcoinNoncedOutputClaimHandler.type = base_1.ChainSwapType.CHAIN_NONCED;
|
|
48
|
-
BitcoinNoncedOutputClaimHandler.gas = {
|
|
48
|
+
BitcoinNoncedOutputClaimHandler.gas = { l1DataGas: 0, l2Gas: 20000 * 40000, l1Gas: 0 };
|
|
@@ -1,10 +1,10 @@
|
|
|
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 { BitcoinCommitmentData, BitcoinWitnessData, IBitcoinClaimHandler } from "./IBitcoinClaimHandler";
|
|
7
6
|
import { Buffer } from "buffer";
|
|
7
|
+
import { StarknetGas } from "../../../../chain/modules/StarknetFees";
|
|
8
8
|
export type BitcoinOutputCommitmentData = {
|
|
9
9
|
output: Buffer;
|
|
10
10
|
amount: bigint;
|
|
@@ -37,4 +37,4 @@ class BitcoinOutputClaimHandler extends IBitcoinClaimHandler_1.IBitcoinClaimHand
|
|
|
37
37
|
}
|
|
38
38
|
exports.BitcoinOutputClaimHandler = BitcoinOutputClaimHandler;
|
|
39
39
|
BitcoinOutputClaimHandler.type = base_1.ChainSwapType.CHAIN;
|
|
40
|
-
BitcoinOutputClaimHandler.gas = {
|
|
40
|
+
BitcoinOutputClaimHandler.gas = { l1DataGas: 0, l2Gas: 20000 * 40000, l1Gas: 0 };
|