@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.
Files changed (74) hide show
  1. package/dist/starknet/StarknetInitializer.d.ts +1 -9
  2. package/dist/starknet/StarknetInitializer.js +3 -8
  3. package/dist/starknet/btcrelay/StarknetBtcRelay.js +5 -5
  4. package/dist/starknet/chain/StarknetAction.d.ts +10 -2
  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 +8 -30
  8. package/dist/starknet/chain/modules/StarknetFees.js +26 -40
  9. package/dist/starknet/chain/modules/StarknetSignatures.js +1 -1
  10. package/dist/starknet/chain/modules/StarknetTokens.d.ts +4 -6
  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 +2 -1
  14. package/dist/starknet/events/StarknetChainEventsBrowser.js +3 -1
  15. package/dist/starknet/spv_swap/StarknetSpvVaultContract.d.ts +2 -3
  16. package/dist/starknet/spv_swap/StarknetSpvVaultContract.js +8 -14
  17. package/dist/starknet/spv_swap/StarknetSpvVaultData.js +0 -1
  18. package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.d.ts +0 -1
  19. package/dist/starknet/spv_swap/StarknetSpvWithdrawalData.js +0 -11
  20. package/dist/starknet/swaps/EscrowManagerAbi.d.ts +0 -26
  21. package/dist/starknet/swaps/EscrowManagerAbi.js +0 -36
  22. package/dist/starknet/swaps/StarknetSwapContract.d.ts +2 -3
  23. package/dist/starknet/swaps/StarknetSwapContract.js +19 -6
  24. package/dist/starknet/swaps/StarknetSwapData.d.ts +1 -8
  25. package/dist/starknet/swaps/StarknetSwapData.js +7 -51
  26. package/dist/starknet/swaps/handlers/IHandler.d.ts +1 -1
  27. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +1 -1
  28. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +1 -1
  29. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +1 -1
  30. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +1 -1
  31. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +1 -1
  32. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +1 -1
  33. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +1 -1
  34. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +1 -1
  35. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +1 -1
  36. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +1 -1
  37. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +1 -1
  38. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +1 -1
  39. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +1 -1
  40. package/dist/starknet/swaps/modules/StarknetLpVault.js +2 -2
  41. package/dist/starknet/swaps/modules/StarknetSwapClaim.js +8 -8
  42. package/dist/starknet/swaps/modules/StarknetSwapInit.d.ts +0 -1
  43. package/dist/starknet/swaps/modules/StarknetSwapInit.js +8 -67
  44. package/dist/starknet/swaps/modules/StarknetSwapRefund.js +4 -4
  45. package/dist/utils/Utils.js +8 -12
  46. package/package.json +3 -3
  47. package/src/starknet/StarknetInitializer.ts +4 -17
  48. package/src/starknet/btcrelay/StarknetBtcRelay.ts +6 -9
  49. package/src/starknet/chain/StarknetAction.ts +20 -15
  50. package/src/starknet/chain/modules/StarknetAccounts.ts +1 -1
  51. package/src/starknet/chain/modules/StarknetFees.ts +31 -53
  52. package/src/starknet/chain/modules/StarknetSignatures.ts +4 -5
  53. package/src/starknet/chain/modules/StarknetTokens.ts +2 -2
  54. package/src/starknet/chain/modules/StarknetTransactions.ts +2 -2
  55. package/src/starknet/events/StarknetChainEventsBrowser.ts +3 -1
  56. package/src/starknet/spv_swap/StarknetSpvVaultContract.ts +8 -14
  57. package/src/starknet/spv_swap/StarknetSpvVaultData.ts +0 -1
  58. package/src/starknet/spv_swap/StarknetSpvWithdrawalData.ts +2 -13
  59. package/src/starknet/swaps/EscrowManagerAbi.ts +0 -36
  60. package/src/starknet/swaps/StarknetSwapContract.ts +23 -8
  61. package/src/starknet/swaps/StarknetSwapData.ts +9 -70
  62. package/src/starknet/swaps/handlers/IHandler.ts +1 -1
  63. package/src/starknet/swaps/handlers/claim/ClaimHandlers.ts +1 -1
  64. package/src/starknet/swaps/handlers/claim/HashlockClaimHandler.ts +2 -2
  65. package/src/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +2 -2
  66. package/src/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +2 -2
  67. package/src/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +2 -2
  68. package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +2 -2
  69. package/src/starknet/swaps/handlers/refund/TimelockRefundHandler.ts +3 -3
  70. package/src/starknet/swaps/modules/StarknetLpVault.ts +2 -2
  71. package/src/starknet/swaps/modules/StarknetSwapClaim.ts +10 -10
  72. package/src/starknet/swaps/modules/StarknetSwapInit.ts +9 -67
  73. package/src/starknet/swaps/modules/StarknetSwapRefund.ts +7 -6
  74. 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, StarknetFees_1.starknetGasAdd)(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, 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: { l1DataGas: 750, l2Gas: 4000000, l1Gas: 0 },
127
- REFUND_PAY_OUT: { l1DataGas: 900, l2Gas: 6000000, l1Gas: 0 }
126
+ REFUND: { l1: 750, l2: 0 },
127
+ REFUND_PAY_OUT: { l1: 1250, l2: 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_08_1 = require("@starknet-io/starknet-types-08");
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
- // @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)
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").toLowerCase();
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" ? starknet_types_08_1.EDAMode[tx.details.nonceDataAvailabilityMode] : null,
102
- feeDataAvailabilityMode: tx.details.version === "0x3" ? starknet_types_08_1.EDAMode[tx.details.feeDataAvailabilityMode] : 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,
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": "4.0.0-dev.8",
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": "^10.0.0-dev.8",
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": "^7.5.0"
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, ChainSwapType} from "@atomiqlabs/base";
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, options.handlerContracts
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, starknetGasAdd, starknetGasMul} from "../chain/modules/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 = {l1DataGas: 600, l2Gas: 40_000_000, l1Gas: 0};
33
- const GAS_PER_BLOCKHEADER_FORK = {l1DataGas: 1000, l2Gas: 60_000_000, l1Gas: 0};
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
- starknetGasMul(GAS_PER_BLOCKHEADER, mainHeaders.length)
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
- starknetGasMul(GAS_PER_BLOCKHEADER, forkHeaders.length)
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
- starknetGasAdd(
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
- import {StarknetGas, starknetGasAdd} from "./modules/StarknetFees";
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
- gas: StarknetGas;
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.gas = {
25
- l1Gas: gasLimit?.l1Gas ?? 0,
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.gas = starknetGasAdd(this.gas, gasLimit);
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.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;
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.gas, feeRate),
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({l1DataGas: 500, l2Gas: 5_000*40_000, l1Gas: 0}, await this.root.Fees.getFeeRate());
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 maxFeeRate: StarknetFeeRate;
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<StarknetFeeRate>
20
+ feeRate: Promise<bigint>
40
21
  } = null;
41
22
 
42
23
  constructor(
43
24
  provider: Provider,
44
- maxFeeRate: StarknetFeeRate = {l1GasCost: 1_000_000_000_000_000n, l2GasCost: 1_000_000_000_000_000n, l1DataGasCost: 1_000_000_000_000_000n} /*100 * 10000 GWei*/,
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.maxFeeRate = maxFeeRate;
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<StarknetFeeRate>} L1 gas price denominated in Wei
42
+ * @returns {Promise<BN>} L1 gas price denominated in Wei
60
43
  */
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;
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: ",[l1GasCost.toString(10), l1DataGasCost.toString(10), l2GasCost.toString(10)]);
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 {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;
72
+ let feeRate = await this.blockFeeCache.feeRate;
73
+ if(feeRate>this.maxFeeRate) feeRate = this.maxFeeRate;
97
74
 
98
- const fee = l1GasCost.toString(10)+","+l2GasCost.toString(10)+","+l1DataGasCost.toString(10)+";v3";
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: {l1DataGas: number, l2Gas: number, l1Gas: number}, feeRate: string): bigint {
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 [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
96
+ const gasPrice = BigInt(arr[0]);
120
97
 
121
- return (BigInt(gas.l1Gas) * BigInt(l1GasCostStr)) +
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(gas: {l1DataGas: number, l2Gas: number, l1Gas: number}, feeRate: string) {
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 [l1GasCostStr, l2GasCostStr, l1DataGasCostStr] = arr[0].split(",");
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
- version: "0x3" as const,
120
+ maxFee: maxFee,
121
+ version: version==="v1" ? "0x1" : "0x3" as "0x1" | "0x3",
143
122
  resourceBounds: {
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)}
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): Promise<boolean> {
58
- return this.provider.verifyMessageInStarknet(
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
- address
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: {l1DataGas: 400, l2Gas: 4_000_000, l1Gas: 0},
16
- APPROVE: {l1DataGas: 400, l2Gas: 4_000_000, l1Gas: 0}
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
- this.logger.error("confirmTransaction(): Error on transaction re-send: ", e);
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
- this.logger.debug("prepareTransactions(): Using nonce from local cache!");
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
- * Starknet on-chain event handler for front-end systems without access to fs, uses WS or long-polling to subscribe, might lose
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: {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}
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, vault: StarknetSpvVaultData, withdrawalData: StarknetSpvWithdrawalData, feeRate?: string): Promise<bigint> {
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, vault: StarknetSpvVaultData, withdrawalData: StarknetSpvWithdrawalData, feeRate?: string): Promise<bigint> {
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 {BigIntBufferUtils, SpvWithdrawalTransactionData} from "@atomiqlabs/base";
1
+ import {SpvWithdrawalTransactionData} from "@atomiqlabs/base";
2
2
  import {Buffer} from "buffer";
3
- import {BigNumberish, cairo, hash} from "starknet";
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
  },