Ver Fonte

feat(contract_manager): more support for starknet contract (#1716)

* feat(contract_manager): more support for starknet contract

* chore(contract_manager): update pyth-starknet-js
Pavel Strakhov há 1 ano atrás
pai
commit
ce1e0c05e1
3 ficheiros alterados com 255 adições e 45 exclusões
  1. 4 3
      contract_manager/package.json
  2. 145 12
      contract_manager/src/contracts/starknet.ts
  3. 106 30
      pnpm-lock.yaml

+ 4 - 3
contract_manager/package.json

@@ -34,6 +34,7 @@
     "@pythnetwork/price-service-client": "workspace:*",
     "@pythnetwork/pyth-fuel-js": "workspace:*",
     "@pythnetwork/pyth-sdk-solidity": "workspace:^",
+    "@pythnetwork/pyth-starknet-js": "^0.2.0",
     "@pythnetwork/pyth-sui-js": "workspace:*",
     "@pythnetwork/solana-utils": "workspace:^",
     "@pythnetwork/xc-admin-common": "workspace:*",
@@ -45,7 +46,7 @@
     "extract-files": "^13.0.0",
     "fuels": "^0.89.2",
     "ramda": "^0.30.1",
-    "starknet": "^5.24.3",
+    "starknet": "^6.9.0",
     "ts-node": "^10.9.1",
     "typescript": "^5.3.3",
     "web3": "^1.8.2",
@@ -54,8 +55,8 @@
   },
   "devDependencies": {
     "@types/web3": "^1.2.2",
+    "eslint": "^8.0.0",
     "prettier": "^2.6.2",
-    "typedoc": "^0.25.7",
-    "eslint": "^8.0.0"
+    "typedoc": "^0.25.7"
   }
 }

+ 145 - 12
contract_manager/src/contracts/starknet.ts

@@ -1,13 +1,15 @@
 import { DataSource } from "@pythnetwork/xc-admin-common";
 import {
   KeyValueConfig,
+  Price,
   PriceFeed,
   PriceFeedContract,
   PrivateKey,
   TxResult,
 } from "../base";
 import { Chain, StarknetChain } from "../chains";
-import { Contract } from "starknet";
+import { Account, Contract, shortString } from "starknet";
+import { ByteBuffer } from "@pythnetwork/pyth-starknet-js";
 
 export class StarknetPriceFeedContract extends PriceFeedContract {
   static type = "StarknetPriceFeedContract";
@@ -65,29 +67,146 @@ export class StarknetPriceFeedContract extends PriceFeedContract {
     });
   }
 
-  getBaseUpdateFee(): Promise<{ amount: string; denom?: string | undefined }> {
-    throw new Error("Method not implemented.");
+  async getBaseUpdateFee(): Promise<{
+    amount: string;
+    denom?: string | undefined;
+  }> {
+    const tokens = await this.getFeeTokenAddresses();
+    return await this.getBaseUpdateFeeInToken(tokens[0]);
   }
-  getLastExecutedGovernanceSequence(): Promise<number> {
-    throw new Error("Method not implemented.");
+
+  /**
+   * Returns the list of accepted fee tokens.
+   * @returns hex encoded token addresses without 0x prefix
+   */
+  async getFeeTokenAddresses(): Promise<string[]> {
+    const contract = await this.getContractClient();
+    const tokens: bigint[] = await contract.fee_token_addresses();
+    return tokens.map((t) => t.toString(16));
   }
-  getPriceFeed(feedId: string): Promise<PriceFeed | undefined> {
-    throw new Error("Method not implemented.");
+
+  /**
+   * Returns the single update fee and symbol of the specified token.
+   * @param token hex encoded token address without 0x prefix
+   */
+  async getBaseUpdateFeeInToken(
+    token: string
+  ): Promise<{ amount: string; denom?: string | undefined }> {
+    token = "0x" + token;
+    const provider = this.chain.getProvider();
+    const contract = await this.getContractClient();
+    const fee: bigint = await contract.get_single_update_fee(token);
+
+    const tokenClassData = await provider.getClassAt(token);
+    const tokenContract = new Contract(tokenClassData.abi, token, provider);
+    const denom = shortString.decodeShortString(await tokenContract.symbol());
+    return { amount: fee.toString(), denom };
   }
-  executeUpdatePriceFeed(
+
+  async getLastExecutedGovernanceSequence(): Promise<number> {
+    const contract = await this.getContractClient();
+    return Number(await contract.last_executed_governance_sequence());
+  }
+
+  async getPriceFeed(feedId: string): Promise<PriceFeed | undefined> {
+    const contract = await this.getContractClient();
+    const result = await contract.query_price_feed_unsafe("0x" + feedId);
+    console.log(result);
+    if (result.Ok !== undefined) {
+      return {
+        price: convertPrice(result.Ok.price),
+        emaPrice: convertPrice(result.Ok.ema_price),
+      };
+    } else {
+      throw new Error(JSON.stringify(result.Err));
+    }
+  }
+
+  async executeUpdatePriceFeed(
     senderPrivateKey: PrivateKey,
     vaas: Buffer[]
   ): Promise<TxResult> {
-    throw new Error("Method not implemented.");
+    // We need the account address to send transactions.
+    throw new Error("Use executeUpdatePriceFeedWithAddress instead");
   }
+
+  /**
+   * Executes the update instructions contained in the VAAs using the sender credentials
+   * @param senderPrivateKey private key of the sender in hex format without 0x prefix
+   * @param senderAddress address of the sender's account in hex format without 0x prefix
+   * @param vaa VAA containing price update messages to execute
+   */
+  async executeUpdatePriceFeedWithAddress(
+    senderPrivateKey: PrivateKey,
+    senderAddress: string,
+    vaa: Buffer
+  ): Promise<TxResult> {
+    const provider = this.chain.getProvider();
+    const contract = await this.getContractClient();
+    const account = new Account(
+      provider,
+      "0x" + senderAddress,
+      "0x" + senderPrivateKey
+    );
+    contract.connect(account);
+
+    const feeToken = "0x" + (await this.getFeeTokenAddresses())[0];
+    const tokenClassData = await provider.getClassAt(feeToken);
+    const tokenContract = new Contract(tokenClassData.abi, feeToken, provider);
+    tokenContract.connect(account);
+
+    const updateData = ByteBuffer.fromBuffer(vaa);
+    const feeAmount = await contract.get_update_fee(updateData, feeToken);
+    const feeTx = await tokenContract.approve(this.address, feeAmount);
+    await provider.waitForTransaction(feeTx.transaction_hash);
+
+    const tx = await contract.update_price_feeds(updateData);
+    const info = await provider.waitForTransaction(tx.transaction_hash);
+    return { id: tx.transaction_hash, info };
+  }
+
   executeGovernanceInstruction(
     senderPrivateKey: PrivateKey,
     vaa: Buffer
   ): Promise<TxResult> {
-    throw new Error("Method not implemented.");
+    // We need the account address to send transactions.
+    throw new Error("Use executeGovernanceInstructionWithAddress instead");
+  }
+
+  /**
+   * Executes the governance instruction contained in the VAA using the sender credentials
+   * @param senderPrivateKey private key of the sender in hex format without 0x prefix
+   * @param senderAddress address of the sender's account in hex format without 0x prefix
+   * @param vaa the VAA to execute
+   */
+  async executeGovernanceInstructionWithAddress(
+    senderPrivateKey: PrivateKey,
+    senderAddress: string,
+    vaa: Buffer
+  ): Promise<TxResult> {
+    const provider = this.chain.getProvider();
+    const contract = await this.getContractClient();
+    const account = new Account(
+      provider,
+      "0x" + senderAddress,
+      "0x" + senderPrivateKey
+    );
+    contract.connect(account);
+
+    const updateData = ByteBuffer.fromBuffer(vaa);
+    const tx = await contract.execute_governance_instruction(updateData);
+    const info = await provider.waitForTransaction(tx.transaction_hash);
+    return { id: tx.transaction_hash, info };
   }
-  getGovernanceDataSource(): Promise<DataSource> {
-    throw new Error("Method not implemented.");
+
+  async getGovernanceDataSource(): Promise<DataSource> {
+    const contract = await this.getContractClient();
+    const source: { emitter_chain_id: bigint; emitter_address: bigint } =
+      await contract.governance_data_source();
+    return {
+      emitterChain: Number(source.emitter_chain_id),
+      emitterAddress: source.emitter_address.toString(16),
+    };
   }
 
   getId(): string {
@@ -98,3 +217,17 @@ export class StarknetPriceFeedContract extends PriceFeedContract {
     return StarknetPriceFeedContract.type;
   }
 }
+
+function convertPrice(obj: {
+  price: bigint;
+  conf: bigint;
+  expo: bigint;
+  publish_time: bigint;
+}): Price {
+  return {
+    price: obj.price.toString(),
+    conf: obj.conf.toString(),
+    expo: obj.expo.toString(),
+    publishTime: obj.publish_time.toString(),
+  };
+}

+ 106 - 30
pnpm-lock.yaml

@@ -353,6 +353,9 @@ importers:
       '@pythnetwork/pyth-sdk-solidity':
         specifier: workspace:^
         version: link:../target_chains/ethereum/sdk/solidity
+      '@pythnetwork/pyth-starknet-js':
+        specifier: ^0.2.0
+        version: 0.2.0
       '@pythnetwork/pyth-sui-js':
         specifier: workspace:*
         version: link:../target_chains/sui/sdk/js
@@ -387,8 +390,8 @@ importers:
         specifier: ^0.30.1
         version: 0.30.1
       starknet:
-        specifier: ^5.24.3
-        version: 5.24.3(encoding@0.1.13)
+        specifier: ^6.9.0
+        version: 6.10.0(encoding@0.1.13)
       ts-node:
         specifier: ^10.9.1
         version: 10.9.1(@types/node@20.14.2)(typescript@5.4.5)
@@ -5208,6 +5211,9 @@ packages:
   '@pythnetwork/pyth-sdk-solidity@3.1.0':
     resolution: {integrity: sha512-NgtEPUTL9r0qqMpIOEtSdUVjrF08fHK6wa7eM8hdjhjzMOti4o053B9oFqpm4lkzJW6eELXuP4sRJOABGmNTUg==}
 
+  '@pythnetwork/pyth-starknet-js@0.2.0':
+    resolution: {integrity: sha512-wJocXpuVWcEkTpniN8UYf8Jd/GOaSu/C/H53AMd24jbpu/WAkDLgm2Q4CVtCFn8tpGNJFE+MUkHcoRSYzpnfuA==}
+
   '@radix-ui/primitive@1.0.0':
     resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==}
 
@@ -5505,8 +5511,8 @@ packages:
   '@scure/bip39@1.2.2':
     resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==}
 
-  '@scure/starknet@0.3.0':
-    resolution: {integrity: sha512-Ma66yZlwa5z00qI5alSxdWtIpky5LBhy22acVFdoC5kwwbd9uDyMWEYzWHdNyKmQg9t5Y2UOXzINMeb3yez+Gw==}
+  '@scure/starknet@1.0.0':
+    resolution: {integrity: sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg==}
 
   '@sentry/core@5.30.0':
     resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==}
@@ -6040,6 +6046,9 @@ packages:
   '@stablelib/x25519@1.0.3':
     resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==}
 
+  '@starknet-io/types-js@0.7.7':
+    resolution: {integrity: sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ==}
+
   '@storybook/csf@0.0.1':
     resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==}
 
@@ -7364,6 +7373,10 @@ packages:
   abbrev@1.1.1:
     resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
 
+  abi-wan-kanabi@2.2.2:
+    resolution: {integrity: sha512-sTCv2HyNIj1x2WFUoc9oL8ZT9liosrL+GoqEGZJK1kDND096CfA7lwx06vLxLWMocQ41FQXO3oliwoh/UZHYdQ==}
+    hasBin: true
+
   abitype@0.7.1:
     resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==}
     peerDependencies:
@@ -7615,6 +7628,9 @@ packages:
     resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
     engines: {node: '>=12'}
 
+  ansicolors@0.3.2:
+    resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
+
   antlr4ts@0.5.0-alpha.4:
     resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==}
 
@@ -8400,6 +8416,10 @@ packages:
   capability@0.2.5:
     resolution: {integrity: sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==}
 
+  cardinal@2.1.1:
+    resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==}
+    hasBin: true
+
   caseless@0.12.0:
     resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
 
@@ -10391,6 +10411,9 @@ packages:
     resolution: {integrity: sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==}
     engines: {node: '>=8'}
 
+  fetch-cookie@3.0.1:
+    resolution: {integrity: sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q==}
+
   figures@3.2.0:
     resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
     engines: {node: '>=8'}
@@ -10685,6 +10708,9 @@ packages:
   get-size@3.0.0:
     resolution: {integrity: sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw==}
 
+  get-starknet-core@4.0.0-next.5:
+    resolution: {integrity: sha512-zZ3i4E5UYF1f04fgkwfaVC0uj1pvdBlzsDqXEAfb4jc1WO4zM7rIm4XAUqdMwVSr4CBend5RM7U+zv166fBNYg==}
+
   get-stream@5.2.0:
     resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
     engines: {node: '>=8'}
@@ -12400,8 +12426,8 @@ packages:
     resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
     hasBin: true
 
-  lossless-json@2.0.11:
-    resolution: {integrity: sha512-BP0vn+NGYvzDielvBZaFain/wgeJ1hTvURCqtKvhr1SCPePdaaTanmmcplrHfEJSJOUql7hk4FHwToNJjWRY3g==}
+  lossless-json@4.0.1:
+    resolution: {integrity: sha512-l0L+ppmgPDnb+JGxNLndPtJZGNf6+ZmVaQzoxQm3u6TXmhdnsA+YtdVR8DjzZd/em58686CQhOFDPewfJ4l7MA==}
 
   loupe@2.3.6:
     resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==}
@@ -14560,6 +14586,9 @@ packages:
     resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
     engines: {node: '>=8'}
 
+  redeyed@2.1.1:
+    resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==}
+
   redux-saga@1.0.0:
     resolution: {integrity: sha512-GvJWs/SzMvEQgeaw6sRMXnS2FghlvEGsHiEtTLpJqc/FHF3I5EE/B+Hq5lyHZ8LSoT2r/X/46uWvkdCnK9WgHA==}
 
@@ -14965,6 +14994,9 @@ packages:
   set-blocking@2.0.0:
     resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
 
+  set-cookie-parser@2.6.0:
+    resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
+
   set-function-length@1.2.2:
     resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
     engines: {node: '>= 0.4'}
@@ -15247,12 +15279,16 @@ packages:
     resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==}
     engines: {node: '>=6'}
 
+  starknet-types@0.7.2:
+    resolution: {integrity: sha512-r3JJ0rrK0g3FnVRGcFiLY+9YT5WZgxB4TKBfR44wYGevHtKEM6BM5B+Gn1eou1zV7xEAwz3GpmvLSQTUAzDhsw==}
+    deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+
+  starknet@6.10.0:
+    resolution: {integrity: sha512-Zlo39V37dytBcqHlWpyLkEH4lXGRMaH7ST4yDGSGxkgxlJ11xW7P7abpWnB87Qn9SdgEzUEDLyM3TeBVTsdtYA==}
+
   stat-mode@0.3.0:
     resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==}
 
-  starknet@5.24.3:
-    resolution: {integrity: sha512-v0TuaNc9iNtHdbIRzX372jfQH1vgx2rwBHQDMqK4DqjJbwFEE5dog8Go6rGiZVW750NqRSWrZ7ahqyRNc3bscg==}
-
   statuses@1.5.0:
     resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
     engines: {node: '>= 0.6'}
@@ -15860,6 +15896,9 @@ packages:
   ts-log@2.2.5:
     resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==}
 
+  ts-mixer@6.0.4:
+    resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==}
+
   ts-mocha@10.0.0:
     resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==}
     engines: {node: '>= 6.X.X'}
@@ -24400,6 +24439,8 @@ snapshots:
 
   '@pythnetwork/pyth-sdk-solidity@3.1.0': {}
 
+  '@pythnetwork/pyth-starknet-js@0.2.0': {}
+
   '@radix-ui/primitive@1.0.0':
     dependencies:
       '@babel/runtime': 7.23.9
@@ -24975,9 +25016,9 @@ snapshots:
       '@noble/hashes': 1.3.3
       '@scure/base': 1.1.6
 
-  '@scure/starknet@0.3.0':
+  '@scure/starknet@1.0.0':
     dependencies:
-      '@noble/curves': 1.2.0
+      '@noble/curves': 1.3.0
       '@noble/hashes': 1.3.3
 
   '@sentry/core@5.30.0':
@@ -25870,6 +25911,8 @@ snapshots:
       '@stablelib/random': 1.0.2
       '@stablelib/wipe': 1.0.1
 
+  '@starknet-io/types-js@0.7.7': {}
+
   '@storybook/csf@0.0.1':
     dependencies:
       lodash: 4.17.21
@@ -27037,7 +27080,7 @@ snapshots:
       '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
       '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
       '@typescript-eslint/visitor-keys': 6.21.0
-      debug: 4.3.4
+      debug: 4.3.4(supports-color@8.1.1)
       eslint: 8.57.0
       graphemer: 1.4.0
       ignore: 5.3.1
@@ -27137,7 +27180,7 @@ snapshots:
       '@typescript-eslint/types': 6.21.0
       '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5)
       '@typescript-eslint/visitor-keys': 6.21.0
-      debug: 4.3.4
+      debug: 4.3.4(supports-color@8.1.1)
       eslint: 8.57.0
     optionalDependencies:
       typescript: 5.4.5
@@ -27241,7 +27284,7 @@ snapshots:
     dependencies:
       '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5)
       '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
-      debug: 4.3.4
+      debug: 4.3.4(supports-color@8.1.1)
       eslint: 8.57.0
       ts-api-utils: 1.3.0(typescript@5.4.5)
     optionalDependencies:
@@ -27317,7 +27360,7 @@ snapshots:
     dependencies:
       '@typescript-eslint/types': 6.21.0
       '@typescript-eslint/visitor-keys': 6.21.0
-      debug: 4.3.4
+      debug: 4.3.4(supports-color@8.1.1)
       globby: 11.1.0
       is-glob: 4.0.3
       minimatch: 9.0.3
@@ -28086,6 +28129,13 @@ snapshots:
 
   abbrev@1.1.1: {}
 
+  abi-wan-kanabi@2.2.2:
+    dependencies:
+      ansicolors: 0.3.2
+      cardinal: 2.1.1
+      fs-extra: 10.1.0
+      yargs: 17.7.2
+
   abitype@0.7.1(typescript@5.4.5)(zod@3.23.8):
     dependencies:
       typescript: 5.4.5
@@ -28335,6 +28385,8 @@ snapshots:
 
   ansi-styles@6.2.1: {}
 
+  ansicolors@0.3.2: {}
+
   antlr4ts@0.5.0-alpha.4: {}
 
   any-promise@1.3.0: {}
@@ -28718,7 +28770,7 @@ snapshots:
 
   axios@0.21.4:
     dependencies:
-      follow-redirects: 1.15.6
+      follow-redirects: 1.15.6(debug@4.3.4)
     transitivePeerDependencies:
       - debug
 
@@ -28736,7 +28788,7 @@ snapshots:
 
   axios@0.27.2:
     dependencies:
-      follow-redirects: 1.15.6
+      follow-redirects: 1.15.6(debug@4.3.4)
       form-data: 4.0.0
     transitivePeerDependencies:
       - debug
@@ -29373,6 +29425,11 @@ snapshots:
 
   capability@0.2.5: {}
 
+  cardinal@2.1.1:
+    dependencies:
+      ansicolors: 0.3.2
+      redeyed: 2.1.1
+
   caseless@0.12.0: {}
 
   catering@2.1.1: {}
@@ -30377,10 +30434,6 @@ snapshots:
     optionalDependencies:
       supports-color: 8.1.1
 
-  debug@4.3.4:
-    dependencies:
-      ms: 2.1.2
-
   debug@4.3.4(supports-color@8.1.1):
     dependencies:
       ms: 2.1.2
@@ -31523,7 +31576,7 @@ snapshots:
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
-      debug: 4.3.4
+      debug: 4.3.4(supports-color@8.1.1)
       doctrine: 3.0.0
       escape-string-regexp: 4.0.0
       eslint-scope: 7.2.2
@@ -32216,6 +32269,11 @@ snapshots:
       tough-cookie: 4.1.2
     optional: true
 
+  fetch-cookie@3.0.1:
+    dependencies:
+      set-cookie-parser: 2.6.0
+      tough-cookie: 4.1.2
+
   figures@3.2.0:
     dependencies:
       escape-string-regexp: 1.0.5
@@ -32319,8 +32377,6 @@ snapshots:
 
   flow-parser@0.237.2: {}
 
-  follow-redirects@1.15.6: {}
-
   follow-redirects@1.15.6(debug@4.3.4):
     optionalDependencies:
       debug: 4.3.4(supports-color@8.1.1)
@@ -32577,6 +32633,10 @@ snapshots:
 
   get-size@3.0.0: {}
 
+  get-starknet-core@4.0.0-next.5:
+    dependencies:
+      starknet-types: 0.7.2
+
   get-stream@5.2.0:
     dependencies:
       pump: 3.0.0
@@ -35617,7 +35677,7 @@ snapshots:
     dependencies:
       js-tokens: 4.0.0
 
-  lossless-json@2.0.11: {}
+  lossless-json@4.0.1: {}
 
   loupe@2.3.6:
     dependencies:
@@ -38555,6 +38615,10 @@ snapshots:
       indent-string: 4.0.0
       strip-indent: 3.0.0
 
+  redeyed@2.1.1:
+    dependencies:
+      esprima: 4.0.1
+
   redux-saga@1.0.0:
     dependencies:
       '@redux-saga/core': 1.2.2
@@ -39042,6 +39106,8 @@ snapshots:
 
   set-blocking@2.0.0: {}
 
+  set-cookie-parser@2.6.0: {}
+
   set-function-length@1.2.2:
     dependencies:
       define-data-property: 1.1.4
@@ -39404,20 +39470,28 @@ snapshots:
     dependencies:
       type-fest: 0.7.1
 
-  stat-mode@0.3.0: {}
+  starknet-types@0.7.2: {}
 
-  starknet@5.24.3(encoding@0.1.13):
+  starknet@6.10.0(encoding@0.1.13):
     dependencies:
-      '@noble/curves': 1.2.0
+      '@noble/curves': 1.4.0
+      '@noble/hashes': 1.4.0
       '@scure/base': 1.1.6
-      '@scure/starknet': 0.3.0
+      '@scure/starknet': 1.0.0
+      abi-wan-kanabi: 2.2.2
+      fetch-cookie: 3.0.1
+      get-starknet-core: 4.0.0-next.5
       isomorphic-fetch: 3.0.0(encoding@0.1.13)
-      lossless-json: 2.0.11
+      lossless-json: 4.0.1
       pako: 2.1.0
+      starknet-types-07: '@starknet-io/types-js@0.7.7'
+      ts-mixer: 6.0.4
       url-join: 4.0.1
     transitivePeerDependencies:
       - encoding
 
+  stat-mode@0.3.0: {}
+
   statuses@1.5.0: {}
 
   statuses@2.0.1: {}
@@ -40263,6 +40337,8 @@ snapshots:
 
   ts-log@2.2.5: {}
 
+  ts-mixer@6.0.4: {}
+
   ts-mocha@10.0.0(mocha@9.2.2):
     dependencies:
       mocha: 9.2.2