@atomiqlabs/chain-starknet 2.0.0-beta.1 → 2.0.0-beta.10

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.
@@ -33,11 +33,11 @@ function initializeStarknet(options, bitcoinRpc, network) {
33
33
  const provider = typeof (options.rpcUrl) === "string" ?
34
34
  new RpcProviderWithRetries_1.RpcProviderWithRetries({ nodeUrl: options.rpcUrl }) :
35
35
  options.rpcUrl;
36
- const Fees = options.fees ?? new StarknetFees_1.StarknetFees(provider, "ETH");
36
+ const Fees = options.fees ?? new StarknetFees_1.StarknetFees(provider, "STRK");
37
37
  const chainId = options.chainId ??
38
38
  (network === base_1.BitcoinNetwork.MAINNET ? starknet_1.constants.StarknetChainId.SN_MAIN : starknet_1.constants.StarknetChainId.SN_SEPOLIA);
39
39
  const chainInterface = new StarknetChainInterface_1.StarknetChainInterface(chainId, provider, options.retryPolicy, Fees);
40
- const btcRelay = new StarknetBtcRelay_1.StarknetBtcRelay(chainInterface, bitcoinRpc, options.btcRelayContract);
40
+ const btcRelay = new StarknetBtcRelay_1.StarknetBtcRelay(chainInterface, bitcoinRpc, network, options.btcRelayContract);
41
41
  const swapContract = new StarknetSwapContract_1.StarknetSwapContract(chainInterface, btcRelay, options.swapContract);
42
42
  const spvVaultContract = new StarknetSpvVaultContract_1.StarknetSpvVaultContract(chainInterface, btcRelay, bitcoinRpc, options.spvVaultContract);
43
43
  const chainEvents = new StarknetChainEventsBrowser_1.StarknetChainEventsBrowser(chainInterface, swapContract, spvVaultContract);
@@ -1,6 +1,6 @@
1
1
  import { Buffer } from "buffer";
2
2
  import { StarknetBtcHeader } from "./headers/StarknetBtcHeader";
3
- import { BitcoinRpc, BtcBlock, BtcRelay, RelaySynchronizer } from "@atomiqlabs/base";
3
+ import { BitcoinNetwork, BitcoinRpc, BtcBlock, BtcRelay, RelaySynchronizer } from "@atomiqlabs/base";
4
4
  import { StarknetContractBase } from "../contract/StarknetContractBase";
5
5
  import { StarknetBtcStoredHeader } from "./headers/StarknetBtcStoredHeader";
6
6
  import { StarknetTx } from "../chain/modules/StarknetTransactions";
@@ -16,7 +16,7 @@ export declare class StarknetBtcRelay<B extends BtcBlock> extends StarknetContra
16
16
  readonly maxHeadersPerTx: number;
17
17
  readonly maxForkHeadersPerTx: number;
18
18
  readonly maxShortForkHeadersPerTx: number;
19
- constructor(chainInterface: StarknetChainInterface, bitcoinRpc: BitcoinRpc<B>, contractAddress?: string);
19
+ constructor(chainInterface: StarknetChainInterface, bitcoinRpc: BitcoinRpc<B>, bitcoinNetwork: BitcoinNetwork, contractAddress?: string);
20
20
  /**
21
21
  * Computes subsequent commited headers as they will appear on the blockchain when transactions
22
22
  * are submitted & confirmed
@@ -25,8 +25,9 @@ function serializeBlockHeader(e) {
25
25
  const GAS_PER_BLOCKHEADER = 850;
26
26
  const GAS_PER_BLOCKHEADER_FORK = 1000;
27
27
  const btcRelayAddreses = {
28
- [starknet_1.constants.StarknetChainId.SN_SEPOLIA]: "0x068601c79da2231d21e015ccfd59c243861156fa523a12c9f987ec28eb8dbc8c",
29
- [starknet_1.constants.StarknetChainId.SN_MAIN]: "0x057b14a4231b82f1e525ff35a722d893ca3dd2bde0baa6cee97937c5be861dbc"
28
+ [base_1.BitcoinNetwork.TESTNET4]: "0x0099b63f39f0cabb767361de3d8d3e97212351a51540e2687c2571f4da490dbe",
29
+ [base_1.BitcoinNetwork.TESTNET]: "0x068601c79da2231d21e015ccfd59c243861156fa523a12c9f987ec28eb8dbc8c",
30
+ [base_1.BitcoinNetwork.MAINNET]: "0x057b14a4231b82f1e525ff35a722d893ca3dd2bde0baa6cee97937c5be861dbc"
30
31
  };
31
32
  function serializeCalldata(headers, storedHeader, span) {
32
33
  span.push((0, Utils_1.toHex)(headers.length));
@@ -59,7 +60,7 @@ class StarknetBtcRelay extends StarknetContractBase_1.StarknetContractBase {
59
60
  calldata: serializeCalldata(forkHeaders, storedHeader, [(0, Utils_1.toHex)(forkId)])
60
61
  }, { l1: (GAS_PER_BLOCKHEADER * forkHeaders.length) + (GAS_PER_BLOCKHEADER_FORK * totalForkHeaders), l2: 0 });
61
62
  }
62
- constructor(chainInterface, bitcoinRpc, contractAddress = btcRelayAddreses[chainInterface.starknetChainId]) {
63
+ constructor(chainInterface, bitcoinRpc, bitcoinNetwork, contractAddress = btcRelayAddreses[bitcoinNetwork]) {
63
64
  super(chainInterface, contractAddress, BtcRelayAbi_1.BtcRelayAbi);
64
65
  this.maxHeadersPerTx = 100;
65
66
  this.maxForkHeadersPerTx = 100;
@@ -4,10 +4,8 @@ exports.StarknetFees = void 0;
4
4
  const Utils_1 = require("../../../utils/Utils");
5
5
  const StarknetTokens_1 = require("./StarknetTokens");
6
6
  const MAX_FEE_AGE = 5000;
7
- const ERC20_ADDRESS_ETH = "";
8
- const ERC20_ADDRESS_STRK = "";
9
7
  class StarknetFees {
10
- constructor(provider, gasToken = "ETH", maxFeeRate = gasToken === "ETH" ? 100000000000 /*100 GWei*/ : 1000000000000000 /*100 * 10000 GWei*/, feeMultiplier = 1.25, da) {
8
+ constructor(provider, gasToken = "STRK", maxFeeRate = gasToken === "ETH" ? 100000000000 /*100 GWei*/ : 1000000000000000 /*100 * 10000 GWei*/, feeMultiplier = 1.25, da) {
11
9
  this.logger = (0, Utils_1.getLogger)("StarknetFees: ");
12
10
  this.blockFeeCache = null;
13
11
  this.provider = provider;
@@ -85,7 +85,7 @@ class StarknetTransactions extends StarknetModule_1.StarknetModule {
85
85
  async sendSignedTransaction(tx, onBeforePublish, signer) {
86
86
  if (onBeforePublish != null)
87
87
  await onBeforePublish(tx.txId, await this.serializeTx(tx));
88
- this.logger.debug("sendSignedTransaction(): sending transaction: ", tx);
88
+ this.logger.debug("sendSignedTransaction(): sending transaction: ", tx.txId);
89
89
  if (tx.signed == null) {
90
90
  let txHash;
91
91
  switch (tx.type) {
@@ -202,14 +202,13 @@ class StarknetChainEventsBrowser {
202
202
  async checkEventsEcrowManager(lastTxHash, lastBlockNumber, currentBlock) {
203
203
  const currentBlockNumber = currentBlock.block_number;
204
204
  lastBlockNumber ?? (lastBlockNumber = currentBlockNumber);
205
- const logStartHeight = currentBlockNumber > lastBlockNumber ? lastBlockNumber + 1 : lastBlockNumber;
206
- this.logger.debug("checkEvents(EscrowManager): Requesting logs: " + logStartHeight + "...pending");
207
- let events = await this.starknetSwapContract.Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [], logStartHeight, null);
205
+ // this.logger.debug("checkEvents(EscrowManager): Requesting logs: "+logStartHeight+"...pending");
206
+ let events = await this.starknetSwapContract.Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [], lastBlockNumber, null);
208
207
  if (lastTxHash != null) {
209
208
  const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
210
209
  if (latestProcessedEventIndex !== -1) {
211
210
  events.splice(0, latestProcessedEventIndex + 1);
212
- this.logger.debug("checkEvents(EscrowManager): Splicing processed events, resulting size: " + events.length);
211
+ // this.logger.debug("checkEvents(EscrowManager): Splicing processed events, resulting size: "+events.length);
213
212
  }
214
213
  }
215
214
  if (events.length > 0) {
@@ -221,14 +220,13 @@ class StarknetChainEventsBrowser {
221
220
  async checkEventsSpvVaults(lastTxHash, lastBlockNumber, currentBlock) {
222
221
  const currentBlockNumber = currentBlock.block_number;
223
222
  lastBlockNumber ?? (lastBlockNumber = currentBlockNumber);
224
- const logStartHeight = currentBlockNumber > lastBlockNumber ? lastBlockNumber + 1 : lastBlockNumber;
225
- this.logger.debug("checkEvents(SpvVaults): Requesting logs: " + logStartHeight + "...pending");
226
- let events = await this.starknetSpvVaultContract.Events.getContractBlockEvents(["spv_swap_vault::events::Opened", "spv_swap_vault::events::Deposited", "spv_swap_vault::events::Closed", "spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed"], [], logStartHeight, null);
223
+ // this.logger.debug("checkEvents(SpvVaults): Requesting logs: "+logStartHeight+"...pending");
224
+ let events = await this.starknetSpvVaultContract.Events.getContractBlockEvents(["spv_swap_vault::events::Opened", "spv_swap_vault::events::Deposited", "spv_swap_vault::events::Closed", "spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed"], [], lastBlockNumber, null);
227
225
  if (lastTxHash != null) {
228
226
  const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
229
227
  if (latestProcessedEventIndex !== -1) {
230
228
  events.splice(0, latestProcessedEventIndex + 1);
231
- this.logger.debug("checkEvents(SpvVaults): Splicing processed events, resulting size: " + events.length);
229
+ // this.logger.debug("checkEvents(SpvVaults): Splicing processed events, resulting size: "+events.length);
232
230
  }
233
231
  }
234
232
  if (events.length > 0) {
@@ -93,6 +93,8 @@ class StarknetSpvVaultContract extends StarknetContractBase_1.StarknetContractBa
93
93
  //Getters
94
94
  async getVaultData(owner, vaultId) {
95
95
  const struct = await this.contract.get_vault(owner, vaultId);
96
+ if ((0, Utils_1.toHex)(struct.relay_contract) !== (0, Utils_1.toHex)(this.btcRelay.contract.address))
97
+ return null;
96
98
  return new StarknetSpvVaultData_1.StarknetSpvVaultData(owner, vaultId, struct);
97
99
  }
98
100
  async getAllVaults(owner) {
@@ -112,7 +114,9 @@ class StarknetSpvVaultContract extends StarknetContractBase_1.StarknetContractBa
112
114
  const vaults = [];
113
115
  for (let identifier of openedVaults.keys()) {
114
116
  const [owner, vaultIdStr] = identifier.split(":");
115
- vaults.push(await this.getVaultData(owner, BigInt(vaultIdStr)));
117
+ const vaultData = await this.getVaultData(owner, BigInt(vaultIdStr));
118
+ if (vaultData != null)
119
+ vaults.push(vaultData);
116
120
  }
117
121
  return vaults;
118
122
  }
@@ -3,4 +3,5 @@ export declare class StarknetKeypairWallet extends Account {
3
3
  readonly publicKey: string;
4
4
  constructor(provider: Provider, privateKey: string);
5
5
  getDeploymentData(): DeployAccountContractPayload;
6
+ static generateRandomPrivateKey(): string;
6
7
  }
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StarknetKeypairWallet = void 0;
4
4
  const starknet_1 = require("starknet");
5
5
  const Utils_1 = require("../../utils/Utils");
6
+ const buffer_1 = require("buffer");
6
7
  const OZaccountClassHash = '0x00261c293c8084cd79086214176b33e5911677cec55104fddc8d25b0b736dcad';
7
8
  //Openzeppelin Account wallet
8
9
  class StarknetKeypairWallet extends starknet_1.Account {
@@ -22,5 +23,8 @@ class StarknetKeypairWallet extends starknet_1.Account {
22
23
  contractAddress: this.address
23
24
  };
24
25
  }
26
+ static generateRandomPrivateKey() {
27
+ return "0x" + buffer_1.Buffer.from(starknet_1.ec.starkCurve.utils.randomPrivateKey()).toString("hex");
28
+ }
25
29
  }
26
30
  exports.StarknetKeypairWallet = StarknetKeypairWallet;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atomiqlabs/chain-starknet",
3
- "version": "2.0.0-beta.1",
3
+ "version": "2.0.0-beta.10",
4
4
  "description": "Starknet specific base implementation",
5
5
  "main": "./dist/index.js",
6
6
  "types:": "./dist/index.d.ts",
@@ -22,7 +22,7 @@
22
22
  "author": "adambor",
23
23
  "license": "ISC",
24
24
  "dependencies": {
25
- "@atomiqlabs/base": "^9.0.0-beta.0",
25
+ "@atomiqlabs/base": "^9.0.0-beta.2",
26
26
  "@noble/hashes": "^1.7.1",
27
27
  "@scure/btc-signer": "1.6.0",
28
28
  "abi-wan-kanabi": "2.2.4",
@@ -1,4 +1,4 @@
1
- import {constants, Provider, RpcProvider} from "starknet";
1
+ import {constants, Provider} from "starknet";
2
2
  import {StarknetFees} from "./chain/modules/StarknetFees";
3
3
  import {StarknetChainInterface, StarknetRetryPolicy} from "./chain/StarknetChainInterface";
4
4
  import {StarknetBtcRelay} from "./btcrelay/StarknetBtcRelay";
@@ -51,7 +51,7 @@ export function initializeStarknet(
51
51
  new RpcProviderWithRetries({nodeUrl: options.rpcUrl}) :
52
52
  options.rpcUrl;
53
53
 
54
- const Fees = options.fees ?? new StarknetFees(provider, "ETH");
54
+ const Fees = options.fees ?? new StarknetFees(provider, "STRK");
55
55
 
56
56
  const chainId = options.chainId ??
57
57
  (network===BitcoinNetwork.MAINNET ? constants.StarknetChainId.SN_MAIN : constants.StarknetChainId.SN_SEPOLIA);
@@ -59,7 +59,7 @@ export function initializeStarknet(
59
59
  const chainInterface = new StarknetChainInterface(chainId, provider, options.retryPolicy, Fees);
60
60
 
61
61
  const btcRelay = new StarknetBtcRelay(
62
- chainInterface, bitcoinRpc, options.btcRelayContract
62
+ chainInterface, bitcoinRpc, network, options.btcRelayContract
63
63
  );
64
64
 
65
65
  const swapContract = new StarknetSwapContract(
@@ -1,6 +1,6 @@
1
1
  import {Buffer} from "buffer";
2
2
  import {StarknetBtcHeader} from "./headers/StarknetBtcHeader";
3
- import {BitcoinRpc, BtcBlock, BtcRelay, RelaySynchronizer, StatePredictorUtils} from "@atomiqlabs/base";
3
+ import {BitcoinNetwork, BitcoinRpc, BtcBlock, BtcRelay, RelaySynchronizer, StatePredictorUtils} from "@atomiqlabs/base";
4
4
  import {
5
5
  bigNumberishToBuffer,
6
6
  bufferToU32Array, getLogger,
@@ -12,7 +12,7 @@ import {StarknetBtcStoredHeader} from "./headers/StarknetBtcStoredHeader";
12
12
  import {StarknetTx} from "../chain/modules/StarknetTransactions";
13
13
  import {StarknetSigner} from "../wallet/StarknetSigner";
14
14
  import {BtcRelayAbi} from "./BtcRelayAbi";
15
- import {BigNumberish, constants, hash} from "starknet";
15
+ import {BigNumberish, hash} from "starknet";
16
16
  import {StarknetFees} from "../chain/modules/StarknetFees";
17
17
  import {StarknetChainInterface} from "../chain/StarknetChainInterface";
18
18
  import {StarknetAction} from "../chain/StarknetAction";
@@ -33,8 +33,9 @@ const GAS_PER_BLOCKHEADER = 850;
33
33
  const GAS_PER_BLOCKHEADER_FORK = 1000;
34
34
 
35
35
  const btcRelayAddreses = {
36
- [constants.StarknetChainId.SN_SEPOLIA]: "0x068601c79da2231d21e015ccfd59c243861156fa523a12c9f987ec28eb8dbc8c",
37
- [constants.StarknetChainId.SN_MAIN]: "0x057b14a4231b82f1e525ff35a722d893ca3dd2bde0baa6cee97937c5be861dbc"
36
+ [BitcoinNetwork.TESTNET4]: "0x0099b63f39f0cabb767361de3d8d3e97212351a51540e2687c2571f4da490dbe",
37
+ [BitcoinNetwork.TESTNET]: "0x068601c79da2231d21e015ccfd59c243861156fa523a12c9f987ec28eb8dbc8c",
38
+ [BitcoinNetwork.MAINNET]: "0x057b14a4231b82f1e525ff35a722d893ca3dd2bde0baa6cee97937c5be861dbc"
38
39
  };
39
40
 
40
41
  function serializeCalldata(headers: StarknetBtcHeader[], storedHeader: StarknetBtcStoredHeader, span: BigNumberish[]) {
@@ -96,7 +97,8 @@ export class StarknetBtcRelay<B extends BtcBlock>
96
97
  constructor(
97
98
  chainInterface: StarknetChainInterface,
98
99
  bitcoinRpc: BitcoinRpc<B>,
99
- contractAddress: string = btcRelayAddreses[chainInterface.starknetChainId],
100
+ bitcoinNetwork: BitcoinNetwork,
101
+ contractAddress: string = btcRelayAddreses[bitcoinNetwork],
100
102
  ) {
101
103
  super(chainInterface, contractAddress, BtcRelayAbi);
102
104
  this.bitcoinRpc = bitcoinRpc;
@@ -4,9 +4,6 @@ import {StarknetTokens} from "./StarknetTokens";
4
4
 
5
5
  const MAX_FEE_AGE = 5000;
6
6
 
7
- const ERC20_ADDRESS_ETH = "";
8
- const ERC20_ADDRESS_STRK = "";
9
-
10
7
  export class StarknetFees {
11
8
 
12
9
  private readonly logger = getLogger("StarknetFees: ");
@@ -25,7 +22,7 @@ export class StarknetFees {
25
22
 
26
23
  constructor(
27
24
  provider: Provider,
28
- gasToken: "ETH" | "STRK" = "ETH",
25
+ gasToken: "ETH" | "STRK" = "STRK",
29
26
  maxFeeRate: number = gasToken==="ETH" ? 100_000_000_000 /*100 GWei*/ : 1_000_000_000_000_000 /*100 * 10000 GWei*/,
30
27
  feeMultiplier: number = 1.25,
31
28
  da?: {fee?: "L1" | "L2", nonce?: "L1" | "L2"}
@@ -106,7 +106,7 @@ export class StarknetTransactions extends StarknetModule {
106
106
  signer?: StarknetSigner
107
107
  ): Promise<string> {
108
108
  if(onBeforePublish!=null) await onBeforePublish(tx.txId, await this.serializeTx(tx));
109
- this.logger.debug("sendSignedTransaction(): sending transaction: ", tx);
109
+ this.logger.debug("sendSignedTransaction(): sending transaction: ", tx.txId);
110
110
 
111
111
  if(tx.signed==null) {
112
112
  let txHash: string;
@@ -300,19 +300,18 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
300
300
  protected async checkEventsEcrowManager(lastTxHash: string, lastBlockNumber?: number, currentBlock?: {timestamp: number, block_number: number}): Promise<string> {
301
301
  const currentBlockNumber: number = (currentBlock as any).block_number;
302
302
  lastBlockNumber ??= currentBlockNumber;
303
- const logStartHeight = currentBlockNumber>lastBlockNumber ? lastBlockNumber+1 : lastBlockNumber;
304
- this.logger.debug("checkEvents(EscrowManager): Requesting logs: "+logStartHeight+"...pending");
303
+ // this.logger.debug("checkEvents(EscrowManager): Requesting logs: "+logStartHeight+"...pending");
305
304
  let events = await this.starknetSwapContract.Events.getContractBlockEvents(
306
305
  ["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"],
307
306
  [],
308
- logStartHeight,
307
+ lastBlockNumber,
309
308
  null
310
309
  );
311
310
  if(lastTxHash!=null) {
312
311
  const latestProcessedEventIndex = findLastIndex(events, val => val.txHash===lastTxHash);
313
312
  if(latestProcessedEventIndex!==-1) {
314
313
  events.splice(0, latestProcessedEventIndex+1);
315
- this.logger.debug("checkEvents(EscrowManager): Splicing processed events, resulting size: "+events.length);
314
+ // this.logger.debug("checkEvents(EscrowManager): Splicing processed events, resulting size: "+events.length);
316
315
  }
317
316
  }
318
317
  if(events.length>0) {
@@ -325,19 +324,18 @@ export class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData>
325
324
  protected async checkEventsSpvVaults(lastTxHash: string, lastBlockNumber?: number, currentBlock?: {timestamp: number, block_number: number}): Promise<string> {
326
325
  const currentBlockNumber: number = (currentBlock as any).block_number;
327
326
  lastBlockNumber ??= currentBlockNumber;
328
- const logStartHeight = currentBlockNumber>lastBlockNumber ? lastBlockNumber+1 : lastBlockNumber;
329
- this.logger.debug("checkEvents(SpvVaults): Requesting logs: "+logStartHeight+"...pending");
327
+ // this.logger.debug("checkEvents(SpvVaults): Requesting logs: "+logStartHeight+"...pending");
330
328
  let events = await this.starknetSpvVaultContract.Events.getContractBlockEvents(
331
329
  ["spv_swap_vault::events::Opened", "spv_swap_vault::events::Deposited", "spv_swap_vault::events::Closed", "spv_swap_vault::events::Fronted", "spv_swap_vault::events::Claimed"],
332
330
  [],
333
- logStartHeight,
331
+ lastBlockNumber,
334
332
  null
335
333
  );
336
334
  if(lastTxHash!=null) {
337
335
  const latestProcessedEventIndex = findLastIndex(events, val => val.txHash===lastTxHash);
338
336
  if(latestProcessedEventIndex!==-1) {
339
337
  events.splice(0, latestProcessedEventIndex+1);
340
- this.logger.debug("checkEvents(SpvVaults): Splicing processed events, resulting size: "+events.length);
338
+ // this.logger.debug("checkEvents(SpvVaults): Splicing processed events, resulting size: "+events.length);
341
339
  }
342
340
  }
343
341
  if(events.length>0) {
@@ -162,6 +162,7 @@ export class StarknetSpvVaultContract
162
162
  //Getters
163
163
  async getVaultData(owner: string, vaultId: bigint): Promise<StarknetSpvVaultData> {
164
164
  const struct = await this.contract.get_vault(owner, vaultId);
165
+ if(toHex(struct.relay_contract)!==toHex(this.btcRelay.contract.address)) return null;
165
166
  return new StarknetSpvVaultData(owner, vaultId, struct);
166
167
  }
167
168
 
@@ -185,7 +186,8 @@ export class StarknetSpvVaultContract
185
186
  const vaults: StarknetSpvVaultData[] = [];
186
187
  for(let identifier of openedVaults.keys()) {
187
188
  const [owner, vaultIdStr] = identifier.split(":");
188
- vaults.push(await this.getVaultData(owner, BigInt(vaultIdStr)));
189
+ const vaultData = await this.getVaultData(owner, BigInt(vaultIdStr));
190
+ if(vaultData!=null) vaults.push(vaultData);
189
191
  }
190
192
  return vaults;
191
193
  }
@@ -1,5 +1,6 @@
1
1
  import {Account, CallData, DeployAccountContractPayload, ec, hash, Provider} from "starknet";
2
2
  import {toHex} from "../../utils/Utils";
3
+ import {Buffer} from "buffer";
3
4
 
4
5
  const OZaccountClassHash = '0x00261c293c8084cd79086214176b33e5911677cec55104fddc8d25b0b736dcad';
5
6
 
@@ -31,4 +32,8 @@ export class StarknetKeypairWallet extends Account {
31
32
  }
32
33
  }
33
34
 
35
+ public static generateRandomPrivateKey(): string {
36
+ return "0x"+Buffer.from(ec.starkCurve.utils.randomPrivateKey()).toString("hex");
37
+ }
38
+
34
39
  }