@atomiqlabs/chain-starknet 4.0.0-dev.8 → 5.0.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/dist/starknet/StarknetInitializer.d.ts +1 -9
- package/dist/starknet/StarknetInitializer.js +3 -8
- package/dist/starknet/btcrelay/StarknetBtcRelay.js +5 -5
- package/dist/starknet/chain/StarknetAction.d.ts +10 -2
- 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 +8 -30
- package/dist/starknet/chain/modules/StarknetFees.js +26 -40
- package/dist/starknet/chain/modules/StarknetSignatures.js +1 -1
- package/dist/starknet/chain/modules/StarknetTokens.d.ts +4 -6
- 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 +2 -1
- package/dist/starknet/events/StarknetChainEventsBrowser.js +3 -1
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.d.ts +2 -3
- package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +8 -14
- package/dist/starknet/spv_swap/StarknetSpvVaultData.js +0 -1
- package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.d.ts +0 -1
- package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.js +0 -11
- package/dist/starknet/swaps/EscrowManagerAbi.d.ts +0 -26
- package/dist/starknet/swaps/EscrowManagerAbi.js +0 -36
- package/dist/starknet/swaps/StarknetSwapContract.d.ts +2 -3
- package/dist/starknet/swaps/StarknetSwapContract.js +19 -6
- package/dist/starknet/swaps/StarknetSwapData.d.ts +1 -8
- package/dist/starknet/swaps/StarknetSwapData.js +7 -51
- 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.d.ts +0 -1
- package/dist/starknet/swaps/modules/StarknetSwapInit.js +8 -67
- package/dist/starknet/swaps/modules/StarknetSwapRefund.js +4 -4
- package/dist/utils/Utils.js +8 -12
- package/package.json +3 -3
- package/src/starknet/StarknetInitializer.ts +4 -17
- package/src/starknet/btcrelay/StarknetBtcRelay.ts +6 -9
- package/src/starknet/chain/StarknetAction.ts +20 -15
- package/src/starknet/chain/modules/StarknetAccounts.ts +1 -1
- package/src/starknet/chain/modules/StarknetFees.ts +31 -53
- package/src/starknet/chain/modules/StarknetSignatures.ts +4 -5
- package/src/starknet/chain/modules/StarknetTokens.ts +2 -2
- package/src/starknet/chain/modules/StarknetTransactions.ts +2 -2
- package/src/starknet/events/StarknetChainEventsBrowser.ts +3 -1
- package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +8 -14
- package/src/starknet/spv_swap/StarknetSpvVaultData.ts +0 -1
- package/src/starknet/spv_swap/StarknetSpvWithdrawalData.ts +2 -13
- package/src/starknet/swaps/EscrowManagerAbi.ts +0 -36
- package/src/starknet/swaps/StarknetSwapContract.ts +23 -8
- package/src/starknet/swaps/StarknetSwapData.ts +9 -70
- 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 +9 -67
- package/src/starknet/swaps/modules/StarknetSwapRefund.ts +7 -6
- package/src/utils/Utils.ts +6 -10
|
@@ -22,7 +22,7 @@ class StarknetSwapRefund extends StarknetSwapModule_1.StarknetSwapModule {
|
|
|
22
22
|
* @private
|
|
23
23
|
*/
|
|
24
24
|
Refund(signer, swapData, witness, handlerGas) {
|
|
25
|
-
return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness), (0,
|
|
25
|
+
return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness), (0, StarknetAction_1.sumStarknetGas)(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, handlerGas));
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
28
|
* Action for cooperative refunding with signature
|
|
@@ -118,11 +118,11 @@ class StarknetSwapRefund extends StarknetSwapModule_1.StarknetSwapModule {
|
|
|
118
118
|
*/
|
|
119
119
|
async getRefundFee(swapData, feeRate) {
|
|
120
120
|
feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
|
|
121
|
-
return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, feeRate);
|
|
121
|
+
return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT.l1 : StarknetSwapRefund.GasCosts.REFUND.l1, feeRate);
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
exports.StarknetSwapRefund = StarknetSwapRefund;
|
|
125
125
|
StarknetSwapRefund.GasCosts = {
|
|
126
|
-
REFUND: {
|
|
127
|
-
REFUND_PAY_OUT: {
|
|
126
|
+
REFUND: { l1: 750, l2: 0 },
|
|
127
|
+
REFUND_PAY_OUT: { l1: 1250, l2: 0 }
|
|
128
128
|
};
|
package/dist/utils/Utils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.findLastIndex = exports.parseInitFunctionCalldata = exports.poseidonHashRange = exports.bufferToByteArray = exports.bufferToBytes31Span = exports.bytes31SpanToBuffer = exports.toBigInt = exports.bigNumberishToBuffer = exports.u32ReverseEndianness = exports.bufferToU32Array = exports.u32ArrayToBuffer = exports.calculateHash = exports.toHex = exports.tryWithRetries = exports.getLogger = exports.onceAsync = exports.timeoutPromise = exports.isUint256 = void 0;
|
|
4
|
-
const
|
|
4
|
+
const starknet_types_07_1 = require("starknet-types-07");
|
|
5
5
|
const starknet_1 = require("starknet");
|
|
6
6
|
const buffer_1 = require("buffer");
|
|
7
7
|
const StarknetSwapData_1 = require("../starknet/swaps/StarknetSwapData");
|
|
@@ -35,14 +35,10 @@ function onceAsync(executor) {
|
|
|
35
35
|
exports.onceAsync = onceAsync;
|
|
36
36
|
function getLogger(prefix) {
|
|
37
37
|
return {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// @ts-ignore
|
|
43
|
-
warn: (msg, ...args) => (global.atomiqLogLevel == null || global.atomiqLogLevel >= 1) && console.warn(prefix + msg, ...args),
|
|
44
|
-
// @ts-ignore
|
|
45
|
-
error: (msg, ...args) => (global.atomiqLogLevel == null || global.atomiqLogLevel >= 0) && console.error(prefix + msg, ...args)
|
|
38
|
+
debug: (msg, ...args) => console.debug(prefix + msg, ...args),
|
|
39
|
+
info: (msg, ...args) => console.info(prefix + msg, ...args),
|
|
40
|
+
warn: (msg, ...args) => console.warn(prefix + msg, ...args),
|
|
41
|
+
error: (msg, ...args) => console.error(prefix + msg, ...args)
|
|
46
42
|
};
|
|
47
43
|
}
|
|
48
44
|
exports.getLogger = getLogger;
|
|
@@ -79,7 +75,7 @@ function toHex(value, length = 64) {
|
|
|
79
75
|
switch (typeof (value)) {
|
|
80
76
|
case "string":
|
|
81
77
|
if (value.startsWith("0x")) {
|
|
82
|
-
return "0x" + value.slice(2).padStart(length, "0")
|
|
78
|
+
return "0x" + value.slice(2).padStart(length, "0");
|
|
83
79
|
}
|
|
84
80
|
else {
|
|
85
81
|
return "0x" + BigInt(value).toString(16).padStart(length, "0");
|
|
@@ -98,8 +94,8 @@ function calculateHash(tx) {
|
|
|
98
94
|
chainId: tx.details.chainId,
|
|
99
95
|
nonce: tx.details.nonce,
|
|
100
96
|
accountDeploymentData: tx.details.version === "0x3" ? tx.details.accountDeploymentData : null,
|
|
101
|
-
nonceDataAvailabilityMode: tx.details.version === "0x3" ?
|
|
102
|
-
feeDataAvailabilityMode: tx.details.version === "0x3" ?
|
|
97
|
+
nonceDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_07_1.EDAMode[tx.details.nonceDataAvailabilityMode] : null,
|
|
98
|
+
feeDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_07_1.EDAMode[tx.details.feeDataAvailabilityMode] : null,
|
|
103
99
|
resourceBounds: tx.details.version === "0x3" ? tx.details.resourceBounds : null,
|
|
104
100
|
tip: tx.details.version === "0x3" ? tx.details.tip : null,
|
|
105
101
|
paymasterData: tx.details.version === "0x3" ? tx.details.paymasterData : null
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atomiqlabs/chain-starknet",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "Starknet specific base implementation",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types:": "./dist/index.d.ts",
|
|
@@ -22,14 +22,14 @@
|
|
|
22
22
|
"author": "adambor",
|
|
23
23
|
"license": "ISC",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@atomiqlabs/base": "^
|
|
25
|
+
"@atomiqlabs/base": "^11.0.0",
|
|
26
26
|
"@noble/hashes": "^1.7.1",
|
|
27
27
|
"@scure/btc-signer": "1.6.0",
|
|
28
28
|
"abi-wan-kanabi": "2.2.4",
|
|
29
29
|
"buffer": "6.0.3"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
|
-
"starknet": "^
|
|
32
|
+
"starknet": "^6.11.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"typescript": "4.9.5"
|
|
@@ -4,7 +4,7 @@ import {StarknetChainInterface, StarknetRetryPolicy} from "./chain/StarknetChain
|
|
|
4
4
|
import {StarknetBtcRelay} from "./btcrelay/StarknetBtcRelay";
|
|
5
5
|
import {StarknetSwapContract} from "./swaps/StarknetSwapContract";
|
|
6
6
|
import {StarknetChainEventsBrowser} from "./events/StarknetChainEventsBrowser";
|
|
7
|
-
import {BaseTokenType, BitcoinNetwork, BitcoinRpc, ChainData, ChainInitializer
|
|
7
|
+
import {BaseTokenType, BitcoinNetwork, BitcoinRpc, ChainData, ChainInitializer} from "@atomiqlabs/base";
|
|
8
8
|
import {StarknetChainType} from "./StarknetChainType";
|
|
9
9
|
import {StarknetSwapData} from "./swaps/StarknetSwapData";
|
|
10
10
|
import {StarknetSpvVaultContract} from "./spv_swap/StarknetSpvVaultContract";
|
|
@@ -27,12 +27,7 @@ export const StarknetAssets: StarknetAssetsType = {
|
|
|
27
27
|
WBTC: {
|
|
28
28
|
address: "0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac",
|
|
29
29
|
decimals: 8
|
|
30
|
-
}
|
|
31
|
-
// TBTC: {
|
|
32
|
-
// address: "0x04daa17763b286d1e59b97c283C0b8C949994C361e426A28F743c67bDfE9a32f",
|
|
33
|
-
// decimals: 18,
|
|
34
|
-
// displayDecimals: 8
|
|
35
|
-
// }
|
|
30
|
+
}
|
|
36
31
|
} as const;
|
|
37
32
|
|
|
38
33
|
export type StarknetOptions = {
|
|
@@ -43,14 +38,6 @@ export type StarknetOptions = {
|
|
|
43
38
|
swapContract?: string,
|
|
44
39
|
btcRelayContract?: string,
|
|
45
40
|
spvVaultContract?: string,
|
|
46
|
-
handlerContracts?: {
|
|
47
|
-
refund?: {
|
|
48
|
-
timelock?: string
|
|
49
|
-
},
|
|
50
|
-
claim?: {
|
|
51
|
-
[type in ChainSwapType]?: string
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
41
|
|
|
55
42
|
fees?: StarknetFees
|
|
56
43
|
}
|
|
@@ -64,7 +51,7 @@ export function initializeStarknet(
|
|
|
64
51
|
new RpcProviderWithRetries({nodeUrl: options.rpcUrl}) :
|
|
65
52
|
options.rpcUrl;
|
|
66
53
|
|
|
67
|
-
const Fees = options.fees ?? new StarknetFees(provider);
|
|
54
|
+
const Fees = options.fees ?? new StarknetFees(provider, "STRK");
|
|
68
55
|
|
|
69
56
|
const chainId = options.chainId ??
|
|
70
57
|
(network===BitcoinNetwork.MAINNET ? constants.StarknetChainId.SN_MAIN : constants.StarknetChainId.SN_SEPOLIA);
|
|
@@ -76,7 +63,7 @@ export function initializeStarknet(
|
|
|
76
63
|
);
|
|
77
64
|
|
|
78
65
|
const swapContract = new StarknetSwapContract(
|
|
79
|
-
chainInterface, btcRelay, options.swapContract
|
|
66
|
+
chainInterface, btcRelay, options.swapContract
|
|
80
67
|
);
|
|
81
68
|
|
|
82
69
|
const spvVaultContract = new StarknetSpvVaultContract(
|
|
@@ -13,7 +13,7 @@ import {StarknetTx} from "../chain/modules/StarknetTransactions";
|
|
|
13
13
|
import {StarknetSigner} from "../wallet/StarknetSigner";
|
|
14
14
|
import {BtcRelayAbi} from "./BtcRelayAbi";
|
|
15
15
|
import {BigNumberish, hash} from "starknet";
|
|
16
|
-
import {StarknetFees
|
|
16
|
+
import {StarknetFees} from "../chain/modules/StarknetFees";
|
|
17
17
|
import {StarknetChainInterface} from "../chain/StarknetChainInterface";
|
|
18
18
|
import {StarknetAction} from "../chain/StarknetAction";
|
|
19
19
|
|
|
@@ -29,8 +29,8 @@ function serializeBlockHeader(e: BtcBlock): StarknetBtcHeader {
|
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
const GAS_PER_BLOCKHEADER =
|
|
33
|
-
const GAS_PER_BLOCKHEADER_FORK =
|
|
32
|
+
const GAS_PER_BLOCKHEADER = 850;
|
|
33
|
+
const GAS_PER_BLOCKHEADER_FORK = 1000;
|
|
34
34
|
|
|
35
35
|
const btcRelayAddreses = {
|
|
36
36
|
[BitcoinNetwork.TESTNET4]: "0x0099b63f39f0cabb767361de3d8d3e97212351a51540e2687c2571f4da490dbe",
|
|
@@ -62,7 +62,7 @@ export class StarknetBtcRelay<B extends BtcBlock>
|
|
|
62
62
|
entrypoint: "submit_main_blockheaders",
|
|
63
63
|
calldata: serializeCalldata(mainHeaders, storedHeader, [])
|
|
64
64
|
},
|
|
65
|
-
|
|
65
|
+
{l1: GAS_PER_BLOCKHEADER * mainHeaders.length, l2: 0}
|
|
66
66
|
)
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -73,7 +73,7 @@ export class StarknetBtcRelay<B extends BtcBlock>
|
|
|
73
73
|
entrypoint: "submit_short_fork_blockheaders",
|
|
74
74
|
calldata: serializeCalldata(forkHeaders, storedHeader, [])
|
|
75
75
|
},
|
|
76
|
-
|
|
76
|
+
{l1: GAS_PER_BLOCKHEADER * forkHeaders.length, l2: 0}
|
|
77
77
|
)
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -84,10 +84,7 @@ export class StarknetBtcRelay<B extends BtcBlock>
|
|
|
84
84
|
entrypoint: "submit_fork_blockheaders",
|
|
85
85
|
calldata: serializeCalldata(forkHeaders, storedHeader, [toHex(forkId)])
|
|
86
86
|
},
|
|
87
|
-
|
|
88
|
-
starknetGasMul(GAS_PER_BLOCKHEADER, forkHeaders.length),
|
|
89
|
-
starknetGasMul(GAS_PER_BLOCKHEADER_FORK, totalForkHeaders)
|
|
90
|
-
)
|
|
87
|
+
{l1: (GAS_PER_BLOCKHEADER * forkHeaders.length) + (GAS_PER_BLOCKHEADER_FORK * totalForkHeaders), l2: 0}
|
|
91
88
|
)
|
|
92
89
|
}
|
|
93
90
|
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import {Call} from "starknet";
|
|
2
2
|
import {StarknetChainInterface} from "./StarknetChainInterface";
|
|
3
3
|
import {StarknetTx} from "./modules/StarknetTransactions";
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
export type StarknetGas = {l1?: number, l2?: number};
|
|
6
|
+
|
|
7
|
+
export function sumStarknetGas(a: StarknetGas, b: StarknetGas) {
|
|
8
|
+
return {
|
|
9
|
+
l1: (a?.l1 ?? 0) + (b?.l1 ?? 0),
|
|
10
|
+
l2: (a?.l2 ?? 0) + (b?.l2 ?? 0)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
5
13
|
|
|
6
14
|
export class StarknetAction {
|
|
7
15
|
|
|
8
|
-
|
|
16
|
+
L1GasLimit: number;
|
|
17
|
+
L2GasLimit: number;
|
|
9
18
|
readonly mainSigner: string;
|
|
10
19
|
private readonly root: StarknetChainInterface;
|
|
11
20
|
private readonly instructions: Call[];
|
|
@@ -21,11 +30,8 @@ export class StarknetAction {
|
|
|
21
30
|
this.mainSigner = mainSigner;
|
|
22
31
|
this.root = root;
|
|
23
32
|
this.instructions = Array.isArray(instructions) ? instructions : [instructions];
|
|
24
|
-
this.
|
|
25
|
-
|
|
26
|
-
l2Gas: gasLimit?.l2Gas ?? 0,
|
|
27
|
-
l1DataGas: gasLimit?.l1DataGas ?? 0,
|
|
28
|
-
};
|
|
33
|
+
this.L1GasLimit = gasLimit?.l1 ?? 0;
|
|
34
|
+
this.L2GasLimit = gasLimit?.l2 ?? 0;
|
|
29
35
|
this.feeRate = feeRate;
|
|
30
36
|
}
|
|
31
37
|
|
|
@@ -35,7 +41,8 @@ export class StarknetAction {
|
|
|
35
41
|
|
|
36
42
|
public addIx(instruction: Call, gasLimit?: StarknetGas) {
|
|
37
43
|
this.instructions.push(instruction);
|
|
38
|
-
this.
|
|
44
|
+
this.L1GasLimit += gasLimit?.l1 ?? 0;
|
|
45
|
+
this.L2GasLimit += gasLimit?.l2 ?? 0;
|
|
39
46
|
}
|
|
40
47
|
|
|
41
48
|
public add(action: StarknetAction): this {
|
|
@@ -44,12 +51,10 @@ export class StarknetAction {
|
|
|
44
51
|
|
|
45
52
|
public addAction(action: StarknetAction, index: number = this.instructions.length): this {
|
|
46
53
|
if(action.mainSigner!==this.mainSigner) throw new Error("Actions need to have the same signer!");
|
|
47
|
-
if(this.
|
|
48
|
-
if(this.
|
|
49
|
-
if(this.
|
|
50
|
-
if(this.
|
|
51
|
-
if(this.gas.l2Gas!=null && action.gas.l2Gas!=null) this.gas.l2Gas += action.gas.l2Gas;
|
|
52
|
-
if(this.gas.l1DataGas!=null && action.gas.l1DataGas!=null) this.gas.l1DataGas += action.gas.l1DataGas;
|
|
54
|
+
if(this.L1GasLimit==null && action.L1GasLimit!=null) this.L1GasLimit = action.L1GasLimit;
|
|
55
|
+
if(this.L2GasLimit==null && action.L2GasLimit!=null) this.L2GasLimit = action.L2GasLimit;
|
|
56
|
+
if(this.L1GasLimit!=null && action.L1GasLimit!=null) this.L1GasLimit += action.L1GasLimit;
|
|
57
|
+
if(this.L2GasLimit!=null && action.L2GasLimit!=null) this.L2GasLimit += action.L2GasLimit;
|
|
53
58
|
this.instructions.splice(index, 0, ...action.instructions);
|
|
54
59
|
if(this.feeRate==null) this.feeRate = action.feeRate;
|
|
55
60
|
return this;
|
|
@@ -63,7 +68,7 @@ export class StarknetAction {
|
|
|
63
68
|
type: "INVOKE",
|
|
64
69
|
tx: this.instructions,
|
|
65
70
|
details: {
|
|
66
|
-
...this.root.Fees.getFeeDetails(this.
|
|
71
|
+
...this.root.Fees.getFeeDetails(this.L1GasLimit, this.L2GasLimit, feeRate),
|
|
67
72
|
walletAddress: this.mainSigner,
|
|
68
73
|
cairoVersion: "1",
|
|
69
74
|
chainId: this.root.starknetChainId,
|
|
@@ -6,7 +6,7 @@ import {DeployAccountContractPayload} from "starknet";
|
|
|
6
6
|
export class StarknetAccounts extends StarknetModule {
|
|
7
7
|
|
|
8
8
|
public async getAccountDeployTransaction(deploymentData: DeployAccountContractPayload): Promise<StarknetTx> {
|
|
9
|
-
const feeDetails = this.root.Fees.getFeeDetails(
|
|
9
|
+
const feeDetails = this.root.Fees.getFeeDetails(5000, 0, await this.root.Fees.getFeeRate());
|
|
10
10
|
const details = {
|
|
11
11
|
...feeDetails,
|
|
12
12
|
walletAddress: deploymentData.contractAddress,
|
|
@@ -4,26 +4,6 @@ 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
|
-
|
|
27
7
|
export class StarknetFees {
|
|
28
8
|
|
|
29
9
|
private readonly logger = getLogger("StarknetFees: ");
|
|
@@ -31,22 +11,25 @@ export class StarknetFees {
|
|
|
31
11
|
private readonly feeDA: "L1" | "L2";
|
|
32
12
|
private readonly nonceDA: "L1" | "L2";
|
|
33
13
|
private readonly provider: Provider;
|
|
34
|
-
private readonly
|
|
14
|
+
private readonly gasToken: "ETH" | "STRK";
|
|
15
|
+
private readonly maxFeeRate: bigint;
|
|
35
16
|
private readonly feeMultiplierPPM: bigint;
|
|
36
17
|
|
|
37
18
|
private blockFeeCache: {
|
|
38
19
|
timestamp: number,
|
|
39
|
-
feeRate: Promise<
|
|
20
|
+
feeRate: Promise<bigint>
|
|
40
21
|
} = null;
|
|
41
22
|
|
|
42
23
|
constructor(
|
|
43
24
|
provider: Provider,
|
|
44
|
-
|
|
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*/,
|
|
45
27
|
feeMultiplier: number = 1.25,
|
|
46
28
|
da?: {fee?: "L1" | "L2", nonce?: "L1" | "L2"}
|
|
47
29
|
) {
|
|
48
30
|
this.provider = provider;
|
|
49
|
-
this.
|
|
31
|
+
this.gasToken = gasToken;
|
|
32
|
+
this.maxFeeRate = BigInt(maxFeeRate);
|
|
50
33
|
this.feeDA = da?.fee ?? "L1";
|
|
51
34
|
this.nonceDA = da?.nonce ?? "L1";
|
|
52
35
|
this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier*1000000));
|
|
@@ -56,20 +39,16 @@ export class StarknetFees {
|
|
|
56
39
|
* Gets starknet fee rate
|
|
57
40
|
*
|
|
58
41
|
* @private
|
|
59
|
-
* @returns {Promise<
|
|
42
|
+
* @returns {Promise<BN>} L1 gas price denominated in Wei
|
|
60
43
|
*/
|
|
61
|
-
private async _getFeeRate(): Promise<
|
|
62
|
-
const block = await this.provider.
|
|
63
|
-
|
|
64
|
-
|
|
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;
|
|
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;
|
|
67
48
|
|
|
68
|
-
this.logger.debug("_getFeeRate(): L1 fee rate: "
|
|
49
|
+
this.logger.debug("_getFeeRate(): L1 fee rate: "+l1GasCost.toString(10));
|
|
69
50
|
|
|
70
|
-
return
|
|
71
|
-
l1GasCost, l2GasCost, l1DataGasCost
|
|
72
|
-
};
|
|
51
|
+
return l1GasCost;
|
|
73
52
|
}
|
|
74
53
|
|
|
75
54
|
/**
|
|
@@ -90,12 +69,10 @@ export class StarknetFees {
|
|
|
90
69
|
this.blockFeeCache = obj;
|
|
91
70
|
}
|
|
92
71
|
|
|
93
|
-
let
|
|
94
|
-
if(
|
|
95
|
-
if(l2GasCost>this.maxFeeRate.l2GasCost) l2GasCost = this.maxFeeRate.l2GasCost;
|
|
96
|
-
if(l1DataGasCost>this.maxFeeRate.l1DataGasCost) l1DataGasCost = this.maxFeeRate.l1DataGasCost;
|
|
72
|
+
let feeRate = await this.blockFeeCache.feeRate;
|
|
73
|
+
if(feeRate>this.maxFeeRate) feeRate = this.maxFeeRate;
|
|
97
74
|
|
|
98
|
-
const fee =
|
|
75
|
+
const fee = feeRate.toString(10)+";"+(this.gasToken === "ETH" ? "v1" : "v3");
|
|
99
76
|
|
|
100
77
|
this.logger.debug("getFeeRate(): calculated fee: "+fee);
|
|
101
78
|
|
|
@@ -103,24 +80,22 @@ export class StarknetFees {
|
|
|
103
80
|
}
|
|
104
81
|
|
|
105
82
|
public getDefaultGasToken(): string {
|
|
106
|
-
return StarknetTokens.ERC20_STRK;
|
|
83
|
+
return this.gasToken==="ETH" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
107
84
|
}
|
|
108
85
|
|
|
109
86
|
/**
|
|
110
|
-
* Calculates the total gas fee paid for a given gas limit at a given fee rate
|
|
87
|
+
* Calculates the total gas fee fee paid for a given gas limit at a given fee rate
|
|
111
88
|
*
|
|
112
89
|
* @param gas
|
|
113
90
|
* @param feeRate
|
|
114
91
|
*/
|
|
115
|
-
public static getGasFee(gas:
|
|
92
|
+
public static getGasFee(gas: number, feeRate: string): bigint {
|
|
116
93
|
if(feeRate==null) return 0n;
|
|
117
94
|
|
|
118
95
|
const arr = feeRate.split(";");
|
|
119
|
-
const
|
|
96
|
+
const gasPrice = BigInt(arr[0]);
|
|
120
97
|
|
|
121
|
-
return
|
|
122
|
-
(BigInt(gas.l2Gas) * BigInt(l2GasCostStr)) +
|
|
123
|
-
(BigInt(gas.l1DataGas) * BigInt(l1DataGasCostStr));
|
|
98
|
+
return gasPrice * BigInt(gas);
|
|
124
99
|
}
|
|
125
100
|
|
|
126
101
|
public static getGasToken(feeRate: string): string {
|
|
@@ -132,18 +107,21 @@ export class StarknetFees {
|
|
|
132
107
|
return txVersion==="v1" ? StarknetTokens.ERC20_ETH : StarknetTokens.ERC20_STRK;
|
|
133
108
|
}
|
|
134
109
|
|
|
135
|
-
getFeeDetails(
|
|
110
|
+
getFeeDetails(L1GasLimit: number, L2GasLimit: number, feeRate: string) {
|
|
136
111
|
if(feeRate==null) return null;
|
|
137
112
|
|
|
138
113
|
const arr = feeRate.split(";");
|
|
139
|
-
const
|
|
114
|
+
const gasPrice = BigInt(arr[0]);
|
|
115
|
+
const version = arr[1] as "v1" | "v3";
|
|
116
|
+
|
|
117
|
+
const maxFee = toHex(BigInt(L1GasLimit) * gasPrice, 16);
|
|
140
118
|
|
|
141
119
|
return {
|
|
142
|
-
|
|
120
|
+
maxFee: maxFee,
|
|
121
|
+
version: version==="v1" ? "0x1" : "0x3" as "0x1" | "0x3",
|
|
143
122
|
resourceBounds: {
|
|
144
|
-
l1_gas: {max_amount: toHex(
|
|
145
|
-
l2_gas: {max_amount:
|
|
146
|
-
l1_data_gas: {max_amount: toHex(gas.l1DataGas, 16), max_price_per_unit: toHex(BigInt(l1DataGasCostStr), 16)}
|
|
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"}
|
|
147
125
|
},
|
|
148
126
|
tip: "0x0",
|
|
149
127
|
paymasterData: [],
|
|
@@ -54,12 +54,11 @@ 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 this.provider.
|
|
57
|
+
public async isValidSignature(signature: string, address: string, type: StarknetType[], typeName: string, message: object) {
|
|
58
|
+
return new Account(this.provider, address, null).verifyMessage(
|
|
59
59
|
this.getTypedMessage(type, typeName, message),
|
|
60
|
-
JSON.parse(signature)
|
|
61
|
-
|
|
62
|
-
);
|
|
60
|
+
JSON.parse(signature)
|
|
61
|
+
)
|
|
63
62
|
}
|
|
64
63
|
|
|
65
64
|
///////////////////
|
|
@@ -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: {l1: 400, l2: 0},
|
|
16
|
+
APPROVE: {l1: 400, l2: 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
|
+
console.error("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
|
+
console.debug("StarknetTransactions: 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
|
+
* Solana on-chain event handler for front-end systems without access to fs, uses pure WS 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,6 +44,7 @@ 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[] = [];
|
|
47
48
|
protected readonly logger = getLogger("StarknetChainEventsBrowser: ");
|
|
48
49
|
|
|
49
50
|
protected initFunctionName: ExtractAbiFunctionNames<EscrowManagerAbiType> = "initialize";
|
|
@@ -393,6 +394,7 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
|
|
|
393
394
|
async stop(): Promise<void> {
|
|
394
395
|
this.stopped = true;
|
|
395
396
|
if(this.timeout!=null) clearTimeout(this.timeout);
|
|
397
|
+
this.eventListeners = [];
|
|
396
398
|
}
|
|
397
399
|
|
|
398
400
|
registerListener(cbk: EventListener<StarknetSwapData>): void {
|
|
@@ -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: {l1: 750, l2: 0},
|
|
55
|
+
OPEN: {l1: 1500, l2: 0},
|
|
56
|
+
FRONT: {l1: 750, l2: 0},
|
|
57
|
+
CLAIM: {l1: 10000, l2: 0}
|
|
58
58
|
};
|
|
59
59
|
|
|
60
60
|
readonly chainId = "STARKNET";
|
|
@@ -192,12 +192,6 @@ export class StarknetSpvVaultContract
|
|
|
192
192
|
return vaults;
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
-
async getFronterAddress(owner: string, vaultId: bigint, withdrawal: StarknetSpvWithdrawalData): Promise<string | null> {
|
|
196
|
-
const fronterAddress = await this.contract.get_fronter_address_by_id(owner, vaultId, "0x"+withdrawal.getFrontingId());
|
|
197
|
-
if(toHex(fronterAddress, 64)==="0x0000000000000000000000000000000000000000000000000000000000000000") return null;
|
|
198
|
-
return fronterAddress;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
195
|
async getWithdrawalState(btcTxId: string): Promise<SpvWithdrawalState> {
|
|
202
196
|
const txHash = Buffer.from(btcTxId, "hex").reverse();
|
|
203
197
|
const txHashU256 = cairo.uint256("0x"+txHash.toString("hex"));
|
|
@@ -470,14 +464,14 @@ export class StarknetSpvVaultContract
|
|
|
470
464
|
return [await action.tx(feeRate)];
|
|
471
465
|
}
|
|
472
466
|
|
|
473
|
-
async getClaimFee(signer: string,
|
|
467
|
+
async getClaimFee(signer: string, withdrawalData: StarknetSpvWithdrawalData, feeRate?: string): Promise<bigint> {
|
|
474
468
|
feeRate ??= await this.Chain.Fees.getFeeRate();
|
|
475
|
-
return StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.CLAIM, feeRate);
|
|
469
|
+
return StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.CLAIM.l1, feeRate);
|
|
476
470
|
}
|
|
477
471
|
|
|
478
|
-
async getFrontFee(signer: string,
|
|
472
|
+
async getFrontFee(signer: string, withdrawalData: StarknetSpvWithdrawalData, feeRate?: string): Promise<bigint> {
|
|
479
473
|
feeRate ??= await this.Chain.Fees.getFeeRate();
|
|
480
|
-
return StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.FRONT, feeRate);
|
|
474
|
+
return StarknetFees.getGasFee(StarknetSpvVaultContract.GasCosts.FRONT.l1, feeRate);
|
|
481
475
|
}
|
|
482
476
|
|
|
483
477
|
}
|
|
@@ -148,7 +148,6 @@ 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,
|
|
152
151
|
initialUtxo: this.initialUtxo
|
|
153
152
|
}
|
|
154
153
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {SpvWithdrawalTransactionData} from "@atomiqlabs/base";
|
|
2
2
|
import {Buffer} from "buffer";
|
|
3
|
-
import {BigNumberish, cairo
|
|
3
|
+
import {BigNumberish, cairo} from "starknet";
|
|
4
4
|
import {toBigInt} from "../../utils/Utils";
|
|
5
5
|
import {StarknetSpvVaultContract} from "./StarknetSpvVaultContract";
|
|
6
6
|
|
|
@@ -63,17 +63,6 @@ export class StarknetSpvWithdrawalData extends SpvWithdrawalTransactionData {
|
|
|
63
63
|
]
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
getFrontingId(): string {
|
|
67
|
-
const txHashU256 = cairo.uint256(BigIntBufferUtils.fromBuffer(Buffer.from(this.btcTx.txid), "le"));
|
|
68
|
-
let frontingId = hash.computePoseidonHashOnElements([
|
|
69
|
-
txHashU256.low,
|
|
70
|
-
txHashU256.high,
|
|
71
|
-
...this.serializeToFelts()
|
|
72
|
-
]);
|
|
73
|
-
if(frontingId.startsWith("0x")) frontingId = frontingId.slice(2);
|
|
74
|
-
return frontingId.padStart(64, "0");
|
|
75
|
-
}
|
|
76
|
-
|
|
77
66
|
}
|
|
78
67
|
|
|
79
68
|
SpvWithdrawalTransactionData.deserializers["STARKNET"] = StarknetSpvWithdrawalData;
|
|
@@ -18,38 +18,6 @@ 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
|
-
},
|
|
53
21
|
{
|
|
54
22
|
"type": "struct",
|
|
55
23
|
"name": "escrow_manager::structs::escrow::EscrowData",
|
|
@@ -101,10 +69,6 @@ export const EscrowManagerAbi = [
|
|
|
101
69
|
{
|
|
102
70
|
"name": "claimer_bounty",
|
|
103
71
|
"type": "core::integer::u256"
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"name": "success_action",
|
|
107
|
-
"type": "core::option::Option::<escrow_manager::structs::escrow::EscrowExecution>"
|
|
108
72
|
}
|
|
109
73
|
]
|
|
110
74
|
},
|