Quellcode durchsuchen

initial sdk prototype (#1850)

* initial sdk prototype

* generalize svm endpoints, some reorg

* some renamings, reorg

* address some lint issues

* lint + name changes

* fixed tx serialization to include signatures & template

* fixed type hints

* address comments

* unused import

* update to new server bidsvm format

* improve org

* refactored js sdk + addressed comments

* fix lint

* idl folders

* idl folders

* bump package version

* rename package

* address comments
Anirudh Suresh vor 1 Jahr
Ursprung
Commit
b0aa4b1031

+ 1 - 1
express_relay/examples/easy_lend/package.json

@@ -21,7 +21,7 @@
   },
   "dependencies": {
     "@openzeppelin/contracts": "^4.5.0",
-    "@pythnetwork/express-relay-evm-js": "workspace:*",
+    "@pythnetwork/express-relay-js": "workspace:*",
     "@pythnetwork/express-relay-sdk-solidity": "workspace:*",
     "@pythnetwork/price-service-client": "workspace:^",
     "@pythnetwork/pyth-evm-js": "workspace:*",

+ 1 - 3
express_relay/examples/easy_lend/src/monitor.ts

@@ -4,8 +4,7 @@ import {
   checkAddress,
   Client,
   OpportunityParams,
-} from "@pythnetwork/express-relay-evm-js";
-import { privateKeyToAccount } from "viem/accounts";
+} from "@pythnetwork/express-relay-js";
 import type { ContractFunctionReturnType } from "viem";
 import {
   Address,
@@ -15,7 +14,6 @@ import {
   getContract,
   Hex,
   http,
-  isHex,
 } from "viem";
 import { optimismSepolia } from "viem/chains";
 import { abi } from "./abi";

+ 21 - 3
express_relay/sdk/js/README.md

@@ -7,13 +7,13 @@ Utility library for interacting with the Pyth Express Relay API.
 ### npm
 
 ```
-$ npm install --save @pythnetwork/express-relay-evm-js
+$ npm install --save @pythnetwork/express-relay-js
 ```
 
 ### Yarn
 
 ```
-$ yarn add @pythnetwork/express-relay-evm-js
+$ yarn add @pythnetwork/express-relay-js
 ```
 
 ## Development
@@ -24,6 +24,12 @@ To generate the latest type declarations from the server openapi schema, run:
 npm run generate-api-types
 ```
 
+You can generate the Solana Typescript declaration files from the IDLs via:
+
+```bash
+npm run generate-anchor-types
+```
+
 ## Quickstart
 
 ```typescript
@@ -31,7 +37,7 @@ import {
   Client,
   OpportunityParams,
   BidParams,
-} from "@pythnetwork/express-relay-evm-js";
+} from "@pythnetwork/express-relay-js";
 
 function calculateOpportunityBid(opportunity: Opportunity): BidParams | null {
   // searcher implementation here
@@ -79,4 +85,16 @@ npm run simple-searcher -- \
   --private-key <YOUR-PRIVATE-KEY>
 ```
 
+#### SimpleSearcherSvm
+
+The SimpleSearcherSvm example submits a dummy SVM transaction to the auction server after appending the appropriate `SubmitBid` instruction that permissions the transaction. You can run it with `npm run simple-searcher-svm`, and the full command looks like:
+
+```bash
+npm run simple-searcher-svm -- \
+  --endpoint-express-relay http://per-staging.dourolabs.app/ \
+  --chain-id solana \
+  --private-key <YOUR-PRIVATE-KEY> \
+  --endpoint-svm "https://api.mainnet-beta.solana.com"
+```
+
 Note that if you are using a localhost server at `http://127.0.0.1`, you should specify `--endpoint http://127.0.0.1:{PORT}` rather than `http://localhost:{PORT}`, as Typescript maps `localhost` to `::1` in line with IPv6 rather than to `127.0.0.1` as with IPv4.

+ 6 - 2
express_relay/sdk/js/package.json

@@ -1,6 +1,6 @@
 {
-  "name": "@pythnetwork/express-relay-evm-js",
-  "version": "0.8.1",
+  "name": "@pythnetwork/express-relay-js",
+  "version": "0.9.0",
   "description": "Utilities for interacting with the express relay protocol",
   "homepage": "https://github.com/pyth-network/pyth-crosschain/tree/main/express_relay/sdk/js",
   "author": "Douro Labs",
@@ -16,7 +16,9 @@
     "build": "tsc",
     "test": "jest src/ --passWithNoTests",
     "simple-searcher": "pnpm run build && node lib/examples/simpleSearcher.js",
+    "simple-searcher-svm": "pnpm run build && node lib/examples/simpleSearcherSvm.js",
     "generate-api-types": "openapi-typescript http://127.0.0.1:9000/docs/openapi.json --output src/serverTypes.d.ts",
+    "generate-anchor-types": "anchor idl type src/idl/idlExpressRelay.json --out src/expressRelayTypes.d.ts && anchor idl type src/examples/idl/idlDummy.json --out src/examples/dummyTypes.d.ts",
     "format": "prettier --write \"src/**/*.ts\"",
     "lint": "eslint src",
     "prepublishOnly": "pnpm run build && pnpm test && pnpm run lint",
@@ -34,6 +36,8 @@
     "directory": "express_relay/sdk/js"
   },
   "dependencies": {
+    "@coral-xyz/anchor": "^0.30.1",
+    "@solana/web3.js": "^1.95.3",
     "isomorphic-ws": "^5.0.0",
     "openapi-client-axios": "^7.5.5",
     "openapi-fetch": "^0.8.2",

+ 16 - 1
express_relay/sdk/js/src/const.ts

@@ -1,4 +1,5 @@
-import { OpportunityAdapterConfig } from "./types";
+import { PublicKey } from "@solana/web3.js";
+import { OpportunityAdapterConfig, SvmConstantsConfig } from "./types";
 
 export const OPPORTUNITY_ADAPTER_CONFIGS: Record<
   string,
@@ -21,3 +22,17 @@ export const OPPORTUNITY_ADAPTER_CONFIGS: Record<
     weth: "0x4200000000000000000000000000000000000006",
   },
 };
+
+export const SVM_CONSTANTS: Record<string, SvmConstantsConfig> = {
+  solana: {
+    relayerSigner: new PublicKey(
+      "3pR5W8qPTHKEdoD7mNMx1SwkaPE18aQZwoAKWYpnHozY"
+    ),
+    feeReceiverRelayer: new PublicKey(
+      "3pR5W8qPTHKEdoD7mNMx1SwkaPE18aQZwoAKWYpnHozY"
+    ),
+    expressRelayProgram: new PublicKey(
+      "GwEtasTAxdS9neVE4GPUpcwR7DB7AizntQSPcG36ubZM"
+    ),
+  },
+};

+ 43 - 0
express_relay/sdk/js/src/examples/dummyTypes.d.ts

@@ -0,0 +1,43 @@
+/**
+ * Program IDL in camelCase format in order to be used in JS/TS.
+ *
+ * Note that this is only a type helper and is not the actual IDL. The original
+ * IDL can be found at `target/idl/dummy.json`.
+ */
+export type Dummy = {
+  address: "HYCgALnu6CM2gkQVopa1HGaNf8Vzbs9bomWRiKP267P3";
+  metadata: {
+    name: "dummy";
+    version: "0.1.0";
+    spec: "0.1.0";
+    description: "Created with Anchor";
+  };
+  instructions: [
+    {
+      name: "doNothing";
+      discriminator: [112, 130, 224, 161, 71, 149, 192, 187];
+      accounts: [
+        {
+          name: "payer";
+          writable: true;
+          signer: true;
+        },
+        {
+          name: "expressRelay";
+          address: "GwEtasTAxdS9neVE4GPUpcwR7DB7AizntQSPcG36ubZM";
+        },
+        {
+          name: "sysvarInstructions";
+          address: "Sysvar1nstructions1111111111111111111111111";
+        },
+        {
+          name: "permission";
+        },
+        {
+          name: "router";
+        }
+      ];
+      args: [];
+    }
+  ];
+};

+ 37 - 0
express_relay/sdk/js/src/examples/idl/idlDummy.json

@@ -0,0 +1,37 @@
+{
+  "address": "HYCgALnu6CM2gkQVopa1HGaNf8Vzbs9bomWRiKP267P3",
+  "metadata": {
+    "name": "dummy",
+    "version": "0.1.0",
+    "spec": "0.1.0",
+    "description": "Created with Anchor"
+  },
+  "instructions": [
+    {
+      "name": "do_nothing",
+      "discriminator": [112, 130, 224, 161, 71, 149, 192, 187],
+      "accounts": [
+        {
+          "name": "payer",
+          "writable": true,
+          "signer": true
+        },
+        {
+          "name": "express_relay",
+          "address": "GwEtasTAxdS9neVE4GPUpcwR7DB7AizntQSPcG36ubZM"
+        },
+        {
+          "name": "sysvar_instructions",
+          "address": "Sysvar1nstructions1111111111111111111111111"
+        },
+        {
+          "name": "permission"
+        },
+        {
+          "name": "router"
+        }
+      ],
+      "args": []
+    }
+  ]
+}

+ 178 - 0
express_relay/sdk/js/src/examples/simpleSearcherSvm.ts

@@ -0,0 +1,178 @@
+import yargs from "yargs";
+import { hideBin } from "yargs/helpers";
+import { Client } from "../index";
+import { BidStatusUpdate } from "../types";
+import { SVM_CONSTANTS } from "../const";
+
+import * as anchor from "@coral-xyz/anchor";
+import { Program, AnchorProvider } from "@coral-xyz/anchor";
+import { Keypair, PublicKey, Connection } from "@solana/web3.js";
+import dummyIdl from "./idl/idlDummy.json";
+import { Dummy } from "./dummyTypes";
+
+const DAY_IN_SECONDS = 60 * 60 * 24;
+const DUMMY_PIDS: Record<string, PublicKey> = {
+  solana: new PublicKey("HYCgALnu6CM2gkQVopa1HGaNf8Vzbs9bomWRiKP267P3"),
+};
+
+class SimpleSearcherSvm {
+  private client: Client;
+  private connectionSvm: Connection;
+  constructor(
+    public endpointExpressRelay: string,
+    public chainId: string,
+    public privateKey: string,
+    public endpointSvm: string,
+    public apiKey?: string
+  ) {
+    this.client = new Client(
+      {
+        baseUrl: endpointExpressRelay,
+        apiKey,
+      },
+      undefined,
+      () => {
+        return Promise.resolve();
+      },
+      this.bidStatusHandler.bind(this)
+    );
+    this.connectionSvm = new Connection(endpointSvm, "confirmed");
+  }
+
+  async bidStatusHandler(bidStatus: BidStatusUpdate) {
+    let resultDetails = "";
+    if (bidStatus.type == "submitted" || bidStatus.type == "won") {
+      resultDetails = `, transaction ${bidStatus.result}`;
+    } else if (bidStatus.type == "lost") {
+      if (bidStatus.result) {
+        resultDetails = `, transaction ${bidStatus.result}`;
+      }
+    }
+    console.log(
+      `Bid status for bid ${bidStatus.id}: ${bidStatus.type.replaceAll(
+        "_",
+        " "
+      )}${resultDetails}`
+    );
+  }
+
+  async dummyBid() {
+    const secretKey = anchor.utils.bytes.bs58.decode(this.privateKey);
+    const searcher = Keypair.fromSecretKey(secretKey);
+
+    const provider = new AnchorProvider(
+      this.connectionSvm,
+      new anchor.Wallet(searcher),
+      {}
+    );
+    const dummy = new Program<Dummy>(dummyIdl as Dummy, provider);
+
+    const permission = PublicKey.default;
+    const router = Keypair.generate().publicKey;
+    const bidAmount = new anchor.BN(argv.bid);
+
+    const svmConstants = SVM_CONSTANTS[this.chainId];
+    if (!(this.chainId in DUMMY_PIDS)) {
+      throw new Error(`Dummy program id not found for chain ${this.chainId}`);
+    }
+    const dummyPid = DUMMY_PIDS[this.chainId];
+
+    const ixDummy = await dummy.methods
+      .doNothing()
+      .accountsStrict({
+        payer: searcher.publicKey,
+        expressRelay: svmConstants.expressRelayProgram,
+        sysvarInstructions: anchor.web3.SYSVAR_INSTRUCTIONS_PUBKEY,
+        permission,
+        router,
+      })
+      .instruction();
+    ixDummy.programId = dummyPid;
+
+    const txRaw = new anchor.web3.Transaction().add(ixDummy);
+
+    const bid = await this.client.constructSvmBid(
+      txRaw,
+      searcher.publicKey,
+      router,
+      permission,
+      bidAmount,
+      new anchor.BN(Math.round(Date.now() / 1000 + DAY_IN_SECONDS)),
+      this.chainId
+    );
+
+    try {
+      const { blockhash } = await this.connectionSvm.getLatestBlockhash();
+      bid.transaction.recentBlockhash = blockhash;
+      bid.transaction.sign(Keypair.fromSecretKey(secretKey));
+      const bidId = await this.client.submitBid(bid);
+      console.log(`Successful bid. Bid id ${bidId}`);
+    } catch (error) {
+      console.error(`Failed to bid: ${error}`);
+    }
+  }
+
+  async start() {
+    for (;;) {
+      await this.dummyBid();
+      await new Promise((resolve) => setTimeout(resolve, 2000));
+    }
+  }
+}
+
+const argv = yargs(hideBin(process.argv))
+  .option("endpoint-express-relay", {
+    description:
+      "Express relay endpoint. e.g: https://per-staging.dourolabs.app/",
+    type: "string",
+    demandOption: true,
+  })
+  .option("chain-id", {
+    description: "Chain id to fetch opportunities for. e.g: solana",
+    type: "string",
+    demandOption: true,
+  })
+  .option("bid", {
+    description: "Bid amount in lamports",
+    type: "string",
+    default: "100",
+  })
+  .option("private-key", {
+    description: "Private key to sign the bid with. In 64-byte base58 format",
+    type: "string",
+    demandOption: true,
+  })
+  .option("api-key", {
+    description:
+      "The API key of the searcher to authenticate with the server for fetching and submitting bids",
+    type: "string",
+    demandOption: false,
+  })
+  .option("endpoint-svm", {
+    description: "SVM RPC endpoint",
+    type: "string",
+    demandOption: true,
+  })
+  .help()
+  .alias("help", "h")
+  .parseSync();
+async function run() {
+  if (SVM_CONSTANTS[argv.chainId] === undefined) {
+    throw new Error(`SVM constants not found for chain ${argv.chainId}`);
+  }
+  const searcherSvm = Keypair.fromSecretKey(
+    anchor.utils.bytes.bs58.decode(argv.privateKey)
+  );
+  console.log(`Using searcher pubkey: ${searcherSvm.publicKey.toBase58()}`);
+
+  const simpleSearcher = new SimpleSearcherSvm(
+    argv.endpointExpressRelay,
+    argv.chainId,
+    argv.privateKey,
+    argv.endpointSvm,
+    argv.apiKey
+  );
+  await simpleSearcher.start();
+}
+
+run();

+ 517 - 0
express_relay/sdk/js/src/expressRelayTypes.d.ts

@@ -0,0 +1,517 @@
+/**
+ * Program IDL in camelCase format in order to be used in JS/TS.
+ *
+ * Note that this is only a type helper and is not the actual IDL. The original
+ * IDL can be found at `target/idl/express_relay.json`.
+ */
+export type ExpressRelay = {
+  address: "GwEtasTAxdS9neVE4GPUpcwR7DB7AizntQSPcG36ubZM";
+  metadata: {
+    name: "expressRelay";
+    version: "0.1.0";
+    spec: "0.1.0";
+    description: "Created with Anchor";
+  };
+  instructions: [
+    {
+      name: "checkPermission";
+      discriminator: [154, 199, 232, 242, 96, 72, 197, 236];
+      accounts: [
+        {
+          name: "sysvarInstructions";
+          address: "Sysvar1nstructions1111111111111111111111111";
+        },
+        {
+          name: "permission";
+        },
+        {
+          name: "router";
+        }
+      ];
+      args: [];
+    },
+    {
+      name: "initialize";
+      discriminator: [175, 175, 109, 31, 13, 152, 155, 237];
+      accounts: [
+        {
+          name: "payer";
+          writable: true;
+          signer: true;
+        },
+        {
+          name: "expressRelayMetadata";
+          writable: true;
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [109, 101, 116, 97, 100, 97, 116, 97];
+              }
+            ];
+          };
+        },
+        {
+          name: "admin";
+        },
+        {
+          name: "relayerSigner";
+        },
+        {
+          name: "feeReceiverRelayer";
+        },
+        {
+          name: "systemProgram";
+          address: "11111111111111111111111111111111";
+        }
+      ];
+      args: [
+        {
+          name: "data";
+          type: {
+            defined: {
+              name: "initializeArgs";
+            };
+          };
+        }
+      ];
+    },
+    {
+      name: "setAdmin";
+      discriminator: [251, 163, 0, 52, 91, 194, 187, 92];
+      accounts: [
+        {
+          name: "admin";
+          writable: true;
+          signer: true;
+          relations: ["expressRelayMetadata"];
+        },
+        {
+          name: "expressRelayMetadata";
+          writable: true;
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [109, 101, 116, 97, 100, 97, 116, 97];
+              }
+            ];
+          };
+        },
+        {
+          name: "adminNew";
+        }
+      ];
+      args: [];
+    },
+    {
+      name: "setRelayer";
+      discriminator: [23, 243, 33, 88, 110, 84, 196, 37];
+      accounts: [
+        {
+          name: "admin";
+          writable: true;
+          signer: true;
+          relations: ["expressRelayMetadata"];
+        },
+        {
+          name: "expressRelayMetadata";
+          writable: true;
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [109, 101, 116, 97, 100, 97, 116, 97];
+              }
+            ];
+          };
+        },
+        {
+          name: "relayerSigner";
+        },
+        {
+          name: "feeReceiverRelayer";
+        }
+      ];
+      args: [];
+    },
+    {
+      name: "setRouterSplit";
+      discriminator: [16, 150, 106, 13, 27, 191, 104, 8];
+      accounts: [
+        {
+          name: "admin";
+          writable: true;
+          signer: true;
+          relations: ["expressRelayMetadata"];
+        },
+        {
+          name: "routerConfig";
+          writable: true;
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [
+                  99,
+                  111,
+                  110,
+                  102,
+                  105,
+                  103,
+                  95,
+                  114,
+                  111,
+                  117,
+                  116,
+                  101,
+                  114
+                ];
+              },
+              {
+                kind: "account";
+                path: "router";
+              }
+            ];
+          };
+        },
+        {
+          name: "expressRelayMetadata";
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [109, 101, 116, 97, 100, 97, 116, 97];
+              }
+            ];
+          };
+        },
+        {
+          name: "router";
+        },
+        {
+          name: "systemProgram";
+          address: "11111111111111111111111111111111";
+        }
+      ];
+      args: [
+        {
+          name: "data";
+          type: {
+            defined: {
+              name: "setRouterSplitArgs";
+            };
+          };
+        }
+      ];
+    },
+    {
+      name: "setSplits";
+      discriminator: [175, 2, 86, 49, 225, 202, 232, 189];
+      accounts: [
+        {
+          name: "admin";
+          writable: true;
+          signer: true;
+          relations: ["expressRelayMetadata"];
+        },
+        {
+          name: "expressRelayMetadata";
+          writable: true;
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [109, 101, 116, 97, 100, 97, 116, 97];
+              }
+            ];
+          };
+        }
+      ];
+      args: [
+        {
+          name: "data";
+          type: {
+            defined: {
+              name: "setSplitsArgs";
+            };
+          };
+        }
+      ];
+    },
+    {
+      name: "submitBid";
+      discriminator: [19, 164, 237, 254, 64, 139, 237, 93];
+      accounts: [
+        {
+          name: "searcher";
+          writable: true;
+          signer: true;
+        },
+        {
+          name: "relayerSigner";
+          signer: true;
+          relations: ["expressRelayMetadata"];
+        },
+        {
+          name: "permission";
+        },
+        {
+          name: "router";
+          writable: true;
+        },
+        {
+          name: "routerConfig";
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [
+                  99,
+                  111,
+                  110,
+                  102,
+                  105,
+                  103,
+                  95,
+                  114,
+                  111,
+                  117,
+                  116,
+                  101,
+                  114
+                ];
+              },
+              {
+                kind: "account";
+                path: "router";
+              }
+            ];
+          };
+        },
+        {
+          name: "feeReceiverRelayer";
+          writable: true;
+          relations: ["expressRelayMetadata"];
+        },
+        {
+          name: "expressRelayMetadata";
+          writable: true;
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [109, 101, 116, 97, 100, 97, 116, 97];
+              }
+            ];
+          };
+        },
+        {
+          name: "systemProgram";
+          address: "11111111111111111111111111111111";
+        },
+        {
+          name: "sysvarInstructions";
+          address: "Sysvar1nstructions1111111111111111111111111";
+        }
+      ];
+      args: [
+        {
+          name: "data";
+          type: {
+            defined: {
+              name: "submitBidArgs";
+            };
+          };
+        }
+      ];
+    },
+    {
+      name: "withdrawFees";
+      discriminator: [198, 212, 171, 109, 144, 215, 174, 89];
+      accounts: [
+        {
+          name: "admin";
+          writable: true;
+          signer: true;
+          relations: ["expressRelayMetadata"];
+        },
+        {
+          name: "feeReceiverAdmin";
+          writable: true;
+        },
+        {
+          name: "expressRelayMetadata";
+          writable: true;
+          pda: {
+            seeds: [
+              {
+                kind: "const";
+                value: [109, 101, 116, 97, 100, 97, 116, 97];
+              }
+            ];
+          };
+        }
+      ];
+      args: [];
+    }
+  ];
+  accounts: [
+    {
+      name: "configRouter";
+      discriminator: [135, 66, 240, 166, 94, 198, 187, 36];
+    },
+    {
+      name: "expressRelayMetadata";
+      discriminator: [204, 75, 133, 7, 175, 241, 130, 11];
+    }
+  ];
+  errors: [
+    {
+      code: 6000;
+      name: "feeSplitLargerThanPrecision";
+      msg: "Fee split(s) larger than fee precision";
+    },
+    {
+      code: 6001;
+      name: "feesHigherThanBid";
+      msg: "Fees higher than bid";
+    },
+    {
+      code: 6002;
+      name: "deadlinePassed";
+      msg: "Deadline passed";
+    },
+    {
+      code: 6003;
+      name: "invalidCpiSubmitBid";
+      msg: "Invalid CPI into submit bid instruction";
+    },
+    {
+      code: 6004;
+      name: "missingPermission";
+      msg: "Missing permission";
+    },
+    {
+      code: 6005;
+      name: "multiplePermissions";
+      msg: "Multiple permissions";
+    },
+    {
+      code: 6006;
+      name: "insufficientSearcherFunds";
+      msg: "Insufficient Searcher Funds";
+    },
+    {
+      code: 6007;
+      name: "insufficientRent";
+      msg: "Insufficient funds for rent";
+    }
+  ];
+  types: [
+    {
+      name: "configRouter";
+      type: {
+        kind: "struct";
+        fields: [
+          {
+            name: "router";
+            type: "pubkey";
+          },
+          {
+            name: "split";
+            type: "u64";
+          }
+        ];
+      };
+    },
+    {
+      name: "expressRelayMetadata";
+      type: {
+        kind: "struct";
+        fields: [
+          {
+            name: "admin";
+            type: "pubkey";
+          },
+          {
+            name: "relayerSigner";
+            type: "pubkey";
+          },
+          {
+            name: "feeReceiverRelayer";
+            type: "pubkey";
+          },
+          {
+            name: "splitRouterDefault";
+            type: "u64";
+          },
+          {
+            name: "splitRelayer";
+            type: "u64";
+          }
+        ];
+      };
+    },
+    {
+      name: "initializeArgs";
+      type: {
+        kind: "struct";
+        fields: [
+          {
+            name: "splitRouterDefault";
+            type: "u64";
+          },
+          {
+            name: "splitRelayer";
+            type: "u64";
+          }
+        ];
+      };
+    },
+    {
+      name: "setRouterSplitArgs";
+      type: {
+        kind: "struct";
+        fields: [
+          {
+            name: "splitRouter";
+            type: "u64";
+          }
+        ];
+      };
+    },
+    {
+      name: "setSplitsArgs";
+      type: {
+        kind: "struct";
+        fields: [
+          {
+            name: "splitRouterDefault";
+            type: "u64";
+          },
+          {
+            name: "splitRelayer";
+            type: "u64";
+          }
+        ];
+      };
+    },
+    {
+      name: "submitBidArgs";
+      type: {
+        kind: "struct";
+        fields: [
+          {
+            name: "deadline";
+            type: "i64";
+          },
+          {
+            name: "bidAmount";
+            type: "u64";
+          }
+        ];
+      };
+    }
+  ];
+};

+ 487 - 0
express_relay/sdk/js/src/idl/idlExpressRelay.json

@@ -0,0 +1,487 @@
+{
+  "address": "GwEtasTAxdS9neVE4GPUpcwR7DB7AizntQSPcG36ubZM",
+  "metadata": {
+    "name": "express_relay",
+    "version": "0.1.0",
+    "spec": "0.1.0",
+    "description": "Created with Anchor"
+  },
+  "instructions": [
+    {
+      "name": "check_permission",
+      "discriminator": [154, 199, 232, 242, 96, 72, 197, 236],
+      "accounts": [
+        {
+          "name": "sysvar_instructions",
+          "address": "Sysvar1nstructions1111111111111111111111111"
+        },
+        {
+          "name": "permission"
+        },
+        {
+          "name": "router"
+        }
+      ],
+      "args": []
+    },
+    {
+      "name": "initialize",
+      "discriminator": [175, 175, 109, 31, 13, 152, 155, 237],
+      "accounts": [
+        {
+          "name": "payer",
+          "writable": true,
+          "signer": true
+        },
+        {
+          "name": "express_relay_metadata",
+          "writable": true,
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [109, 101, 116, 97, 100, 97, 116, 97]
+              }
+            ]
+          }
+        },
+        {
+          "name": "admin"
+        },
+        {
+          "name": "relayer_signer"
+        },
+        {
+          "name": "fee_receiver_relayer"
+        },
+        {
+          "name": "system_program",
+          "address": "11111111111111111111111111111111"
+        }
+      ],
+      "args": [
+        {
+          "name": "data",
+          "type": {
+            "defined": {
+              "name": "InitializeArgs"
+            }
+          }
+        }
+      ]
+    },
+    {
+      "name": "set_admin",
+      "discriminator": [251, 163, 0, 52, 91, 194, 187, 92],
+      "accounts": [
+        {
+          "name": "admin",
+          "writable": true,
+          "signer": true,
+          "relations": ["express_relay_metadata"]
+        },
+        {
+          "name": "express_relay_metadata",
+          "writable": true,
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [109, 101, 116, 97, 100, 97, 116, 97]
+              }
+            ]
+          }
+        },
+        {
+          "name": "admin_new"
+        }
+      ],
+      "args": []
+    },
+    {
+      "name": "set_relayer",
+      "discriminator": [23, 243, 33, 88, 110, 84, 196, 37],
+      "accounts": [
+        {
+          "name": "admin",
+          "writable": true,
+          "signer": true,
+          "relations": ["express_relay_metadata"]
+        },
+        {
+          "name": "express_relay_metadata",
+          "writable": true,
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [109, 101, 116, 97, 100, 97, 116, 97]
+              }
+            ]
+          }
+        },
+        {
+          "name": "relayer_signer"
+        },
+        {
+          "name": "fee_receiver_relayer"
+        }
+      ],
+      "args": []
+    },
+    {
+      "name": "set_router_split",
+      "discriminator": [16, 150, 106, 13, 27, 191, 104, 8],
+      "accounts": [
+        {
+          "name": "admin",
+          "writable": true,
+          "signer": true,
+          "relations": ["express_relay_metadata"]
+        },
+        {
+          "name": "router_config",
+          "writable": true,
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [
+                  99, 111, 110, 102, 105, 103, 95, 114, 111, 117, 116, 101, 114
+                ]
+              },
+              {
+                "kind": "account",
+                "path": "router"
+              }
+            ]
+          }
+        },
+        {
+          "name": "express_relay_metadata",
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [109, 101, 116, 97, 100, 97, 116, 97]
+              }
+            ]
+          }
+        },
+        {
+          "name": "router"
+        },
+        {
+          "name": "system_program",
+          "address": "11111111111111111111111111111111"
+        }
+      ],
+      "args": [
+        {
+          "name": "data",
+          "type": {
+            "defined": {
+              "name": "SetRouterSplitArgs"
+            }
+          }
+        }
+      ]
+    },
+    {
+      "name": "set_splits",
+      "discriminator": [175, 2, 86, 49, 225, 202, 232, 189],
+      "accounts": [
+        {
+          "name": "admin",
+          "writable": true,
+          "signer": true,
+          "relations": ["express_relay_metadata"]
+        },
+        {
+          "name": "express_relay_metadata",
+          "writable": true,
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [109, 101, 116, 97, 100, 97, 116, 97]
+              }
+            ]
+          }
+        }
+      ],
+      "args": [
+        {
+          "name": "data",
+          "type": {
+            "defined": {
+              "name": "SetSplitsArgs"
+            }
+          }
+        }
+      ]
+    },
+    {
+      "name": "submit_bid",
+      "discriminator": [19, 164, 237, 254, 64, 139, 237, 93],
+      "accounts": [
+        {
+          "name": "searcher",
+          "writable": true,
+          "signer": true
+        },
+        {
+          "name": "relayer_signer",
+          "signer": true,
+          "relations": ["express_relay_metadata"]
+        },
+        {
+          "name": "permission"
+        },
+        {
+          "name": "router",
+          "writable": true
+        },
+        {
+          "name": "router_config",
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [
+                  99, 111, 110, 102, 105, 103, 95, 114, 111, 117, 116, 101, 114
+                ]
+              },
+              {
+                "kind": "account",
+                "path": "router"
+              }
+            ]
+          }
+        },
+        {
+          "name": "fee_receiver_relayer",
+          "writable": true,
+          "relations": ["express_relay_metadata"]
+        },
+        {
+          "name": "express_relay_metadata",
+          "writable": true,
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [109, 101, 116, 97, 100, 97, 116, 97]
+              }
+            ]
+          }
+        },
+        {
+          "name": "system_program",
+          "address": "11111111111111111111111111111111"
+        },
+        {
+          "name": "sysvar_instructions",
+          "address": "Sysvar1nstructions1111111111111111111111111"
+        }
+      ],
+      "args": [
+        {
+          "name": "data",
+          "type": {
+            "defined": {
+              "name": "SubmitBidArgs"
+            }
+          }
+        }
+      ]
+    },
+    {
+      "name": "withdraw_fees",
+      "discriminator": [198, 212, 171, 109, 144, 215, 174, 89],
+      "accounts": [
+        {
+          "name": "admin",
+          "writable": true,
+          "signer": true,
+          "relations": ["express_relay_metadata"]
+        },
+        {
+          "name": "fee_receiver_admin",
+          "writable": true
+        },
+        {
+          "name": "express_relay_metadata",
+          "writable": true,
+          "pda": {
+            "seeds": [
+              {
+                "kind": "const",
+                "value": [109, 101, 116, 97, 100, 97, 116, 97]
+              }
+            ]
+          }
+        }
+      ],
+      "args": []
+    }
+  ],
+  "accounts": [
+    {
+      "name": "ConfigRouter",
+      "discriminator": [135, 66, 240, 166, 94, 198, 187, 36]
+    },
+    {
+      "name": "ExpressRelayMetadata",
+      "discriminator": [204, 75, 133, 7, 175, 241, 130, 11]
+    }
+  ],
+  "errors": [
+    {
+      "code": 6000,
+      "name": "FeeSplitLargerThanPrecision",
+      "msg": "Fee split(s) larger than fee precision"
+    },
+    {
+      "code": 6001,
+      "name": "FeesHigherThanBid",
+      "msg": "Fees higher than bid"
+    },
+    {
+      "code": 6002,
+      "name": "DeadlinePassed",
+      "msg": "Deadline passed"
+    },
+    {
+      "code": 6003,
+      "name": "InvalidCPISubmitBid",
+      "msg": "Invalid CPI into submit bid instruction"
+    },
+    {
+      "code": 6004,
+      "name": "MissingPermission",
+      "msg": "Missing permission"
+    },
+    {
+      "code": 6005,
+      "name": "MultiplePermissions",
+      "msg": "Multiple permissions"
+    },
+    {
+      "code": 6006,
+      "name": "InsufficientSearcherFunds",
+      "msg": "Insufficient Searcher Funds"
+    },
+    {
+      "code": 6007,
+      "name": "InsufficientRent",
+      "msg": "Insufficient funds for rent"
+    }
+  ],
+  "types": [
+    {
+      "name": "ConfigRouter",
+      "type": {
+        "kind": "struct",
+        "fields": [
+          {
+            "name": "router",
+            "type": "pubkey"
+          },
+          {
+            "name": "split",
+            "type": "u64"
+          }
+        ]
+      }
+    },
+    {
+      "name": "ExpressRelayMetadata",
+      "type": {
+        "kind": "struct",
+        "fields": [
+          {
+            "name": "admin",
+            "type": "pubkey"
+          },
+          {
+            "name": "relayer_signer",
+            "type": "pubkey"
+          },
+          {
+            "name": "fee_receiver_relayer",
+            "type": "pubkey"
+          },
+          {
+            "name": "split_router_default",
+            "type": "u64"
+          },
+          {
+            "name": "split_relayer",
+            "type": "u64"
+          }
+        ]
+      }
+    },
+    {
+      "name": "InitializeArgs",
+      "type": {
+        "kind": "struct",
+        "fields": [
+          {
+            "name": "split_router_default",
+            "type": "u64"
+          },
+          {
+            "name": "split_relayer",
+            "type": "u64"
+          }
+        ]
+      }
+    },
+    {
+      "name": "SetRouterSplitArgs",
+      "type": {
+        "kind": "struct",
+        "fields": [
+          {
+            "name": "split_router",
+            "type": "u64"
+          }
+        ]
+      }
+    },
+    {
+      "name": "SetSplitsArgs",
+      "type": {
+        "kind": "struct",
+        "fields": [
+          {
+            "name": "split_router_default",
+            "type": "u64"
+          },
+          {
+            "name": "split_relayer",
+            "type": "u64"
+          }
+        ]
+      }
+    },
+    {
+      "name": "SubmitBidArgs",
+      "type": {
+        "kind": "struct",
+        "fields": [
+          {
+            "name": "deadline",
+            "type": "i64"
+          },
+          {
+            "name": "bid_amount",
+            "type": "u64"
+          }
+        ]
+      }
+    }
+  ]
+}

+ 124 - 6
express_relay/sdk/js/src/index.ts

@@ -17,6 +17,7 @@ import {
   BidId,
   BidParams,
   BidStatusUpdate,
+  BidSvm,
   Opportunity,
   OpportunityParams,
   TokenAmount,
@@ -25,13 +26,25 @@ import {
   OpportunityBid,
 } from "./types";
 import { executeOpportunityAbi } from "./abi";
-import { OPPORTUNITY_ADAPTER_CONFIGS } from "./const";
+import { OPPORTUNITY_ADAPTER_CONFIGS, SVM_CONSTANTS } from "./const";
+import {
+  PublicKey,
+  Transaction,
+  TransactionInstruction,
+} from "@solana/web3.js";
+import * as anchor from "@coral-xyz/anchor";
+import { AnchorProvider, Program } from "@coral-xyz/anchor";
+import expressRelayIdl from "./idl/idlExpressRelay.json";
+import { ExpressRelay } from "./expressRelayTypes";
 
 export * from "./types";
 
 export class ClientError extends Error {}
 
-type ClientOptions = FetchClientOptions & { baseUrl: string; apiKey?: string };
+type ClientOptions = FetchClientOptions & {
+  baseUrl: string;
+  apiKey?: string;
+};
 
 export interface WsOptions {
   /**
@@ -526,16 +539,26 @@ export class Client {
       chainId: opportunity.chainId,
       targetContract: opportunityAdapterConfig.opportunity_adapter_factory,
       permissionKey: opportunity.permissionKey,
+      env: "evm",
     };
   }
 
   private toServerBid(bid: Bid): components["schemas"]["Bid"] {
+    if (bid.env == "evm") {
+      return {
+        amount: bid.amount.toString(),
+        target_calldata: bid.targetCalldata,
+        chain_id: bid.chainId,
+        target_contract: bid.targetContract,
+        permission_key: bid.permissionKey,
+      };
+    }
+
     return {
-      amount: bid.amount.toString(),
-      target_calldata: bid.targetCalldata,
       chain_id: bid.chainId,
-      target_contract: bid.targetContract,
-      permission_key: bid.permissionKey,
+      transaction: bid.transaction
+        .serialize({ requireAllSignatures: false })
+        .toString("base64"),
     };
   }
 
@@ -591,4 +614,99 @@ export class Client {
       return response.data;
     }
   }
+
+  /**
+   * Constructs a SubmitBid instruction, which can be added to a transaction to permission it on the given permission key
+   * @param searcher The address of the searcher that is submitting the bid
+   * @param router The identifying address of the router that the permission key is for
+   * @param permissionKey The 32-byte permission key as an SVM PublicKey
+   * @param bidAmount The amount of the bid in lamports
+   * @param deadline The deadline for the bid in seconds since Unix epoch
+   * @param chainId The chain ID as a string, e.g. "solana"
+   * @returns The SubmitBid instruction
+   */
+  async constructSubmitBidInstruction(
+    searcher: PublicKey,
+    router: PublicKey,
+    permissionKey: PublicKey,
+    bidAmount: anchor.BN,
+    deadline: anchor.BN,
+    chainId: string
+  ): Promise<TransactionInstruction> {
+    const expressRelay = new Program<ExpressRelay>(
+      expressRelayIdl as ExpressRelay,
+      {} as AnchorProvider
+    );
+
+    const svmConstants = SVM_CONSTANTS[chainId];
+
+    const routerConfig = PublicKey.findProgramAddressSync(
+      [anchor.utils.bytes.utf8.encode("config_router"), router.toBuffer()],
+      svmConstants.expressRelayProgram
+    )[0];
+
+    const expressRelayMetadata = PublicKey.findProgramAddressSync(
+      [anchor.utils.bytes.utf8.encode("metadata")],
+      svmConstants.expressRelayProgram
+    )[0];
+
+    const ixSubmitBid = await expressRelay.methods
+      .submitBid({
+        deadline,
+        bidAmount,
+      })
+      .accountsStrict({
+        searcher,
+        relayerSigner: svmConstants.relayerSigner,
+        permission: permissionKey,
+        router,
+        routerConfig,
+        feeReceiverRelayer: svmConstants.feeReceiverRelayer,
+        expressRelayMetadata,
+        systemProgram: anchor.web3.SystemProgram.programId,
+        sysvarInstructions: anchor.web3.SYSVAR_INSTRUCTIONS_PUBKEY,
+      })
+      .instruction();
+    ixSubmitBid.programId = svmConstants.expressRelayProgram;
+
+    return ixSubmitBid;
+  }
+
+  /**
+   * Constructs an SVM bid, by adding a SubmitBid instruction to a transaction
+   * @param txRaw The transaction to add a SubmitBid instruction to. This transaction should already check for the appropriate permissions.
+   * @param searcher The address of the searcher that is submitting the bid
+   * @param router The identifying address of the router that the permission key is for
+   * @param permissionKey The 32-byte permission key as an SVM PublicKey
+   * @param bidAmount The amount of the bid in lamports
+   * @param deadline The deadline for the bid in seconds since Unix epoch
+   * @param chainId The chain ID as a string, e.g. "solana"
+   * @returns The constructed SVM bid
+   */
+  async constructSvmBid(
+    tx: Transaction,
+    searcher: PublicKey,
+    router: PublicKey,
+    permissionKey: PublicKey,
+    bidAmount: anchor.BN,
+    deadline: anchor.BN,
+    chainId: string
+  ): Promise<BidSvm> {
+    const ixSubmitBid = await this.constructSubmitBidInstruction(
+      searcher,
+      router,
+      permissionKey,
+      bidAmount,
+      deadline,
+      chainId
+    );
+
+    tx.instructions.unshift(ixSubmitBid);
+
+    return {
+      transaction: tx,
+      chainId: chainId,
+      env: "svm",
+    };
+  }
 }

+ 18 - 5
express_relay/sdk/js/src/serverTypes.d.ts

@@ -12,8 +12,8 @@ export interface paths {
     get: operations["get_bids_by_time"];
     /**
      * Bid on a specific permission key for a specific chain.
-     * @description Your bid will be simulated and verified by the server. Depending on the outcome of the auction, a transaction
-     * containing the contract call will be sent to the blockchain expecting the bid amount to be paid after the call.
+     * @description Your bid will be verified by the server. Depending on the outcome of the auction, a transaction
+     * containing your bid will be sent to the blockchain expecting the bid amount to be paid in the transaction.
      */
     post: operations["bid"];
   };
@@ -53,7 +53,8 @@ export type webhooks = Record<string, never>;
 export interface components {
   schemas: {
     APIResponse: components["schemas"]["BidResult"];
-    Bid: {
+    Bid: components["schemas"]["BidEvm"] | components["schemas"]["BidSvm"];
+    BidEvm: {
       /**
        * @description Amount of bid in wei.
        * @example 10
@@ -130,6 +131,18 @@ export interface components {
       bid_status: components["schemas"]["BidStatus"];
       id: string;
     };
+    BidSvm: {
+      /**
+       * @description The chain id to bid on.
+       * @example solana
+       */
+      chain_id: string;
+      /**
+       * @description The transaction for bid.
+       * @example SGVsbG8sIFdvcmxkIQ==
+       */
+      transaction: string;
+    };
     ClientMessage:
       | {
           /** @enum {string} */
@@ -431,8 +444,8 @@ export interface operations {
   };
   /**
    * Bid on a specific permission key for a specific chain.
-   * @description Your bid will be simulated and verified by the server. Depending on the outcome of the auction, a transaction
-   * containing the contract call will be sent to the blockchain expecting the bid amount to be paid after the call.
+   * @description Your bid will be verified by the server. Depending on the outcome of the auction, a transaction
+   * containing your bid will be sent to the blockchain expecting the bid amount to be paid in the transaction.
    */
   bid: {
     requestBody: {

+ 34 - 2
express_relay/sdk/js/src/types.ts

@@ -1,5 +1,6 @@
 import { Address, Hex } from "viem";
 import type { components } from "./serverTypes";
+import { PublicKey, Transaction } from "@solana/web3.js";
 
 /**
  * ERC20 token with contract address and amount
@@ -123,10 +124,12 @@ export type OpportunityBid = {
  * All the parameters necessary to represent an opportunity
  */
 export type OpportunityParams = Omit<Opportunity, "opportunityId">;
+
+export type Bid = BidEvm | BidSvm;
 /**
- * Represents a raw bid on acquiring a permission key
+ * Represents a raw EVM bid on acquiring a permission key
  */
-export type Bid = {
+export type BidEvm = {
   /**
    * The permission key to bid on
    * @example 0xc0ffeebabe
@@ -153,6 +156,29 @@ export type Bid = {
    * @example 0xcA11bde05977b3631167028862bE2a173976CA11
    */
   targetContract: Address;
+  /**
+   * @description The execution environment for the bid.
+   */
+  env: "evm";
+};
+/**
+ * Represents a raw SVM bid on acquiring a permission key
+ */
+export type BidSvm = {
+  /**
+   * @description Transaction object.
+   * @example SGVsbG8sIFdvcmxkIQ
+   */
+  transaction: Transaction;
+  /**
+   * @description The chain id to bid on.
+   * @example solana
+   */
+  chainId: ChainId;
+  /**
+   * @description The execution environment for the bid.
+   */
+  env: "svm";
 };
 export type BidStatusUpdate = {
   id: BidId;
@@ -162,3 +188,9 @@ export type BidResponse = components["schemas"]["SimulatedBid"];
 export type BidsResponse = {
   items: BidResponse[];
 };
+
+export type SvmConstantsConfig = {
+  relayerSigner: PublicKey;
+  feeReceiverRelayer: PublicKey;
+  expressRelayProgram: PublicKey;
+};

+ 1 - 1
express_relay/sdk/js/tsconfig.json

@@ -11,6 +11,6 @@
     "resolveJsonModule": true,
     "typeRoots": ["node_modules/@types"]
   },
-  "include": ["src"],
+  "include": ["src", "src/**/*.json"],
   "exclude": ["node_modules", "**/__tests__/*"]
 }

+ 92 - 144
pnpm-lock.yaml

@@ -347,7 +347,7 @@ importers:
         version: 0.9.35(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)
       '@solana/wallet-adapter-wallets':
         specifier: 0.19.10
-        version: 0.19.10(@babel/runtime@7.24.8)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)
+        version: 0.19.10(@babel/runtime@7.25.0)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)
       '@solana/web3.js':
         specifier: 1.92.3
         version: 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
@@ -594,6 +594,12 @@ importers:
 
   express_relay/sdk/js:
     dependencies:
+      '@coral-xyz/anchor':
+        specifier: ^0.30.1
+        version: 0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
+      '@solana/web3.js':
+        specifier: 1.92.3
+        version: 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
       isomorphic-ws:
         specifier: ^5.0.0
         version: 5.0.0(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))
@@ -3478,6 +3484,10 @@ packages:
   '@confio/ics23@0.6.8':
     resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==}
 
+  '@coral-xyz/anchor-errors@0.30.1':
+    resolution: {integrity: sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==}
+    engines: {node: '>=10'}
+
   '@coral-xyz/anchor@0.27.0':
     resolution: {integrity: sha512-+P/vPdORawvg3A9Wj02iquxb4T0C5m4P6aZBVYysKl4Amk+r6aMPZkUhilBkD6E4Nuxnoajv3CFykUfkGE0n5g==}
     engines: {node: '>=11'}
@@ -3490,6 +3500,10 @@ packages:
     resolution: {integrity: sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==}
     engines: {node: '>=11'}
 
+  '@coral-xyz/anchor@0.30.1':
+    resolution: {integrity: sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==}
+    engines: {node: '>=11'}
+
   '@coral-xyz/borsh@0.2.6':
     resolution: {integrity: sha512-y6nmHw1bFcJib7sMHsQPpC8r47xhqDZVvhUdna7NUPzpSbOZG6f46N21+aXsQ2w/tG8Ggls488J/ZmwbgVmyjg==}
     engines: {node: '>=10'}
@@ -3520,6 +3534,12 @@ packages:
     peerDependencies:
       '@solana/web3.js': 1.92.3
 
+  '@coral-xyz/borsh@0.30.1':
+    resolution: {integrity: sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@solana/web3.js': 1.92.3
+
   '@cosmjs/amino@0.30.1':
     resolution: {integrity: sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w==}
 
@@ -23078,6 +23098,8 @@ snapshots:
       '@noble/hashes': 1.4.0
       protobufjs: 6.11.4
 
+  '@coral-xyz/anchor-errors@0.30.1': {}
+
   '@coral-xyz/anchor@0.27.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)':
     dependencies:
       '@coral-xyz/borsh': 0.27.0(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -23163,6 +23185,28 @@ snapshots:
       - encoding
       - utf-8-validate
 
+  '@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@coral-xyz/anchor-errors': 0.30.1
+      '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
+      '@noble/hashes': 1.4.0
+      '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      bs58: 4.0.1
+      buffer-layout: 1.2.2
+      camelcase: 6.3.0
+      cross-fetch: 3.1.5(encoding@0.1.13)
+      crypto-hash: 1.3.0
+      eventemitter3: 4.0.7
+      pako: 2.1.0
+      snake-case: 3.0.4
+      superstruct: 0.15.5
+      toml: 3.0.0
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - utf-8-validate
+
   '@coral-xyz/borsh@0.2.6(@solana/web3.js@1.92.3(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@5.0.10))':
     dependencies:
       '@solana/web3.js': 1.92.3(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@5.0.10)
@@ -23223,6 +23267,12 @@ snapshots:
       bn.js: 5.2.1
       buffer-layout: 1.2.2
 
+  '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))':
+    dependencies:
+      '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      buffer-layout: 1.2.2
+
   '@cosmjs/amino@0.30.1':
     dependencies:
       '@cosmjs/crypto': 0.30.1
@@ -28770,7 +28820,7 @@ snapshots:
 
   '@radix-ui/react-arrow@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@radix-ui/react-primitive': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
@@ -28877,7 +28927,7 @@ snapshots:
 
   '@radix-ui/react-use-callback-ref@1.0.0(react@18.3.1)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       react: 18.3.1
 
   '@radix-ui/react-use-controllable-state@1.0.0(react@18.3.1)':
@@ -28888,24 +28938,24 @@ snapshots:
 
   '@radix-ui/react-use-escape-keydown@1.0.2(react@18.3.1)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1)
       react: 18.3.1
 
   '@radix-ui/react-use-layout-effect@1.0.0(react@18.3.1)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       react: 18.3.1
 
   '@radix-ui/react-use-rect@1.0.0(react@18.3.1)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@radix-ui/rect': 1.0.0
       react: 18.3.1
 
   '@radix-ui/react-use-size@1.0.0(react@18.3.1)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1)
       react: 18.3.1
 
@@ -28918,7 +28968,7 @@ snapshots:
 
   '@radix-ui/rect@1.0.0':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
 
   '@react-aria/focus@3.17.1(react@18.3.1)':
     dependencies:
@@ -30169,23 +30219,6 @@ snapshots:
       '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
 
-  '@solana/wallet-adapter-torus@0.11.28(@babel/runtime@7.24.8)(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)':
-    dependencies:
-      '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
-      '@toruslabs/solana-embed': 0.3.4(@babel/runtime@7.24.8)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
-      assert: 2.1.0
-      crypto-browserify: 3.12.0
-      process: 0.11.10
-      stream-browserify: 3.0.0
-    transitivePeerDependencies:
-      - '@babel/runtime'
-      - '@sentry/types'
-      - bufferutil
-      - encoding
-      - supports-color
-      - utf-8-validate
-
   '@solana/wallet-adapter-torus@0.11.28(@babel/runtime@7.25.0)(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)':
     dependencies:
       '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -30264,7 +30297,7 @@ snapshots:
       - uWebSockets.js
       - utf-8-validate
 
-  '@solana/wallet-adapter-wallets@0.19.10(@babel/runtime@7.24.8)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)':
+  '@solana/wallet-adapter-wallets@0.19.10(@babel/runtime@7.25.0)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.0)(@babel/preset-env@7.24.7(@babel/core@7.24.0))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)':
     dependencies:
       '@solana/wallet-adapter-alpha': 0.1.10(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-avana': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -30292,7 +30325,7 @@ snapshots:
       '@solana/wallet-adapter-nightly': 0.1.16(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-nufi': 0.1.17(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-onto': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-particle': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)
+      '@solana/wallet-adapter-particle': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)
       '@solana/wallet-adapter-phantom': 0.9.24(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-safepal': 0.5.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-saifu': 0.1.15(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -30306,10 +30339,10 @@ snapshots:
       '@solana/wallet-adapter-strike': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
       '@solana/wallet-adapter-tokenary': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-tokenpocket': 0.4.19(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-torus': 0.11.28(@babel/runtime@7.24.8)(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
+      '@solana/wallet-adapter-torus': 0.11.28(@babel/runtime@7.25.0)(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
       '@solana/wallet-adapter-trust': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-unsafe-burner': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-walletconnect': 0.1.16(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
+      '@solana/wallet-adapter-walletconnect': 0.1.16(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.0)(@babel/preset-env@7.24.7(@babel/core@7.24.0))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
       '@solana/wallet-adapter-xdefi': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
     transitivePeerDependencies:
@@ -30338,7 +30371,7 @@ snapshots:
       - uWebSockets.js
       - utf-8-validate
 
-  '@solana/wallet-adapter-wallets@0.19.10(@babel/runtime@7.25.0)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.0)(@babel/preset-env@7.24.7(@babel/core@7.24.0))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)':
+  '@solana/wallet-adapter-wallets@0.19.10(@babel/runtime@7.25.0)(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)':
     dependencies:
       '@solana/wallet-adapter-alpha': 0.1.10(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-avana': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -30366,7 +30399,7 @@ snapshots:
       '@solana/wallet-adapter-nightly': 0.1.16(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-nufi': 0.1.17(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-onto': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-particle': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)
+      '@solana/wallet-adapter-particle': 0.1.12(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)
       '@solana/wallet-adapter-phantom': 0.9.24(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-safepal': 0.5.18(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-saifu': 0.1.15(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
@@ -30383,7 +30416,7 @@ snapshots:
       '@solana/wallet-adapter-torus': 0.11.28(@babel/runtime@7.25.0)(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
       '@solana/wallet-adapter-trust': 0.1.13(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/wallet-adapter-unsafe-burner': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
-      '@solana/wallet-adapter-walletconnect': 0.1.16(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.0)(@babel/preset-env@7.24.7(@babel/core@7.24.0))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
+      '@solana/wallet-adapter-walletconnect': 0.1.16(@react-native-async-storage/async-storage@1.23.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
       '@solana/wallet-adapter-xdefi': 0.1.7(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))
       '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
     transitivePeerDependencies:
@@ -30508,7 +30541,7 @@ snapshots:
 
   '@solana/web3.js@1.77.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@noble/curves': 1.4.2
       '@noble/hashes': 1.4.0
       '@solana/buffer-layout': 4.0.1
@@ -30530,7 +30563,7 @@ snapshots:
 
   '@solana/web3.js@1.92.3(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@5.0.10)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@noble/curves': 1.4.2
       '@noble/hashes': 1.4.0
       '@solana/buffer-layout': 4.0.1
@@ -30552,7 +30585,7 @@ snapshots:
 
   '@solana/web3.js@1.92.3(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@noble/curves': 1.4.2
       '@noble/hashes': 1.4.0
       '@solana/buffer-layout': 4.0.1
@@ -30574,7 +30607,7 @@ snapshots:
 
   '@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@noble/curves': 1.4.2
       '@noble/hashes': 1.4.0
       '@solana/buffer-layout': 4.0.1
@@ -30596,7 +30629,7 @@ snapshots:
 
   '@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@noble/curves': 1.4.2
       '@noble/hashes': 1.4.0
       '@solana/buffer-layout': 4.0.1
@@ -31252,26 +31285,6 @@ snapshots:
 
   '@tootallnate/once@2.0.0': {}
 
-  '@toruslabs/base-controllers@2.9.0(@babel/runtime@7.24.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
-    dependencies:
-      '@babel/runtime': 7.24.8
-      '@ethereumjs/util': 8.1.0
-      '@toruslabs/broadcast-channel': 6.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
-      '@toruslabs/http-helpers': 3.4.0(@babel/runtime@7.24.8)
-      '@toruslabs/openlogin-jrpc': 4.7.2(@babel/runtime@7.24.8)
-      async-mutex: 0.4.1
-      bignumber.js: 9.1.2
-      bowser: 2.11.0
-      eth-rpc-errors: 4.0.3
-      json-rpc-random-id: 1.0.1
-      lodash: 4.17.21
-      loglevel: 1.8.1
-    transitivePeerDependencies:
-      - '@sentry/types'
-      - bufferutil
-      - supports-color
-      - utf-8-validate
-
   '@toruslabs/base-controllers@2.9.0(@babel/runtime@7.25.0)(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
     dependencies:
       '@babel/runtime': 7.25.0
@@ -31294,9 +31307,9 @@ snapshots:
 
   '@toruslabs/broadcast-channel@6.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@toruslabs/eccrypto': 2.2.1
-      '@toruslabs/metadata-helpers': 3.2.0(@babel/runtime@7.24.8)
+      '@toruslabs/metadata-helpers': 3.2.0(@babel/runtime@7.25.0)
       bowser: 2.11.0
       loglevel: 1.8.1
       oblivious-set: 1.1.1
@@ -31312,41 +31325,23 @@ snapshots:
     dependencies:
       elliptic: 6.5.6
 
-  '@toruslabs/http-helpers@3.4.0(@babel/runtime@7.24.8)':
-    dependencies:
-      '@babel/runtime': 7.24.8
-      lodash.merge: 4.6.2
-      loglevel: 1.8.1
-
   '@toruslabs/http-helpers@3.4.0(@babel/runtime@7.25.0)':
     dependencies:
       '@babel/runtime': 7.25.0
       lodash.merge: 4.6.2
       loglevel: 1.8.1
 
-  '@toruslabs/metadata-helpers@3.2.0(@babel/runtime@7.24.8)':
+  '@toruslabs/metadata-helpers@3.2.0(@babel/runtime@7.25.0)':
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       '@toruslabs/eccrypto': 2.2.1
-      '@toruslabs/http-helpers': 3.4.0(@babel/runtime@7.24.8)
+      '@toruslabs/http-helpers': 3.4.0(@babel/runtime@7.25.0)
       elliptic: 6.5.6
       ethereum-cryptography: 2.2.1
       json-stable-stringify: 1.1.1
     transitivePeerDependencies:
       - '@sentry/types'
 
-  '@toruslabs/openlogin-jrpc@3.2.0(@babel/runtime@7.24.8)':
-    dependencies:
-      '@babel/runtime': 7.24.8
-      '@toruslabs/openlogin-utils': 3.0.0(@babel/runtime@7.24.8)
-      end-of-stream: 1.4.4
-      eth-rpc-errors: 4.0.3
-      events: 3.3.0
-      fast-safe-stringify: 2.1.1
-      once: 1.4.0
-      pump: 3.0.0
-      readable-stream: 3.6.2
-
   '@toruslabs/openlogin-jrpc@3.2.0(@babel/runtime@7.25.0)':
     dependencies:
       '@babel/runtime': 7.25.0
@@ -31359,20 +31354,6 @@ snapshots:
       pump: 3.0.0
       readable-stream: 3.6.2
 
-  '@toruslabs/openlogin-jrpc@4.7.2(@babel/runtime@7.24.8)':
-    dependencies:
-      '@babel/runtime': 7.24.8
-      '@metamask/rpc-errors': 5.1.1
-      '@toruslabs/openlogin-utils': 4.7.0(@babel/runtime@7.24.8)
-      end-of-stream: 1.4.4
-      events: 3.3.0
-      fast-safe-stringify: 2.1.1
-      once: 1.4.0
-      pump: 3.0.0
-      readable-stream: 4.5.2
-    transitivePeerDependencies:
-      - supports-color
-
   '@toruslabs/openlogin-jrpc@4.7.2(@babel/runtime@7.25.0)':
     dependencies:
       '@babel/runtime': 7.25.0
@@ -31387,13 +31368,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@toruslabs/openlogin-utils@3.0.0(@babel/runtime@7.24.8)':
-    dependencies:
-      '@babel/runtime': 7.24.8
-      base64url: 3.0.1
-      keccak: 3.0.4
-      randombytes: 2.1.0
-
   '@toruslabs/openlogin-utils@3.0.0(@babel/runtime@7.25.0)':
     dependencies:
       '@babel/runtime': 7.25.0
@@ -31401,36 +31375,11 @@ snapshots:
       keccak: 3.0.4
       randombytes: 2.1.0
 
-  '@toruslabs/openlogin-utils@4.7.0(@babel/runtime@7.24.8)':
-    dependencies:
-      '@babel/runtime': 7.24.8
-      base64url: 3.0.1
-
   '@toruslabs/openlogin-utils@4.7.0(@babel/runtime@7.25.0)':
     dependencies:
       '@babel/runtime': 7.25.0
       base64url: 3.0.1
 
-  '@toruslabs/solana-embed@0.3.4(@babel/runtime@7.24.8)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)':
-    dependencies:
-      '@babel/runtime': 7.24.8
-      '@solana/web3.js': 1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
-      '@toruslabs/base-controllers': 2.9.0(@babel/runtime@7.24.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10)
-      '@toruslabs/http-helpers': 3.4.0(@babel/runtime@7.24.8)
-      '@toruslabs/openlogin-jrpc': 3.2.0(@babel/runtime@7.24.8)
-      eth-rpc-errors: 4.0.3
-      fast-deep-equal: 3.1.3
-      is-stream: 2.0.1
-      lodash-es: 4.17.21
-      loglevel: 1.8.1
-      pump: 3.0.0
-    transitivePeerDependencies:
-      - '@sentry/types'
-      - bufferutil
-      - encoding
-      - supports-color
-      - utf-8-validate
-
   '@toruslabs/solana-embed@0.3.4(@babel/runtime@7.25.0)(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)':
     dependencies:
       '@babel/runtime': 7.25.0
@@ -31948,7 +31897,6 @@ snapshots:
   '@types/connect@3.4.38':
     dependencies:
       '@types/node': 20.14.15
-    optional: true
 
   '@types/cors@2.8.12':
     optional: true
@@ -34949,7 +34897,7 @@ snapshots:
 
   axios-retry@3.9.1:
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       is-retry-allowed: 2.2.0
 
   axios-retry@4.4.0(axios@1.6.8):
@@ -35547,7 +35495,7 @@ snapshots:
 
   bs58@4.0.1:
     dependencies:
-      base-x: 3.0.9
+      base-x: 3.0.10
 
   bs58@5.0.0:
     dependencies:
@@ -36727,7 +36675,7 @@ snapshots:
 
   crypto-addr-codec@0.1.7:
     dependencies:
-      base-x: 3.0.9
+      base-x: 3.0.10
       big-integer: 1.6.36
       blakejs: 1.2.1
       bs58: 4.0.1
@@ -38464,7 +38412,7 @@ snapshots:
   eth-block-tracker@4.4.3(@babel/core@7.24.7):
     dependencies:
       '@babel/plugin-transform-runtime': 7.19.6(@babel/core@7.24.7)
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       eth-query: 2.1.2
       json-rpc-random-id: 1.0.1
       pify: 3.0.0
@@ -40340,11 +40288,11 @@ snapshots:
 
   i18next-browser-languagedetector@7.1.0:
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
 
   i18next@22.5.1:
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
 
   iconv-lite@0.4.24:
     dependencies:
@@ -40908,7 +40856,7 @@ snapshots:
 
   jayson@4.1.0(bufferutil@4.0.7)(utf-8-validate@5.0.10):
     dependencies:
-      '@types/connect': 3.4.35
+      '@types/connect': 3.4.38
       '@types/node': 12.20.55
       '@types/ws': 7.4.7
       JSONStream: 1.3.5
@@ -40926,7 +40874,7 @@ snapshots:
 
   jayson@4.1.0(bufferutil@4.0.7)(utf-8-validate@6.0.3):
     dependencies:
-      '@types/connect': 3.4.35
+      '@types/connect': 3.4.38
       '@types/node': 12.20.55
       '@types/ws': 7.4.7
       JSONStream: 1.3.5
@@ -40944,7 +40892,7 @@ snapshots:
 
   jayson@4.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10):
     dependencies:
-      '@types/connect': 3.4.35
+      '@types/connect': 3.4.38
       '@types/node': 12.20.55
       '@types/ws': 7.4.7
       JSONStream: 1.3.5
@@ -40962,7 +40910,7 @@ snapshots:
 
   jayson@4.1.0(bufferutil@4.0.8)(utf-8-validate@6.0.4):
     dependencies:
-      '@types/connect': 3.4.35
+      '@types/connect': 3.4.38
       '@types/node': 12.20.55
       '@types/ws': 7.4.7
       JSONStream: 1.3.5
@@ -40980,7 +40928,7 @@ snapshots:
 
   jayson@4.1.1(bufferutil@4.0.7)(utf-8-validate@5.0.10):
     dependencies:
-      '@types/connect': 3.4.35
+      '@types/connect': 3.4.38
       '@types/node': 12.20.55
       '@types/ws': 7.4.7
       JSONStream: 1.3.5
@@ -40998,7 +40946,7 @@ snapshots:
 
   jayson@4.1.1(bufferutil@4.0.7)(utf-8-validate@6.0.3):
     dependencies:
-      '@types/connect': 3.4.35
+      '@types/connect': 3.4.38
       '@types/node': 12.20.55
       '@types/ws': 7.4.7
       JSONStream: 1.3.5
@@ -41016,7 +40964,7 @@ snapshots:
 
   jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10):
     dependencies:
-      '@types/connect': 3.4.35
+      '@types/connect': 3.4.38
       '@types/node': 12.20.55
       '@types/ws': 7.4.7
       JSONStream: 1.3.5
@@ -41034,7 +40982,7 @@ snapshots:
 
   jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4):
     dependencies:
-      '@types/connect': 3.4.35
+      '@types/connect': 3.4.38
       '@types/node': 12.20.55
       '@types/ws': 7.4.7
       JSONStream: 1.3.5
@@ -46669,11 +46617,11 @@ snapshots:
 
   regenerator-transform@0.15.1:
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
 
   regenerator-transform@0.15.2:
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
 
   regexp-tree@0.1.27: {}
 
@@ -46884,7 +46832,7 @@ snapshots:
 
   rpc-websockets@7.5.1:
     dependencies:
-      '@babel/runtime': 7.24.8
+      '@babel/runtime': 7.25.0
       eventemitter3: 4.0.7
       uuid: 8.3.2
       ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)