@atomiqlabs/chain-starknet 5.0.2 → 5.1.1

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