From 3db07240994c8987642e3a7af8d3e2d6a97bbdf1 Mon Sep 17 00:00:00 2001
From: cygaar <tmpftl1@gmail.com>
Date: Wed, 4 Dec 2024 19:51:08 -0500
Subject: [PATCH] fix: plugins docs

---
 docs/docs/packages/plugins.md | 596 ++++++++++++----------------------
 1 file changed, 210 insertions(+), 386 deletions(-)

diff --git a/docs/docs/packages/plugins.md b/docs/docs/packages/plugins.md
index dc9215c277b..78326cc35bc 100644
--- a/docs/docs/packages/plugins.md
+++ b/docs/docs/packages/plugins.md
@@ -12,92 +12,15 @@ Each plugin in Eliza must implement the `Plugin` interface with the following pr
 
 ```typescript
 interface Plugin {
-  name: string; // Unique identifier for the plugin
-  description: string; // Brief description of plugin functionality
-  actions?: Action[]; // Custom actions provided by the plugin
-  evaluators?: Evaluator[]; // Custom evaluators for behavior assessment
-  providers?: Provider[]; // Context providers for message generation
-  services?: Service[]; // Additional services (optional)
+    name: string; // Unique identifier for the plugin
+    description: string; // Brief description of plugin functionality
+    actions?: Action[]; // Custom actions provided by the plugin
+    evaluators?: Evaluator[]; // Custom evaluators for behavior assessment
+    providers?: Provider[]; // Context providers for message generation
+    services?: Service[]; // Additional services (optional)
 }
 ```
 
-### Available Plugins
-
-#### 1. Bootstrap Plugin (`@eliza/plugin-bootstrap`)
-
-The bootstrap plugin provides essential baseline functionality:
-
-**Actions:**
-
-- `continue` - Continue the current conversation flow
-- `followRoom` - Follow a room for updates
-- `unfollowRoom` - Unfollow a room
-- `ignore` - Ignore specific messages
-- `muteRoom` - Mute notifications from a room
-- `unmuteRoom` - Unmute notifications from a room
-
-**Evaluators:**
-
-- `fact` - Evaluate factual accuracy
-- `goal` - Assess goal completion
-
-**Providers:**
-
-- `boredom` - Manages engagement levels
-- `time` - Provides temporal context
-- `facts` - Supplies factual information
-
-#### 2. Image Generation Plugin (`@eliza/plugin-image-generation`)
-
-Enables AI image generation capabilities:
-
-**Actions:**
-
-- `GENERATE_IMAGE` - Create images based on text descriptions
-- Supports multiple image generation services (Anthropic, Together)
-- Auto-generates captions for created images
-
-#### 3. Node Plugin (`@eliza/plugin-node`)
-
-Provides core Node.js-based services:
-
-**Services:**
-
-- `BrowserService` - Web browsing capabilities
-- `ImageDescriptionService` - Image analysis
-- `LlamaService` - LLM integration
-- `PdfService` - PDF processing
-- `SpeechService` - Text-to-speech
-- `TranscriptionService` - Speech-to-text
-- `VideoService` - Video processing
-
-#### 4. Solana Plugin (`@eliza/plugin-solana`)
-
-Integrates Solana blockchain functionality:
-
-**Evaluators:**
-
-- `trustEvaluator` - Assess transaction trust scores
-
-**Providers:**
-
-- `walletProvider` - Wallet management
-- `trustScoreProvider` - Transaction trust metrics
-
-#### 5. Buttplug Plugin (`@eliza/plugin-buttplug`)
-
-Integrates Buttplug.io for intimate toy control:
-
-**Services:**
-
-- `ButtplugService` - Buttplug.io integration itself
-
-**Actions:**
-
-- `VIBRATE` - Control vibration intensity and duration of connected devices
-- `ROTATE` - Control rotation intensity and duration of connected devices
-- `BATTERY` - Get the battery level of connected devices
-
 ## Using Plugins
 
 ### Installation
@@ -115,36 +38,13 @@ import { bootstrapPlugin } from "@eliza/plugin-bootstrap";
 import { imageGenerationPlugin } from "@eliza/plugin-image-generation";
 import { buttplugPlugin } from "@eliza/plugin-buttplug";
 const character = {
-  // ... other character config
-  plugins: [bootstrapPlugin, imageGenerationPlugin, buttplugPlugin],
+    // ... other character config
+    plugins: [bootstrapPlugin, imageGenerationPlugin, buttplugPlugin],
 };
 ```
 
 ---
 
-# 🧩 Plugins
-
-## Overview
-
-Eliza's plugin system provides a modular way to extend the core functionality with additional features, actions, evaluators, and providers. Plugins are self-contained modules that can be easily added or removed to customize your agent's capabilities.
-
-## Core Plugin Concepts
-
-### Plugin Structure
-
-Each plugin in Eliza must implement the `Plugin` interface with the following properties:
-
-```typescript
-interface Plugin {
-  name: string; // Unique identifier for the plugin
-  description: string; // Brief description of plugin functionality
-  actions?: Action[]; // Custom actions provided by the plugin
-  evaluators?: Evaluator[]; // Custom evaluators for behavior assessment
-  providers?: Provider[]; // Context providers for message generation
-  services?: Service[]; // Additional services (optional)
-}
-```
-
 ### Available Plugins
 
 #### 1. Bootstrap Plugin (`@eliza/plugin-bootstrap`)
@@ -222,7 +122,6 @@ The charity addresses for each network are as follows:
 
 In the future, we aim to integrate with The Giving Block API to allow for dynamic and configurable donations, enabling support for a wider range of charitable organizations.
 
-
 #### 5. Coinbase Commerce Plugin (`@eliza/plugin-coinbase`)
 
 Integrates Coinbase Commerce for payment and transaction management:
@@ -245,34 +144,15 @@ The plugin automatically handles wallet creation or uses an existing wallet if t
 1. **Wallet Generation on First Run**
    If no wallet information is provided (`COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID`), the plugin will:
 
-   - **Generate a new wallet** using the Coinbase SDK.
-   - Automatically **export the wallet details** (`seed` and `walletId`) and securely store them in `runtime.character.settings.secrets` or other configured storage.
-   - Log the wallet’s default address for reference.
-   - If the character file does not exist, the wallet details are saved to a characters/charactername-seed.txt file in the characters directory with a note indicating that the user must manually add these details to settings.secrets or the .env file.
-
-2. **Using an Existing Wallet**
-   If wallet information is available during the first run:
-   - Provide `COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID` via `runtime.character.settings.secrets` or environment variables.
-   - The plugin will **import the wallet** and use it for processing mass payouts.
-
----
-
-### Coinbase Wallet Management
-
-The plugin automatically handles wallet creation or uses an existing wallet if the required details are provided during the first run.
-
-1. **Wallet Generation on First Run**
-   If no wallet information is provided (`COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID`), the plugin will:
-
-   - **Generate a new wallet** using the Coinbase SDK.
-   - Automatically **export the wallet details** (`seed` and `walletId`) and securely store them in `runtime.character.settings.secrets` or other configured storage.
-   - Log the wallet’s default address for reference.
-   - If the character file does not exist, the wallet details are saved to a characters/charactername-seed.txt file in the characters directory with a note indicating that the user must manually add these details to settings.secrets or the .env file.
+    - **Generate a new wallet** using the Coinbase SDK.
+    - Automatically **export the wallet details** (`seed` and `walletId`) and securely store them in `runtime.character.settings.secrets` or other configured storage.
+    - Log the wallet’s default address for reference.
+    - If the character file does not exist, the wallet details are saved to a characters/charactername-seed.txt file in the characters directory with a note indicating that the user must manually add these details to settings.secrets or the .env file.
 
 2. **Using an Existing Wallet**
    If wallet information is available during the first run:
-   - Provide `COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID` via `runtime.character.settings.secrets` or environment variables.
-   - The plugin will **import the wallet** and use it for processing mass payouts.
+    - Provide `COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID` via `runtime.character.settings.secrets` or environment variables.
+    - The plugin will **import the wallet** and use it for processing mass payouts.
 
 ---
 
@@ -284,35 +164,35 @@ This plugin facilitates the processing of cryptocurrency mass payouts using the
 
 - `SEND_MASS_PAYOUT`
   Sends cryptocurrency mass payouts to multiple wallet addresses.
-  - **Inputs**:
-    - `receivingAddresses` (array of strings): Wallet addresses to receive funds.
-    - `transferAmount` (number): Amount to send to each address (in smallest currency unit, e.g., Wei for ETH).
-    - `assetId` (string): Cryptocurrency asset ID (e.g., `ETH`, `BTC`).
-    - `network` (string): Blockchain network (e.g., `base`, `sol`, `eth`, `arb`, `pol`).
-  - **Outputs**: Logs transaction results (success/failure) in a CSV file.
-  - **Example**:
-    ```json
-    {
-      "receivingAddresses": [
-        "0xA0ba2ACB5846A54834173fB0DD9444F756810f06",
-        "0xF14F2c49aa90BaFA223EE074C1C33b59891826bF"
-      ],
-      "transferAmount": 5000000000000000,
-      "assetId": "ETH",
-      "network": "eth"
-    }
-    ```
+    - **Inputs**:
+        - `receivingAddresses` (array of strings): Wallet addresses to receive funds.
+        - `transferAmount` (number): Amount to send to each address (in smallest currency unit, e.g., Wei for ETH).
+        - `assetId` (string): Cryptocurrency asset ID (e.g., `ETH`, `BTC`).
+        - `network` (string): Blockchain network (e.g., `base`, `sol`, `eth`, `arb`, `pol`).
+    - **Outputs**: Logs transaction results (success/failure) in a CSV file.
+    - **Example**:
+        ```json
+        {
+            "receivingAddresses": [
+                "0xA0ba2ACB5846A54834173fB0DD9444F756810f06",
+                "0xF14F2c49aa90BaFA223EE074C1C33b59891826bF"
+            ],
+            "transferAmount": 5000000000000000,
+            "assetId": "ETH",
+            "network": "eth"
+        }
+        ```
 
 **Providers:**
 
 - `massPayoutProvider`
   Retrieves details of past transactions from the generated CSV file.
-  - **Outputs**: A list of transaction records including the following fields:
-    - `address`: Recipient wallet address.
-    - `amount`: Amount sent.
-    - `status`: Transaction status (`Success` or `Failed`).
-    - `errorCode`: Error code (if any).
-    - `transactionUrl`: URL for transaction details (if available).
+    - **Outputs**: A list of transaction records including the following fields:
+        - `address`: Recipient wallet address.
+        - `amount`: Amount sent.
+        - `status`: Transaction status (`Success` or `Failed`).
+        - `errorCode`: Error code (if any).
+        - `transactionUrl`: URL for transaction details (if available).
 
 **Description:**
 
@@ -326,150 +206,91 @@ Supported networks:
 - `arb` (Arbitrum)
 - `pol` (Polygon)
 
-**Usage Instructions:**
+**Setup and Configuration:**
 
 1. **Configure the Plugin**
-   Add the plugin to your character’s configuration:
+   Add the plugin to your character's configuration:
 
-   ```typescript
-   import { coinbaseMassPaymentsPlugin } from "@eliza/plugin-coinbase-masspayments";
+    ```typescript
+    import { coinbaseMassPaymentsPlugin } from "@eliza/plugin-coinbase-masspayments";
 
-   const character = {
-     plugins: [coinbaseMassPaymentsPlugin],
-   };
-   ```
+    const character = {
+        plugins: [coinbaseMassPaymentsPlugin],
+    };
+    ```
 
-2. **Ensure Secure Configuration**
-   Set the following environment variables or runtime settings to ensure the plugin functions securely:
+2. **Required Configurations**
+   Set the following environment variables or runtime settings:
 
-   - `COINBASE_API_KEY`: API key for Coinbase SDK.
-   - `COINBASE_PRIVATE_KEY`: Private key for secure transactions.
+    - `COINBASE_API_KEY`: API key for Coinbase SDK
+    - `COINBASE_PRIVATE_KEY`: Private key for secure transactions
+    - `COINBASE_GENERATED_WALLET_HEX_SEED`: Hexadecimal seed of the wallet (if using existing wallet)
+    - `COINBASE_GENERATED_WALLET_ID`: Unique wallet ID (if using existing wallet)
 
 **Wallet Management:**
 
-The plugin automatically handles wallet creation or uses an existing wallet if the required details are provided during the first run.
-
-1. **Wallet Generation on First Run**
-   If no wallet information is provided (`COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID`), the plugin will:
-
-   - **Generate a new wallet** using the Coinbase SDK.
-   - Automatically **export the wallet details** (`seed` and `walletId`) and securely store them in `runtime.character.settings.secrets` or other configured storage.
-   - Log the wallet’s default address for reference.
-   - If the character file does not exist, the wallet details are saved to a characters/charactername-seed.txt file in the characters directory with a note indicating that the user must manually add these details to settings.secrets or the .env file.
-
-2. **Using an Existing Wallet**
-   If wallet information is available during the first run:
-   - Provide `COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID` via `runtime.character.settings.secrets` or environment variables.
-   - The plugin will **import the wallet** and use it for processing mass payouts.
-
-**Required Configurations:**
-
-The following configurations must be provided for wallet management:
-
-- **Environment Variables or Secrets**:
-  - `COINBASE_GENERATED_WALLET_HEX_SEED`: Hexadecimal seed of the wallet.
-  - `COINBASE_GENERATED_WALLET_ID`: Unique wallet ID.
-  - These variables must be securely stored in `runtime.character.settings.secrets` or as environment variables.
-
----
-
-### Wallet Creation Process
+The plugin handles wallet creation and management in two ways:
 
 1. **Automatic Wallet Creation**
-   When no wallet details are available:
-
-   - A new wallet is created using the Coinbase SDK.
-   - The wallet’s `seed` and `walletId` are retrieved using the following logic:
-     ```typescript
-     const walletData: WalletData = wallet.export();
-     runtime.character.settings.secrets.COINBASE_GENERATED_WALLET_HEX_SEED =
-       walletData.seed;
-     runtime.character.settings.secrets.COINBASE_GENERATED_WALLET_ID =
-       walletData.walletId;
-     ```
-   - The default wallet address is logged:
-     ```typescript
-     const walletAddress = wallet.getDefaultAddress();
-     elizaLogger.log("Created and stored new wallet:", walletAddress);
-     ```
-
-2. **Using Existing Wallet Details**
-   When the wallet details are provided:
-   - The wallet is imported using the following logic:
-     ```typescript
-     wallet = await Wallet.import({
-       seed: storedSeed,
-       walletId: storedWalletId,
-     });
-     elizaLogger.log("Imported existing wallet:", wallet.getDefaultAddress());
-     ```
+   When no wallet details are provided, the plugin will:
 
-**Example Configuration:**
+    - Generate a new wallet using the Coinbase SDK
+    - Export and store the wallet details in `runtime.character.settings.secrets`
+    - Save details to `characters/charactername-seed.txt` if character file doesn't exist
+    - Log the wallet's default address
 
-#### Automatic Wallet Generation:
+2. **Using Existing Wallet**
+   When wallet information is available:
+    - Provide the required wallet details via settings or environment variables
+    - The plugin will import and use the existing wallet
 
-No existing wallet information is passed. The plugin creates and stores a new wallet:
+**Example Configuration:**
 
 ```typescript
+// For automatic wallet generation
 runtime.character.settings.secrets = {
-  // Empty settings for first run
+    // Empty settings for first run
 };
-```
 
-Output Log:
-
-```plaintext
-[INFO] Created and stored new wallet: 0x1234567890abcdef1234567890abcdef12345678
+// For using existing wallet
+runtime.character.settings.secrets = {
+    COINBASE_GENERATED_WALLET_HEX_SEED:
+        "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
+    COINBASE_GENERATED_WALLET_ID: "wallet-id-123",
+};
 ```
 
-#### Using Existing Wallet Information:
-
-Existing wallet details are passed into the runtime:
+**Example Call**
 
 ```typescript
-runtime.character.settings.secrets = {
-  COINBASE_GENERATED_WALLET_HEX_SEED:
-    "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
-  COINBASE_GENERATED_WALLET_ID: "wallet-id-123",
-};
+const response = await runtime.triggerAction("SEND_MASS_PAYOUT", {
+    receivingAddresses: [
+        "0xA0ba2ACB5846A54834173fB0DD9444F756810f06",
+        "0xF14F2c49aa90BaFA223EE074C1C33b59891826bF",
+    ],
+    transferAmount: 5000000000000000, // 0.005 ETH
+    assetId: "ETH",
+    network: "eth",
+});
+console.log("Mass payout response:", response);
 ```
 
-Output Log:
+**Transaction Logging**
+
+All transactions (successful and failed) are logged to a `transactions.csv` file in the plugin’s working directory:
 
 ```plaintext
-[INFO] Imported existing wallet: 0x1234567890abcdef1234567890abcdef12345678
+Address,Amount,Status,Error Code,Transaction URL
+0xA0ba2ACB5846A54834173fB0DD9444F756810f06,5000000000000000,Success,,https://etherscan.io/tx/0x...
 ```
 
-3. **Example Call**
-   An example of using the `SEND_MASS_PAYOUT` action:
-
-   ```typescript
-   const response = await runtime.triggerAction("SEND_MASS_PAYOUT", {
-     receivingAddresses: [
-       "0xA0ba2ACB5846A54834173fB0DD9444F756810f06",
-       "0xF14F2c49aa90BaFA223EE074C1C33b59891826bF",
-     ],
-     transferAmount: 5000000000000000, // 0.005 ETH
-     assetId: "ETH",
-     network: "eth",
-   });
-   console.log("Mass payout response:", response);
-   ```
-
-4. **Transaction Logging**
-   All transactions (successful and failed) are logged to a `transactions.csv` file in the plugin’s working directory:
-   ```plaintext
-   Address,Amount,Status,Error Code,Transaction URL
-   0xA0ba2ACB5846A54834173fB0DD9444F756810f06,5000000000000000,Success,,https://etherscan.io/tx/0x...
-   ```
-
 **Example Output:**
 
 When successful, a response similar to the following will be returned:
 
 ```json
 {
-  "text": "Mass payouts completed successfully.\n- Successful Transactions: 2\n- Failed Transactions: 0\nCheck the CSV file for more details."
+    "text": "Mass payouts completed successfully.\n- Successful Transactions: 2\n- Failed Transactions: 0\nCheck the CSV file for more details."
 }
 ```
 
@@ -489,47 +310,48 @@ This plugin enables the deployment and interaction with various token contracts
 
 1. `DEPLOY_TOKEN_CONTRACT`
    Deploys a new token contract (ERC20, ERC721, or ERC1155).
-   - **Inputs**:
-     - `contractType` (string): Type of contract to deploy (`ERC20`, `ERC721`, or `ERC1155`)
-     - `name` (string): Name of the token
-     - `symbol` (string): Symbol of the token
-     - `network` (string): Blockchain network to deploy on
-     - `baseURI` (string, optional): Base URI for token metadata (required for ERC721 and ERC1155)
-     - `totalSupply` (number, optional): Total supply of tokens (only for ERC20)
-   - **Example**:
-     ```json
-     {
-       "contractType": "ERC20",
-       "name": "MyToken",
-       "symbol": "MTK",
-       "network": "base",
-       "totalSupply": 1000000
-     }
-     ```
+
+    - **Inputs**:
+        - `contractType` (string): Type of contract to deploy (`ERC20`, `ERC721`, or `ERC1155`)
+        - `name` (string): Name of the token
+        - `symbol` (string): Symbol of the token
+        - `network` (string): Blockchain network to deploy on
+        - `baseURI` (string, optional): Base URI for token metadata (required for ERC721 and ERC1155)
+        - `totalSupply` (number, optional): Total supply of tokens (only for ERC20)
+    - **Example**:
+        ```json
+        {
+            "contractType": "ERC20",
+            "name": "MyToken",
+            "symbol": "MTK",
+            "network": "base",
+            "totalSupply": 1000000
+        }
+        ```
 
 2. `INVOKE_CONTRACT`
    Invokes a method on a deployed smart contract.
-   - **Inputs**:
-     - `contractAddress` (string): Address of the contract to invoke
-     - `method` (string): Method name to invoke
-     - `abi` (array): Contract ABI
-     - `args` (object, optional): Arguments for the method
-     - `amount` (number, optional): Amount of asset to send (for payable methods)
-     - `assetId` (string, optional): Asset ID to send
-     - `network` (string): Blockchain network to use
-   - **Example**:
-     ```json
-     {
-       "contractAddress": "0x123...",
-       "method": "transfer",
-       "abi": [...],
-       "args": {
-         "to": "0x456...",
-         "amount": "1000000000000000000"
-       },
-       "network": "base"
-     }
-     ```
+    - **Inputs**:
+        - `contractAddress` (string): Address of the contract to invoke
+        - `method` (string): Method name to invoke
+        - `abi` (array): Contract ABI
+        - `args` (object, optional): Arguments for the method
+        - `amount` (number, optional): Amount of asset to send (for payable methods)
+        - `assetId` (string, optional): Asset ID to send
+        - `network` (string): Blockchain network to use
+    - **Example**:
+        ```json
+        {
+          "contractAddress": "0x123...",
+          "method": "transfer",
+          "abi": [...],
+          "args": {
+            "to": "0x456...",
+            "amount": "1000000000000000000"
+          },
+          "network": "base"
+        }
+        ```
 
 **Description:**
 
@@ -547,54 +369,56 @@ All contract deployments and interactions are logged to a CSV file for record-ke
 1. **Configure the Plugin**
    Add the plugin to your character's configuration:
 
-   ```typescript
-   import { tokenContractPlugin } from "@eliza/plugin-coinbase";
+    ```typescript
+    import { tokenContractPlugin } from "@eliza/plugin-coinbase";
 
-   const character = {
-     plugins: [tokenContractPlugin],
-   };
-   ```
+    const character = {
+        plugins: [tokenContractPlugin],
+    };
+    ```
 
 2. **Required Configurations**
    Ensure the following environment variables or runtime settings are configured:
-   - `COINBASE_API_KEY`: API key for Coinbase SDK
-   - `COINBASE_PRIVATE_KEY`: Private key for secure transactions
-   - Wallet configuration (same as MassPayments plugin)
+    - `COINBASE_API_KEY`: API key for Coinbase SDK
+    - `COINBASE_PRIVATE_KEY`: Private key for secure transactions
+    - Wallet configuration (same as MassPayments plugin)
 
 **Example Deployments:**
 
 1. **ERC20 Token**
-   ```typescript
-   const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", {
-     contractType: "ERC20",
-     name: "MyToken",
-     symbol: "MTK",
-     network: "base",
-     totalSupply: 1000000
-   });
-   ```
+
+    ```typescript
+    const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", {
+        contractType: "ERC20",
+        name: "MyToken",
+        symbol: "MTK",
+        network: "base",
+        totalSupply: 1000000,
+    });
+    ```
 
 2. **NFT Collection**
-   ```typescript
-   const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", {
-     contractType: "ERC721",
-     name: "MyNFT",
-     symbol: "MNFT",
-     network: "eth",
-     baseURI: "https://api.mynft.com/metadata/"
-   });
-   ```
+
+    ```typescript
+    const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", {
+        contractType: "ERC721",
+        name: "MyNFT",
+        symbol: "MNFT",
+        network: "eth",
+        baseURI: "https://api.mynft.com/metadata/",
+    });
+    ```
 
 3. **Multi-token Collection**
-   ```typescript
-   const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", {
-     contractType: "ERC1155",
-     name: "MyMultiToken",
-     symbol: "MMT",
-     network: "pol",
-     baseURI: "https://api.mymultitoken.com/metadata/"
-   });
-   ```
+    ```typescript
+    const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", {
+        contractType: "ERC1155",
+        name: "MyMultiToken",
+        symbol: "MMT",
+        network: "pol",
+        baseURI: "https://api.mymultitoken.com/metadata/",
+    });
+    ```
 
 **Contract Interaction Example:**
 
@@ -640,37 +464,37 @@ const provider = new DeriveKeyProvider();
 
 // Derive a raw key
 try {
-  const rawKey = await provider.rawDeriveKey(
-    "/path/to/derive",
-    "subject-identifier",
-  );
-  // rawKey is a DeriveKeyResponse that can be used for further processing
-  // to get the uint8Array do the following
-  const rawKeyArray = rawKey.asUint8Array();
+    const rawKey = await provider.rawDeriveKey(
+        "/path/to/derive",
+        "subject-identifier",
+    );
+    // rawKey is a DeriveKeyResponse that can be used for further processing
+    // to get the uint8Array do the following
+    const rawKeyArray = rawKey.asUint8Array();
 } catch (error) {
-  console.error("Raw key derivation failed:", error);
+    console.error("Raw key derivation failed:", error);
 }
 
 // Derive a Solana keypair (Ed25519)
 try {
-  const solanaKeypair = await provider.deriveEd25519Keypair(
-    "/path/to/derive",
-    "subject-identifier",
-  );
-  // solanaKeypair can now be used for Solana operations
+    const solanaKeypair = await provider.deriveEd25519Keypair(
+        "/path/to/derive",
+        "subject-identifier",
+    );
+    // solanaKeypair can now be used for Solana operations
 } catch (error) {
-  console.error("Solana key derivation failed:", error);
+    console.error("Solana key derivation failed:", error);
 }
 
 // Derive an Ethereum keypair (ECDSA)
 try {
-  const evmKeypair = await provider.deriveEcdsaKeypair(
-    "/path/to/derive",
-    "subject-identifier",
-  );
-  // evmKeypair can now be used for Ethereum operations
+    const evmKeypair = await provider.deriveEcdsaKeypair(
+        "/path/to/derive",
+        "subject-identifier",
+    );
+    // evmKeypair can now be used for Ethereum operations
 } catch (error) {
-  console.error("EVM key derivation failed:", error);
+    console.error("EVM key derivation failed:", error);
 }
 ```
 
@@ -682,10 +506,10 @@ import { RemoteAttestationProvider } from "@ai16z/plugin-tee";
 const provider = new RemoteAttestationProvider();
 // Generate Remote Attestation
 try {
-  const attestation = await provider.generateAttestation("your-report-data");
-  console.log("Attestation:", attestation);
+    const attestation = await provider.generateAttestation("your-report-data");
+    console.log("Attestation:", attestation);
 } catch (error) {
-  console.error("Failed to generate attestation:", error);
+    console.error("Failed to generate attestation:", error);
 }
 ```
 
@@ -717,20 +541,20 @@ Create a new plugin by implementing the Plugin interface:
 import { Plugin, Action, Evaluator, Provider } from "@ai16z/eliza";
 
 const myCustomPlugin: Plugin = {
-  name: "my-custom-plugin",
-  description: "Adds custom functionality",
-  actions: [
-    /* custom actions */
-  ],
-  evaluators: [
-    /* custom evaluators */
-  ],
-  providers: [
-    /* custom providers */
-  ],
-  services: [
-    /* custom services */
-  ],
+    name: "my-custom-plugin",
+    description: "Adds custom functionality",
+    actions: [
+        /* custom actions */
+    ],
+    evaluators: [
+        /* custom evaluators */
+    ],
+    providers: [
+        /* custom providers */
+    ],
+    services: [
+        /* custom services */
+    ],
 };
 ```
 
@@ -772,14 +596,14 @@ const myCustomPlugin: Plugin = {
 ```typescript
 // Check if plugins are loaded correctly
 if (character.plugins) {
-  console.log("Plugins are: ", character.plugins);
-  const importedPlugins = await Promise.all(
-    character.plugins.map(async (plugin) => {
-      const importedPlugin = await import(plugin);
-      return importedPlugin;
-    }),
-  );
-  character.plugins = importedPlugins;
+    console.log("Plugins are: ", character.plugins);
+    const importedPlugins = await Promise.all(
+        character.plugins.map(async (plugin) => {
+            const importedPlugin = await import(plugin);
+            return importedPlugin;
+        }),
+    );
+    character.plugins = importedPlugins;
 }
 ```