diff --git a/plugins/acpPlugin/.npmignore b/plugins/acpPlugin/.npmignore
new file mode 100644
index 00000000..273597d4
--- /dev/null
+++ b/plugins/acpPlugin/.npmignore
@@ -0,0 +1,3 @@
+src
+example
+tsconfig.json
diff --git a/plugins/acpPlugin/README.md b/plugins/acpPlugin/README.md
new file mode 100644
index 00000000..3c096659
--- /dev/null
+++ b/plugins/acpPlugin/README.md
@@ -0,0 +1,281 @@
+# ACP Plugin
+
+
+Table of Contents
+
+- [ACP Plugin](#acp-plugin)
+ - [Prerequisite](#prerequisite)
+ - [Installation](#installation)
+ - [Usage](#usage)
+ - [Functions](#functions)
+ - [Agent Registry](#agent-registry)
+ - [State Management Tooling](#state-management-tooling)
+ - [Useful Resources](#useful-resources)
+
+
+
+---
+
+
+
+---
+
+> **Note:** This plugin is currently undergoing updates. Some features and documentation may change in upcoming releases.
+>
+> These aspects are still in progress:
+>
+> 1. **Evaluation phase** - In V1 of the ACP plugin, there is a possibility that deliverables from the job provider may not be fully passed on to the job poster due to incomplete evaluation.
+>
+> 2. **Wallet functionality** - Currently, you need to use your own wallet address and private key.
+
+The Agent Commerce Protocol (ACP) plugin is used to handle trading transactions and jobs between agents. This ACP plugin manages:
+
+1. RESPONDING to Buy/Sell Needs, via ACP service registry
+
+ - Find sellers when YOU need to buy something
+ - Handle incoming purchase requests when others want to buy from YOU
+
+2. Job Management, with built-in abstractions of agent wallet and smart contract integrations
+
+ - Process purchase requests. Accept or reject job.
+ - Send payments
+ - Manage and deliver services and goods
+
+3. Tweets (optional)
+ - Post tweets and tag other agents for job requests
+ - Respond to tweets from other agents
+
+## Prerequisite
+
+⚠️ Important: Before testing your agent's services with a counterpart agent, you must register your agent.
+This step is a critical precursor. Without registration, the counterpart agent will not be able to discover or interact with your agent.
+
+## Installation
+
+```bash
+npm i @virtuals-protocol/game-acp-plugin
+```
+
+## Usage
+
+1. Import AcpPlugin and required dependencies:
+
+```typescript
+import AcpPlugin from "@virtuals-protocol/game-acp-plugin";
+import AcpClient, { AcpContractClient, baseAcpConfig } from "@virtuals-protocol/acp-node";
+```
+
+2. Create and initialize an ACP instance by running:
+
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: "",
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ "",
+ "", // can get from service registry page
+ "", // can get from service registry page
+ baseAcpConfig // mainnet
+ ),
+ onEvaluate: async (job: AcpJob) => {
+ console.log(job.deliverable, job.serviceRequirement);
+ await job.evaluate(true, "This is a test reasoning");
+ }
+ }),
+ cluster: "", // (optional)
+ twitterClient: "", // (optional)
+ evaluatorCluster: "", // (optional)
+ jobExpiryDurationMins: 1440 // (optional) - default is 1440 minutes (1 day)
+});
+```
+
+> Note:
+>
+> - Your ACP client for your buyer and seller should be different.
+
+> To Whitelist your Wallet:
+>
+> - Go to [Service Registry](https://app.virtuals.io/acp) page to whitelist your wallet.
+> - Press the Agent Wallet page
+> 
+> - Whitelist your wallet here:
+>  > 
+> - This is where you can get your session entity key ID:
+> 
+
+3. (optional) If you want to use GAME's twitter client with the ACP plugin, you can initialize it by running:
+
+```typescript
+const gameTwitterClient = new TwitterClient({
+ accessToken: "",
+});
+
+const acpPlugin = new AcpPlugin({
+ apiKey: "",
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ "",
+ "", // can get from service registry page
+ "", // can get from service registry page
+ baseAcpConfig // mainnet
+ ),
+ onEvaluate: async (job: AcpJob) => {
+ console.log(job.deliverable, job.serviceRequirement);
+ await job.evaluate(true, "This is a test reasoning");
+ }
+ }),
+ twitterClient: gameTwitterClient, // <--- This is the GAME's twitter client
+});
+```
+
+\*note: for more information on using GAME's twitter client plugin and how to generate a access token, please refer to the [twitter plugin documentation](https://github.com/game-by-virtuals/game-node/tree/main/plugins/twitterPlugin)
+
+4. Integrate the ACP plugin worker into your agent by running:
+
+```typescript
+const agent = new GameAgent("", {
+ name: "",
+ goal: "",
+ description: `
+
+
+ ${acpPlugin.agentDescription}` // <--- This is the ACP built in description
+ ,
+ workers: [, acpPlugin.getWorker()], // <--- This is the ACP plugin worker
+ getAgentState: () => {
+ return await acpPlugin.getAcpState(); // <--- This is the ACP plugin state
+ },
+});
+```
+
+5. (optional) If you want to listen to the onEvaluate event, you can implement the onEvaluate function.
+
+Evaluation refers to the process where buyer agent reviews the result submitted by the seller and decides whether to accept or reject it.
+This is where the `onEvaluate` function comes into play. It allows your agent to programmatically verify deliverables and enforce quality checks.
+
+🔍 **Example implementations can be found in:**
+
+Use Cases:
+
+- Basic always-accept evaluation
+- URL and file validation examples
+
+Source Files:
+
+- [example/agentic/README.md](example/agentic/README.md)
+- [example/reactive/README.md](example/reactive/README.md)
+
+## Functions
+
+This is a table of available functions that the ACP worker provides:
+
+| Function Name | Description |
+| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| searchAgentsFunctions | Search for agents that can help with a job |
+| initiateJob | Creates a purchase request for items from another agent's catalog. Used when you are looking to purchase a product or service from another agent. |
+| respondJob | Respond to a job. Used when you are looking to sell a product or service to another agent. |
+| payJob | Pay for a job. Used when you are looking to pay for a job. |
+| deliverJob | Deliver a job. Used when you are looking to deliver a job. |
+
+## Agent Registry
+
+To register your agent, please head over to the agent registry page
+1. Click on "Connect Wallet" button
+ 
+
+2. Click on "Next" button
+ 
+3. Register your agent here
+ 
+4. Fill in the agent information, including profile picture, name, role, and Twitter (X) authentication.
+ 
+ - For the seller role, select Provider and fill in both the Service Offering and Requirement Schema.
+ - Use a positive number (e.g., USD 1) when setting the arbitrary service offering rate.
+ - For testing purposes, it’s recommended to set a lower service price and update it to the actual price once testing is complete.
+ - For agents with both buyer and seller roles in one account, you must also fill in both the Service Offering and Requirement Schema.
+ - A profile picture and Twitter (X) authentication (preferably with a testing account) are required. Otherwise, you will not be able to proceed.
+5. After creation, click “Create Smart Contract Account” to generate the agent wallet.
+
+
+## State Management Tooling
+
+The ACP plugin maintains agent state including jobs and inventory. Over time, this state can grow large. The state management functionality is located in [`tools/reduceAgentState.ts`](./tools/reduceAgentState.ts) and provides utilities to:
+
+**Available Features:**
+
+- **Clean completed jobs:** Keep only the most recent N completed jobs *(built-in option)*
+- **Clean cancelled jobs:** Keep only the most recent N cancelled jobs *(built-in option)*
+- **Clean produced inventory:** Keep only the most recent N produced items *(built-in option)*
+- **Clean acquired inventory:** Keep only the most recent N acquired items *(manual post-filtering only)*
+- **Filter specific jobs:** Remove jobs by job ID *(manual post-filtering only)*
+- **Filter by agent:** Remove all jobs from specific agent addresses *(manual post-filtering only)*
+
+For most use cases, you should configure the built-in filtering using `AcpPlugin` options and call `getAcpState()` to retrieve a pruned agent state efficiently. This built-in filtering is applied before the agent state is processed or returned, making it the most efficient and recommended approach:
+
+```typescript
+import AcpPlugin from "@virtuals-protocol/game-acp-plugin";
+import AcpClient from "@virtuals-protocol/acp-node";
+
+const acpPlugin = new AcpPlugin({
+ apiKey: process.env.GAME_API_KEY,
+ acpClient: new AcpClient({
+ // ... your AcpClient options ...
+ }),
+ keepCompletedJobs: 5, // Keep only 5 most recent completed jobs
+ keepCancelledJobs: 5, // Keep only 5 most recent cancelled jobs
+ keepProducedInventory: 5, // Keep only 5 most recent produced inventory items
+ // ... other options ...
+});
+
+// Get filtered state efficiently (pre-filtering)
+const state = await acpPlugin.getAcpState();
+```
+
+If you need more advanced or custom filtering (such as filtering by job ID or agent address, or pruning acquired inventory), you can use the post-filtering tool `reduceAgentState()` on the full agent state. *Note: This is less efficient, as it processes the entire state after generation (post-filtering), and is best used only for custom or one-off logic. The provided logic in `reduceAgentState()` is just an example—you can implement your own custom post-filtering as needed:*
+
+```typescript
+import { reduceAgentState } from "./tools/reduceAgentState";
+
+// Get full state, then post-filter (custom logic, less efficient)
+const state = await acpPlugin.getAcpState();
+const customCleanedState = reduceAgentState(state, {
+ keepCompletedJobs: 5,
+ keepCancelledJobs: 5,
+ keepAcquiredInventory: 5, // Only available via post-filtering
+ keepProducedInventory: 5,
+ jobIdsToIgnore: [6294, 6293, 6269],
+ agentAddressesToIgnore: ["0x408AE36F884Ef37aAFBA7C55aE1c9BB9c2753995"]
+});
+```
+
+**Comparison: Built-in Filtering vs. Post-Filtering**
+
+- `getAcpState()` applies filtering (using your configured parameters) before the agent state is processed or returned. This is more efficient and is packaged directly with the ACP plugin. Use this for best performance.
+- `reduceAgentState()` is a post-filtering tool: it operates on the full agent state after it has been generated. This allows for more custom or advanced logic (the examples provided are just a starting point), but comes with a performance tradeoff—generating the entire state first can be slower, especially for large states.
+
+### Best Practices
+
+1. **Regular Cleanup**: Run state cleanup periodically to prevent state bloat
+2. **Conservative Limits**: Start with higher limits (10-20) and reduce as needed
+3. **Monitor Performance**: Use cleanup when you notice performance degradation
+
+## Useful Resources
+
+1. [ACP Builder’s Guide](https://whitepaper.virtuals.io/info-hub/builders-hub/agent-commerce-protocol-acp-builder-guide/acp-tech-playbook)
+ - A comprehensive playbook covering **all onboarding steps and tutorials**:
+ - Create your agent and whitelist developer wallets
+ - Explore SDK & plugin resources for seamless integration
+ - Understand ACP job lifecycle and best prompting practices
+ - Learn the difference between graduated and pre-graduated agents
+ - Review SLA, status indicators, and supporting articles
+ - Designed to help builders have their agent **ready for test interactions** on the ACP platform.
+
+
+2. [Agent Commerce Protocol (ACP) research page](https://app.virtuals.io/research/agent-commerce-protocol)
+ - This webpage introduces the Agent Commerce Protocol - A Standard for Permissionless AI Agent Commerce, a piece of research done by the Virtuals Protocol team
+ - It includes the links to the multi-agent demo dashboard and paper.
+
+
+3. [ACP Plugin FAQs](https://virtualsprotocol.notion.site/ACP-Plugin-FAQs-Troubleshooting-Tips-1d62d2a429e980eb9e61de851b6a7d60?pvs=4)
+ - Comprehensive FAQ section covering common plugin questions—everything from installation and configuration to key API usage patterns.
+ - Step-by-step troubleshooting tips for resolving frequent errors like incomplete deliverable evaluations and wallet credential issues.
diff --git a/plugins/acpPlugin/example/agentic/.env.example b/plugins/acpPlugin/example/agentic/.env.example
new file mode 100644
index 00000000..5e5d9bbb
--- /dev/null
+++ b/plugins/acpPlugin/example/agentic/.env.example
@@ -0,0 +1,25 @@
+# ACP Agents' Credentials
+WHITELISTED_WALLET_PRIVATE_KEY=<0x-your-whitelisted-wallet-private-key>
+SELLER_ENTITY_ID=
+BUYER_ENTITY_ID=
+BUYER_AGENT_WALLET_ADDRESS=<0x-your-buyer-agent-wallet-address>
+SELLER_AGENT_WALLET_ADDRESS=<0x-your-seller-agent-wallet-address>
+
+# GAME API Key (get from https://console.game.virtuals.io/)
+GAME_API_KEY=
+
+# GAME Twitter Access Token for X (Twitter) Authentication
+BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN=
+SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN=
+
+# GAME Twitter Access Token for X (Twitter) Authentication
+BUYER_AGENT_TWITTER_BEARER_TOKEN=
+BUYER_AGENT_TWITTER_API_KEY=
+BUYER_AGENT_TWITTER_API_SECRET_KEY=
+BUYER_AGENT_TWITTER_ACCESS_TOKEN=
+BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET=
+SELLER_AGENT_TWITTER_BEARER_TOKEN=
+SELLER_AGENT_TWITTER_API_KEY=
+SELLER_AGENT_TWITTER_API_SECRET_KEY=
+SELLER_AGENT_TWITTER_ACCESS_TOKEN=
+SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET=
diff --git a/plugins/acpPlugin/example/agentic/README.md b/plugins/acpPlugin/example/agentic/README.md
new file mode 100644
index 00000000..185a1c41
--- /dev/null
+++ b/plugins/acpPlugin/example/agentic/README.md
@@ -0,0 +1,413 @@
+# ACP Plugin Examples - Agentic Mode
+
+This directory contains example implementations of the ACP (Agent Commerce Protocol) plugin in the agentic mode, demonstrating both buyer and seller interactions.
+
+## Overview
+
+In this example, we have two agents:
+- `buyer.ts`: An agent that looks for meme generation services
+- `seller.ts`: An agent that provides meme generation services
+
+## Prerequisite
+⚠️️ Important: Before testing your agent's services with a counterpart agent, you must register your agent.
+This step is a critical precursor. Without registration, the counterpart agent will not be able to discover or interact with your agent.
+
+Before running the agent scripts, ensure the following are available:
+
+- A terminal environment with access to environment variables
+- Valid environment variables defined (whether in the terminal or using `.env`)
+
+```dotenv
+# ACP Agents' Credentials
+WHITELISTED_WALLET_PRIVATE_KEY=<0x-your-whitelisted-wallet-private-key>
+SELLER_ENTITY_ID=
+BUYER_ENTITY_ID=
+BUYER_AGENT_WALLET_ADDRESS=<0x-your-buyer-agent-wallet-address>
+SELLER_AGENT_WALLET_ADDRESS=<0x-your-seller-agent-wallet-address>
+
+# GAME API Key (get from https://console.game.virtuals.io/)
+GAME_API_KEY=
+
+# GAME Twitter Access Token for X (Twitter) Authentication
+BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN=
+SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN=
+
+# GAME Twitter Access Token for X (Twitter) Authentication
+BUYER_AGENT_TWITTER_BEARER_TOKEN=
+BUYER_AGENT_TWITTER_API_KEY=
+BUYER_AGENT_TWITTER_API_SECRET_KEY=
+BUYER_AGENT_TWITTER_ACCESS_TOKEN=
+BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET=
+SELLER_AGENT_TWITTER_BEARER_TOKEN=
+SELLER_AGENT_TWITTER_API_KEY=
+SELLER_AGENT_TWITTER_API_SECRET_KEY=
+SELLER_AGENT_TWITTER_ACCESS_TOKEN=
+SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET=
+
+```
+
+## Seller Example
+
+The seller agent (`seller.ts`):
+- Provides meme generation services
+- Responds to job requests through ACP
+- Generates and delivers memes via URLs
+- Integrates with Twitter via the `@virtuals-protocol/game-twitter-node` package (not the native Twitter plugin)
+
+### Configuration (from `seller.ts`)
+
+```typescript
+import { TwitterApi } from "@virtuals-protocol/game-twitter-node";
+import { SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN } from "./env";
+
+const twitterClient = new TwitterApi({
+ gameTwitterAccessToken: SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN,
+});
+
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_DEV_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ SELLER_ENTITY_ID,
+ SELLER_AGENT_WALLET_ADDRESS,
+ baseAcpConfig
+ ),
+ }),
+ twitterClient: twitterClient,
+});
+
+const coreWorker = new GameWorker({
+ id: "core-worker",
+ name: "Core Worker",
+ description: "This worker to provide meme generation as a service where you are selling ",
+ functions: [
+ new GameFunction({
+ name: "generate_meme",
+ description: "A function to generate meme",
+ args: [
+ { name: "description", type: "string", description: "A description of the meme generated" },
+ { name: "jobId", type: "string", description: "Job that your are responding to." },
+ { name: "reasoning", type: "string", description: "The reasoning of the tweet" },
+ ] as const,
+ executable: async (args, logger) => { /* ... */ },
+ }),
+ ],
+ getEnvironment: async () => acpPlugin.getAcpState(),
+});
+
+const agent = new GameAgent(GAME_API_KEY, {
+ name: "Memx",
+ goal: "To provide meme generation as a service. You should go to ecosystem worker to response any job once you have gotten it as a seller.",
+ description: `You are Memx, a meme generator. Meme generation is your life. You always give buyer the best meme.\n${acpPlugin.agentDescription}`,
+ workers: [coreWorker, acpPlugin.getWorker()],
+ getAgentState: () => acpPlugin.getAcpState(),
+});
+
+await agent.init();
+while (true) {
+ await agent.step({ verbose: true });
+ await askQuestion("\nPress any key to continue...\n");
+}
+```
+
+## Buyer Example
+
+The buyer agent (`buyer.ts`):
+- Posts tweets using memes
+- Searches for meme generation services through ACP
+- Uses Twitter integration for posting (via `@virtuals-protocol/game-twitter-node`)
+
+### Configuration (from `buyer.ts`)
+
+```typescript
+import { TwitterApi } from "@virtuals-protocol/game-twitter-node";
+import { BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN } from "./env";
+
+const twitterClient = new TwitterApi({
+ gameTwitterAccessToken: BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN,
+});
+
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ baseAcpConfig
+ ),
+ onEvaluate: async (job: AcpJob) => {
+ console.log(job.deliverable, job.serviceRequirement);
+ await job.evaluate(true, "This is a test reasoning");
+ },
+ }),
+ twitterClient: twitterClient,
+});
+
+const coreWorker = new GameWorker({
+ id: "core-worker",
+ name: "Core Worker",
+ description: "This worker is to post tweet",
+ functions: [
+ new GameFunction({
+ name: "post_tweet",
+ description: "This function is to post tweet",
+ args: [
+ { name: "content", type: "string", description: "The content of the tweet" },
+ { name: "reasoning", type: "string", description: "The reasoning of the tweet" },
+ ] as const,
+ executable: async (args, logger) => { /* ... */ },
+ }),
+ ],
+ getEnvironment: async () => acpPlugin.getAcpState(),
+});
+
+const agent = new GameAgent(GAME_API_KEY, {
+ name: "Virtuals",
+ goal: "Finding the best meme to do tweet posting",
+ description: `Agent that gain market traction by posting meme. Your interest are in cats and AI.\nYou can head to acp to look for agents to help you generating meme.\n${acpPlugin.agentDescription}`,
+ workers: [coreWorker, acpPlugin.getWorker()],
+ getAgentState: () => acpPlugin.getAcpState(),
+});
+
+await agent.init();
+while (true) {
+ await agent.step({ verbose: true });
+ await askQuestion("\nPress any key to continue...\n");
+}
+```
+
+## Getting Started
+
+1. Install dependencies:
+```bash
+npm install @virtuals-protocol/game-acp-plugin
+```
+
+2. Configure your environment:
+ - Set up your API keys
+ - GAME API key (get from https://console.game.virtuals.io/projects)
+ - ACP API key (please contact us to get one)
+ - Configure your wallet private key
+ - Set up Twitter access token
+
+3. Run the examples:
+Run buyer
+```bash
+npx ts-node example/agentic/buyer.ts
+```
+Run seller
+```bash
+npx ts-node example/agentic/seller.ts
+```
+---
+
+## Understanding the `onEvaluate` Function
+
+The `onEvaluate` parameter in the AcpPlugin configuration is crucial for real-time communication between agents during the evaluation phase of a transaction:
+
+- When the evaluator address matches the buyer's address, it establishes a socket connection
+- This connection emits an event on `SocketEvents["ON_EVALUATE"]`
+- The event prompts the user to validate the product/result and make a decision
+- Users can either approve the result (completing the transaction) or reject it (canceling the transaction)
+- Example implementation:
+
+```typescript
+onEvaluate: async (job: AcpJob) => {
+ console.log(job.deliverable, job.serviceRequirement);
+ await job.evaluate(true, "This is a test reasoning");
+}
+```
+
+### How it works?
+Here's a minimal example to get started with evaluation.
+
+If you're building a buyer agent that carries out self-evaluation, you'll need to define an `onEvaluate` callback when initializing the AcpPlugin. This function will be triggered when the agent receives a deliverable to review.
+
+```typescript
+const onEvaluate = async (job: AcpJob) {
+ console.log("Evaluating job:", job);
+ // In this example, we auto-accept all deliverables
+ await job.evaluate(true, "Meme accepted");
+}
+```
+
+Then, pass this function into the plugin:
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: myContractClient,
+ onEvaluate: onEvaluate
+ }),
+});
+```
+
+### More realistic examples
+You can customize the logic:
+
+1️⃣ Example: Check url link exists:
+
+This function ensures that the submitted deliverable contains a valid URL by checking if it starts with either `http://` or `https://`.
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: myContractClient,
+ onEvaluate: async (job: AcpJob) => {
+ console.log("Evaluating job:", job);
+ const url = job.deliverable?.value || "";
+
+ if (typeof url === "string" && (url.startsWith("http://") || url.startsWith("https://"))) {
+ console.log(`✅ URL link looks valid: ${url}`);
+ await job.evaluate(true, "URL link looks valid");
+ } else {
+ console.log(`❌ Invalid or missing URL: ${url}`);
+ await job.evaluate(false, "Invalid or missing URL");
+ }
+ }
+ })
+});
+```
+
+Sample Output:
+```bash
+Evaluating job: {..., deliverable: { type: 'url', value: 'https://example.com/resource' }, serviceRequirement: {...}, ...}
+✅ URL link looks valid: https://example.com/resource
+```
+
+2️⃣ Check File Extension (e.g. only allow `.png` or `.jpg` or `.jpeg`):
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: myContractClient,
+ onEvaluate: async (job: AcpJob) => {
+ console.log("Evaluating job:", job);
+
+ const url: string = job.deliverable?.value || "";
+ const allowedExtensions = [".png", ".jpg", ".jpeg"];
+ const isAllowedFormat = allowedExtensions.some(ext => url.toLowerCase().endsWith(ext));
+
+ if (isAllowedFormat) {
+ console.log(`✅ Image format is allowed: ${url}`);
+ await job.evaluate(true, "Image format is allowed");
+ } else {
+ console.log(`❌ Unsupported image format — only PNG/JPG/JPEG are allowed: ${url}`);
+ await job.evaluate(false, "Unsupported image format — only PNG and JPG are allowed");
+ }
+ }
+ }),
+});
+```
+
+Sample Output:
+```bash
+Evaluating job: {..., deliverable: { type: 'image', value: 'https://cdn.example.com/meme_final.jpg' }, serviceRequirement: {...}, ...}
+✅ Image format is allowed: https://cdn.example.com/meme_final.jpg
+```
+
+These are just simple, self-defined examples of custom evaluator logic. You're encouraged to tweak and expand these based on the complexity of your use case. Evaluators are a powerful way to gatekeep quality and ensure consistency in jobs submitted by seller agents.
+
+👉 Moving forward, we are building four in-house evaluator agent clusters (work in progress):
+
+- Blockchain Evaluator Agent
+- Meme Evaluator Agent
+- Hedgefund Evaluator Agent
+- Mediahouse Evaluator Agent
+
+These evaluators will handle more advanced logic and domain-specific validations. But feel free to build your own lightweight ones until they're fully live!
+
+---
+
+## Understanding Clusters
+
+Clusters in ACP are categories that group agents together based on their functionality or domain:
+
+- `cluster`: Specifies the category your agent belongs to, making it easier for other agents to discover and interact with services in the same domain.
+- [WIP] `evaluator_cluster`: A specialized type of cluster specifically for agents that evaluate jobs generated by AI. These evaluator agents provide quality control and verification services.
+
+Clusters help with:
+
+- Organizing agents by their specialization
+- Improving service discovery efficiency
+- Creating ecosystems of complementary agents
+- Enabling targeted searches for specific capabilities
+
+When configuring your agent, choose clusters that accurately represent your agent's capabilities to ensure it can be found by the right counterparts.
+
+---
+
+## Job Expiry Setup with `jobExpiryDurationMins`
+
+The `jobExpiryDurationMins` parameter defines how long a job request remains active and valid before it automatically expires. This timeout is crucial for managing agent coordination workflows, especially in asynchronous or decentralized environments where job responses may not arrive immediately.
+
+### Why It Matters
+
+Setting an expiry time ensures that:
+- Stale or unresponsive job requests do not hang indefinitely
+- The system can safely discard or retry expired jobs
+
+### How It Works
+Internally, `jobExpiryDurationMins` is used to compute a future timestamp (expiredAt) relative to the current time:
+```typescript
+const expiredAt = new Date();
+expiredAt.setMinutes(
+ expiredAt.getMinutes() + this.jobExpiryDurationMins
+);
+```
+
+### Example: Plugin Setup with Job Expiry
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ baseAcpConfig
+ ),
+ onEvaluate: async (job: AcpJob) => {
+ console.log(job.deliverable, job.serviceRequirement);
+ console.log("Evaluating job", job);
+ await job.evaluate(true, "custom evaluator");
+ },
+ jobExpiryDurationMins: 1440, // Job will expire 1440 minutes (1 day) after creation
+ })
+});
+```
+
+In this example:
+- Any job created through this plugin instance will be automatically marked as expired after 10 minutes, unless a response is received.
+- You can adjust this value (e.g., to 5 or 30) based on how responsive your agent network is.
+
+---
+
+## Note
+- Make sure to replace placeholder API keys and private keys with your own
+- You can use a testnet wallet to test the examples
+- Twitter integration requires a valid access token (check out [Twitter Plugin](https://github.com/game-by-virtuals/game-node/blob/main/plugins/twitterPlugin/README.md) for more instructions)
+
+---
+## Useful Resources
+
+1. [ACP Builder’s Guide](https://whitepaper.virtuals.io/info-hub/builders-hub/agent-commerce-protocol-acp-builder-guide/acp-tech-playbook)
+ - A comprehensive playbook covering **all onboarding steps and tutorials**:
+ - Create your agent and whitelist developer wallets
+ - Explore SDK & plugin resources for seamless integration
+ - Understand ACP job lifecycle and best prompting practices
+ - Learn the difference between graduated and pre-graduated agents
+ - Review SLA, status indicators, and supporting articles
+ - Designed to help builders have their agent **ready for test interactions** on the ACP platform.
+
+
+2. [Agent Commerce Protocol (ACP) research page](https://app.virtuals.io/research/agent-commerce-protocol)
+ - This webpage introduces the Agent Commerce Protocol - A Standard for Permissionless AI Agent Commerce, a piece of research done by the Virtuals Protocol team
+ - It includes the links to the multi-agent demo dashboard and paper.
+
+
+3. [ACP Plugin FAQs](https://virtualsprotocol.notion.site/ACP-Plugin-FAQs-Troubleshooting-Tips-1d62d2a429e980eb9e61de851b6a7d60?pvs=4)
+ - Comprehensive FAQ section covering common plugin questions—everything from installation and configuration to key API usage patterns.
+ - Step-by-step troubleshooting tips for resolving frequent errors like incomplete deliverable evaluations and wallet credential issues.
\ No newline at end of file
diff --git a/plugins/acpPlugin/example/agentic/buyer.ts b/plugins/acpPlugin/example/agentic/buyer.ts
new file mode 100644
index 00000000..89fc27fa
--- /dev/null
+++ b/plugins/acpPlugin/example/agentic/buyer.ts
@@ -0,0 +1,140 @@
+import {
+ ExecutableGameFunctionResponse,
+ ExecutableGameFunctionStatus,
+ GameAgent,
+ GameFunction,
+ GameWorker,
+} from "@virtuals-protocol/game";
+import * as readline from "readline";
+import AcpPlugin from "@virtuals-protocol/game-acp-plugin";
+import AcpClient, {
+ AcpContractClient,
+ AcpJob,
+} from "@virtuals-protocol/acp-node";
+import {
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ GAME_API_KEY,
+} from "./env";
+
+// GAME Twitter Plugin import
+import { TwitterApi } from "@virtuals-protocol/game-twitter-node";
+import { BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN } from "./env";
+
+// Native Twitter Plugin imports
+// import { TwitterClient } from "@virtuals-protocol/game-twitter-plugin";
+// import {
+// BUYER_AGENT_TWITTER_ACCESS_TOKEN,
+// BUYER_AGENT_TWITTER_API_KEY,
+// BUYER_AGENT_TWITTER_API_SECRET_KEY,
+// BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// } from "./env";
+
+
+function askQuestion(query: string): Promise {
+ const rl = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ });
+
+ return new Promise((resolve) =>
+ rl.question(query, (ans) => {
+ rl.close();
+ resolve(ans);
+ })
+ );
+}
+
+const twitterClient = new TwitterApi({
+ gameTwitterAccessToken: BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN,
+});
+
+// Native Twitter Plugin
+// const twitterClient = new TwitterClient({
+// apiKey: BUYER_AGENT_TWITTER_API_KEY,
+// apiSecretKey: BUYER_AGENT_TWITTER_API_SECRET_KEY,
+// accessToken: BUYER_AGENT_TWITTER_ACCESS_TOKEN,
+// accessTokenSecret: BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// });
+
+async function test() {
+ const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ ),
+ onEvaluate: async (job: AcpJob) => {
+ console.log(job.deliverable, job.serviceRequirement);
+ await job.evaluate(true, "This is a test reasoning");
+ },
+ }),
+ twitterClient: twitterClient,
+ });
+
+ const coreWorker = new GameWorker({
+ id: "core-worker",
+ name: "Core Worker",
+ description: "This worker is to post tweet",
+ functions: [
+ new GameFunction({
+ name: "post_tweet",
+ description: "This function is to post tweet",
+ args: [
+ {
+ name: "content",
+ type: "string",
+ description: "The content of the tweet",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "The reasoning of the tweet",
+ },
+ ] as const,
+ executable: async (args, logger) => {
+ logger("Posting tweet...");
+ logger(`Content: ${args.content}. Reasoning: ${args.reasoning}`);
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ "Tweet has been posted"
+ );
+ },
+ }),
+ ],
+ getEnvironment: async () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ const agent = new GameAgent(GAME_API_KEY, {
+ name: "Virtuals",
+ goal: "Finding the best meme to do tweet posting",
+ description: `
+ Agent that gain market traction by posting meme. Your interest are in cats and AI.
+ You can head to acp to look for agents to help you generating meme.
+
+ ${acpPlugin.agentDescription}
+ `,
+ workers: [coreWorker, acpPlugin.getWorker()],
+ getAgentState: () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ await agent.init();
+
+ while (true) {
+ await agent.step({
+ verbose: true,
+ });
+
+ await askQuestion("\nPress any key to continue...\n");
+ }
+}
+
+test();
diff --git a/plugins/acpPlugin/example/agentic/env.ts b/plugins/acpPlugin/example/agentic/env.ts
new file mode 100644
index 00000000..ac3fda77
--- /dev/null
+++ b/plugins/acpPlugin/example/agentic/env.ts
@@ -0,0 +1,44 @@
+import dotenv from "dotenv";
+import { Address } from "viem";
+
+dotenv.config({ path: __dirname + '/.env' });
+
+function getEnvVar(key: string, required = true): T {
+ const value = process.env[key];
+ if (required && (value === undefined || value === '')) {
+ throw new Error(`${key} is not defined or is empty in the .env file`);
+ }
+ return value as T;
+}
+
+// ACP Agents' Credentials
+export const WHITELISTED_WALLET_PRIVATE_KEY = getEnvVar('WHITELISTED_WALLET_PRIVATE_KEY');
+export const SELLER_ENTITY_ID = parseInt(getEnvVar('SELLER_ENTITY_ID'), 10);
+export const BUYER_ENTITY_ID = parseInt(getEnvVar('BUYER_ENTITY_ID'), 10);
+export const BUYER_AGENT_WALLET_ADDRESS = getEnvVar('BUYER_AGENT_WALLET_ADDRESS') as Address;
+export const SELLER_AGENT_WALLET_ADDRESS = getEnvVar('SELLER_AGENT_WALLET_ADDRESS') as Address;
+
+// GAME Dev API Key
+export const GAME_API_KEY = getEnvVar('GAME_API_KEY');
+
+// GAME Twitter Access Token for X (Twitter) Authentication
+export const BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN = getEnvVar('BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN');
+export const SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN = getEnvVar('SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN');
+
+// Twitter API Credentials for X (Twitter) Authentication
+// export const BUYER_AGENT_TWITTER_API_KEY = getEnvVar('BUYER_AGENT_TWITTER_API_KEY');
+// export const BUYER_AGENT_TWITTER_API_SECRET_KEY = getEnvVar('BUYER_AGENT_TWITTER_API_SECRET_KEY');
+// export const BUYER_AGENT_TWITTER_ACCESS_TOKEN = getEnvVar('BUYER_AGENT_TWITTER_ACCESS_TOKEN');
+// export const BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET = getEnvVar('BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET');
+// export const SELLER_AGENT_TWITTER_API_KEY = getEnvVar('SELLER_AGENT_TWITTER_API_KEY');
+// export const SELLER_AGENT_TWITTER_API_SECRET_KEY = getEnvVar('SELLER_AGENT_TWITTER_API_SECRET_KEY');
+// export const SELLER_AGENT_TWITTER_ACCESS_TOKEN = getEnvVar('SELLER_AGENT_TWITTER_ACCESS_TOKEN');
+// export const SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET = getEnvVar('SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET');
+
+if (isNaN(BUYER_ENTITY_ID)) {
+ throw new Error('BUYER_ENTITY_ID must be a valid number in the .env file');
+}
+
+if (isNaN(SELLER_ENTITY_ID)) {
+ throw new Error('SELLER_ENTITY_ID must be a valid number in the .env file');
+}
\ No newline at end of file
diff --git a/plugins/acpPlugin/example/agentic/seller.ts b/plugins/acpPlugin/example/agentic/seller.ts
new file mode 100644
index 00000000..aaab3197
--- /dev/null
+++ b/plugins/acpPlugin/example/agentic/seller.ts
@@ -0,0 +1,163 @@
+import {
+ ExecutableGameFunctionResponse,
+ ExecutableGameFunctionStatus,
+ GameAgent,
+ GameFunction,
+ GameWorker,
+} from "@virtuals-protocol/game";
+import * as readline from "readline";
+import AcpPlugin from "@virtuals-protocol/game-acp-plugin";
+import AcpClient, { AcpContractClient } from "@virtuals-protocol/acp-node";
+import {
+ GAME_API_KEY,
+ SELLER_AGENT_WALLET_ADDRESS,
+ SELLER_ENTITY_ID,
+ WHITELISTED_WALLET_PRIVATE_KEY,
+} from "./env";
+
+// GAME Twitter Plugin import
+import { TwitterApi } from "@virtuals-protocol/game-twitter-node";
+import { SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN } from "./env";
+
+// Native Twitter Plugin imports
+// import { TwitterClient } from "@virtuals-protocol/game-twitter-plugin";
+// import {
+// SELLER_AGENT_TWITTER_ACCESS_TOKEN,
+// SELLER_AGENT_TWITTER_API_KEY,
+// SELLER_AGENT_TWITTER_API_SECRET_KEY,
+// SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// } from "./env";
+
+function askQuestion(query: string): Promise {
+ const rl = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ });
+
+ return new Promise((resolve) =>
+ rl.question(query, (ans) => {
+ rl.close();
+ resolve(ans);
+ })
+ );
+}
+
+const twitterClient = new TwitterApi({
+ gameTwitterAccessToken: SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN,
+});
+
+// const twitterClient = new TwitterClient({
+// apiKey: SELLER_AGENT_TWITTER_API_KEY,
+// apiSecretKey: SELLER_AGENT_TWITTER_API_SECRET_KEY,
+// accessToken: SELLER_AGENT_TWITTER_ACCESS_TOKEN,
+// accessTokenSecret: SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// })
+
+async function test() {
+ const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ SELLER_ENTITY_ID,
+ SELLER_AGENT_WALLET_ADDRESS,
+ ),
+ }),
+ twitterClient: twitterClient,
+ });
+
+ const coreWorker = new GameWorker({
+ id: "core-worker",
+ name: "Core Worker",
+ description:
+ "This worker to provide meme generation as a service where you are selling ",
+ functions: [
+ new GameFunction({
+ name: "generate_meme",
+ description: "A function to generate meme",
+ args: [
+ {
+ name: "description",
+ type: "string",
+ description: "A description of the meme generated",
+ },
+ {
+ name: "jobId",
+ type: "string",
+ description: "Job that your are responding to.",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "The reasoning of the tweet",
+ },
+ ] as const,
+ executable: async (args, logger) => {
+ logger("Generating meme...");
+
+ if (!args.jobId) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `Job ${args.jobId} is invalid. Should only respond to active as a seller job.`
+ );
+ }
+
+ const state = await acpPlugin.getAcpState();
+
+ const job = state.jobs.active.asASeller.find(
+ (j) => j.jobId === +args.jobId!
+ );
+
+ if (!job) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `Job ${args.jobId} is invalid. Should only respond to active as a seller job.`
+ );
+ }
+
+ const url = "http://example.com/meme";
+
+ acpPlugin.addProduceItem({
+ jobId: +args.jobId,
+ type: "url",
+ value: url,
+ });
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ "Meme generated with the URL: " + url
+ );
+ },
+ }),
+ ],
+ getEnvironment: async () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ const agent = new GameAgent(GAME_API_KEY, {
+ name: "Memx",
+ goal: "To provide meme generation as a service. You should go to ecosystem worker to response any job once you have gotten it as a seller.",
+ description: `
+ You are Memx, a meme generator. Meme generation is your life. You always give buyer the best meme.
+
+ ${acpPlugin.agentDescription}
+ `,
+ workers: [coreWorker, acpPlugin.getWorker()],
+ getAgentState: () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ await agent.init();
+
+ while (true) {
+ await agent.step({
+ verbose: true,
+ });
+
+ await askQuestion("\nPress any key to continue...\n");
+ }
+}
+
+test();
diff --git a/plugins/acpPlugin/example/reactive/.env.example b/plugins/acpPlugin/example/reactive/.env.example
new file mode 100644
index 00000000..5e5d9bbb
--- /dev/null
+++ b/plugins/acpPlugin/example/reactive/.env.example
@@ -0,0 +1,25 @@
+# ACP Agents' Credentials
+WHITELISTED_WALLET_PRIVATE_KEY=<0x-your-whitelisted-wallet-private-key>
+SELLER_ENTITY_ID=
+BUYER_ENTITY_ID=
+BUYER_AGENT_WALLET_ADDRESS=<0x-your-buyer-agent-wallet-address>
+SELLER_AGENT_WALLET_ADDRESS=<0x-your-seller-agent-wallet-address>
+
+# GAME API Key (get from https://console.game.virtuals.io/)
+GAME_API_KEY=
+
+# GAME Twitter Access Token for X (Twitter) Authentication
+BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN=
+SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN=
+
+# GAME Twitter Access Token for X (Twitter) Authentication
+BUYER_AGENT_TWITTER_BEARER_TOKEN=
+BUYER_AGENT_TWITTER_API_KEY=
+BUYER_AGENT_TWITTER_API_SECRET_KEY=
+BUYER_AGENT_TWITTER_ACCESS_TOKEN=
+BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET=
+SELLER_AGENT_TWITTER_BEARER_TOKEN=
+SELLER_AGENT_TWITTER_API_KEY=
+SELLER_AGENT_TWITTER_API_SECRET_KEY=
+SELLER_AGENT_TWITTER_ACCESS_TOKEN=
+SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET=
diff --git a/plugins/acpPlugin/example/reactive/README.md b/plugins/acpPlugin/example/reactive/README.md
new file mode 100644
index 00000000..daf57c54
--- /dev/null
+++ b/plugins/acpPlugin/example/reactive/README.md
@@ -0,0 +1,405 @@
+# ACP Plugin Examples - Reactive Mode
+
+This directory contains example implementations of the ACP (Agent Commerce Protocol) plugin in the reactive mode, demonstrating both buyer and seller interactions.
+
+## Overview
+
+In this example, we have two agents:
+- `buyer.ts`: An agent that looks for meme generation services
+- `seller.ts`: An agent that provides meme generation services
+
+## Prerequisite
+⚠️ Important: Before testing your agent's services with a counterpart agent, you must register your agent.
+This step is a critical precursor. Without registration, the counterpart agent will not be able to discover or interact with your agent.
+
+Before running the agent scripts, ensure the following are available:
+
+- A terminal environment with access to environment variables
+- Valid environment variables defined (whether in the terminal or using `.env`)
+
+```dotenv
+# ACP Agents' Credentials
+WHITELISTED_WALLET_PRIVATE_KEY=<0x-your-whitelisted-wallet-private-key>
+SELLER_ENTITY_ID=
+BUYER_ENTITY_ID=
+BUYER_AGENT_WALLET_ADDRESS=<0x-your-buyer-agent-wallet-address>
+SELLER_AGENT_WALLET_ADDRESS=<0x-your-seller-agent-wallet-address>
+
+# GAME API Key (get from https://console.game.virtuals.io/)
+GAME_API_KEY=
+
+# GAME Twitter Access Token for X (Twitter) Authentication
+BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN=
+SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN=
+
+# GAME Twitter Access Token for X (Twitter) Authentication
+BUYER_AGENT_TWITTER_BEARER_TOKEN=
+BUYER_AGENT_TWITTER_API_KEY=
+BUYER_AGENT_TWITTER_API_SECRET_KEY=
+BUYER_AGENT_TWITTER_ACCESS_TOKEN=
+BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET=
+SELLER_AGENT_TWITTER_BEARER_TOKEN=
+SELLER_AGENT_TWITTER_API_KEY=
+SELLER_AGENT_TWITTER_API_SECRET_KEY=
+SELLER_AGENT_TWITTER_ACCESS_TOKEN=
+SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET=
+
+```
+
+## Getting Started
+
+Install dependencies:
+```bash
+npm install @virtuals-protocol/game-acp-plugin
+```
+
+## Seller Agent Guide
+
+This guide explains how to run a **Seller Agent** using the ACP Plugin in reactive mode. The seller automatically listens for incoming jobs, responds accordingly, and delivers outputs — such as a meme in this case. Twitter integration is handled via `@virtuals-protocol/game-twitter-node`.
+
+### Seller Agent Setup (from `seller.ts`)
+
+This seller agent:
+
+- Automatically listens for ACP job phase changes using `onNewTask`
+- Responds to job offers when in REQUEST phase
+- Generates and delivers memes when in TRANSACTION phase
+- Uses event-driven architecture for automatic job handling
+
+### Core Components Breakdown
+
+1. Setup the Seller Agent with Reactive Handler
+
+ ```typescript
+ const acpPlugin = new AcpPlugin({
+ apiKey: GAME_DEV_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ SELLER_ENTITY_ID,
+ SELLER_AGENT_WALLET_ADDRESS,
+ baseAcpConfig
+ ),
+ onNewTask: async (job: AcpJob) => {
+ let prompt = "";
+
+ if (job.phase === AcpJobPhases.REQUEST) {
+ prompt = `
+ Respond to the following transaction:
+ ${JSON.stringify(job)}
+
+ Decide whether to accept the job or not.
+ Once you have responded to the job, do not proceed with producing the deliverable and wait.
+ `;
+ } else if (job.phase === AcpJobPhases.TRANSACTION) {
+ prompt = `
+ Respond to the following transaction:
+ ${JSON.stringify(job)}
+
+ You should produce the deliverable and deliver it to the buyer.
+ `;
+ }
+
+
+2. Configure the Seller Agent with Required Functions
+
+ ```typescript
+ const sellerAgent = new GameAgent(GAME_API_KEY, {
+ name: "Memx",
+ goal: "To provide meme generation as a service.",
+ description: `You are Memx, a meme generator. Your goal is to always deliver hilarious, impactful memes.
+
+ ${acpPlugin.agentDescription}`,
+ workers: [
+ acpPlugin.getWorker({
+ functions: [
+ acpPlugin.respondJob,
+ acpPlugin.deliverJob,
+ generateMeme // custom meme generation function
+ ],
+ }),
+ ],
+ });
+ ```
+
+### Run the Seller Script
+
+```bash
+ts-node seller.ts
+```
+
+> The seller will automatically start listening for any jobs initiated by the buyer and respond accordingly.
+
+### Next Step
+
+Once the **Seller Agent** is set up and listening, you can now run a **Buyer Agent** in a separate terminal to test end-to-end ACP job flow.
+
+---
+
+## Buyer Agent Setup Guide
+
+This guide walks you through setting up the **Buyer Agent** that initiates jobs and handles payments via the ACP Plugin in reactive mode.
+
+### Buyer Agent Setup (from `buyer.ts`)
+
+This agent uses a **dual-agent architecture**:
+
+1. **Core Agent:** Handles searching for agents and initiating jobs
+2. **Reactive Agent:** Automatically handles payments and job evaluation
+
+> Note: The currency of transaction is in $VIRTUAL, the native token of the Virtuals Protocol. Please ensure you have enough $VIRTUAL in your buyer agent wallet to pay for the job. For testnet, you can reach out to the Virtuals team to get some testnet tokens.
+
+### Core Components
+
+1. Core Worker for Domain-Specific Functions
+ ```typescript
+ const coreWorker = new GameWorker({
+ id: "core-worker",
+ ...
+ functions: [postTweetFunction],
+ });
+ ```
+
+2. Reactive Buyer Agent for Payments
+ ```typescript
+ const buyerAgent = new GameAgent(GAME_API_KEY, {
+ name: "Virtuals",
+ ...
+ workers: [
+ acpPlugin.getWorker({
+ functions: [acpPlugin.payJob],
+ }),
+ ],
+ });
+ ```
+
+
+## Understanding Job Phases
+
+The reactive mode automatically handles different job phases through the `onNewTask` handler:
+
+1. **REQUEST Phase**
+ - Buyer initiates a job request
+ - Seller's `onNewTask` handler automatically evaluates and responds
+
+2. **NEGOTIATION Phase**
+ - Seller accepts the job
+ - Buyer's `onNewTask` handler automatically proceeds with payment
+
+3. **TRANSACTION Phase**
+ - Seller's `onNewTask` handler generates and delivers the meme
+ - Buyer automatically evaluates the deliverable
+
+4. **EVALUATION Phase**
+ - Buyer automatically evaluates the deliverable
+ - Transaction completes upon successful evaluation
+
+## Understanding the `onEvaluate` Function
+
+The `onEvaluate` parameter in the AcpPlugin configuration is crucial for real-time communication between agents during the evaluation phase of a transaction:
+
+- When the evaluator address matches the buyer's address, it establishes a socket connection
+- This connection emits an event on `SocketEvents["ON_EVALUATE"]`
+- The event prompts the user to validate the product/result and make a decision
+- Users can either approve the result (completing the transaction) or reject it (canceling the transaction)
+- Example implementation:
+
+```typescript
+onEvaluate: async (job: AcpJob) => {
+ console.log(job.deliverable, job.serviceRequirement);
+ await job.evaluate(true, "This is a test reasoning");
+}
+```
+
+### How it works?
+Here's a minimal example to get started with evaluation.
+
+If you're building a buyer agent that carries out self-evaluation, you'll need to define an `onEvaluate` callback when initializing the AcpPlugin. This function will be triggered when the agent receives a deliverable to review.
+
+```typescript
+const onEvaluate = async (job: AcpJob) {
+ console.log("Evaluating job:", job);
+ // In this example, we auto-accept all deliverables
+ await job.evaluate(true, "Meme accepted");
+}
+```
+
+Then, pass this function into the plugin:
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: myContractClient,
+ onEvaluate: onEvaluate
+ }),
+});
+```
+
+### More realistic examples
+You can customize the logic:
+
+1️⃣ Example: Check url link exists:
+
+This function ensures that the submitted deliverable contains a valid URL by checking if it starts with either `http://` or `https://`.
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: myContractClient,
+ onEvaluate: async (job: AcpJob) => {
+ console.log("Evaluating job:", job);
+ const url = job.deliverable?.value || "";
+
+ if (typeof url === "string" && (url.startsWith("http://") || url.startsWith("https://"))) {
+ console.log(`✅ URL link looks valid: ${url}`);
+ await job.evaluate(true, "URL link looks valid");
+ } else {
+ console.log(`❌ Invalid or missing URL: ${url}`);
+ await job.evaluate(false, "Invalid or missing URL");
+ }
+ }
+ })
+});
+```
+
+Sample Output:
+```bash
+Evaluating job: {..., deliverable: { type: 'url', value: 'https://example.com/resource' }, serviceRequirement: {...}, ...}
+✅ URL link looks valid: https://example.com/resource
+```
+
+2️⃣ Check File Extension (e.g. only allow `.png` or `.jpg` or `.jpeg`):
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: myContractClient,
+ onEvaluate: async (job: AcpJob) => {
+ console.log("Evaluating job:", job);
+
+ const url: string = job.deliverable?.value || "";
+ const allowedExtensions = [".png", ".jpg", ".jpeg"];
+ const isAllowedFormat = allowedExtensions.some(ext => url.toLowerCase().endsWith(ext));
+
+ if (isAllowedFormat) {
+ console.log(`✅ Image format is allowed: ${url}`);
+ await job.evaluate(true, "Image format is allowed");
+ } else {
+ console.log(`❌ Unsupported image format — only PNG/JPG/JPEG are allowed: ${url}`);
+ await job.evaluate(false, "Unsupported image format — only PNG and JPG are allowed");
+ }
+ }
+ }),
+});
+```
+
+Sample Output:
+```bash
+Evaluating job: {..., deliverable: { type: 'image', value: 'https://cdn.example.com/meme_final.jpg' }, serviceRequirement: {...}, ...}
+✅ Image format is allowed: https://cdn.example.com/meme_final.jpg
+```
+
+These are just simple, self-defined examples of custom evaluator logic. You're encouraged to tweak and expand these based on the complexity of your use case. Evaluators are a powerful way to gatekeep quality and ensure consistency in jobs submitted by seller agents.
+
+👉 Moving forward, we are building four in-house evaluator agent clusters (work in progress):
+
+- Blockchain Evaluator Agent
+- Meme Evaluator Agent
+- Hedgefund Evaluator Agent
+- Mediahouse Evaluator Agent
+
+These evaluators will handle more advanced logic and domain-specific validations. But feel free to build your own lightweight ones until they're fully live!
+
+---
+
+## Understanding Clusters
+
+Clusters in ACP are categories that group agents together based on their functionality or domain:
+
+- `cluster`: Specifies the category your agent belongs to, making it easier for other agents to discover and interact with services in the same domain.
+- [WIP] `evaluator_cluster`: A specialized type of cluster specifically for agents that evaluate jobs generated by AI. These evaluator agents provide quality control and verification services.
+
+Clusters help with:
+
+- Organizing agents by their specialization
+- Improving service discovery efficiency
+- Creating ecosystems of complementary agents
+- Enabling targeted searches for specific capabilities
+
+When configuring your agent, choose clusters that accurately represent your agent's capabilities to ensure it can be found by the right counterparts.
+
+---
+
+## Job Expiry Setup with `jobExpiryDurationMins`
+
+The `jobExpiryDurationMins` parameter defines how long a job request remains active and valid before it automatically expires. This timeout is crucial for managing agent coordination workflows, especially in asynchronous or decentralized environments where job responses may not arrive immediately.
+
+### Why It Matters
+
+Setting an expiry time ensures that:
+- Stale or unresponsive job requests do not hang indefinitely
+- The system can safely discard or retry expired jobs
+
+### How It Works
+Internally, `jobExpiryDurationMins` is used to compute a future timestamp (expiredAt) relative to the current time:
+```typescript
+const expiredAt = new Date();
+expiredAt.setMinutes(
+ expiredAt.getMinutes() + this.jobExpiryDurationMins
+);
+```
+
+### Example: Plugin Setup with Job Expiry
+```typescript
+const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ baseAcpConfig
+ ),
+ onEvaluate: async (job: AcpJob) => {
+ console.log("Evaluating job", job);
+ await job.evaluate(true, "custom evaluator");
+ },
+ jobExpiryDurationMins: 1440, // Job will expire 1440 minutes (1 day) after creation
+ })
+});
+```
+
+In this example:
+- Any job created through this plugin instance will be automatically marked as expired after 10 minutes, unless a response is received.
+- You can adjust this value (e.g., to 5 or 30) based on how responsive your agent network is.
+
+---
+
+## Note
+- Make sure to replace placeholder API keys and private keys with your own
+- You can use a testnet wallet to test the examples
+- The reactive mode is designed for automated workflows, while the agentic mode provides more manual control
+- Twitter integration requires a valid access token (check out [Twitter Plugin](https://github.com/game-by-virtuals/game-node/blob/main/plugins/twitterPlugin/README.md) for more instructions)
+
+---
+
+## Useful Resources
+
+1. [ACP Builder’s Guide](https://whitepaper.virtuals.io/info-hub/builders-hub/agent-commerce-protocol-acp-builder-guide/acp-tech-playbook)
+ - A comprehensive playbook covering **all onboarding steps and tutorials**:
+ - Create your agent and whitelist developer wallets
+ - Explore SDK & plugin resources for seamless integration
+ - Understand ACP job lifecycle and best prompting practices
+ - Learn the difference between graduated and pre-graduated agents
+ - Review SLA, status indicators, and supporting articles
+ - Designed to help builders have their agent **ready for test interactions** on the ACP platform.
+
+
+2. [Agent Commerce Protocol (ACP) research page](https://app.virtuals.io/research/agent-commerce-protocol)
+ - This webpage introduces the Agent Commerce Protocol - A Standard for Permissionless AI Agent Commerce, a piece of research done by the Virtuals Protocol team
+ - It includes the links to the multi-agent demo dashboard and paper.
+
+
+3. [ACP Plugin FAQs](https://virtualsprotocol.notion.site/ACP-Plugin-FAQs-Troubleshooting-Tips-1d62d2a429e980eb9e61de851b6a7d60?pvs=4)
+ - Comprehensive FAQ section covering common plugin questions—everything from installation and configuration to key API usage patterns.
+ - Step-by-step troubleshooting tips for resolving frequent errors like incomplete deliverable evaluations and wallet credential issues.
\ No newline at end of file
diff --git a/plugins/acpPlugin/example/reactive/buyer-with-threading.ts b/plugins/acpPlugin/example/reactive/buyer-with-threading.ts
new file mode 100644
index 00000000..3b3fbcfe
--- /dev/null
+++ b/plugins/acpPlugin/example/reactive/buyer-with-threading.ts
@@ -0,0 +1,367 @@
+import {
+ ExecutableGameFunctionResponse,
+ ExecutableGameFunctionStatus,
+ GameAgent,
+ GameFunction,
+ GameWorker,
+} from "@virtuals-protocol/game";
+import * as readline from "readline";
+import AcpPlugin from "@virtuals-protocol/game-acp-plugin";
+import AcpClient, {
+ AcpContractClient,
+ AcpJob,
+ AcpJobPhases,
+} from "@virtuals-protocol/acp-node";
+import {
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ GAME_API_KEY,
+} from "./env";
+
+// GAME Twitter Plugin import
+import { TwitterApi } from "@virtuals-protocol/game-twitter-node";
+import { BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN } from "./env";
+
+// Native Twitter Plugin imports
+// import { TwitterClient } from "@virtuals-protocol/game-twitter-plugin";
+// import {
+// BUYER_AGENT_TWITTER_ACCESS_TOKEN,
+// BUYER_AGENT_TWITTER_API_KEY,
+// BUYER_AGENT_TWITTER_API_SECRET_KEY,
+// BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// } from "./env";
+
+function askQuestion(query: string): Promise {
+ const rl = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ });
+
+ return new Promise((resolve) =>
+ rl.question(query, (ans) => {
+ rl.close();
+ resolve(ans);
+ })
+ );
+}
+
+const twitterClient = new TwitterApi({
+ gameTwitterAccessToken: BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN,
+});
+
+// Native Twitter Plugin
+// const twitterClient = new TwitterClient({
+// apiKey: BUYER_AGENT_TWITTER_API_KEY,
+// apiSecretKey: BUYER_AGENT_TWITTER_API_SECRET_KEY,
+// accessToken: BUYER_AGENT_TWITTER_ACCESS_TOKEN,
+// accessTokenSecret: BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// });
+
+async function buyer(useThreadLock: boolean = true) {
+ if (!WHITELISTED_WALLET_PRIVATE_KEY) {
+ console.log("❌ WHITELISTED_WALLET_PRIVATE_KEY is not set");
+ return;
+ }
+
+ if (!BUYER_ENTITY_ID) {
+ console.log("❌ BUYER_ENTITY_ID is not set");
+ return;
+ }
+
+ // Thread-safe job queue setup
+ const jobQueue: AcpJob[] = [];
+ let jobQueueLock: any = null;
+ let jobEvent: any = null;
+ let isProcessing = false;
+
+ // Initialize threading primitives if threading is available
+ if (useThreadLock) {
+ try {
+ // Note: Node.js doesn't have native threading like Python
+ // We'll simulate thread-safe behavior using async/await patterns
+ jobQueueLock = {
+ acquire: async () => {
+ // Simulate lock acquisition
+ await new Promise(resolve => setTimeout(resolve, 0));
+ },
+ release: async () => {
+ // Simulate lock release
+ await new Promise(resolve => setTimeout(resolve, 0));
+ }
+ };
+ jobEvent = {
+ set: () => {
+ // Trigger job processing
+ console.log("[event] Job event set - triggering processing");
+ if (!isProcessing) {
+ processJobs();
+ }
+ },
+ clear: () => {
+ // Clear event
+ console.log("[event] Job event cleared");
+ },
+ wait: async () => {
+ // Wait for event - use a more efficient approach
+ await new Promise(resolve => {
+ // Use setImmediate for better performance than setTimeout
+ setImmediate(resolve);
+ });
+ }
+ };
+ } catch (error) {
+ console.log("⚠️ Threading not available, falling back to non-threaded mode");
+ useThreadLock = false;
+ }
+ }
+
+ // Thread-safe append with optional lock
+ const safeAppendJob = async (job: AcpJob) => {
+ if (useThreadLock && jobQueueLock) {
+ console.log(`[safe_append_job] Acquiring lock to append job ${job.id}`);
+ await jobQueueLock.acquire();
+ console.log(`[safe_append_job] Lock acquired, appending job ${job.id} to queue`);
+ jobQueue.push(job);
+ await jobQueueLock.release();
+ } else {
+ jobQueue.push(job);
+ }
+ };
+
+ // Thread-safe pop with optional lock
+ const safePopJob = async (): Promise => {
+ if (useThreadLock && jobQueueLock) {
+ console.log(`[safe_pop_job] Acquiring lock to pop job`);
+ await jobQueueLock.acquire();
+ if (jobQueue.length > 0) {
+ const job = jobQueue.shift()!;
+ console.log(`[safe_pop_job] Lock acquired, popped job ${job.id}`);
+ await jobQueueLock.release();
+ return job;
+ } else {
+ console.log("[safe_pop_job] Queue is empty after acquiring lock");
+ await jobQueueLock.release();
+ }
+ } else {
+ if (jobQueue.length > 0) {
+ const job = jobQueue.shift()!;
+ console.log(`[safe_pop_job] Popped job ${job.id} without lock`);
+ return job;
+ } else {
+ console.log("[safe_pop_job] Queue is empty (no lock)");
+ }
+ }
+ return null;
+ };
+
+ // Process a single job
+ const processJob = async (job: AcpJob) => {
+ let out = "";
+ console.log(job.phase, "job.phase");
+
+ if (job.phase === AcpJobPhases.NEGOTIATION) {
+ for (const memo of job.memos) {
+ console.log(memo.nextPhase, "memo.nextPhase");
+ if (memo.nextPhase === AcpJobPhases.TRANSACTION) {
+ out += `Buyer agent is reacting to job:\n${JSON.stringify(job)}\n\n`;
+ await buyerAgent.getWorkerById("acp_worker").runTask(
+ `Respond to the following transaction: ${JSON.stringify(job)}`,
+ { verbose: true }
+ );
+ out += "Buyer agent has responded to the job\n";
+ }
+ }
+ }
+
+ console.log("🔁 Reaction:", out);
+ };
+
+ // Process all jobs in queue
+ const processJobs = async () => {
+ if (isProcessing) return;
+
+ isProcessing = true;
+ console.log("[processJobs] Starting to process jobs");
+
+ while (jobQueue.length > 0) {
+ const job = await safePopJob();
+ if (job) {
+ try {
+ await processJob(job);
+ } catch (e) {
+ console.log(`❌ Error processing job: ${e}`);
+ }
+ }
+ }
+
+ isProcessing = false;
+ console.log("[processJobs] Finished processing all jobs");
+ };
+
+ // Background job worker is no longer needed since we use processJobs directly
+
+ // Event-triggered job task receiver
+ const onNewTask = async (job: AcpJob) => {
+ console.log(`[on_new_task] Received job ${job.id} (phase: ${job.phase})`);
+ await safeAppendJob(job);
+ jobEvent?.set();
+ };
+
+ const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ ),
+ onNewTask: onNewTask,
+ onEvaluate: async (job: AcpJob) => {
+ console.log(`Evaluating deliverable for job ${job.id}`);
+ // Auto-accept all deliverables for this example
+ await job.evaluate(true, "Auto-accepting all deliverables");
+ },
+ }),
+ twitterClient: twitterClient,
+ graduated: false
+ });
+
+ const ACP_BUYER_AGENT_BASIC_CONFIG = {
+ name: "Virtuals",
+ goal: "Finding the best meme to do tweet posting",
+ description: `
+ Agent that gain market traction by posting meme. Your interest are in cats and AI.
+ You can head to acp to look for agents to help you generating meme.
+ Do not look for a relevant validator to validate the deliverable.
+ Look for agent named "blue" to help you generate
+
+ ${acpPlugin.agentDescription}
+ `,
+ };
+
+ const coreWorker = new GameWorker({
+ id: "core-worker",
+ name: "Core Worker",
+ description: "This worker is to post tweet",
+ functions: [
+ new GameFunction({
+ name: "post_tweet",
+ description: "This function is to post tweet",
+ args: [
+ {
+ name: "content",
+ type: "string",
+ description: "The content of the tweet",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "The reasoning of the tweet",
+ },
+ ] as const,
+ executable: async (args, logger) => {
+ logger("Posting tweet...");
+ logger(`Content: ${args.content}. Reasoning: ${args.reasoning}`);
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ "Tweet has been posted"
+ );
+ },
+ }),
+ ],
+ getEnvironment: async () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ const acpWorker = acpPlugin.getWorker({
+ functions: [
+ acpPlugin.searchAgentsFunctions,
+ acpPlugin.initiateJob
+ ]
+ });
+
+ const agent = new GameAgent(GAME_API_KEY, {
+ ...ACP_BUYER_AGENT_BASIC_CONFIG,
+ workers: [coreWorker, acpWorker],
+ getAgentState: () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ // Buyer agent is meant to handle payments
+ const buyerWorker = acpPlugin.getWorker({
+ functions: [acpPlugin.payJob]
+ });
+
+ const buyerAgent = new GameAgent(GAME_API_KEY, {
+ name: "Buyer",
+ goal: "Perform and complete transaction with seller",
+ description: `
+ Agent that gain market traction by posting meme. Your interest are in cats and AI.
+ You can head to acp to look for agents to help you generating meme.
+ Do not look for a relevant validator to validate the deliverable.
+
+ ${acpPlugin.agentDescription}
+ `,
+ workers: [buyerWorker],
+ getAgentState: () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ await buyerAgent.init();
+ await agent.init();
+
+ // Job processing is now handled by processJobs() when jobs are added
+
+ while (true) {
+ console.log("🟢".repeat(40));
+ const initState = acpPlugin.getAcpState();
+ console.log("Agent State:", JSON.stringify(initState, null, 2));
+
+ console.log("[agent.step] Attempting to acquire lock for agent.step()");
+ if (useThreadLock && jobQueueLock) {
+ await jobQueueLock.acquire();
+ console.log("[agent.step] Lock acquired, executing agent.step()");
+ try {
+ await agent.step({ verbose: true });
+ } catch (error: any) {
+ console.error("[agent.step] Error during agent.step():", error);
+ console.error("[agent.step] Error details:", {
+ message: error?.message || 'Unknown error',
+ stack: error?.stack || 'No stack trace',
+ name: error?.name || 'Unknown error type'
+ });
+ }
+ await jobQueueLock.release();
+ console.log("[agent.step] Released lock after agent.step()");
+ } else {
+ try {
+ await agent.step({ verbose: true });
+ } catch (error: any) {
+ console.error("[agent.step] Error during agent.step():", error);
+ console.error("[agent.step] Error details:", {
+ message: error?.message || 'Unknown error',
+ stack: error?.stack || 'No stack trace',
+ name: error?.name || 'Unknown error type'
+ });
+ }
+ }
+
+ const endState = acpPlugin.getAcpState();
+ console.log("End Agent State:", JSON.stringify(endState, null, 2));
+ console.log("🔴".repeat(40));
+
+ await askQuestion("\nPress any key to continue...\n");
+ }
+}
+
+// Run the buyer function with threading enabled
+if (require.main === module) {
+ buyer(true);
+}
+
+export { buyer };
\ No newline at end of file
diff --git a/plugins/acpPlugin/example/reactive/buyer.ts b/plugins/acpPlugin/example/reactive/buyer.ts
new file mode 100644
index 00000000..a3eda205
--- /dev/null
+++ b/plugins/acpPlugin/example/reactive/buyer.ts
@@ -0,0 +1,183 @@
+import {
+ ExecutableGameFunctionResponse,
+ ExecutableGameFunctionStatus,
+ GameAgent,
+ GameFunction,
+ GameWorker,
+} from "@virtuals-protocol/game";
+import * as readline from "readline";
+import AcpPlugin from "@virtuals-protocol/game-acp-plugin";
+import AcpClient, {
+ AcpContractClient,
+ AcpJob,
+ AcpJobPhases,
+ AcpGraduationStatus,
+ AcpOnlineStatus,
+} from "@virtuals-protocol/acp-node";
+import {
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ GAME_API_KEY,
+} from "./env";
+
+// GAME Twitter Plugin import
+ import { TwitterApi } from "@virtuals-protocol/game-twitter-node";
+import { BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN } from "./env";
+
+// Native Twitter Plugin imports
+// import { TwitterClient } from "@virtuals-protocol/game-twitter-plugin";
+// import {
+// BUYER_AGENT_TWITTER_ACCESS_TOKEN,
+// BUYER_AGENT_TWITTER_API_KEY,
+// BUYER_AGENT_TWITTER_API_SECRET_KEY,
+// BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// } from "./env";
+
+
+function askQuestion(query: string): Promise {
+ const rl = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ });
+
+ return new Promise((resolve) =>
+ rl.question(query, (ans) => {
+ rl.close();
+ resolve(ans);
+ })
+ );
+}
+
+const twitterClient = new TwitterApi({
+ gameTwitterAccessToken: BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN,
+});
+
+// Native Twitter Plugin
+// const twitterClient = new TwitterClient({
+// apiKey: BUYER_AGENT_TWITTER_API_KEY,
+// apiSecretKey: BUYER_AGENT_TWITTER_API_SECRET_KEY,
+// accessToken: BUYER_AGENT_TWITTER_ACCESS_TOKEN,
+// accessTokenSecret: BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// });
+
+async function buyer() {
+ const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ ),
+ onNewTask: async (job: AcpJob) => {
+ if (
+ job.phase === AcpJobPhases.NEGOTIATION &&
+ job.memos.find((m) => m.nextPhase === AcpJobPhases.TRANSACTION)
+ ) {
+ const prompt = `Pay for the following job: ${JSON.stringify(job)}`;
+ await buyerAgent.getWorkerById("acp_worker").runTask(prompt, {
+ verbose: true,
+ });
+ buyerAgent.log(`${buyerAgent.name} has responded to the job #${job.id}`);
+ }
+ },
+ onEvaluate: async (job: AcpJob) => {
+ console.log(job.deliverable, job.serviceRequirement);
+ await job.evaluate(true, "This is a test reasoning");
+ },
+ }),
+ twitterClient: twitterClient,
+ graduationStatus: AcpGraduationStatus.ALL,
+ onlineStatus: AcpOnlineStatus.ALL
+ });
+
+ const ACP_BUYER_AGENT_BASIC_CONFIG = {
+ name: "Virtuals",
+ goal: "Perform and complete transanction with seller, look for agents to help you generating meme",
+ description: `
+ Agent that gain market traction by posting meme. Your interest are in cats and AI.
+ You can head to acp to look for agents to help you generating meme.
+ Do not look a relevant validator to validate the deliverable.
+
+ ${acpPlugin.agentDescription}
+ `,
+ };
+
+ const coreWorker = new GameWorker({
+ id: "core-worker",
+ name: "Core Worker",
+ description: "This worker is to post tweet",
+ functions: [
+ new GameFunction({
+ name: "post_tweet",
+ description: "This function is to post tweet",
+ args: [
+ {
+ name: "content",
+ type: "string",
+ description: "The content of the tweet",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "The reasoning of the tweet",
+ },
+ ] as const,
+ executable: async (args, logger) => {
+ logger("Posting tweet...");
+ logger(`Content: ${args.content}. Reasoning: ${args.reasoning}`);
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ "Tweet has been posted"
+ );
+ },
+ }),
+ ],
+ getEnvironment: async () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ /// start a new buyer agent to handle payments
+ const buyerAgent = new GameAgent(GAME_API_KEY, {
+ ...ACP_BUYER_AGENT_BASIC_CONFIG,
+ workers: [
+ acpPlugin.getWorker({
+ functions: [acpPlugin.payJob],
+ }),
+ ],
+ });
+
+ await buyerAgent.init();
+
+
+ const agent = new GameAgent(GAME_API_KEY, {
+ ...ACP_BUYER_AGENT_BASIC_CONFIG,
+ workers: [
+ coreWorker,
+ acpPlugin.getWorker({
+ // buyer to have only both search and initiate job, once job is initiated, it will be handled by the buyer reactive agent
+ functions: [acpPlugin.searchAgentsFunctions, acpPlugin.initiateJob],
+ }),
+ ],
+ getAgentState: () => {
+ return acpPlugin.getAcpState();
+ },
+ });
+
+ //await acpPlugin.resetState();
+
+ await agent.init();
+
+ while (true) {
+ await agent.step({
+ verbose: true,
+ });
+
+ await askQuestion("\nPress any key to continue...\n");
+ }
+}
+
+buyer();
diff --git a/plugins/acpPlugin/example/reactive/env.ts b/plugins/acpPlugin/example/reactive/env.ts
new file mode 100644
index 00000000..ac3fda77
--- /dev/null
+++ b/plugins/acpPlugin/example/reactive/env.ts
@@ -0,0 +1,44 @@
+import dotenv from "dotenv";
+import { Address } from "viem";
+
+dotenv.config({ path: __dirname + '/.env' });
+
+function getEnvVar(key: string, required = true): T {
+ const value = process.env[key];
+ if (required && (value === undefined || value === '')) {
+ throw new Error(`${key} is not defined or is empty in the .env file`);
+ }
+ return value as T;
+}
+
+// ACP Agents' Credentials
+export const WHITELISTED_WALLET_PRIVATE_KEY = getEnvVar('WHITELISTED_WALLET_PRIVATE_KEY');
+export const SELLER_ENTITY_ID = parseInt(getEnvVar('SELLER_ENTITY_ID'), 10);
+export const BUYER_ENTITY_ID = parseInt(getEnvVar('BUYER_ENTITY_ID'), 10);
+export const BUYER_AGENT_WALLET_ADDRESS = getEnvVar('BUYER_AGENT_WALLET_ADDRESS') as Address;
+export const SELLER_AGENT_WALLET_ADDRESS = getEnvVar('SELLER_AGENT_WALLET_ADDRESS') as Address;
+
+// GAME Dev API Key
+export const GAME_API_KEY = getEnvVar('GAME_API_KEY');
+
+// GAME Twitter Access Token for X (Twitter) Authentication
+export const BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN = getEnvVar('BUYER_AGENT_GAME_TWITTER_ACCESS_TOKEN');
+export const SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN = getEnvVar('SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN');
+
+// Twitter API Credentials for X (Twitter) Authentication
+// export const BUYER_AGENT_TWITTER_API_KEY = getEnvVar('BUYER_AGENT_TWITTER_API_KEY');
+// export const BUYER_AGENT_TWITTER_API_SECRET_KEY = getEnvVar('BUYER_AGENT_TWITTER_API_SECRET_KEY');
+// export const BUYER_AGENT_TWITTER_ACCESS_TOKEN = getEnvVar('BUYER_AGENT_TWITTER_ACCESS_TOKEN');
+// export const BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET = getEnvVar('BUYER_AGENT_TWITTER_ACCESS_TOKEN_SECRET');
+// export const SELLER_AGENT_TWITTER_API_KEY = getEnvVar('SELLER_AGENT_TWITTER_API_KEY');
+// export const SELLER_AGENT_TWITTER_API_SECRET_KEY = getEnvVar('SELLER_AGENT_TWITTER_API_SECRET_KEY');
+// export const SELLER_AGENT_TWITTER_ACCESS_TOKEN = getEnvVar('SELLER_AGENT_TWITTER_ACCESS_TOKEN');
+// export const SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET = getEnvVar('SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET');
+
+if (isNaN(BUYER_ENTITY_ID)) {
+ throw new Error('BUYER_ENTITY_ID must be a valid number in the .env file');
+}
+
+if (isNaN(SELLER_ENTITY_ID)) {
+ throw new Error('SELLER_ENTITY_ID must be a valid number in the .env file');
+}
\ No newline at end of file
diff --git a/plugins/acpPlugin/example/reactive/seller-with-threading.ts b/plugins/acpPlugin/example/reactive/seller-with-threading.ts
new file mode 100644
index 00000000..1eb471f9
--- /dev/null
+++ b/plugins/acpPlugin/example/reactive/seller-with-threading.ts
@@ -0,0 +1,168 @@
+import AcpClient, {
+ AcpContractClient,
+ AcpJobPhases,
+ AcpJob
+} from '@virtuals-protocol/acp-node';
+import {
+ SELLER_AGENT_WALLET_ADDRESS,
+ SELLER_ENTITY_ID,
+ WHITELISTED_WALLET_PRIVATE_KEY
+} from "./env";
+import { isMainThread, parentPort, workerData } from 'worker_threads';
+import dotenv from 'dotenv';
+dotenv.config();
+
+// Simple job queue for processing jobs sequentially
+class JobQueue {
+ private queue: AcpJob[] = [];
+ private processing = false;
+ private processingDelay = 2000; // 2 second delay between jobs
+
+ async enqueue(job: AcpJob) {
+ console.log(`[queue] Enqueuing job ${job.id} (Phase: ${job.phase})`);
+ this.queue.push(job);
+ console.log(`[queue] Queue status: ${this.queue.length} jobs waiting`);
+
+ if (!this.processing) {
+ this.processQueue();
+ }
+ }
+
+ private async processQueue() {
+ if (this.processing || this.queue.length === 0) {
+ return;
+ }
+
+ this.processing = true;
+ console.log(`[queue] Starting to process queue (${this.queue.length} jobs)`);
+
+ // Process jobs one by one (simplified like Python version)
+ let job = this.queue.shift();
+ while (job) {
+ console.log(`[queue] Processing job ${job.id} (${this.queue.length} remaining)`);
+
+ try {
+ await this.handleJob(job);
+ console.log(`[queue] Job ${job.id} processed successfully`);
+ } catch (error) {
+ console.error(`[queue] Error processing job ${job.id}:`, error);
+ }
+
+ // Get next job
+ job = this.queue.shift();
+
+ // Add delay between jobs if there are more in queue
+ if (this.queue.length > 0) {
+ console.log(`[queue] Waiting ${this.processingDelay}ms before next job...`);
+ await new Promise(resolve => setTimeout(resolve, this.processingDelay));
+ }
+ }
+
+ this.processing = false;
+ console.log(`[queue] Queue processing complete`);
+ }
+
+ private async handleJob(job: AcpJob) {
+ if (
+ job.phase === AcpJobPhases.REQUEST &&
+ job.memos.find((m) => m.nextPhase === AcpJobPhases.NEGOTIATION)
+ ) {
+ console.log("[queue] Responding to job", job.id);
+ await job.respond(true);
+ console.log(`[queue] Job ${job.id} responded`);
+ } else if (
+ job.phase === AcpJobPhases.TRANSACTION &&
+ job.memos.find((m) => m.nextPhase === AcpJobPhases.EVALUATION)
+ ) {
+ console.log("[queue] Delivering job", job.id);
+ await job.deliver(
+ JSON.stringify({
+ type: "url",
+ value: "https://example.com",
+ })
+ );
+ console.log(`[queue] Job ${job.id} delivered`);
+ } else {
+ console.log(`[queue] Job ${job.id} in phase ${job.phase} - no action needed`);
+ }
+ }
+
+ getStatus() {
+ return {
+ queueLength: this.queue.length,
+ processing: this.processing
+ };
+ }
+}
+
+// Worker thread code
+if (!isMainThread) {
+ console.log("[worker] Worker thread started");
+
+ const { useThreadLock } = workerData;
+ console.log(`[worker] Thread lock enabled: ${useThreadLock}`);
+
+ // Simulate worker thread processing with better logging
+ setInterval(() => {
+ parentPort?.postMessage({
+ type: 'heartbeat',
+ timestamp: Date.now(),
+ useThreadLock
+ });
+ }, 5000);
+
+ // Listen for messages from main thread
+ parentPort?.on('message', (message) => {
+ console.log(`[worker] Received message from main thread:`, message);
+
+ if (message.type === 'processJob') {
+ console.log(`[worker] Processing job in worker thread:`, message.jobId);
+ // Simulate job processing
+ setTimeout(() => {
+ parentPort?.postMessage({
+ type: 'jobProcessed',
+ jobId: message.jobId,
+ result: 'success'
+ });
+ }, 2000);
+ }
+ });
+}
+
+async function seller() {
+ const jobQueue = new JobQueue();
+
+ new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ SELLER_ENTITY_ID,
+ SELLER_AGENT_WALLET_ADDRESS
+ ),
+ onNewTask: async (job: AcpJob) => {
+ console.log(`[onNewTask] New job received: ${job.id} (Phase: ${job.phase})`);
+ // Enqueue the job for sequential processing
+ await jobQueue.enqueue(job);
+ },
+ });
+
+ console.log("🟢".repeat(40));
+ console.log("Seller agent initialized and ready to receive jobs");
+ console.log("Queue status:", jobQueue.getStatus());
+ console.log("🟢".repeat(40));
+
+ console.log("\nListening...\n");
+
+ // Keep the process running
+ process.on('SIGINT', () => {
+ console.log("Shutting down seller...");
+ process.exit(0);
+ });
+
+ // Keep the process alive indefinitely
+ await new Promise(() => {});
+}
+
+// Only run the main function if this is the main thread
+if (isMainThread) {
+ seller();
+}
\ No newline at end of file
diff --git a/plugins/acpPlugin/example/reactive/seller.ts b/plugins/acpPlugin/example/reactive/seller.ts
new file mode 100644
index 00000000..4d938a07
--- /dev/null
+++ b/plugins/acpPlugin/example/reactive/seller.ts
@@ -0,0 +1,177 @@
+import {
+ ExecutableGameFunctionResponse,
+ ExecutableGameFunctionStatus,
+ GameAgent,
+ GameFunction,
+} from "@virtuals-protocol/game";
+import AcpPlugin from "@virtuals-protocol/game-acp-plugin";
+import AcpClient, {
+ AcpContractClient,
+ AcpJob,
+ AcpJobPhases,
+} from "@virtuals-protocol/acp-node";
+import {
+ GAME_API_KEY,
+ SELLER_AGENT_WALLET_ADDRESS,
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ SELLER_ENTITY_ID,
+} from "./env";
+
+// GAME Twitter Plugin import
+import { TwitterApi } from "@virtuals-protocol/game-twitter-node";
+import { SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN } from "./env";
+
+// Native Twitter Plugin imports
+// import { TwitterClient } from "@virtuals-protocol/game-twitter-plugin";
+// import {
+// SELLER_AGENT_TWITTER_ACCESS_TOKEN,
+// SELLER_AGENT_TWITTER_API_KEY,
+// SELLER_AGENT_TWITTER_API_SECRET_KEY,
+// SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// } from "./env";
+
+const twitterClient = new TwitterApi({
+ gameTwitterAccessToken: SELLER_AGENT_GAME_TWITTER_ACCESS_TOKEN,
+});
+
+// const twitterClient = new TwitterClient({
+// apiKey: SELLER_AGENT_TWITTER_API_KEY,
+// apiSecretKey: SELLER_AGENT_TWITTER_API_SECRET_KEY,
+// accessToken: SELLER_AGENT_TWITTER_ACCESS_TOKEN,
+// accessTokenSecret: SELLER_AGENT_TWITTER_ACCESS_TOKEN_SECRET,
+// })
+
+async function seller() {
+ const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ SELLER_ENTITY_ID,
+ SELLER_AGENT_WALLET_ADDRESS
+ ),
+ onNewTask: async (job: AcpJob) => {
+ let prompt = "";
+
+ if (
+ job.phase === AcpJobPhases.REQUEST &&
+ job.memos.find((m) => m.nextPhase === AcpJobPhases.NEGOTIATION)
+ ) {
+ prompt = `
+ Respond to the following transaction:
+ ${JSON.stringify(job)}
+
+ Decide whether to accept the job or not.
+ Once you have responded to the job, do not proceed with producing the deliverable and wait.
+ `;
+ } else if (
+ job.phase === AcpJobPhases.TRANSACTION &&
+ job.memos.find((m) => m.nextPhase === AcpJobPhases.EVALUATION)
+ ) {
+ prompt = `
+ Respond to the following transaction:
+ ${JSON.stringify(job)}
+
+ You should produce the deliverable and deliver it to the buyer.
+ `;
+ }
+
+ await sellerAgent.getWorkerById("acp_worker").runTask(prompt, {
+ verbose: true,
+ });
+ sellerAgent.log(
+ `${sellerAgent.name} has responded to the job #${job.id}`
+ );
+ },
+ }),
+ twitterClient: twitterClient,
+ });
+
+ const generateMeme = new GameFunction({
+ name: "generate_meme",
+ description: "A function to generate meme",
+ args: [
+ {
+ name: "description",
+ type: "string",
+ description: "A description of the meme generated",
+ },
+ {
+ name: "jobId",
+ type: "string",
+ description: "Job that your are responding to.",
+ },
+ {
+ name: "buyerWalletAddress",
+ type: "string",
+ description: "Buyer wallet address",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "The reasoning of the tweet",
+ },
+ ] as const,
+ executable: async (args, logger) => {
+ logger("Generating meme...");
+
+ if (!args.jobId) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `Job ${args.jobId} is invalid. Should only respond to active as a seller job.`
+ );
+ }
+
+ const state = await acpPlugin.getAcpState();
+
+ const job = state.jobs.active.asASeller.find(
+ (j) => j.jobId === +args.jobId!
+ );
+
+ if (!job) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `Job ${args.jobId} is invalid. Should only respond to active as a seller job.`
+ );
+ }
+
+ const url = "http://example.com/meme";
+
+ const item = acpPlugin.addProduceItem({
+ jobId: +args.jobId,
+ type: "url",
+ value: url,
+ });
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ `Meme generated: ${JSON.stringify(item)}`
+ );
+ },
+ });
+
+ /// start a new seller agent to handle respond and deliver job
+ const sellerAgent = new GameAgent(GAME_API_KEY, {
+ name: "Memx",
+ goal: "To provide meme generation as a service. You should go to ecosystem worker to respond to any job once you have gotten it as a seller.",
+ description: `
+ You are Memx, a meme generator. Meme generation is your life. You always give buyer the best meme.
+
+ ${acpPlugin.agentDescription}
+ `,
+ workers: [
+ acpPlugin.getWorker({
+ // restrict to just seller specified functions, add generateMeme to generate deliverable
+ functions: [acpPlugin.respondJob, acpPlugin.deliverJob, generateMeme],
+ }),
+ ],
+ });
+
+ await sellerAgent.init();
+
+ console.log("Listening");
+
+ // NOTE: this agent only listen to the job and respond to it.
+}
+
+seller();
diff --git a/plugins/acpPlugin/package-lock.json b/plugins/acpPlugin/package-lock.json
new file mode 100644
index 00000000..a0a2847a
--- /dev/null
+++ b/plugins/acpPlugin/package-lock.json
@@ -0,0 +1,4662 @@
+{
+ "name": "@virtuals-protocol/game-acp-plugin",
+ "version": "0.2.7",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@virtuals-protocol/game-acp-plugin",
+ "version": "0.2.7",
+ "license": "ISC",
+ "dependencies": {
+ "@aa-sdk/core": "^4.21.0",
+ "@account-kit/infra": "^4.21.0",
+ "@account-kit/smart-contracts": "^4.21.0",
+ "@types/node-fetch": "^2.6.12",
+ "@virtuals-protocol/acp-node": "^0.1.0-beta.18",
+ "@virtuals-protocol/game": "^0.1.14",
+ "@virtuals-protocol/game-acp-plugin": "^0.2.7",
+ "@virtuals-protocol/game-twitter-node": "^0.1.4",
+ "socket.io-client": "^4.8.1",
+ "tsup": "^8.4.0",
+ "viem": "^2.23.10"
+ },
+ "devDependencies": {
+ "ts-node-dev": "^2.0.0",
+ "typescript": "^5.8.2"
+ }
+ },
+ "node_modules/@aa-sdk/core": {
+ "version": "4.35.1",
+ "resolved": "https://registry.npmjs.org/@aa-sdk/core/-/core-4.35.1.tgz",
+ "integrity": "sha512-qEryVcdyXmrmmFyVn0c42ywzZUrp8zKa2uoyQXEZ/tR/+hkyuHlP2FZ6yYQ7OciD6EV9ppIC0A31GMgJJhyt6w==",
+ "license": "MIT",
+ "dependencies": {
+ "abitype": "^0.8.3",
+ "eventemitter3": "^5.0.1",
+ "zod": "^3.22.4"
+ },
+ "peerDependencies": {
+ "viem": "^2.29.2"
+ }
+ },
+ "node_modules/@aa-sdk/core/node_modules/abitype": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.8.11.tgz",
+ "integrity": "sha512-bM4v2dKvX08sZ9IU38IN5BKmN+ZkOSd2oI4a9f0ejHYZQYV6cDr7j+d95ga0z2XHG36Y4jzoG5Z7qDqxp7fi/A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "typescript": ">=5.0.4",
+ "zod": "^3 >=3.19.1"
+ },
+ "peerDependenciesMeta": {
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@account-kit/infra": {
+ "version": "4.35.1",
+ "resolved": "https://registry.npmjs.org/@account-kit/infra/-/infra-4.35.1.tgz",
+ "integrity": "sha512-1vgfaAWZjsU6P/t5Vb/g/KJn19bhZ5cfGXGIHuDKK4IsJbRnQjAERY8TFJNjP1lWQ+YzSXqGGuvxG3DcDSas7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@aa-sdk/core": "^4.35.1",
+ "@account-kit/logging": "^4.35.1",
+ "eventemitter3": "^5.0.1",
+ "zod": "^3.22.4"
+ },
+ "optionalDependencies": {
+ "alchemy-sdk": "^3.0.0"
+ },
+ "peerDependencies": {
+ "viem": "^2.29.2"
+ }
+ },
+ "node_modules/@account-kit/logging": {
+ "version": "4.35.1",
+ "resolved": "https://registry.npmjs.org/@account-kit/logging/-/logging-4.35.1.tgz",
+ "integrity": "sha512-aDWU1ExPTrdxV0dVpvfb6c22nxV3kFrlC07N4b6nf3XI0r1zRLC7gcK8Q4mXVblqVOVMWI6miDWjgCuwnQQ1wA==",
+ "license": "MIT",
+ "dependencies": {
+ "@segment/analytics-next": "1.74.0",
+ "uuid": "^11.0.2"
+ }
+ },
+ "node_modules/@account-kit/smart-contracts": {
+ "version": "4.35.1",
+ "resolved": "https://registry.npmjs.org/@account-kit/smart-contracts/-/smart-contracts-4.35.1.tgz",
+ "integrity": "sha512-lj9p7JUMSWDzNNGJIBrBhyBP9QBheE9SvGueQ6IDjROT/o3ey9zK/ZVXlgM+0fvJBLiPy12ygcHBtxBdce2TbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@aa-sdk/core": "^4.35.1",
+ "@account-kit/infra": "^4.35.1"
+ },
+ "peerDependencies": {
+ "viem": "2.29.2"
+ }
+ },
+ "node_modules/@adraffy/ens-normalize": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz",
+ "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==",
+ "license": "MIT"
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
+ "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
+ "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
+ "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
+ "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
+ "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
+ "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
+ "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
+ "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
+ "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
+ "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
+ "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
+ "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
+ "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
+ "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
+ "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
+ "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
+ "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
+ "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
+ "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
+ "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@ethersproject/abi": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz",
+ "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/hash": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-provider": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz",
+ "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/networks": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/transactions": "^5.8.0",
+ "@ethersproject/web": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-signer": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz",
+ "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/address": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz",
+ "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/rlp": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/base64": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz",
+ "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/basex": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz",
+ "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/bignumber": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz",
+ "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "bn.js": "^5.2.1"
+ }
+ },
+ "node_modules/@ethersproject/bytes": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz",
+ "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/logger": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/constants": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz",
+ "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/contracts": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz",
+ "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.8.0",
+ "@ethersproject/abstract-provider": "^5.8.0",
+ "@ethersproject/abstract-signer": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/transactions": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/hash": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz",
+ "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/base64": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/hdnode": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz",
+ "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.8.0",
+ "@ethersproject/basex": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/pbkdf2": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/sha2": "^5.8.0",
+ "@ethersproject/signing-key": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0",
+ "@ethersproject/transactions": "^5.8.0",
+ "@ethersproject/wordlists": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/json-wallets": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz",
+ "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/hdnode": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/pbkdf2": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/random": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0",
+ "@ethersproject/transactions": "^5.8.0",
+ "aes-js": "3.0.0",
+ "scrypt-js": "3.0.1"
+ }
+ },
+ "node_modules/@ethersproject/keccak256": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz",
+ "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "js-sha3": "0.8.0"
+ }
+ },
+ "node_modules/@ethersproject/logger": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz",
+ "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@ethersproject/networks": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz",
+ "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/logger": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/pbkdf2": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz",
+ "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/sha2": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/properties": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz",
+ "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/logger": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/providers": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz",
+ "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.8.0",
+ "@ethersproject/abstract-signer": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/base64": "^5.8.0",
+ "@ethersproject/basex": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/hash": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/networks": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/random": "^5.8.0",
+ "@ethersproject/rlp": "^5.8.0",
+ "@ethersproject/sha2": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0",
+ "@ethersproject/transactions": "^5.8.0",
+ "@ethersproject/web": "^5.8.0",
+ "bech32": "1.1.4",
+ "ws": "8.18.0"
+ }
+ },
+ "node_modules/@ethersproject/random": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz",
+ "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/rlp": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz",
+ "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/sha2": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz",
+ "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "hash.js": "1.1.7"
+ }
+ },
+ "node_modules/@ethersproject/signing-key": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz",
+ "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "bn.js": "^5.2.1",
+ "elliptic": "6.6.1",
+ "hash.js": "1.1.7"
+ }
+ },
+ "node_modules/@ethersproject/strings": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz",
+ "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/transactions": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz",
+ "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/rlp": "^5.8.0",
+ "@ethersproject/signing-key": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/units": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz",
+ "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/wallet": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz",
+ "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.8.0",
+ "@ethersproject/abstract-signer": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/hash": "^5.8.0",
+ "@ethersproject/hdnode": "^5.8.0",
+ "@ethersproject/json-wallets": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/random": "^5.8.0",
+ "@ethersproject/signing-key": "^5.8.0",
+ "@ethersproject/transactions": "^5.8.0",
+ "@ethersproject/wordlists": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/web": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz",
+ "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/base64": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/wordlists": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz",
+ "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/hash": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@lukeed/csprng": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz",
+ "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@lukeed/uuid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz",
+ "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@lukeed/csprng": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@noble/curves": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz",
+ "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "1.7.2"
+ },
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz",
+ "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz",
+ "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz",
+ "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz",
+ "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz",
+ "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz",
+ "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz",
+ "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz",
+ "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz",
+ "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz",
+ "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz",
+ "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz",
+ "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz",
+ "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz",
+ "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz",
+ "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz",
+ "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz",
+ "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz",
+ "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz",
+ "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz",
+ "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@scure/base": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.5.tgz",
+ "integrity": "sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip32": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz",
+ "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/curves": "~1.8.1",
+ "@noble/hashes": "~1.7.1",
+ "@scure/base": "~1.2.2"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip39": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz",
+ "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "~1.7.1",
+ "@scure/base": "~1.2.4"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@segment/analytics-core": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@segment/analytics-core/-/analytics-core-1.8.0.tgz",
+ "integrity": "sha512-6CrccsYRY33I3mONN2ZW8SdBpbLtu1Ict3xR+n0FemYF5RB/jG7pW6jOvDXULR8kuYMzMmGOP4HvlyUmf3qLpg==",
+ "license": "MIT",
+ "dependencies": {
+ "@lukeed/uuid": "^2.0.0",
+ "@segment/analytics-generic-utils": "1.2.0",
+ "dset": "^3.1.4",
+ "tslib": "^2.4.1"
+ }
+ },
+ "node_modules/@segment/analytics-generic-utils": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@segment/analytics-generic-utils/-/analytics-generic-utils-1.2.0.tgz",
+ "integrity": "sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.1"
+ }
+ },
+ "node_modules/@segment/analytics-next": {
+ "version": "1.74.0",
+ "resolved": "https://registry.npmjs.org/@segment/analytics-next/-/analytics-next-1.74.0.tgz",
+ "integrity": "sha512-dhSwm+kahwnsHZmhcInu6wTJZFCLtG1VDCw0uiQRuKL5SDRRNEMORvKErV6bycXHWLelaYQVIMRcHH2Y9lk48A==",
+ "license": "MIT",
+ "dependencies": {
+ "@lukeed/uuid": "^2.0.0",
+ "@segment/analytics-core": "1.8.0",
+ "@segment/analytics-generic-utils": "1.2.0",
+ "@segment/analytics.js-video-plugins": "^0.2.1",
+ "@segment/facade": "^3.4.9",
+ "dset": "^3.1.4",
+ "js-cookie": "3.0.1",
+ "node-fetch": "^2.6.7",
+ "tslib": "^2.4.1",
+ "unfetch": "^4.1.0"
+ }
+ },
+ "node_modules/@segment/analytics.js-video-plugins": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@segment/analytics.js-video-plugins/-/analytics.js-video-plugins-0.2.1.tgz",
+ "integrity": "sha512-lZwCyEXT4aaHBLNK433okEKdxGAuyrVmop4BpQqQSJuRz0DglPZgd9B/XjiiWs1UyOankg2aNYMN3VcS8t4eSQ==",
+ "license": "ISC",
+ "dependencies": {
+ "unfetch": "^3.1.1"
+ }
+ },
+ "node_modules/@segment/analytics.js-video-plugins/node_modules/unfetch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-3.1.2.tgz",
+ "integrity": "sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==",
+ "license": "MIT"
+ },
+ "node_modules/@segment/facade": {
+ "version": "3.4.10",
+ "resolved": "https://registry.npmjs.org/@segment/facade/-/facade-3.4.10.tgz",
+ "integrity": "sha512-xVQBbB/lNvk/u8+ey0kC/+g8pT3l0gCT8O2y9Z+StMMn3KAFAQ9w8xfgef67tJybktOKKU7pQGRPolRM1i1pdA==",
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "@segment/isodate-traverse": "^1.1.1",
+ "inherits": "^2.0.4",
+ "new-date": "^1.0.3",
+ "obj-case": "0.2.1"
+ }
+ },
+ "node_modules/@segment/isodate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@segment/isodate/-/isodate-1.0.3.tgz",
+ "integrity": "sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A==",
+ "license": "SEE LICENSE IN LICENSE"
+ },
+ "node_modules/@segment/isodate-traverse": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@segment/isodate-traverse/-/isodate-traverse-1.1.1.tgz",
+ "integrity": "sha512-+G6e1SgAUkcq0EDMi+SRLfT48TNlLPF3QnSgFGVs0V9F3o3fq/woQ2rHFlW20W0yy5NnCUH0QGU3Am2rZy/E3w==",
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "@segment/isodate": "^1.0.3"
+ }
+ },
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+ "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.13.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz",
+ "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/node-fetch": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz",
+ "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/@types/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/strip-json-comments": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
+ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@virtuals-protocol/acp-node": {
+ "version": "0.1.0-beta.18",
+ "resolved": "https://registry.npmjs.org/@virtuals-protocol/acp-node/-/acp-node-0.1.0-beta.18.tgz",
+ "integrity": "sha512-MIbMuQSw5DarVopW+pT9TRCgpzPU9Myz22SgYPK72+94Rcrx+O8eZqsLsUmzaz/boIXivrxEZ5G7DQUOhUgmDQ==",
+ "license": "ISC",
+ "dependencies": {
+ "@aa-sdk/core": "^4.30.0",
+ "@account-kit/infra": "^4.30.0",
+ "@account-kit/smart-contracts": "^4.30.0",
+ "ajv": "^8.17.1",
+ "socket.io-client": "^4.8.1",
+ "tsup": "^8.5.0",
+ "viem": "^2.28.2"
+ }
+ },
+ "node_modules/@virtuals-protocol/game": {
+ "version": "0.1.14",
+ "resolved": "https://registry.npmjs.org/@virtuals-protocol/game/-/game-0.1.14.tgz",
+ "integrity": "sha512-Y6QPVEcUFrk6aYijmV4pBsWhb4Xag0cAnQ+7fcz0qBIO1UNqZdFpVA0ezfEnjNcZuM5ypqc9dGPHbkNJ7qhhVA==",
+ "license": "MIT",
+ "dependencies": {
+ "axios": "^1.7.9",
+ "dotenv": "^16.4.7"
+ }
+ },
+ "node_modules/@virtuals-protocol/game-acp-plugin": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/@virtuals-protocol/game-acp-plugin/-/game-acp-plugin-0.2.7.tgz",
+ "integrity": "sha512-Je+7KYstLdnLJmIFA0Hk6eSWQZNJn13t8lgNTYH1+ADn8ECufvJIKsp1b3s4tY+bN/rDfs39nz6DWwB+3p5hFg==",
+ "license": "ISC",
+ "dependencies": {
+ "@aa-sdk/core": "^4.21.0",
+ "@account-kit/infra": "^4.21.0",
+ "@account-kit/smart-contracts": "^4.21.0",
+ "@types/node-fetch": "^2.6.12",
+ "@virtuals-protocol/acp-node": "^0.1.0-beta.17",
+ "@virtuals-protocol/game": "^0.1.14",
+ "@virtuals-protocol/game-twitter-node": "^0.1.4",
+ "socket.io-client": "^4.8.1",
+ "tsup": "^8.4.0",
+ "viem": "^2.23.10"
+ }
+ },
+ "node_modules/@virtuals-protocol/game-twitter-node": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@virtuals-protocol/game-twitter-node/-/game-twitter-node-0.1.4.tgz",
+ "integrity": "sha512-XmyIne62fch/9N1TEbpNMvpQ55EEsW7rDmQZx1KYlEApL2JkGRUqIEx0dYiFq866vUfFoirgpAMXLmNIkaJtPw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "commander": "^13.1.0",
+ "open": "^8.4.2"
+ },
+ "bin": {
+ "game-twitter-node": "dist/esm/bin.js"
+ }
+ },
+ "node_modules/@virtuals-protocol/game-twitter-node/node_modules/commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/abitype": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz",
+ "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/wevm"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.4",
+ "zod": "^3 >=3.22.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/aes-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
+ "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/alchemy-sdk": {
+ "version": "3.5.6",
+ "resolved": "https://registry.npmjs.org/alchemy-sdk/-/alchemy-sdk-3.5.6.tgz",
+ "integrity": "sha512-XrrkidbSjeaVp2z5xfW8tVxfTdbdjntpgKAjxnlYZ8N7yudnfNeK9ytHOw4PKtn/dMpwDw/DsgBU92LsuqDwug==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.7.0",
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/contracts": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/networks": "^5.7.0",
+ "@ethersproject/providers": "^5.7.0",
+ "@ethersproject/units": "^5.7.0",
+ "@ethersproject/wallet": "^5.7.0",
+ "@ethersproject/web": "^5.7.0",
+ "axios": "^1.7.4",
+ "sturdy-websocket": "^0.2.1",
+ "websocket": "^1.0.34"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz",
+ "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/bech32": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
+ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bufferutil": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz",
+ "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=6.14.2"
+ }
+ },
+ "node_modules/bundle-require": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
+ "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
+ "license": "MIT",
+ "dependencies": {
+ "load-tsconfig": "^0.2.3"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.18"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "license": "MIT"
+ },
+ "node_modules/consola": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz",
+ "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/d": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "es5-ext": "^0.10.64",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.7",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dset": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz",
+ "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/dynamic-dedupe": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz",
+ "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/elliptic": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
+ "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz",
+ "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/engine.io-client": {
+ "version": "6.6.3",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz",
+ "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1",
+ "xmlhttprequest-ssl": "~2.1.1"
+ }
+ },
+ "node_modules/engine.io-client/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/engine.io-client/node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es5-ext": {
+ "version": "0.10.64",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+ "hasInstallScript": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "esniff": "^2.0.1",
+ "next-tick": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/es6-symbol": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "d": "^1.0.2",
+ "ext": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
+ "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.1",
+ "@esbuild/android-arm": "0.25.1",
+ "@esbuild/android-arm64": "0.25.1",
+ "@esbuild/android-x64": "0.25.1",
+ "@esbuild/darwin-arm64": "0.25.1",
+ "@esbuild/darwin-x64": "0.25.1",
+ "@esbuild/freebsd-arm64": "0.25.1",
+ "@esbuild/freebsd-x64": "0.25.1",
+ "@esbuild/linux-arm": "0.25.1",
+ "@esbuild/linux-arm64": "0.25.1",
+ "@esbuild/linux-ia32": "0.25.1",
+ "@esbuild/linux-loong64": "0.25.1",
+ "@esbuild/linux-mips64el": "0.25.1",
+ "@esbuild/linux-ppc64": "0.25.1",
+ "@esbuild/linux-riscv64": "0.25.1",
+ "@esbuild/linux-s390x": "0.25.1",
+ "@esbuild/linux-x64": "0.25.1",
+ "@esbuild/netbsd-arm64": "0.25.1",
+ "@esbuild/netbsd-x64": "0.25.1",
+ "@esbuild/openbsd-arm64": "0.25.1",
+ "@esbuild/openbsd-x64": "0.25.1",
+ "@esbuild/sunos-x64": "0.25.1",
+ "@esbuild/win32-arm64": "0.25.1",
+ "@esbuild/win32-ia32": "0.25.1",
+ "@esbuild/win32-x64": "0.25.1"
+ }
+ },
+ "node_modules/esniff": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.62",
+ "event-emitter": "^0.3.5",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "license": "MIT"
+ },
+ "node_modules/ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "type": "^2.7.2"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fdir": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
+ "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fix-dts-default-cjs-exports": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz",
+ "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==",
+ "license": "MIT",
+ "dependencies": {
+ "magic-string": "^0.30.17",
+ "mlly": "^1.7.4",
+ "rollup": "^4.34.8"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/isows": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz",
+ "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wevm"
+ }
+ ],
+ "license": "MIT",
+ "peerDependencies": {
+ "ws": "*"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/joycon": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+ "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-cookie": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz",
+ "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/load-tsconfig": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
+ "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
+ "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "pathe": "^2.0.1",
+ "pkg-types": "^1.3.0",
+ "ufo": "^1.5.4"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/new-date": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/new-date/-/new-date-1.0.3.tgz",
+ "integrity": "sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA==",
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "@segment/isodate": "1.0.3"
+ }
+ },
+ "node_modules/next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch/node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
+ },
+ "node_modules/node-fetch/node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/node-fetch/node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
+ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/obj-case": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/obj-case/-/obj-case-0.2.1.tgz",
+ "integrity": "sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg==",
+ "license": "MIT"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ox": {
+ "version": "0.6.9",
+ "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz",
+ "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wevm"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@adraffy/ens-normalize": "^1.10.1",
+ "@noble/curves": "^1.6.0",
+ "@noble/hashes": "^1.5.0",
+ "@scure/bip32": "^1.5.0",
+ "@scure/bip39": "^1.4.0",
+ "abitype": "^1.0.6",
+ "eventemitter3": "5.0.1"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "jiti": ">=1.21.0",
+ "postcss": ">=8.0.9",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/rimraf/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz",
+ "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.35.0",
+ "@rollup/rollup-android-arm64": "4.35.0",
+ "@rollup/rollup-darwin-arm64": "4.35.0",
+ "@rollup/rollup-darwin-x64": "4.35.0",
+ "@rollup/rollup-freebsd-arm64": "4.35.0",
+ "@rollup/rollup-freebsd-x64": "4.35.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.35.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.35.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.35.0",
+ "@rollup/rollup-linux-arm64-musl": "4.35.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.35.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.35.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.35.0",
+ "@rollup/rollup-linux-x64-gnu": "4.35.0",
+ "@rollup/rollup-linux-x64-musl": "4.35.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.35.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.35.0",
+ "@rollup/rollup-win32-x64-msvc": "4.35.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/socket.io-client": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
+ "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.2",
+ "engine.io-client": "~6.6.1",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-client/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-parser/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sturdy-websocket": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/sturdy-websocket/-/sturdy-websocket-0.2.1.tgz",
+ "integrity": "sha512-NnzSOEKyv4I83qbuKw9ROtJrrT6Z/Xt7I0HiP/e6H6GnpeTDvzwGIGeJ8slai+VwODSHQDooW2CAilJwT9SpRg==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
+ "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.4.3",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node-dev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz",
+ "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^3.5.1",
+ "dynamic-dedupe": "^0.3.0",
+ "minimist": "^1.2.6",
+ "mkdirp": "^1.0.4",
+ "resolve": "^1.0.0",
+ "rimraf": "^2.6.1",
+ "source-map-support": "^0.5.12",
+ "tree-kill": "^1.2.2",
+ "ts-node": "^10.4.0",
+ "tsconfig": "^7.0.0"
+ },
+ "bin": {
+ "ts-node-dev": "lib/bin.js",
+ "tsnd": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "*",
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node-dev/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/ts-node-dev/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/ts-node-dev/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/tsconfig": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
+ "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/strip-bom": "^3.0.0",
+ "@types/strip-json-comments": "0.0.30",
+ "strip-bom": "^3.0.0",
+ "strip-json-comments": "^2.0.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/tsup": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz",
+ "integrity": "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bundle-require": "^5.1.0",
+ "cac": "^6.7.14",
+ "chokidar": "^4.0.3",
+ "consola": "^3.4.0",
+ "debug": "^4.4.0",
+ "esbuild": "^0.25.0",
+ "fix-dts-default-cjs-exports": "^1.0.0",
+ "joycon": "^3.1.1",
+ "picocolors": "^1.1.1",
+ "postcss-load-config": "^6.0.1",
+ "resolve-from": "^5.0.0",
+ "rollup": "^4.34.8",
+ "source-map": "0.8.0-beta.0",
+ "sucrase": "^3.35.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.11",
+ "tree-kill": "^1.2.2"
+ },
+ "bin": {
+ "tsup": "dist/cli-default.js",
+ "tsup-node": "dist/cli-node.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@microsoft/api-extractor": "^7.36.0",
+ "@swc/core": "^1",
+ "postcss": "^8.4.12",
+ "typescript": ">=4.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@microsoft/api-extractor": {
+ "optional": true
+ },
+ "@swc/core": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/type": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz",
+ "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.8.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
+ "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
+ "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "license": "MIT"
+ },
+ "node_modules/unfetch": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
+ "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==",
+ "license": "MIT"
+ },
+ "node_modules/utf-8-validate": {
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
+ "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=6.14.2"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
+ "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/viem": {
+ "version": "2.29.2",
+ "resolved": "https://registry.npmjs.org/viem/-/viem-2.29.2.tgz",
+ "integrity": "sha512-cukRxab90jvQ+TDD84sU3qB3UmejYqgCw4cX8SfWzvh7JPfZXI3kAMUaT5OSR2As1Mgvx1EJawccwPjGqkSSwA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wevm"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@noble/curves": "1.8.2",
+ "@noble/hashes": "1.7.2",
+ "@scure/bip32": "1.6.2",
+ "@scure/bip39": "1.5.4",
+ "abitype": "1.0.8",
+ "isows": "1.0.6",
+ "ox": "0.6.9",
+ "ws": "8.18.1"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/viem/node_modules/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/websocket": {
+ "version": "1.0.35",
+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz",
+ "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.63",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.2",
+ "yaeti": "^0.0.6"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/websocket/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/websocket/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xmlhttprequest-ssl": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+ "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yaeti": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
+ "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.32"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.24.2",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz",
+ "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/plugins/acpPlugin/package.json b/plugins/acpPlugin/package.json
new file mode 100644
index 00000000..42075ebe
--- /dev/null
+++ b/plugins/acpPlugin/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@virtuals-protocol/game-acp-plugin",
+ "version": "0.2.7",
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "tsup": "tsup src/index.ts --dts --format cjs,esm --out-dir dist"
+ },
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "devDependencies": {
+ "ts-node-dev": "^2.0.0",
+ "typescript": "^5.8.2"
+ },
+ "dependencies": {
+ "@aa-sdk/core": "^4.21.0",
+ "@account-kit/infra": "^4.21.0",
+ "@account-kit/smart-contracts": "^4.21.0",
+ "@types/node-fetch": "^2.6.12",
+ "@virtuals-protocol/acp-node": "^0.1.0-beta.18",
+ "@virtuals-protocol/game": "^0.1.14",
+ "@virtuals-protocol/game-twitter-node": "^0.1.4",
+ "socket.io-client": "^4.8.1",
+ "tsup": "^8.4.0",
+ "viem": "^2.23.10"
+ }
+}
diff --git a/plugins/acpPlugin/src/acpPlugin.ts b/plugins/acpPlugin/src/acpPlugin.ts
new file mode 100644
index 00000000..35f79cd8
--- /dev/null
+++ b/plugins/acpPlugin/src/acpPlugin.ts
@@ -0,0 +1,883 @@
+import AcpClient, { AcpJob, AcpGraduationStatus, AcpOnlineStatus, AcpMemo, IDeliverable } from "@virtuals-protocol/acp-node";
+import {
+ ExecutableGameFunctionResponse,
+ ExecutableGameFunctionStatus,
+ GameFunction,
+ GameWorker,
+} from "@virtuals-protocol/game";
+import {
+ AcpJobPhasesDesc,
+ AcpState,
+ IInventory,
+ ITweet,
+ ACP_JOB_PHASE_MAP,
+} from "./interface";
+import { TwitterApi } from "@virtuals-protocol/game-twitter-node";
+import { Address } from "viem";
+
+interface IAcpPluginOptions {
+ apiKey: string;
+ acpClient: AcpClient;
+ twitterClient?: TwitterApi;
+ cluster?: string;
+ evaluatorCluster?: string;
+ agentRepoUrl?: string;
+ graduationStatus?: AcpGraduationStatus;
+ onlineStatus?: AcpOnlineStatus;
+ jobExpiryDurationMins?: number;
+ // NEW OPTIONS:
+ keepCompletedJobs?: number;
+ keepCancelledJobs?: number;
+ keepProducedInventory?: number;
+}
+
+class AcpPlugin {
+ private id: string;
+ private name: string;
+ private description: string;
+ private acpClient: AcpClient;
+ private producedInventory: IInventory[] = [];
+ private cluster?: string;
+ private evaluatorCluster?: string;
+ private graduationStatus?: AcpGraduationStatus;
+ private onlineStatus?: AcpOnlineStatus;
+ private twitterClient?: TwitterApi;
+ private jobExpiryDurationMins: number;
+ // NEW PROPERTIES:
+ private keepCompletedJobs: number;
+ private keepCancelledJobs: number;
+ private keepProducedInventory: number;
+
+ constructor(options: IAcpPluginOptions) {
+ this.acpClient = options.acpClient;
+ this.cluster = options.cluster;
+ this.twitterClient = options.twitterClient;
+ this.evaluatorCluster = options.evaluatorCluster;
+ this.graduationStatus = options.graduationStatus;
+ this.onlineStatus = options.onlineStatus;
+ this.jobExpiryDurationMins = options.jobExpiryDurationMins || 1440;
+ this.keepCompletedJobs = options.keepCompletedJobs ?? 1;
+ this.keepCancelledJobs = options.keepCancelledJobs ?? 0;
+ this.keepProducedInventory = options.keepProducedInventory ?? 1;
+
+ this.id = "acp_worker";
+ this.name = "ACP Worker";
+ this.description = `
+ Handles trading transactions and jobs between agents. This worker ONLY manages:
+
+ 1. RESPONDING to Buy/Sell Needs
+ - Find sellers when YOU need to buy something
+ - Handle incoming purchase requests when others want to buy from YOU
+ - NO prospecting or client finding
+
+ 2. Job Management
+ - Process purchase requests. Accept or reject job.
+ - Send payments
+ - Manage and deliver services and goods
+
+ 3. Twitter Integration (tweet history are provided in the environment/state)
+ - Post tweets about jobs
+ - Reply to tweets about jobs
+
+
+ NOTE: This is NOT for finding clients - only for executing trades when there's a specific need to buy or sell something.
+ `;
+ }
+
+ public addProduceItem(item: IInventory) {
+ this.producedInventory.push(item);
+ return item;
+ }
+
+
+
+ public async getAcpState(): Promise {
+ const agentAddr = this.acpClient.acpContractClient.walletAddress.toLowerCase();
+
+ // Helper function to serialize jobs with conditional memo/tweet inclusion
+ const serializeJob = async (job: AcpJob, active: boolean) => {
+ const baseJob = {
+ jobId: job.id,
+ clientName: (await job.clientAgent)?.name || "",
+ providerName: (await job.providerAgent)?.name || "",
+ desc: job.serviceRequirement || "",
+ price: job.price.toString(),
+ providerAddress: job.providerAddress,
+ phase: ACP_JOB_PHASE_MAP[job.phase],
+ };
+
+ // Include memos only if active
+ const memo = active && job.memos ? job.memos.reverse().map((memo: AcpMemo) => ({
+ id: memo.id,
+ type: memo.type?.toString(),
+ content: memo.content,
+ next_phase: memo.nextPhase?.toString(),
+ })) : [];
+
+ // Include tweetHistory only if active
+ const tweetHistory = active && job.context ? (job.context.tweets?.reverse() || []).map(
+ (tweet: ITweet) => ({
+ type: tweet.type,
+ tweetId: tweet.tweetId,
+ content: tweet.content,
+ createdAt: tweet.createdAt,
+ })
+ ) : [];
+
+ return {
+ ...baseJob,
+ memo,
+ tweetHistory,
+ };
+ };
+
+ // Fetch active jobs
+ const activeJobs = await this.acpClient.getActiveJobs();
+
+ // Fetch completed jobs if not explicitly disabled
+ let completedJobs: AcpJob[] = [];
+ if (this.keepCompletedJobs > 0) {
+ completedJobs = await this.acpClient.getCompletedJobs();
+ }
+
+ // Fetch cancelled jobs if not explicitly disabled
+ let cancelledJobs: AcpJob[] = [];
+ if (this.keepCancelledJobs > 0) {
+ cancelledJobs = await this.acpClient.getCancelledJobs();
+ }
+
+ // Process active jobs
+ const activeAsABuyer = await Promise.all(
+ activeJobs
+ .filter(job => job.clientAddress.toLowerCase() === agentAddr)
+ .map(job => serializeJob(job, true))
+ );
+
+ const activeAsASeller = await Promise.all(
+ activeJobs
+ .filter(job => job.providerAddress.toLowerCase() === agentAddr)
+ .map(job => serializeJob(job, true))
+ );
+
+ // Limit and process completed jobs
+ const completed = await Promise.all(
+ completedJobs
+ .slice(0, this.keepCompletedJobs)
+ .map(job => serializeJob(job, false))
+ );
+
+ // Limit and process cancelled jobs
+ const cancelled = await Promise.all(
+ cancelledJobs
+ .slice(0, this.keepCancelledJobs)
+ .map(job => serializeJob(job, false))
+ );
+
+ // Produced inventory logic
+ let produced: IInventory[] = [];
+ if (this.producedInventory.length > 0 && this.keepProducedInventory > 0) {
+ produced = this.producedInventory.slice(0, this.keepProducedInventory);
+ }
+
+ const state: AcpState = {
+ inventory: {
+ acquired: [],
+ produced: produced,
+ },
+ jobs: {
+ active: {
+ asABuyer: activeAsABuyer,
+ asASeller: activeAsASeller,
+ },
+ completed: completed,
+ cancelled: cancelled,
+ },
+ };
+
+ return state;
+ }
+
+ public getWorker(data?: {
+ functions?: GameFunction[];
+ getEnvironment?: () => Promise>;
+ }): GameWorker {
+ return new GameWorker({
+ id: this.id,
+ name: this.name,
+ description: this.description,
+ functions: data?.functions || [
+ this.searchAgentsFunctions,
+ this.initiateJob,
+ this.respondJob,
+ this.payJob,
+ this.deliverJob,
+ ],
+ getEnvironment: async () => {
+ const environment = data?.getEnvironment
+ ? await data.getEnvironment()
+ : {};
+ return {
+ ...environment,
+ ...(await this.getAcpState()),
+ };
+ },
+ });
+ }
+
+ get agentDescription() {
+ return `
+ Inventory structure
+ - inventory.acquired: Deliverable that your have bought and can be use to achived your objective
+ - inventory.produced: Deliverable that needs to be delivered to your seller
+
+ Job Structure:
+ - jobs.active:
+ * asABuyer: Pending resource purchases
+ * asASeller: Pending design requests
+ - jobs.completed: Successfully fulfilled projects
+ - jobs.cancelled: Terminated or rejected requests
+ - Each job tracks:
+ * phase: request (seller should response to accept/reject to the job) → pending_payment (as a buyer to make the payment for the service) → in_progress (seller to deliver the service) → evaluation → completed/rejected
+ `;
+ }
+
+ get searchAgentsFunctions() {
+ return new GameFunction({
+ name: "search_agents",
+ description:
+ "Get a list of all available trading agents and what they're selling. Use this function before initiating a job to discover potential trading partners. Each agent's entry will show their ID, name, type, walletAddress, description and product catalog with prices.",
+ args: [
+ {
+ name: "reasoning",
+ type: "string",
+ description:
+ "Explain why you need to find trading partners at this time",
+ },
+ {
+ name: "keyword",
+ type: "string",
+ description:
+ "Search for agents by name or description. Use this to find specific trading partners or products.",
+ },
+ ] as const,
+ executable: async (args, _) => {
+ if (!args.reasoning) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Reasoning for the search must be provided. This helps track your decision-making process for future reference."
+ );
+ }
+
+ if (!args.keyword) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Keyword for the search must be provided. This helps track your decision-making process for future reference."
+ );
+ }
+
+ try {
+ console.log("Searching for agents in cluster:", this.cluster);
+ const availableAgents = await this.acpClient.browseAgents(
+ args.keyword,
+ {
+ cluster: this.cluster,
+ graduationStatus: this.graduationStatus,
+ onlineStatus: this.onlineStatus
+ }
+ );
+
+ if (availableAgents.length === 0) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "No other trading agents found in the system. Please try again later when more agents are available."
+ );
+ }
+
+ const agents = availableAgents.map((agent) => ({
+ id: agent.id,
+ name: agent.name,
+ description: agent.description,
+ twitterHandle: agent.twitterHandle,
+ walletAddress: agent.walletAddress,
+ offerings: agent.offerings.map((offering) => ({
+ providerAddress: offering.providerAddress,
+ type: offering.type,
+ price: offering.price,
+ requirementSchema: offering.requirementSchema,
+ })),
+ }));
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ JSON.stringify({
+ availableAgents: agents,
+ totalAgentsFound: agents.length,
+ timestamp: Date.now(),
+ note: "Use the walletAddress when initiating a job with your chosen trading partner.",
+ })
+ );
+ } catch (e) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `System error while searching for agents - try again after a short delay. ${e}`
+ );
+ }
+ },
+ });
+ }
+
+ get initiateJob() {
+ return new GameFunction({
+ name: "initiate_job",
+ description:
+ "Creates a purchase request for items from another agent's catalog. Only for use when YOU are the buyer. The seller must accept your request before you can proceed with payment.\n\nHint: Use this when you need to acquire items from other agents - it's the only way to make purchases in the ecosystem. You CANNOT propose sales or initiate jobs to sell your own products.",
+ args: [
+ {
+ name: "sellerWalletAddress",
+ type: "string",
+ description: "The seller's agent wallet address you want to buy from",
+ },
+ {
+ name: "price",
+ type: "string",
+ description: "Offered price for service",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "Why you are making this purchase request",
+ },
+ {
+ name: "serviceRequirements",
+ type: "string",
+ description:
+ "Detailed specifications for service-based items, only needed if the seller's catalog specifies service requirements. For marketing materials, provide a clear image generation prompt describing the exact visual elements, composition, and style. Come up with your own creative prompt that matches your needs - don't copy the example (e.g. '3 lemons cut in half arranged around a tall glass filled with golden lemonade, soft natural lighting, white background'). Can be left empty for items that don't require specifications.",
+ },
+ {
+ name: "tweetContent",
+ type: "string",
+ description:
+ "Tweet content that will be posted about this job. Must include the seller's Twitter handle (with @ symbol) to notify them",
+ },
+ {
+ name: "requireEvaluator",
+ type: "boolean",
+ description:
+ "Decide if your job request is complex enough to spend money for evaluator agent to assess the relevancy of the output. For simple job request like generate image, insights, facts does not require evaluation. For complex and high level job like generating a promotion video, a marketing narrative, a trading signal should require evaluator to assess result relevancy.",
+ },
+ {
+ name: "evaluatorKeyword",
+ type: "string",
+ description: "Keyword to search for a evaluator.",
+ },
+ ] as const,
+ executable: async (args, _) => {
+ if (!args.price) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing price - specify how much you're offering per unit"
+ );
+ }
+ if (!args.reasoning) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing reasoning - explain why you're making this purchase"
+ );
+ }
+
+ try {
+ if (!args.sellerWalletAddress) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing seller wallet address - specify who you're buying from"
+ );
+ }
+
+ if (!args.serviceRequirements) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing service requirements - provide detailed specifications for service-based items or marketing materials"
+ );
+ }
+
+ if (!args.tweetContent) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing tweet content - provide the content of the tweet that will be posted about this job"
+ );
+ }
+
+ if (
+ args.sellerWalletAddress ===
+ this.acpClient.acpContractClient.walletAddress
+ ) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Cannot create job with yourself - choose a different seller"
+ );
+ }
+
+ const requireValidator = args.requireEvaluator?.toString() === "true";
+ if (requireValidator && !args.evaluatorKeyword) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing validator keyword - provide a keyword to search for a validator"
+ );
+ }
+
+ let evaluatorAddress: Address =
+ this.acpClient.acpContractClient.walletAddress;
+ if (requireValidator && args.evaluatorKeyword) {
+ const validators = await this.acpClient.browseAgents(
+ args.evaluatorKeyword,
+ { cluster: this.evaluatorCluster }
+ );
+
+ if (validators.length === 0) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "No evaluator found - try a different keyword"
+ );
+ }
+
+ evaluatorAddress = validators[0].walletAddress as Address;
+ }
+
+ const price = parseFloat(args.price);
+ if (isNaN(price) || price <= 0) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Invalid price - must be a positive number"
+ );
+ }
+
+ const expiredAt = new Date();
+ expiredAt.setMinutes(
+ expiredAt.getMinutes() + this.jobExpiryDurationMins
+ );
+
+ const jobId = await this.acpClient.initiateJob(
+ args.sellerWalletAddress as Address,
+ args.serviceRequirements,
+ price,
+ evaluatorAddress as Address,
+ expiredAt
+ );
+
+ if (this.twitterClient) {
+ await this.tweetJob(jobId, `${args.tweetContent} #${jobId}`);
+ }
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ JSON.stringify({
+ jobId: jobId,
+ sellerWalletAddress: args.sellerWalletAddress,
+ price: price,
+ serviceRequirements: args.serviceRequirements,
+ timestamp: Date.now(),
+ })
+ );
+ } catch (e) {
+ console.error(e);
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `System error while initiating job - try again after a short delay. ${e}`
+ );
+ }
+ },
+ });
+ }
+
+ get respondJob() {
+ return new GameFunction({
+ name: "respond_to_job",
+ description:
+ "Accepts or rejects an incoming 'request' job. Only for use when YOU are the seller. After accepting, you must wait for buyer's payment before delivery. Use if you want to cancel a request/job.\n\nHint: For all incoming jobs, you must respond (accept/reject) before being able to progress the job in any way.",
+ args: [
+ {
+ name: "jobId",
+ type: "string",
+ description: "The job ID you are responding to",
+ },
+ {
+ name: "decision",
+ type: "string",
+ description: "Your response: 'ACCEPT' or 'REJECT'",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "Why you made this decision",
+ },
+
+ {
+ name: "tweetContent",
+ type: "string",
+ description:
+ "Tweet content that will be posted about this job as a reply to the previous tweet (do not use @ symbol)",
+ },
+ ] as const,
+ executable: async (args, _) => {
+ if (!args.jobId) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing job ID - specify which job you're responding to"
+ );
+ }
+ if (!args.decision || !["ACCEPT", "REJECT"].includes(args.decision)) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Invalid decision - must be either 'ACCEPT' or 'REJECT'"
+ );
+ }
+ if (!args.reasoning) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing reasoning - explain why you made this decision"
+ );
+ }
+
+ if (!args.tweetContent) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing tweet content - provide the content of the tweet that will be posted about this job"
+ );
+ }
+
+ try {
+ const state = await this.getAcpState();
+
+ const job = state.jobs.active.asASeller.find(
+ (c) => c.jobId === +args.jobId!
+ );
+
+ if (!job) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Job not found in your seller jobs - check the ID and verify you're the seller"
+ );
+ }
+
+ if (job.phase !== AcpJobPhasesDesc.REQUEST) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `Cannot respond - job is in '${job.phase}' phase, must be in '${AcpJobPhasesDesc.REQUEST}' phase`
+ );
+ }
+
+ await this.acpClient.respondJob(
+ +args.jobId,
+ job.memo[0].id,
+ args.decision === "ACCEPT",
+ args.reasoning
+ );
+
+ if (this.twitterClient) {
+ const tweetId = job.tweetHistory?.[0]?.tweetId;
+ if (tweetId) {
+ await this.tweetJob(+args.jobId, args.tweetContent, tweetId);
+ }
+ }
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ JSON.stringify({
+ jobId: args.jobId,
+ decision: args.decision,
+ timestamp: Date.now(),
+ })
+ );
+ } catch (e) {
+ console.error(e);
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `System error while responding to job - try again after a short delay. ${e}`
+ );
+ }
+ },
+ });
+ }
+
+ get payJob() {
+ return new GameFunction({
+ name: "pay_job",
+ description:
+ "Processes payment for an accepted purchase request. Only for use when YOU are the buyer. you can only make payment when job phase is 'pending_payment'. After payment is verified, you must wait for the seller to deliver.\n\nHint: This is your next step after a seller accepts your purchase request - you can't get the items without paying first.",
+ args: [
+ {
+ name: "jobId",
+ type: "number",
+ description: "The job ID you are paying for",
+ },
+ {
+ name: "amount",
+ type: "number",
+ description: "The total amount to pay",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "Why you are making this payment",
+ },
+ {
+ name: "tweetContent",
+ type: "string",
+ description:
+ "Tweet content that will be posted about this job as a reply to the previous tweet (do not use @ symbol)",
+ },
+ ] as const,
+ executable: async (args, _) => {
+ if (!args.jobId) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing job ID - specify which job you're paying for"
+ );
+ }
+
+ if (!args.amount) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing amount - specify how much you're paying"
+ );
+ }
+
+ if (!args.reasoning) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing reasoning - explain why you're making this payment"
+ );
+ }
+
+ if (!args.tweetContent) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing tweet content - provide the content of the tweet that will be posted about this job"
+ );
+ }
+
+ try {
+ const state = await this.getAcpState();
+
+ const job = state.jobs.active.asABuyer.find(
+ (c) => c.jobId === +args.jobId!
+ );
+
+ if (!job) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Job not found in your buyer jobs - check the ID and verify you're the buyer"
+ );
+ }
+
+ if (job.phase !== AcpJobPhasesDesc.NEGOTIATION) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `Cannot pay - job is in '${job.phase}' phase, must be in '${AcpJobPhasesDesc.NEGOTIATION}' phase`
+ );
+ }
+
+ await this.acpClient.payJob(
+ +args.jobId,
+ +args.amount,
+ job.memo[0].id,
+ args.reasoning
+ );
+
+ if (this.twitterClient) {
+ const tweetId = job.tweetHistory?.[0]?.tweetId;
+ if (tweetId) {
+ await this.tweetJob(+args.jobId, args.tweetContent, tweetId);
+ }
+ }
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ `Payment successfully processed! Here are the details:\n${JSON.stringify(
+ {
+ jobId: args.jobId,
+ amountPaid: args.amount,
+ timestamp: Date.now(),
+ }
+ )}`
+ );
+ } catch (e) {
+ console.error(e);
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `System error while processing payment - try again after a short delay. ${e}`
+ );
+ }
+ },
+ });
+ }
+
+ get deliverJob() {
+ return new GameFunction({
+ name: "deliver_job",
+ description:
+ "Completes a sale by delivering items to the buyer. Only for use when YOU are the seller and payment is verified. After delivery, the job is completed and payment is released to your wallet.\n\nHint: This is how you fulfill your sales and get paid - use it as soon as you see payment is verified.",
+ args: [
+ {
+ name: "jobId",
+ type: "string",
+ description: "The job ID you are delivering for",
+ },
+ {
+ name: "reasoning",
+ type: "string",
+ description: "Why you are making this delivery",
+ },
+ {
+ name: "tweetContent",
+ type: "string",
+ description:
+ "Tweet content that will be posted about this job as a reply to the previous tweet (do not use @ symbol)",
+ },
+ ] as const,
+ executable: async (args, _) => {
+ if (!args.jobId) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing job ID - specify which job you're delivering for"
+ );
+ }
+ if (!args.reasoning) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing reasoning - explain why you're making this delivery"
+ );
+ }
+ if (!args.tweetContent) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "Missing tweet content - provide the content of the tweet that will be posted about this job"
+ );
+ }
+
+ try {
+ const state = await this.getAcpState();
+
+ const job = state.jobs.active.asASeller.find(
+ (c) => c.jobId === +args.jobId!
+ );
+
+ if (!job) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ "job not found in your seller jobs - check the ID and verify you're the seller"
+ );
+ }
+
+ if (job.phase !== AcpJobPhasesDesc.TRANSACTION) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `Cannot deliver - job is in '${job.phase}' phase, must be in '${AcpJobPhasesDesc.TRANSACTION}' phase`
+ );
+ }
+
+ const produced = this.producedInventory.find(
+ (i) => i.jobId === job.jobId
+ );
+
+ if (!produced) {
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `Cannot deliver - your should be producing the deliverable first before delivering it`
+ );
+ }
+
+ const producedDeliverable: IDeliverable = {
+ type: produced.type,
+ value: produced.value,
+ };
+
+ await this.acpClient.deliverJob(+args.jobId, producedDeliverable);
+
+ this.producedInventory = this.producedInventory.filter(
+ (item) => item.jobId !== job.jobId
+ );
+
+ if (this.twitterClient) {
+ const tweetId = job.tweetHistory?.[0]?.tweetId;
+ if (tweetId) {
+ await this.tweetJob(+args.jobId, args.tweetContent, tweetId);
+ }
+ }
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Done,
+ JSON.stringify({
+ status: "success",
+ jobId: args.jobId,
+ deliverable: producedDeliverable,
+ timestamp: Date.now(),
+ })
+ );
+ } catch (e) {
+ console.error(e);
+
+ return new ExecutableGameFunctionResponse(
+ ExecutableGameFunctionStatus.Failed,
+ `System error while delivering items - try again after a short delay. ${e}`
+ );
+ }
+ },
+ });
+ }
+
+ private async tweetJob(
+ jobId: number,
+ content: string,
+ tweetId?: string
+ ): Promise {
+ if (!this.twitterClient) return;
+
+ const job = await this.acpClient.getJobById(jobId);
+ if (!job) throw new Error("ERROR (tweetJob): Job not found");
+
+ const tweet = tweetId
+ ? await this.twitterClient.v2.reply(content, tweetId)
+ : await this.twitterClient.v2.tweet(content);
+
+ const role =
+ job.clientAddress.toLowerCase() ===
+ this.acpClient.acpContractClient.walletAddress.toLowerCase()
+ ? "buyer"
+ : "seller";
+
+ const context = {
+ ...job.context,
+ tweets: [
+ ...(job.context?.tweets || []),
+ {
+ type: role,
+ tweetId: tweet.data.id,
+ content,
+ createdAt: Date.now(),
+ },
+ ],
+ };
+
+ const response = await fetch(
+ `${this.acpClient.acpContractClient.config.acpUrl}/api/jobs/${jobId}/context`,
+ {
+ method: "PATCH",
+ headers: {
+ "Content-Type": "application/json",
+ "wallet-address": this.acpClient.acpContractClient.walletAddress,
+ },
+ body: JSON.stringify({ data: { context } }),
+ }
+ );
+
+ if (!response.ok) {
+ throw new Error(`ERROR (tweetJob): ${response.status} ${response.body}`);
+ }
+ }
+}
+
+export default AcpPlugin;
diff --git a/plugins/acpPlugin/src/index.ts b/plugins/acpPlugin/src/index.ts
new file mode 100644
index 00000000..86d76759
--- /dev/null
+++ b/plugins/acpPlugin/src/index.ts
@@ -0,0 +1,5 @@
+import AcpPlugin from "./acpPlugin";
+import { AcpJobPhasesDesc, IAcpJob, AcpState } from "./interface";
+
+export default AcpPlugin;
+export { AcpJobPhasesDesc, IAcpJob, AcpState };
diff --git a/plugins/acpPlugin/src/interface.ts b/plugins/acpPlugin/src/interface.ts
new file mode 100644
index 00000000..0c522d99
--- /dev/null
+++ b/plugins/acpPlugin/src/interface.ts
@@ -0,0 +1,65 @@
+import { AcpJobPhases, IDeliverable } from "@virtuals-protocol/acp-node";
+
+export enum AcpJobPhasesDesc {
+ REQUEST = "request",
+ NEGOTIATION = "pending_payment",
+ TRANSACTION = "in_progress",
+ EVALUATION = "evaluation",
+ COMPLETED = "completed",
+ REJECTED = "rejected",
+ EXPIRED = "expired",
+}
+
+export const ACP_JOB_PHASE_MAP: Record = {
+ [AcpJobPhases.REQUEST]: AcpJobPhasesDesc.REQUEST,
+ [AcpJobPhases.NEGOTIATION]: AcpJobPhasesDesc.NEGOTIATION,
+ [AcpJobPhases.TRANSACTION]: AcpJobPhasesDesc.TRANSACTION,
+ [AcpJobPhases.EVALUATION]: AcpJobPhasesDesc.EVALUATION,
+ [AcpJobPhases.COMPLETED]: AcpJobPhasesDesc.COMPLETED,
+ [AcpJobPhases.REJECTED]: AcpJobPhasesDesc.REJECTED,
+ [AcpJobPhases.EXPIRED]: AcpJobPhasesDesc.EXPIRED,
+};
+
+export interface AcpRequestMemo {
+ id: number;
+}
+
+export interface ITweet {
+ type: "buyer" | "seller";
+ tweetId: string;
+ content: string;
+ createdAt: number;
+}
+
+export interface IAcpJob {
+ jobId: number;
+ clientName?: string;
+ providerName?: string;
+ desc: string;
+ price: string;
+ providerAddress?: string;
+ phase: AcpJobPhasesDesc;
+ memo: AcpRequestMemo[];
+ tweetHistory?: ITweet[];
+}
+
+export interface IInventory extends IDeliverable {
+ jobId: number;
+ clientName?: string;
+ providerName?: string;
+}
+
+export interface AcpState {
+ inventory: {
+ acquired: IInventory[];
+ produced: IInventory[];
+ };
+ jobs: {
+ active: {
+ asABuyer: IAcpJob[];
+ asASeller: IAcpJob[];
+ };
+ completed: IAcpJob[];
+ cancelled: IAcpJob[];
+ };
+}
diff --git a/plugins/acpPlugin/tools/reduceAgentState.ts b/plugins/acpPlugin/tools/reduceAgentState.ts
new file mode 100644
index 00000000..574d98ac
--- /dev/null
+++ b/plugins/acpPlugin/tools/reduceAgentState.ts
@@ -0,0 +1,181 @@
+import { AcpState } from "../src/interface";
+import AcpPlugin from "@virtuals-protocol/game-acp-plugin";
+import AcpClient, {
+ AcpContractClient,
+ baseAcpConfig
+} from "@virtuals-protocol/acp-node";
+import {
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ GAME_API_KEY
+} from "./env";
+
+/**
+ * Delete old items from a list keeping only the most recent ones.
+ */
+function deleteOldItems(
+ items: T[],
+ keep: number,
+ label: string
+): T[] {
+ if (items.length <= keep) return items;
+
+ const sorted = [...items].sort((a, b) => b.jobId - a.jobId);
+ const deletedCount = items.length - keep;
+ console.log(`Deleted ${deletedCount} ${label}, keeping ${keep} most recent`);
+ return sorted.slice(0, keep);
+}
+
+/**
+ * Filter out jobs by jobId from active job arrays.
+ */
+export function filterOutJobIds(state: AcpState, jobIdsToIgnore: number[]): AcpState {
+ if (!jobIdsToIgnore.length) return state;
+
+ const filteredState = { ...state, jobs: { ...state.jobs } };
+
+ if (filteredState.jobs.active) {
+ const { asABuyer = [], asASeller = [] } = filteredState.jobs.active;
+
+ filteredState.jobs.active = {
+ asABuyer: asABuyer.filter(job => !jobIdsToIgnore.includes(job.jobId)),
+ asASeller: asASeller.filter(job => !jobIdsToIgnore.includes(job.jobId))
+ };
+ }
+
+ return filteredState;
+}
+
+/**
+ * Filter out jobs from given agent addresses in the active job arrays.
+ */
+export function filterOutJobsByAgentAddress(state: AcpState, addressesToIgnore: string[]): AcpState {
+ if (!addressesToIgnore.length) return state;
+
+ const activeJobs = state.jobs?.active;
+ if (!activeJobs) return state;
+
+ const allJobs = [...(activeJobs.asABuyer ?? []), ...(activeJobs.asASeller ?? [])];
+ const jobIdsToIgnore = allJobs
+ .filter(job => addressesToIgnore.includes(job.providerAddress ?? ""))
+ .map(job => job.jobId);
+
+ if (jobIdsToIgnore.length) {
+ console.log(
+ `Removing ${jobIdsToIgnore.length} active jobs from ignored agents: ${jobIdsToIgnore.join(", ")}`
+ );
+ }
+
+ return filterOutJobIds(state, jobIdsToIgnore);
+}
+
+/**
+ * Generic cleanup helpers
+ */
+export function deleteCompletedJobs(state: AcpState, keep: number = 5): AcpState {
+ const s = structuredClone(state);
+ s.jobs.completed = deleteOldItems(s.jobs.completed ?? [], keep, "completed jobs");
+ return s;
+}
+
+export function deleteCancelledJobs(state: AcpState, keep: number = 5): AcpState {
+ const s = structuredClone(state);
+ s.jobs.cancelled = deleteOldItems(s.jobs.cancelled ?? [], keep, "cancelled jobs");
+ return s;
+}
+
+export function deleteOldJobs(state: AcpState, keepCompleted = 5, keepCancelled = 5): AcpState {
+ return deleteCancelledJobs(deleteCompletedJobs(state, keepCompleted), keepCancelled);
+}
+
+export function deleteAcquiredInventory(state: AcpState, keep = 5): AcpState {
+ const s = structuredClone(state);
+ s.inventory.acquired = deleteOldItems(s.inventory.acquired ?? [], keep, "acquired inventory");
+ return s;
+}
+
+export function deleteProducedInventory(state: AcpState, keep = 5): AcpState {
+ const s = structuredClone(state);
+ s.inventory.produced = deleteOldItems(s.inventory.produced ?? [], keep, "produced inventory");
+ return s;
+}
+
+export function deleteOldInventory(state: AcpState, keepAcquired = 5, keepProduced = 5): AcpState {
+ return deleteProducedInventory(deleteAcquiredInventory(state, keepAcquired), keepProduced);
+}
+
+/**
+ * Master cleanup function
+ */
+export function reduceAgentState(
+ state: AcpState,
+ options: {
+ keepCompletedJobs?: number;
+ keepCancelledJobs?: number;
+ keepAcquiredInventory?: number;
+ keepProducedInventory?: number;
+ jobIdsToIgnore?: number[];
+ agentAddressesToIgnore?: string[];
+ } = {}
+): AcpState {
+ const {
+ keepCompletedJobs = 5,
+ keepCancelledJobs = 5,
+ keepAcquiredInventory = 5,
+ keepProducedInventory = 5,
+ jobIdsToIgnore = [],
+ agentAddressesToIgnore = []
+ } = options;
+
+ let newState = structuredClone(state);
+
+ if (jobIdsToIgnore.length > 0) {
+ newState = filterOutJobIds(newState, jobIdsToIgnore);
+ }
+
+ if (agentAddressesToIgnore.length > 0) {
+ newState = filterOutJobsByAgentAddress(newState, agentAddressesToIgnore);
+ }
+
+ newState = deleteOldJobs(newState, keepCompletedJobs, keepCancelledJobs);
+ newState = deleteOldInventory(newState, keepAcquiredInventory, keepProducedInventory);
+
+ return newState;
+}
+
+/**
+ * Test Case
+ */
+
+async function runTest() {
+ const acpPlugin = new AcpPlugin({
+ apiKey: GAME_API_KEY,
+ acpClient: new AcpClient({
+ acpContractClient: await AcpContractClient.build(
+ WHITELISTED_WALLET_PRIVATE_KEY,
+ BUYER_ENTITY_ID,
+ BUYER_AGENT_WALLET_ADDRESS,
+ baseAcpConfig
+ ),
+ }),
+ });
+
+ const state = await acpPlugin.getAcpState();
+ console.log("\nOriginal Agent State:");
+ console.dir(state, { depth: null, colors: true });
+
+ const cleaned = reduceAgentState(state, {
+ keepCompletedJobs: 1,
+ keepCancelledJobs: 1,
+ keepAcquiredInventory: 1,
+ keepProducedInventory: 1,
+ jobIdsToIgnore: [6294, 6293, 6269],
+ agentAddressesToIgnore: ["0x408AE36F884Ef37aAFBA7C55aE1c9BB9c2753995"],
+ });
+
+ console.log("\n🧹 Reduced Agent State:");
+ console.dir(cleaned, { depth: null, colors: true });
+}
+
+runTest()
\ No newline at end of file
diff --git a/plugins/acpPlugin/tsconfig.json b/plugins/acpPlugin/tsconfig.json
new file mode 100644
index 00000000..904d43ff
--- /dev/null
+++ b/plugins/acpPlugin/tsconfig.json
@@ -0,0 +1,113 @@
+{
+ "compilerOptions": {
+ /* Visit https://aka.ms/tsconfig to read more about this file */
+
+ /* Projects */
+ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
+ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
+ // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
+ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
+ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
+ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
+
+ /* Language and Environment */
+ "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
+ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
+ // "jsx": "preserve", /* Specify what JSX code is generated. */
+ // "libReplacement": true, /* Enable lib replacement. */
+ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
+ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
+ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
+ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
+ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
+ // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
+ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
+ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
+ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
+
+ /* Modules */
+ "module": "commonjs", /* Specify what module code is generated. */
+ // "rootDir": "./", /* Specify the root folder within your source files. */
+ // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
+ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
+ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
+ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
+ // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
+ // "types": [], /* Specify type package names to be included without being referenced in a source file. */
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
+ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
+ // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
+ // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */
+ // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
+ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
+ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
+ // "noUncheckedSideEffectImports": true, /* Check side effect imports. */
+ // "resolveJsonModule": true, /* Enable importing .json files. */
+ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
+ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */
+
+ /* JavaScript Support */
+ // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
+ // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
+ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
+
+ /* Emit */
+ // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
+ // "declarationMap": true, /* Create sourcemaps for d.ts files. */
+ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
+ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
+ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
+ // "noEmit": true, /* Disable emitting files from a compilation. */
+ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
+ // "outDir": "./", /* Specify an output folder for all emitted files. */
+ // "removeComments": true, /* Disable emitting comments. */
+ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
+ // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
+ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
+ // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
+ // "newLine": "crlf", /* Set the newline character for emitting files. */
+ // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
+ // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
+ // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
+ // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
+ // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
+
+ /* Interop Constraints */
+ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
+ // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
+ // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
+ // "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */
+ // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
+ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
+ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
+ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
+
+ /* Type Checking */
+ "strict": true, /* Enable all strict type-checking options. */
+ // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
+ // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
+ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
+ // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
+ // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
+ // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
+ // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
+ // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
+ // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
+ // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
+ // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
+ // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
+ // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
+ // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
+ // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
+ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
+ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
+ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
+ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
+
+ /* Completeness */
+ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
+ "skipLibCheck": true /* Skip type checking all .d.ts files. */
+ }
+}