Skill: vortitron/solana-transfer (version 0.1.0)

# Solana Transfer Skill **Description:** Send SOL and SPL tokens on Solana blockchain from OpenClaw agents. **Location:** `/root/.openclaw/workspace/skills/solana-transfer` **When to use:** When an agent needs to pay another agent, send a reward, or settle a transaction on-chain. --- ## Quick Start ### 1. Install ```bash cd /root/.openclaw/workspace/skills/solana-transfer npm install ``` ### 2. Set Up Keypair Generate a keypair (or use an existing one): ```bash solana-keygen new --outfile keypair.json ``` This creates a Solana wallet. Get your address: ```bash node index.js address ``` ### 3. Fund the Wallet For **mainnet:** Transfer SOL to your address from your main wallet For **devnet/testnet:** Use the Solana faucet ### 4. Use from an Agent In an agent's task or skill code: ```javascript import { sendSOL } from '../skills/solana-transfer/index.js'; // Send 0.001 SOL (1 million lamports) const result = await sendSOL('recipient-wallet-address', 1000000); console.log(`Sent ${result.amount} SOL`); console.log(`Transaction: ${result.signature}`); ``` --- ## Common Patterns ### Pattern 1: Pay for Expert Query **Scenario:** A cheap agent asks an expert agent a question. The expert quotes a price, the cheap agent pays. ```javascript // In cheap agent's code import { sendSOL } from '../skills/solana-transfer/index.js'; // After expert responds with quote... const expertWallet = 'expert-agent-solana-address'; const amountLamports = 1000000; // 0.001 SOL try { const payment = await sendSOL(expertWallet, amountLamports); console.log(`Paid expert ${payment.amount} SOL for query`); console.log(`Tx: ${payment.signature}`); } catch (error) { console.error(`Payment failed: ${error.message}`); } ``` ### Pattern 2: Reward Agents for Task Completion **Scenario:** A coordinator agent awards SOL to agents that complete work. ```javascript // In coordinator agent's code const workerWallet = 'worker-agent-address'; const rewardLamports = 5000000; // 0.005 SOL const payment = await sendSOL(workerWallet, rewardLamports); console.log(`Rewarded worker with ${payment.amount} SOL`); ``` ### Pattern 3: SPL Token Payments **Scenario:** Pay with USDC or other SPL tokens instead of native SOL. ```javascript import { sendSPLToken } from '../skills/solana-transfer/index.js'; const recipientWallet = 'recipient-address'; const tokenMint = [REDACTED_SECRET]; // USDC mainnet const amountSmallestUnits = 1000000; // 1 USDC (6 decimals) const payment = await sendSPLToken(recipientWallet, tokenMint, amountSmallestUnits); console.log(`Sent USDC payment: ${payment.signature}`); ``` --- ## Configuration Edit `config.json` to change RPC endpoint or network: ```json { "rpc": "https://api.mainnet-beta.solana.com", "network": "mainnet-beta" } ``` **Common endpoints:** - Mainnet: `https://api.mainnet-beta.solana.com` - Devnet: `https://api.devnet.solana.com` - Testnet: `https://api.testnet.solana.com` - Custom: Use your own Solana node RPC --- ## Ledger Integration (Future) Once payments are sent on-chain, you can: 1. **Query transaction history:** View all payments sent/received 2. **Build a local ledger:** Monitor the chain and log queries + payments 3. **Dispute resolution:** If an expert doesn't deliver, agents can reference the tx hash 4. **Analytics:** Track which agents pay whom, average rates, etc. Example: Monitor the blockchain for txs from/to an agent's wallet: ```javascript const walletAddress = 'agent-solana-address'; const signatures = await connection.getSignaturesForAddress( new PublicKey(walletAddress) ); for (const sig of signatures) { const tx = await connection.getParsedTransaction(sig.signature); console.log(`Agent transaction: ${sig.signature}`); } ``` --- ## Security Notes - **Keypair:** Keep `keypair.json` safe. Treat it like a private key (because it is). - **Amounts:** Always verify recipient and lamports before sending. No undo. - **RPC:** Use a trusted RPC provider. Don't hardcode URLs in agent code. - **Rate limits:** If agents spam transactions, Solana will rate-limit or your RPC may block you. Add delays between payments if needed. --- ## Troubleshooting **"Insufficient funds"** Check balance: `node index.js balance`. Fund the wallet. **"Invalid public key"** Recipient address is malformed. Solana addresses are 44-character base58 strings. **"Connection timeout"** RPC endpoint is unreachable. Try a different endpoint in `config.json`. **"Transaction failed to confirm"** Network congestion or insufficient fee. Retry after a few seconds. --- ## Example: Full IRC + Solana Flow 1. **Cheap agent** in IRC: `@expert, analyze this data` 2. **Expert agent** responds: `Quote: 0.001 SOL (Tx settle onchain) [quote_id: xyz]` 3. **Cheap agent** approves: ```javascript const result = await sendSOL(expertWalletAddress, 1000000); console.log(`Paid expert. Tx: ${result.signature}`); ``` 4. **Expert agent** confirms payment received and delivers work 5. Both agents log: `query_id, expert_address, tx_hash` for audit trail --- ## Next Steps - [ ] Set up your keypair and fund with SOL - [ ] Test sending a small amount to verify setup - [ ] Integrate with IRC skill for automatic expert payments - [ ] Build transaction history viewer - [ ] Create agent wallet registry (who has what address?)

path: README.md
content: # Solana Transfer Skill

Send SOL and SPL tokens on Solana blockchain from OpenClaw agents.

## Setup

### 1. Install Dependencies

```bash
npm install
```

### 2. Generate or Import a Keypair

Generate a new keypair:
```bash
solana-keygen new --outfile keypair.json
```

Or use an existing keypair (careful with private keys!):
```bash
cp /path/to/your/keypair.json keypair.json
```

### 3. Fund the Wallet

Get your wallet address:
```bash
node index.js address
```

Fund it with SOL (use faucet for devnet/testnet, or transfer from your main wallet for mainnet).

### 4. Configure RPC (Optional)

Copy `config.example.json` to `config.json` and adjust RPC endpoint if needed:
```bash
cp config.example.json config.json
# Edit config.json for custom RPC endpoint
```

## Usage

### Send SOL

Send 0.1 SOL (100,000,000 lamports) to a recipient:
```bash
node index.js send-sol <recipient-address> 100000000
```

### Send SPL Tokens

Send tokens (e.g., USDC) to a recipient:
```bash
node index.js send-token <recipient-address> <token-mint> <amount-in-smallest-unit>
```

Example (USDC, 1 USDC = 1,000,000 smallest units):
```bash
node index.js send-token FyWvTZqDvJrMfr2QfC3hPP8J5kHVCRPhLx8jP8dVSMVf EPjFWdd5Au17LS7bF8hgGhXMdGGZ5gLtaWh3yzXXQ3g4 1000000
```

### Check Balance

```bash
node index.js balance
```

### Get Wallet Address

```bash
node index.js address
```

## In OpenClaw Skills

Import and use programmatically:

```javascript
import { sendSOL } from './skills/solana-transfer/index.js';

// Send SOL from an agent
const result = await sendSOL('recipientAddress', 100000000);
console.log(result.signature); // transaction hash
```

## Use Cases

### Expert-Pays-Query Pattern

1. **Cheap agent** asks expert in IRC: "@expert, what is X?"
2. **Expert** responds with quoted cost and quote ID
3. **Cheap agent** calls this skill to send payment:
   ```bash
   node index.js send-sol <expert-wallet> 5000000  # 0.005 SOL
   ```
4. **Ledger** (future: chain monitoring or local DB) records the transaction
5. Both agents log the tx hash + quote ID for audit trail

### Agent Bounties

- Set up a "bounty" wallet that rewards agents for completing tasks
- Cheap agents complete work, submit proof, receive SOL rewards via this skill

### Inter-Agent Commerce

- Agents trade services: data analysis, code review, content creation
- Payments settle on-chain in real-time
- No intermediary, no fees (except Solana's ~0.00005 SOL per tx)

## Configuration

### Environment Variables

```bash
SOLANA_CONFIG=/path/to/config.json
SOLANA_KEYPAIR=/path/to/keypair.json
```

### Config File

```json
{
  "rpc": "https://api.mainnet-beta.solana.com",
  "network": "mainnet-beta",
  "commitment": "confirmed"
}
```

- **rpc:** Solana RPC endpoint (mainnet, devnet, testnet, or custom)
- **network:** Network label (informational)
- **commitment:** Transaction confirmation level (processed, confirmed, finalized)

## Security

- **Private keys:** Keep `keypair.json` secure. Don't commit to Git, don't share.
- **RPC endpoints:** Use trusted RPC providers or run your own node.
- **Amount validation:** Always verify recipient and amount before sending.
- **Rate limiting:** Consider adding rate limits if agents send frequently.

## Troubleshooting

### "Connection timed out"

Check RPC endpoint. Try a different one:
```bash
cp config.example.json config.json
# Edit to use: https://api.solana.com or another endpoint
```

### "Insufficient funds"

Wallet doesn't have enough SOL. Check balance and fund:
```bash
node index.js balance
```

### "Invalid public key"

Recipient address is malformed. Verify it's a valid Solana address (base58, 44 characters).

## Future Enhancements

- [ ] Support for custom token decimals
- [ ] Batch transfers
- [ ] Transaction history / local ledger
- [ ] Integration with IRC skill for automatic payments
- [ ] Dispute resolution / escrow patterns


path: config.example.json
content: rpc: https://api.mainnet-beta.solana.com
network: mainnet-beta
commitment: confirmed

path: index.js
content: #!/usr/bin/env node

/**
 * Solana Transfer Skill for OpenClaw
 * 
 * Allows agents to send SOL and SPL tokens on Solana blockchain.
 * Requires a keypair and RPC endpoint configured.
 */

import {
  Connection,
  PublicKey,
  Keypair,
  SystemProgram,
  Transaction,
} from '@solana/web3.js';
import {
  getOrCreateAssociatedTokenAccount,
  transfer,
} from '@solana/spl-token';
import { readFileSync, existsSync } from 'fs';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';

const __dirname = dirname(fileURLToPath(import.meta.url));

// Load config
const CONFIG_PATH = process.env.SOLANA_CONFIG || join(__dirname, 'config.json');
const KEYPAIR_PATH = process.env.SOLANA_KEYPAIR || join(__dirname, 'keypair.json');

let config = {
  rpc: 'https://api.mainnet-beta.solana.com',
  network: 'mainnet-beta',
};

if (existsSync(CONFIG_PATH)) {
  try {
    config = { ...config, ...JSON.parse(readFileSync(CONFIG_PATH, 'utf8')) };
  } catch (e) {
    console.error('Warning: Could not parse config.json, using defaults');
  }
}

// Load keypair
let keypair;
if (!existsSync(KEYPAIR_PATH)) {
  console.error(`Error: keypair.json not found at ${KEYPAIR_PATH}`);
  console.error('Generate with: solana-keygen new --outfile keypair.json');
  process.exit(1);
}

try {
  const keypairData = JSON.parse(readFileSync(KEYPAIR_PATH, 'utf8'));
  keypair = Keypair.fromSecretKey(Uint8Array.from(keypairData));
} catch (e) {
  console.error(`Error loading keypair: ${e.message}`);
  process.exit(1);
}

const connection = new Connection(config.rpc, 'confirmed');

/**
 * Send SOL (native token) to a recipient
 */
async function sendSOL(recipientAddress, lamports) {
  const recipient = new PublicKey(recipientAddress);
  const sender = keypair.publicKey;

  const transaction = new Transaction().add(
    SystemProgram.transfer({
      fromPubkey: sender,
      toPubkey: recipient,
      lamports: parseInt(lamports),
    })
  );

  const blockHash = await connection.getLatestBlockhash();
  transaction.feePayer = sender;
  transaction.recentBlockhash = blockHash.blockhash;

  const signature = await connection.sendTransaction(transaction, [keypair]);
  const confirmation = await connection.confirmTransaction(signature);

  return {
    success: true,
    signature,
    amount: (lamports / 1e9).toFixed(9),
    unit: 'SOL',
    recipient: recipientAddress,
    confirmation,
  };
}

/**
 * Send SPL tokens to a recipient
 */
async function sendSPLToken(recipientAddress, tokenMint, amount) {
  const recipient = new PublicKey(recipientAddress);
  const mint = new PublicKey(tokenMint);
  const sender = keypair.publicKey;

  // Get or create recipient's token account
  const recipientTokenAccount = await getOrCreateAssociatedTokenAccount(
    connection,
    keypair,
    mint,
    recipient
  );

  // Get sender's token account
  const senderTokenAccount = await getOrCreateAssociatedTokenAccount(
    connection,
    keypair,
    mint,
    sender
  );

  // Send tokens
  const signature = await transfer(
    connection,
    keypair,
    senderTokenAccount.address,
    recipientTokenAccount.address,
    keypair,
    parseInt(amount) // assumes amount is in smallest unit (lamports for USDC, etc)
  );

  const confirmation = await connection.confirmTransaction(signature);

  return {
    success: true,
    signature,
    amount,
    unit: tokenMint.substring(0, 8) + '...',
    recipient: recipientAddress,
    confirmation,
  };
}

/**
 * Main CLI interface
 */
async function main() {
  const [command, ...args] = process.argv.slice(2);

  try {
    if (command === 'send-sol') {
      const [recipient, amount] = args;
      if (!recipient || !amount) {
        console.error('Usage: node index.js send-sol <recipient-address> <lamports>');
        process.exit(1);
      }
      const result = await sendSOL(recipient, amount);
      console.log(JSON.stringify(result, null, 2));
    } else if (command === 'send-token') {
      const [recipient, tokenMint, amount] = args;
      if (!recipient || !tokenMint || !amount) {
        console.error(
          'Usage: node index.js send-token <recipient-address> <token-mint> <amount>'
        );
        process.exit(1);
      }
      const result = await sendSPLToken(recipient, tokenMint, amount);
      console.log(JSON.stringify(result, null, 2));
    } else if (command === 'balance') {
      const balance = await connection.getBalance(keypair.publicKey);
      console.log(JSON.stringify({
        wallet: keypair.publicKey.toString(),
        lamports: balance,
        sol: (balance / 1e9).toFixed(9),
      }, null, 2));
    } else if (command === 'address') {
      console.log(keypair.publicKey.toString());
    } else {
      console.log(`Solana Transfer Skill

Commands:
  send-sol <recipient> <lamports>         Send native SOL
  send-token <recipient> <mint> <amount>  Send SPL token
  balance                                  Check wallet balance
  address                                  Show wallet address

Config: ${CONFIG_PATH}
Keypair: ${KEYPAIR_PATH}
Network: ${config.network}
RPC: ${config.rpc}
`);
    }
  } catch (error) {
    console.error('Error:', error.message);
    process.exit(1);
  }
}

main();

export { sendSOL, sendSPLToken, connection, keypair };


path: package-lock.json
content: {
  "name": "solana-transfer",
  "version": "0.1.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "solana-transfer",
      "version": "0.1.0",
      "dependencies": {
        "@solana/spl-token": "^0.4.3",
        "@solana/web3.js": "^1.87.0"
      }
    },
    "node_modules/@babel/runtime": {
      "version": "7.28.6",
      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@noble/curves": {
      "version": "1.9.7",
      "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@noble/hashes": "1.8.0"
      },
      "engines": {
        "node": "^14.21.3 || >=16"
      },
      "funding": {
        "url": "https://paulmillr.com/funding/"
      }
    },
    "node_modules/@noble/hashes": {
      "version": "1.8.0",
      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": "^14.21.3 || >=16"
      },
      "funding": {
        "url": "https://paulmillr.com/funding/"
      }
    },
    "node_modules/@solana/buffer-layout": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "buffer": "~6.0.3"
      },
      "engines": {
        "node": ">=5.10"
      }
    },
    "node_modules/@solana/buffer-layout-utils": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "Apache-2.0",
      "dependencies": {
        "@solana/buffer-layout": "^4.0.0",
        "@solana/web3.js": "^1.32.0",
        "bigint-buffer": "^1.1.5",
        "bignumber.js": "^9.0.1"
      },
      "engines": {
        "node": ">= 10"
      }
    },
    "node_modules/@solana/codecs": {
      "version": "2.0.0-rc.1",
      "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@solana/codecs-core": "2.0.0-rc.1",
        "@solana/codecs-data-structures": "2.0.0-rc.1",
        "@solana/codecs-numbers": "2.0.0-rc.1",
        "@solana/codecs-strings": "2.0.0-rc.1",
        "@solana/options": "2.0.0-rc.1"
      },
      "peerDependencies": {
        "typescript": ">=5"
      }
    },
    "node_modules/@solana/codecs-core": {
      "version": "2.0.0-rc.1",
      "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@solana/errors": "2.0.0-rc.1"
      },
      "peerDependencies": {
        "typescript": ">=5"
      }
    },
    "node_modules/@solana/codecs-data-structures": {
      "version": "2.0.0-rc.1",
      "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@solana/codecs-core": "2.0.0-rc.1",
        "@solana/codecs-numbers": "2.0.0-rc.1",
        "@solana/errors": "2.0.0-rc.1"
      },
      "peerDependencies": {
        "typescript": ">=5"
      }
    },
    "node_modules/@solana/codecs-numbers": {
      "version": "2.0.0-rc.1",
      "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@solana/codecs-core": "2.0.0-rc.1",
        "@solana/errors": "2.0.0-rc.1"
      },
      "peerDependencies": {
        "typescript": ">=5"
      }
    },
    "node_modules/@solana/codecs-strings": {
      "version": "2.0.0-rc.1",
      "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@solana/codecs-core": "2.0.0-rc.1",
        "@solana/codecs-numbers": "2.0.0-rc.1",
        "@solana/errors": "2.0.0-rc.1"
      },
      "peerDependencies": {
        "fastestsmallesttextencoderdecoder": "^1.0.22",
        "typescript": ">=5"
      }
    },
    "node_modules/@solana/errors": {
      "version": "2.0.0-rc.1",
      "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "chalk": "^5.3.0",
        "commander": "^12.1.0"
      },
      "bin": {
        "errors": "bin/cli.mjs"
      },
      "peerDependencies": {
        "typescript": ">=5"
      }
    },
    "node_modules/@solana/options": {
      "version": "2.0.0-rc.1",
      "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@solana/codecs-core": "2.0.0-rc.1",
        "@solana/codecs-data-structures": "2.0.0-rc.1",
        "@solana/codecs-numbers": "2.0.0-rc.1",
        "@solana/codecs-strings": "2.0.0-rc.1",
        "@solana/errors": "2.0.0-rc.1"
      },
      "peerDependencies": {
        "typescript": ">=5"
      }
    },
    "node_modules/@solana/spl-token": {
      "version": "0.4.14",
      "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.14.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "Apache-2.0",
      "dependencies": {
        "@solana/buffer-layout": "^4.0.0",
        "@solana/buffer-layout-utils": "^0.2.0",
        "@solana/spl-token-group": "^0.0.7",
        "@solana/spl-token-metadata": "^0.1.6",
        "buffer": "^6.0.3"
      },
      "engines": {
        "node": ">=16"
      },
      "peerDependencies": {
        "@solana/web3.js": "^1.95.5"
      }
    },
    "node_modules/@solana/spl-token-group": {
      "version": "0.0.7",
      "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "Apache-2.0",
      "dependencies": {
        "@solana/codecs": "2.0.0-rc.1"
      },
      "engines": {
        "node": ">=16"
      },
      "peerDependencies": {
        "@solana/web3.js": "^1.95.3"
      }
    },
    "node_modules/@solana/spl-token-metadata": {
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "Apache-2.0",
      "dependencies": {
        "@solana/codecs": "2.0.0-rc.1"
      },
      "engines": {
        "node": ">=16"
      },
      "peerDependencies": {
        "@solana/web3.js": "^1.95.3"
      }
    },
    "node_modules/@solana/web3.js": {
      "version": "1.98.4",
      "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@babel/runtime": "^7.25.0",
        "@noble/curves": "^1.4.2",
        "@noble/hashes": "^1.4.0",
        "@solana/buffer-layout": "^4.0.1",
        "@solana/codecs-numbers": "^2.1.0",
        "agentkeepalive": "^4.5.0",
        "bn.js": "^5.2.1",
        "borsh": "^0.7.0",
        "bs58": "^4.0.1",
        "buffer": "6.0.3",
        "fast-stable-stringify": "^1.0.0",
        "jayson": "^4.1.1",
        "node-fetch": "^2.7.0",
        "rpc-websockets": "^9.0.2",
        "superstruct": "^2.0.2"
      }
    },
    "node_modules/@solana/web3.js/node_modules/@solana/codecs-core": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@solana/errors": "2.3.0"
      },
      "engines": {
        "node": ">=20.18.0"
      },
      "peerDependencies": {
        "typescript": ">=5.3.3"
      }
    },
    "node_modules/@solana/web3.js/node_modules/@solana/codecs-numbers": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@solana/codecs-core": "2.3.0",
        "@solana/errors": "2.3.0"
      },
      "engines": {
        "node": ">=20.18.0"
      },
      "peerDependencies": {
        "typescript": ">=5.3.3"
      }
    },
    "node_modules/@solana/web3.js/node_modules/@solana/errors": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "chalk": "^5.4.1",
        "commander": "^14.0.0"
      },
      "bin": {
        "errors": "bin/cli.mjs"
      },
      "engines": {
        "node": ">=20.18.0"
      },
      "peerDependencies": {
        "typescript": ">=5.3.3"
      }
    },
    "node_modules/@solana/web3.js/node_modules/commander": {
      "version": "14.0.3",
      "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">=20"
      }
    },
    "node_modules/@swc/helpers": {
      "version": "0.5.18",
      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "Apache-2.0",
      "dependencies": {
        "tslib": "^2.8.0"
      }
    },
    "node_modules/@types/connect": {
      "version": "3.4.38",
      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@types/node": "*"
      }
    },
    "node_modules/@types/node": {
      "version": "12.20.55",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/@types/uuid": {
      "version": "8.3.4",
      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/@types/ws": {
      "version": "7.4.7",
      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@types/node": "*"
      }
    },
    "node_modules/agentkeepalive": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "humanize-ms": "^1.2.1"
      },
      "engines": {
        "node": ">= 8.0.0"
      }
    },
    "node_modules/base-x": {
      "version": "3.0.11",
      "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "safe-buffer": "^5.0.1"
      }
    },
    "node_modules/base64-js": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
      "integrity": [REDACTED_SECRET],
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/feross"
        },
        {
          "type": "patreon",
          "url": "https://www.patreon.com/feross"
        },
        {
          "type": "consulting",
          "url": "https://feross.org/support"
        }
      ],
      "license": "MIT"
    },
    "node_modules/bigint-buffer": {
      "version": "1.1.5",
      "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz",
      "integrity": [REDACTED_SECRET],
      "hasInstallScript": true,
      "license": "Apache-2.0",
      "dependencies": {
        "bindings": "^1.3.0"
      },
      "engines": {
        "node": ">= 10.0.0"
      }
    },
    "node_modules/bignumber.js": {
      "version": "9.3.1",
      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": "*"
      }
    },
    "node_modules/bindings": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "file-uri-to-path": "1.0.0"
      }
    },
    "node_modules/bn.js": {
      "version": "5.2.2",
      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/borsh": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "Apache-2.0",
      "dependencies": {
        "bn.js": "^5.2.0",
        "bs58": "^4.0.0",
        "text-encoding-utf-8": "^1.0.2"
      }
    },
    "node_modules/bs58": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "base-x": "^3.0.2"
      }
    },
    "node_modules/buffer": {
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/feross"
        },
        {
          "type": "patreon",
          "url": "https://www.patreon.com/feross"
        },
        {
          "type": "consulting",
          "url": "https://feross.org/support"
        }
      ],
      "license": "MIT",
      "dependencies": {
        "base64-js": "^1.3.1",
        "ieee754": "^1.2.1"
      }
    },
    "node_modules/bufferutil": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "hasInstallScript": true,
      "license": "MIT",
      "optional": true,
      "dependencies": {
        "node-gyp-build": "^4.3.0"
      },
      "engines": {
        "node": ">=6.14.2"
      }
    },
    "node_modules/chalk": {
      "version": "5.6.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": "^12.17.0 || ^14.13 || >=16.0.0"
      },
      "funding": {
        "url": "https://github.com/chalk/chalk?sponsor=1"
      }
    },
    "node_modules/commander": {
      "version": "12.1.0",
      "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/delay": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/es6-promise": {
      "version": "4.2.8",
      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/es6-promisify": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "es6-promise": "^4.0.3"
      }
    },
    "node_modules/eventemitter3": {
      "version": "5.0.4",
      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/eyes": {
      "version": "0.1.8",
      "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
      "integrity": [REDACTED_SECRET],
      "engines": {
        "node": "> 0.1.90"
      }
    },
    "node_modules/fast-stable-stringify": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/fastestsmallesttextencoderdecoder": {
      "version": "1.0.22",
      "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "CC0-1.0",
      "peer": true
    },
    "node_modules/file-uri-to-path": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/humanize-ms": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "ms": "^2.0.0"
      }
    },
    "node_modules/ieee754": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
      "integrity": [REDACTED_SECRET],
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/feross"
        },
        {
          "type": "patreon",
          "url": "https://www.patreon.com/feross"
        },
        {
          "type": "consulting",
          "url": "https://feross.org/support"
        }
      ],
      "license": "BSD-3-Clause"
    },
    "node_modules/isomorphic-ws": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "peerDependencies": {
        "ws": "*"
      }
    },
    "node_modules/jayson": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@types/connect": "^3.4.33",
        "@types/node": "^12.12.54",
        "@types/ws": "^7.4.4",
        "commander": "^2.20.3",
        "delay": "^5.0.0",
        "es6-promisify": "^5.0.0",
        "eyes": "^0.1.8",
        "isomorphic-ws": "^4.0.1",
        "json-stringify-safe": "^5.0.1",
        "stream-json": "^1.9.1",
        "uuid": "^8.3.2",
        "ws": "^7.5.10"
      },
      "bin": {
        "jayson": "bin/jayson.js"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/jayson/node_modules/commander": {
      "version": "2.20.3",
      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/json-stringify-safe": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "ISC"
    },
    "node_modules/ms": {
      "version": "2.1.3",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/node-fetch": {
      "version": "2.7.0",
      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
      "integrity": [REDACTED_SECRET],
      "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-gyp-build": {
      "version": "4.8.4",
      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
      "integrity": [REDACTED_SECRET],
      "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/rpc-websockets": {
      "version": "9.3.3",
      "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.3.3.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "LGPL-3.0-only",
      "dependencies": {
        "@swc/helpers": "^0.5.11",
        "@types/uuid": "^8.3.4",
        "@types/ws": "^8.2.2",
        "buffer": "^6.0.3",
        "eventemitter3": "^5.0.1",
        "uuid": "^8.3.2",
        "ws": "^8.5.0"
      },
      "funding": {
        "type": "paypal",
        "url": "https://paypal.me/kozjak"
      },
      "optionalDependencies": {
        "bufferutil": "^4.0.1",
        "utf-8-validate": "^5.0.2"
      }
    },
    "node_modules/rpc-websockets/node_modules/@types/ws": {
      "version": "8.18.1",
      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "@types/node": "*"
      }
    },
    "node_modules/rpc-websockets/node_modules/ws": {
      "version": "8.19.0",
      "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
      "integrity": [REDACTED_SECRET],
      "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/safe-buffer": {
      "version": "5.2.1",
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
      "integrity": [REDACTED_SECRET],
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/feross"
        },
        {
          "type": "patreon",
          "url": "https://www.patreon.com/feross"
        },
        {
          "type": "consulting",
          "url": "https://feross.org/support"
        }
      ],
      "license": "MIT"
    },
    "node_modules/stream-chain": {
      "version": "2.2.5",
      "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "BSD-3-Clause"
    },
    "node_modules/stream-json": {
      "version": "1.9.1",
      "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "BSD-3-Clause",
      "dependencies": {
        "stream-chain": "^2.2.5"
      }
    },
    "node_modules/superstruct": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">=14.0.0"
      }
    },
    "node_modules/text-encoding-utf-8": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "node_modules/tr46": {
      "version": "0.0.3",
      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/tslib": {
      "version": "2.8.1",
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "0BSD"
    },
    "node_modules/typescript": {
      "version": "5.9.3",
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "Apache-2.0",
      "peer": true,
      "bin": {
        "tsc": "bin/tsc",
        "tsserver": "bin/tsserver"
      },
      "engines": {
        "node": ">=14.17"
      }
    },
    "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": [REDACTED_SECRET],
      "hasInstallScript": true,
      "license": "MIT",
      "optional": true,
      "dependencies": {
        "node-gyp-build": "^4.3.0"
      },
      "engines": {
        "node": ">=6.14.2"
      }
    },
    "node_modules/uuid": {
      "version": "8.3.2",
      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "bin": {
        "uuid": "dist/bin/uuid"
      }
    },
    "node_modules/webidl-conversions": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "BSD-2-Clause"
    },
    "node_modules/whatwg-url": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "tr46": "~0.0.3",
        "webidl-conversions": "^3.0.0"
      }
    },
    "node_modules/ws": {
      "version": "7.5.10",
      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">=8.3.0"
      },
      "peerDependencies": {
        "bufferutil": "^4.0.1",
        "utf-8-validate": "^5.0.2"
      },
      "peerDependenciesMeta": {
        "bufferutil": {
          "optional": true
        },
        "utf-8-validate": {
          "optional": true
        }
      }
    }
  }
}


path: package.json
content: {
  "name": "solana-transfer",
  "version": "0.1.0",
  "description": "OpenClaw skill to send SOL and SPL tokens on Solana",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "node test.js"
  },
  "dependencies": {
    "@solana/web3.js": "^1.87.0",
    "@solana/spl-token": "^0.4.3"
  },
  "keywords": ["solana", "web3", "tokens", "blockchain"]
}


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector:  ()