@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
@@ -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]: "0x06874044dae5bbe712775cdb576d6aef45fc87a22ce629f2b101a7d591d4e7ca",
23
- [starknet_1.constants.StarknetChainId.SN_MAIN]: "0x04fb26d02d2cf612566cd86cab299716d926272e9f49514670233952ecaf8f0c"
22
+ [starknet_1.constants.StarknetChainId.SN_SEPOLIA]: "0x017bf50dd28b6d823a231355bb25813d4396c8e19d2df03026038714a22f0413",
23
+ [starknet_1.constants.StarknetChainId.SN_MAIN]: "0x04f278e1f19e495c3b1dd35ef307c4f7510768ed95481958fbae588bd173f79a"
24
24
  };
25
25
  const defaultClaimAddresses = {
26
26
  [starknet_1.constants.StarknetChainId.SN_SEPOLIA]: {
@@ -75,7 +75,7 @@ class StarknetSwapContract extends StarknetContractBase_1.StarknetContractBase {
75
75
  handlerAddresses.claim = { ...defaultClaimAddresses[chainInterface.starknetChainId], ...handlerAddresses.claim };
76
76
  ClaimHandlers_1.claimHandlersList.forEach(handlerCtor => {
77
77
  const handler = new handlerCtor(handlerAddresses.claim[handlerCtor.type]);
78
- this.claimHandlersByAddress[handler.address] = handler;
78
+ this.claimHandlersByAddress[(0, Utils_1.toHex)(handler.address)] = handler;
79
79
  this.claimHandlersBySwapType[handlerCtor.type] = handler;
80
80
  });
81
81
  this.timelockRefundHandler = new TimelockRefundHandler_1.TimelockRefundHandler(handlerAddresses.refund.timelock);
@@ -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,13 @@ 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 executionHash = (0, Utils_1.toHex)(span.shift());
281
+ const executionExpiry = (0, Utils_1.toBigInt)(span.shift());
282
+ const executionFee = (0, Utils_1.toBigInt)({ low: span.shift(), high: span.shift() });
283
+ // throw new Error("Success action not allowed!");
284
+ }
277
285
  return new StarknetSwapData(offerer, claimer, token, refundHandler, claimHandler, payOut, payIn, reputation, sequence, claimData, refundData, amount, feeToken, securityDeposit, claimerBounty, claimHandlerImpl.getType(), null);
278
286
  }
279
287
  }
@@ -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;
@@ -41,4 +41,4 @@ class HashlockClaimHandler {
41
41
  }
42
42
  exports.HashlockClaimHandler = HashlockClaimHandler;
43
43
  HashlockClaimHandler.type = base_1.ChainSwapType.HTLC;
44
- HashlockClaimHandler.gas = { l1: 750 };
44
+ HashlockClaimHandler.gas = { l1DataGas: 0, l2Gas: 800 * 40000, l1Gas: 0 };
@@ -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 = { l1: 20000 };
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 = { l1: 20000 };
40
+ BitcoinOutputClaimHandler.gas = { l1DataGas: 0, l2Gas: 20000 * 40000, l1Gas: 0 };
@@ -1,9 +1,9 @@
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";
6
+ import { StarknetGas } from "../../../../chain/modules/StarknetFees";
7
7
  export type BitcoinTxIdCommitmentData = {
8
8
  txId: string;
9
9
  };
@@ -27,4 +27,4 @@ class BitcoinTxIdClaimHandler extends IBitcoinClaimHandler_1.IBitcoinClaimHandle
27
27
  }
28
28
  exports.BitcoinTxIdClaimHandler = BitcoinTxIdClaimHandler;
29
29
  BitcoinTxIdClaimHandler.type = base_1.ChainSwapType.CHAIN_TXID;
30
- BitcoinTxIdClaimHandler.gas = { l1: 20000 };
30
+ BitcoinTxIdClaimHandler.gas = { l1DataGas: 0, l2Gas: 20000 * 40000, l1Gas: 0 };
@@ -1,11 +1,11 @@
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 } 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";
8
+ import { StarknetGas } from "../../../../chain/modules/StarknetFees";
9
9
  export type BitcoinCommitmentData = {
10
10
  btcRelay: StarknetBtcRelay<any>;
11
11
  confirmations: number;
@@ -49,4 +49,4 @@ class IBitcoinClaimHandler {
49
49
  exports.IBitcoinClaimHandler = IBitcoinClaimHandler;
50
50
  IBitcoinClaimHandler.address = "";
51
51
  IBitcoinClaimHandler.type = base_1.ChainSwapType.CHAIN_TXID;
52
- IBitcoinClaimHandler.gas = { l1: 20000 };
52
+ IBitcoinClaimHandler.gas = { l1DataGas: 0, l2Gas: 20000 * 40000, l1Gas: 0 };
@@ -2,7 +2,7 @@ import { StarknetTx } from "../../../chain/modules/StarknetTransactions";
2
2
  import { StarknetSwapData } from "../../StarknetSwapData";
3
3
  import { BigNumberish } from "starknet";
4
4
  import { IHandler } from "../IHandler";
5
- import { StarknetGas } from "../../../chain/StarknetAction";
5
+ import { StarknetGas } from "../../../chain/modules/StarknetFees";
6
6
  export declare class TimelockRefundHandler implements IHandler<bigint, never> {
7
7
  readonly address: string;
8
8
  static readonly gas: StarknetGas;
@@ -24,4 +24,4 @@ class TimelockRefundHandler {
24
24
  }
25
25
  }
26
26
  exports.TimelockRefundHandler = TimelockRefundHandler;
27
- TimelockRefundHandler.gas = { l1: 500 };
27
+ TimelockRefundHandler.gas = { l1DataGas: 0, l2Gas: 4000000, l1Gas: 0 };
@@ -117,6 +117,6 @@ class StarknetLpVault extends StarknetSwapModule_1.StarknetSwapModule {
117
117
  }
118
118
  exports.StarknetLpVault = StarknetLpVault;
119
119
  StarknetLpVault.GasCosts = {
120
- WITHDRAW: { l1: 750, l2: 0 },
121
- DEPOSIT: { l1: 750, l2: 0 }
120
+ WITHDRAW: { l1DataGas: 500, l2Gas: 3200000, l1Gas: 0 },
121
+ DEPOSIT: { l1: 500, l2Gas: 4000000, l1Gas: 0 }
122
122
  };
@@ -18,7 +18,7 @@ class StarknetSwapClaim extends StarknetSwapModule_1.StarknetSwapModule {
18
18
  * @private
19
19
  */
20
20
  Claim(signer, swapData, witness, claimHandlerGas) {
21
- return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.claim(swapData.toEscrowStruct(), witness), (0, StarknetAction_1.sumStarknetGas)(swapData.payOut ? StarknetSwapClaim.GasCosts.CLAIM_PAY_OUT : StarknetSwapClaim.GasCosts.CLAIM, claimHandlerGas));
21
+ return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.claim(swapData.toEscrowStruct(), witness), (0, StarknetFees_1.starknetGasAdd)(swapData.payOut ? StarknetSwapClaim.GasCosts.CLAIM_PAY_OUT : StarknetSwapClaim.GasCosts.CLAIM, claimHandlerGas));
22
22
  }
23
23
  /**
24
24
  * Creates transactions claiming the swap using a secret (for HTLC swaps)
@@ -36,7 +36,7 @@ class StarknetSwapClaim extends StarknetSwapModule_1.StarknetSwapModule {
36
36
  if (checkExpiry && await this.contract.isExpired(swapData.claimer.toString(), swapData)) {
37
37
  throw new base_1.SwapDataVerificationError("Not enough time to reliably pay the invoice");
38
38
  }
39
- const claimHandler = this.contract.claimHandlersByAddress[swapData.claimHandler.toLowerCase()];
39
+ const claimHandler = this.contract.claimHandlersByAddress[(0, Utils_1.toHex)(swapData.claimHandler)];
40
40
  if (claimHandler == null)
41
41
  throw new base_1.SwapDataVerificationError("Unknown claim handler!");
42
42
  if (claimHandler.getType() !== base_1.ChainSwapType.HTLC)
@@ -61,7 +61,7 @@ class StarknetSwapClaim extends StarknetSwapModule_1.StarknetSwapModule {
61
61
  * @param feeRate fee rate to be used for the transactions
62
62
  */
63
63
  async txsClaimWithTxData(signer, swapData, tx, requiredConfirmations, vout, commitedHeader, synchronizer, feeRate) {
64
- const claimHandler = this.contract.claimHandlersByAddress[swapData.claimHandler.toLowerCase()];
64
+ const claimHandler = this.contract.claimHandlersByAddress[(0, Utils_1.toHex)(swapData.claimHandler)];
65
65
  if (claimHandler == null)
66
66
  throw new base_1.SwapDataVerificationError("Unknown claim handler!");
67
67
  if (claimHandler.getType() !== base_1.ChainSwapType.CHAIN_NONCED &&
@@ -87,14 +87,14 @@ class StarknetSwapClaim extends StarknetSwapModule_1.StarknetSwapModule {
87
87
  async getClaimFee(swapData, feeRate) {
88
88
  feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
89
89
  let gasRequired = swapData.payOut ? StarknetSwapClaim.GasCosts.CLAIM_PAY_OUT : StarknetSwapClaim.GasCosts.CLAIM;
90
- const claimHandler = this.contract.claimHandlersByAddress[swapData.claimHandler.toLowerCase()];
90
+ const claimHandler = this.contract.claimHandlersByAddress[(0, Utils_1.toHex)(swapData.claimHandler)];
91
91
  if (claimHandler != null)
92
- gasRequired = (0, StarknetAction_1.sumStarknetGas)(gasRequired, claimHandler.getGas(swapData));
93
- return StarknetFees_1.StarknetFees.getGasFee(gasRequired.l1, feeRate);
92
+ gasRequired = (0, StarknetFees_1.starknetGasAdd)(gasRequired, claimHandler.getGas(swapData));
93
+ return StarknetFees_1.StarknetFees.getGasFee(gasRequired, feeRate);
94
94
  }
95
95
  }
96
96
  exports.StarknetSwapClaim = StarknetSwapClaim;
97
97
  StarknetSwapClaim.GasCosts = {
98
- CLAIM: { l1: 500, l2: 0 },
99
- CLAIM_PAY_OUT: { l1: 1000, l2: 0 }
98
+ CLAIM: { l1DataGas: 750, l2Gas: 4000000, l1Gas: 0 },
99
+ CLAIM_PAY_OUT: { l1DataGas: 900, l2Gas: 6000000, l1Gas: 0 }
100
100
  };
@@ -6,10 +6,24 @@ const Utils_1 = require("../../../utils/Utils");
6
6
  const buffer_1 = require("buffer");
7
7
  const StarknetAction_1 = require("../../chain/StarknetAction");
8
8
  const StarknetSwapModule_1 = require("../StarknetSwapModule");
9
+ const starknet_1 = require("starknet");
9
10
  const StarknetFees_1 = require("../../chain/modules/StarknetFees");
10
11
  const Initialize = [
11
12
  { name: 'Swap hash', type: 'felt' },
12
- { name: 'Timeout', type: 'timestamp' }
13
+ { name: 'Offerer', type: 'ContractAddress' },
14
+ { name: 'Claimer', type: 'ContractAddress' },
15
+ { name: 'Token amount', type: 'TokenAmount' },
16
+ { name: 'Pay in', type: 'bool' },
17
+ { name: 'Pay out', type: 'bool' },
18
+ { name: 'Tracking reputation', type: 'bool' },
19
+ { name: 'Claim handler', type: 'ContractAddress' },
20
+ { name: 'Claim data', type: 'felt' },
21
+ { name: 'Refund handler', type: 'ContractAddress' },
22
+ { name: 'Refund data', type: 'felt' },
23
+ { name: 'Security deposit', type: 'TokenAmount' },
24
+ { name: 'Claimer bounty', type: 'TokenAmount' },
25
+ { name: 'Claim action hash', type: 'felt' },
26
+ { name: 'Deadline', type: 'timestamp' }
13
27
  ];
14
28
  class StarknetSwapInit extends StarknetSwapModule_1.StarknetSwapModule {
15
29
  /**
@@ -51,7 +65,29 @@ class StarknetSwapInit extends StarknetSwapModule_1.StarknetSwapModule {
51
65
  const authTimeout = Math.floor(Date.now() / 1000) + authorizationTimeout;
52
66
  const signature = await this.root.Signatures.signTypedMessage(signer, Initialize, "Initialize", {
53
67
  "Swap hash": "0x" + swapData.getEscrowHash(),
54
- "Timeout": (0, Utils_1.toHex)(authTimeout)
68
+ "Offerer": swapData.offerer,
69
+ "Claimer": swapData.claimer,
70
+ "Token amount": {
71
+ token_address: swapData.token,
72
+ amount: starknet_1.cairo.uint256(swapData.amount)
73
+ },
74
+ "Pay in": swapData.isPayIn(),
75
+ "Pay out": swapData.isPayOut(),
76
+ "Tracking reputation": swapData.reputation,
77
+ "Refund handler": swapData.refundHandler,
78
+ "Claim handler": swapData.claimHandler,
79
+ "Claim data": "0x" + swapData.getClaimHash(),
80
+ "Refund data": swapData.refundData.startsWith("0x") ? swapData.refundData : "0x" + swapData.refundData,
81
+ "Security deposit": {
82
+ token_address: swapData.feeToken,
83
+ amount: starknet_1.cairo.uint256(swapData.securityDeposit)
84
+ },
85
+ "Claimer bounty": {
86
+ token_address: swapData.feeToken,
87
+ amount: starknet_1.cairo.uint256(swapData.claimerBounty)
88
+ },
89
+ "Claim action hash": 0n,
90
+ "Deadline": (0, Utils_1.toHex)(authTimeout)
55
91
  });
56
92
  return {
57
93
  prefix: this.getAuthPrefix(swapData),
@@ -87,7 +123,29 @@ class StarknetSwapInit extends StarknetSwapModule_1.StarknetSwapModule {
87
123
  throw new base_1.SignatureVerificationError("Authorization expired!");
88
124
  const valid = await this.root.Signatures.isValidSignature(signature, signer, Initialize, "Initialize", {
89
125
  "Swap hash": "0x" + swapData.getEscrowHash(),
90
- "Timeout": (0, Utils_1.toHex)(timeoutBN)
126
+ "Offerer": swapData.offerer,
127
+ "Claimer": swapData.claimer,
128
+ "Token amount": {
129
+ token_address: swapData.token,
130
+ amount: starknet_1.cairo.uint256(swapData.amount)
131
+ },
132
+ "Pay in": swapData.isPayIn(),
133
+ "Pay out": swapData.isPayOut(),
134
+ "Tracking reputation": swapData.reputation,
135
+ "Refund handler": swapData.refundHandler,
136
+ "Claim handler": swapData.claimHandler,
137
+ "Claim data": "0x" + swapData.getClaimHash(),
138
+ "Refund data": swapData.refundData.startsWith("0x") ? swapData.refundData : "0x" + swapData.refundData,
139
+ "Security deposit": {
140
+ token_address: swapData.feeToken,
141
+ amount: starknet_1.cairo.uint256(swapData.securityDeposit)
142
+ },
143
+ "Claimer bounty": {
144
+ token_address: swapData.feeToken,
145
+ amount: starknet_1.cairo.uint256(swapData.claimerBounty)
146
+ },
147
+ "Claim action hash": 0n,
148
+ "Deadline": (0, Utils_1.toHex)(timeoutBN)
91
149
  });
92
150
  if (!valid)
93
151
  throw new base_1.SignatureVerificationError("Invalid signature!");
@@ -155,11 +213,11 @@ class StarknetSwapInit extends StarknetSwapModule_1.StarknetSwapModule {
155
213
  */
156
214
  async getInitFee(swapData, feeRate) {
157
215
  feeRate ?? (feeRate = await this.root.Fees.getFeeRate());
158
- return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN.l1 : StarknetSwapInit.GasCosts.INIT.l1, feeRate);
216
+ return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapInit.GasCosts.INIT_PAY_IN : StarknetSwapInit.GasCosts.INIT, feeRate);
159
217
  }
160
218
  }
161
219
  exports.StarknetSwapInit = StarknetSwapInit;
162
220
  StarknetSwapInit.GasCosts = {
163
- INIT: { l1: 500, l2: 0 },
164
- INIT_PAY_IN: { l1: 1000, l2: 0 },
221
+ INIT: { l1DataGas: 750, l2Gas: 8000000, l1Gas: 0 },
222
+ INIT_PAY_IN: { l1DataGas: 500, l2Gas: 4800000, l1Gas: 0 },
165
223
  };
@@ -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, StarknetAction_1.sumStarknetGas)(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, handlerGas));
25
+ return new StarknetAction_1.StarknetAction(signer, this.root, this.swapContract.populateTransaction.refund(swapData.toEscrowStruct(), witness), (0, StarknetFees_1.starknetGasAdd)(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.l1 : StarknetSwapRefund.GasCosts.REFUND.l1, feeRate);
121
+ return StarknetFees_1.StarknetFees.getGasFee(swapData.payIn ? StarknetSwapRefund.GasCosts.REFUND_PAY_OUT : StarknetSwapRefund.GasCosts.REFUND, feeRate);
122
122
  }
123
123
  }
124
124
  exports.StarknetSwapRefund = StarknetSwapRefund;
125
125
  StarknetSwapRefund.GasCosts = {
126
- REFUND: { l1: 750, l2: 0 },
127
- REFUND_PAY_OUT: { l1: 1250, l2: 0 }
126
+ REFUND: { l1DataGas: 750, l2Gas: 4000000, l1Gas: 0 },
127
+ REFUND_PAY_OUT: { l1DataGas: 900, l2Gas: 6000000, l1Gas: 0 }
128
128
  };
@@ -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 starknet_types_07_1 = require("starknet-types-07");
4
+ const starknet_types_08_1 = require("@starknet-io/starknet-types-08");
5
5
  const starknet_1 = require("starknet");
6
6
  const buffer_1 = require("buffer");
7
7
  const StarknetSwapData_1 = require("../starknet/swaps/StarknetSwapData");
@@ -35,10 +35,14 @@ function onceAsync(executor) {
35
35
  exports.onceAsync = onceAsync;
36
36
  function getLogger(prefix) {
37
37
  return {
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)
38
+ // @ts-ignore
39
+ debug: (msg, ...args) => global.atomiqLogLevel >= 3 && console.debug(prefix + msg, ...args),
40
+ // @ts-ignore
41
+ info: (msg, ...args) => global.atomiqLogLevel >= 2 && console.info(prefix + msg, ...args),
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)
42
46
  };
43
47
  }
44
48
  exports.getLogger = getLogger;
@@ -75,7 +79,7 @@ function toHex(value, length = 64) {
75
79
  switch (typeof (value)) {
76
80
  case "string":
77
81
  if (value.startsWith("0x")) {
78
- return "0x" + value.slice(2).padStart(length, "0");
82
+ return "0x" + value.slice(2).padStart(length, "0").toLowerCase();
79
83
  }
80
84
  else {
81
85
  return "0x" + BigInt(value).toString(16).padStart(length, "0");
@@ -94,8 +98,8 @@ function calculateHash(tx) {
94
98
  chainId: tx.details.chainId,
95
99
  nonce: tx.details.nonce,
96
100
  accountDeploymentData: tx.details.version === "0x3" ? tx.details.accountDeploymentData : null,
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,
101
+ nonceDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_08_1.EDAMode[tx.details.nonceDataAvailabilityMode] : null,
102
+ feeDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_08_1.EDAMode[tx.details.feeDataAvailabilityMode] : null,
99
103
  resourceBounds: tx.details.version === "0x3" ? tx.details.resourceBounds : null,
100
104
  tip: tx.details.version === "0x3" ? tx.details.tip : null,
101
105
  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": "5.0.2",
3
+ "version": "5.1.1",
4
4
  "description": "Starknet specific base implementation",
5
5
  "main": "./dist/index.js",
6
6
  "types:": "./dist/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "buffer": "6.0.3"
30
30
  },
31
31
  "peerDependencies": {
32
- "starknet": "^6.11.0"
32
+ "starknet": "^7.5.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} from "@atomiqlabs/base";
7
+ import {BaseTokenType, BitcoinNetwork, BitcoinRpc, ChainData, ChainInitializer, ChainSwapType} 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,7 +27,12 @@ export const StarknetAssets: StarknetAssetsType = {
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
  } as const;
32
37
 
33
38
  export type StarknetOptions = {
@@ -38,6 +43,14 @@ export type StarknetOptions = {
38
43
  swapContract?: string,
39
44
  btcRelayContract?: string,
40
45
  spvVaultContract?: string,
46
+ handlerContracts?: {
47
+ refund?: {
48
+ timelock?: string
49
+ },
50
+ claim?: {
51
+ [type in ChainSwapType]?: string
52
+ }
53
+ }
41
54
 
42
55
  fees?: StarknetFees
43
56
  }
@@ -51,7 +64,7 @@ export function initializeStarknet(
51
64
  new RpcProviderWithRetries({nodeUrl: options.rpcUrl}) :
52
65
  options.rpcUrl;
53
66
 
54
- const Fees = options.fees ?? new StarknetFees(provider, "STRK");
67
+ const Fees = options.fees ?? new StarknetFees(provider);
55
68
 
56
69
  const chainId = options.chainId ??
57
70
  (network===BitcoinNetwork.MAINNET ? constants.StarknetChainId.SN_MAIN : constants.StarknetChainId.SN_SEPOLIA);
@@ -63,7 +76,7 @@ export function initializeStarknet(
63
76
  );
64
77
 
65
78
  const swapContract = new StarknetSwapContract(
66
- chainInterface, btcRelay, options.swapContract
79
+ chainInterface, btcRelay, options.swapContract, options.handlerContracts
67
80
  );
68
81
 
69
82
  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} from "../chain/modules/StarknetFees";
16
+ import {StarknetFees, starknetGasAdd, starknetGasMul} 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 = 850;
33
- const GAS_PER_BLOCKHEADER_FORK = 1000;
32
+ const GAS_PER_BLOCKHEADER = {l1DataGas: 600, l2Gas: 40_000_000, l1Gas: 0};
33
+ const GAS_PER_BLOCKHEADER_FORK = {l1DataGas: 1000, l2Gas: 60_000_000, l1Gas: 0};
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
- {l1: GAS_PER_BLOCKHEADER * mainHeaders.length, l2: 0}
65
+ starknetGasMul(GAS_PER_BLOCKHEADER, mainHeaders.length)
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
- {l1: GAS_PER_BLOCKHEADER * forkHeaders.length, l2: 0}
76
+ starknetGasMul(GAS_PER_BLOCKHEADER, forkHeaders.length)
77
77
  )
78
78
  }
79
79
 
@@ -84,7 +84,10 @@ export class StarknetBtcRelay<B extends BtcBlock>
84
84
  entrypoint: "submit_fork_blockheaders",
85
85
  calldata: serializeCalldata(forkHeaders, storedHeader, [toHex(forkId)])
86
86
  },
87
- {l1: (GAS_PER_BLOCKHEADER * forkHeaders.length) + (GAS_PER_BLOCKHEADER_FORK * totalForkHeaders), l2: 0}
87
+ starknetGasAdd(
88
+ starknetGasMul(GAS_PER_BLOCKHEADER, forkHeaders.length),
89
+ starknetGasMul(GAS_PER_BLOCKHEADER_FORK, totalForkHeaders)
90
+ )
88
91
  )
89
92
  }
90
93
 
@@ -1,20 +1,11 @@
1
1
  import {Call} from "starknet";
2
2
  import {StarknetChainInterface} from "./StarknetChainInterface";
3
3
  import {StarknetTx} from "./modules/StarknetTransactions";
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
- }
4
+ import {StarknetGas, starknetGasAdd} from "./modules/StarknetFees";
13
5
 
14
6
  export class StarknetAction {
15
7
 
16
- L1GasLimit: number;
17
- L2GasLimit: number;
8
+ gas: StarknetGas;
18
9
  readonly mainSigner: string;
19
10
  private readonly root: StarknetChainInterface;
20
11
  private readonly instructions: Call[];
@@ -30,8 +21,11 @@ export class StarknetAction {
30
21
  this.mainSigner = mainSigner;
31
22
  this.root = root;
32
23
  this.instructions = Array.isArray(instructions) ? instructions : [instructions];
33
- this.L1GasLimit = gasLimit?.l1 ?? 0;
34
- this.L2GasLimit = gasLimit?.l2 ?? 0;
24
+ this.gas = {
25
+ l1Gas: gasLimit?.l1Gas ?? 0,
26
+ l2Gas: gasLimit?.l2Gas ?? 0,
27
+ l1DataGas: gasLimit?.l1DataGas ?? 0,
28
+ };
35
29
  this.feeRate = feeRate;
36
30
  }
37
31
 
@@ -41,8 +35,7 @@ export class StarknetAction {
41
35
 
42
36
  public addIx(instruction: Call, gasLimit?: StarknetGas) {
43
37
  this.instructions.push(instruction);
44
- this.L1GasLimit += gasLimit?.l1 ?? 0;
45
- this.L2GasLimit += gasLimit?.l2 ?? 0;
38
+ this.gas = starknetGasAdd(this.gas, gasLimit);
46
39
  }
47
40
 
48
41
  public add(action: StarknetAction): this {
@@ -51,10 +44,12 @@ export class StarknetAction {
51
44
 
52
45
  public addAction(action: StarknetAction, index: number = this.instructions.length): this {
53
46
  if(action.mainSigner!==this.mainSigner) throw new Error("Actions need to have the same signer!");
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;
47
+ if(this.gas.l1Gas==null && action.gas.l1Gas!=null) this.gas.l1Gas = action.gas.l1Gas;
48
+ if(this.gas.l2Gas==null && action.gas.l2Gas!=null) this.gas.l2Gas = action.gas.l2Gas;
49
+ if(this.gas.l1DataGas==null && action.gas.l1DataGas!=null) this.gas.l1DataGas = action.gas.l1DataGas;
50
+ if(this.gas.l1Gas!=null && action.gas.l1Gas!=null) this.gas.l1Gas += action.gas.l1Gas;
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;
58
53
  this.instructions.splice(index, 0, ...action.instructions);
59
54
  if(this.feeRate==null) this.feeRate = action.feeRate;
60
55
  return this;
@@ -68,7 +63,7 @@ export class StarknetAction {
68
63
  type: "INVOKE",
69
64
  tx: this.instructions,
70
65
  details: {
71
- ...this.root.Fees.getFeeDetails(this.L1GasLimit, this.L2GasLimit, feeRate),
66
+ ...this.root.Fees.getFeeDetails(this.gas, feeRate),
72
67
  walletAddress: this.mainSigner,
73
68
  cairoVersion: "1",
74
69
  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(5000, 0, await this.root.Fees.getFeeRate());
9
+ const feeDetails = this.root.Fees.getFeeDetails({l1DataGas: 500, l2Gas: 5_000*40_000, l1Gas: 0}, await this.root.Fees.getFeeRate());
10
10
  const details = {
11
11
  ...feeDetails,
12
12
  walletAddress: deploymentData.contractAddress,