Back to skill

Security audit

mintyouragent

Security checks for vulnerabilities and agentic risk

Overview

This Solana wallet skill largely matches its stated purpose, but it handles real-money transactions and wallet/profile data with enough under-scoped security controls that users should review it carefully before installing.

Install only with a dedicated low-balance wallet, test on devnet first, avoid `--yes`, headless, AI, custom endpoints, and SSL-disable settings for value-bearing actions, and treat `wallet.json`, `RECOVERY_KEY.txt`, backups, and console/JSON key output as full wallet-control secrets. Do not link soul/profile data unless you are comfortable associating the derived agent identity summary with the wallet and MintYourAgent service.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (5)

T09 · Insecure Skill Coding Practices

Error
Location
mya.py:1442
Finding
Server-Controlled Financial Transactions Are Signed Without Semantic Validation<![CDATA[ ## Vulnerability Details **File Location**: `mya.py:1442-1452`, `mya.py:2673-2681`, `mya.py:3552-3562`, `mya.py:3709-3717`, `mya.py:4177-4192`, `mya.py:4269-4284`, `mya.py:4441-4453` **Vulnerability Type**: Insufficient validation of remotely supplied transactions before signing **Risk Level**: Critical ### Vulnerable Code ```python def verify_transaction(tx_bytes: bytes, expected_signer: str) -> bool: try: tx = SoldersTransaction.from_bytes(tx_bytes) message = tx.message if not message.recent_blockhash or message.recent_blockhash == Hash.default(): Output.error("Transaction missing blockhash") return False if not any(str(acc) == expected_signer for acc in message.account_keys): Output.error("Transaction missing signer") return False return True except Exception as e: Output.error("Transaction verification failed") log_error(f"TX verify: {e}") return False ``` The launch workflow signs the remotely returned transaction after applying only the weak check above: ```python tx_bytes = base64.b64decode(prepare_result.data["transaction"]) mint_address = prepare_result.data["mintAddress"] if not verify_transaction(tx_bytes, creator_address): Output.error("Transaction verification failed") sys.exit(ExitCode.SECURITY_ERROR) tx = SoldersTransaction.from_bytes(tx_bytes) tx.sign([keypair], tx.message.recent_blockhash) signed_tx_b64 = base64.b64encode(bytes(tx)).decode() ``` Poker escrow workflows do not perform even this limited validation: ```python if escrow and escrow.get('unsignedTx'): print("Signing escrow deposit transaction...") try: tx_bytes = base64.b64decode(escrow['unsignedTx']) tx = SoldersTransaction.from_bytes(tx_bytes) signed_tx = wallet.sign_transaction(tx) signed_b64 = base64.b64encode(bytes(signed_tx)).decode('utf-8') with Spinner("Confirming on-chain deposit..."): ...[truncated 3224 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Prefer constructing all financial transactions locally from reviewed instruction builders. 2. If remote transaction construction is unavoidable, decode every instruction before signing and enforce an operation-specific allowlist. 3. For token launches, verify: - Exact program IDs and instruction discriminators. - Expected creator, mint, treasury, pump.fun, token, and metadata accounts. - Exact platform fee and maximum initial-buy amount. - Fee payer and required signer positions. - Absence of unexpected transfers, delegates, account closures, or authority changes. 4. For poker deposits, independently derive and verify the escrow PDA, game identifier, recipient, program ID, and exact buy-in amount. 5. Compute the transaction's maximum wallet debit and reject anything above the confirmed amount plus a narrowly bounded network fee. 6. Display a decoded transaction summary and require confirmation immediately before signing. 7. Do not treat the wallet's mere presence in `account_keys` as proof that a transaction is safe. 8. Add adversarial tests using transactions containing extra transfer, delegate, authority-change, and account-close instructions. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
mya.py:2790
Finding
Agent Memory and User Context Files Are Read Beyond the Declared SOUL.md Scope<![CDATA[ ## Vulnerability Details **File Location**: `mya.py:2790-2831`, `mya.py:2848-2890`, `mya.py:2960-3031` **Vulnerability Type**: Excessive access to Agent identity and memory files **Risk Level**: Medium ### Vulnerable Code ```python # Common Clawdbot identity files SOUL_FILES = [ "SOUL.md", "IDENTITY.md", "USER.md", "MEMORY.md", "AGENTS.md", ] # Find workspace root (look for SOUL.md or .git) workspace = None search_paths = [ Path.home() / "clawd", Path.home() / ".clawdbot", ] clawdbot_ws = os.environ.get("CLAWDBOT_WORKSPACE", "") if clawdbot_ws: search_paths.append(Path(clawdbot_ws)) for path in search_paths: if path.exists() and (path / "SOUL.md").exists(): workspace = path break # Read available files collected = {} for filename in SOUL_FILES: filepath = workspace / filename if filepath.exists(): try: content = filepath.read_text(encoding='utf-8') collected[filename] = content print(f"✓ Found {filename} ({len(content)} chars)") except Exception as e: print(f"⚠ Could not read {filename}: {e}") ``` The derived data can subsequently be included in a remote request: ```python link_payload = { "wallet": pubkey, "challenge": challenge, "signature": sig_b64, } if soul_data: link_payload["soul"] = soul_data resp = api_request( "POST", f"{api_url}/agent/link", json=link_payload ) ``` ### Technical Analysis The Skill metadata declares that it reads Agent personality files identified as `SOUL.md`. The implementation expands this access to `IDENTITY.md`, `USER.md`, `MEMORY.md`, and `AGENTS.md` under known home-directory workspace locations. These files can contain private user context, long-term Agent memory, operational instructions, capability descriptions, and personal identity details. The process reads each file in full before deriving a summary. Derived identity fields, section titles, personalit ...[truncated 1599 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Restrict default file access to `SOUL.md`. 2. Require explicit, per-file user consent before reading `IDENTITY.md`, `USER.md`, `MEMORY.md`, or `AGENTS.md`. 3. Display the exact paths and fields that will be accessed before reading them. 4. Parse only the minimum required sections instead of loading full files into memory. 5. Show the complete derived payload and require confirmation immediately before network submission. 6. Separate local extraction from remote linking so extraction never implicitly prepares data for upload. 7. Document every source file and every transmitted field in `SKILL.md` and `README.md`. 8. Apply restrictive permissions such as `0600` to `soul_extract.json` if it is retained. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
mya.py:1218
Finding
Wallet Private Key Is Duplicated in Plaintext Files<![CDATA[ ## Vulnerability Details **File Location**: `mya.py:1218-1239`, `mya.py:1627-1633` **Vulnerability Type**: Plaintext storage and duplication of wallet credentials **Risk Level**: Medium ### Vulnerable Code ```python keypair_bytes = bytes(keypair) checksum = compute_wallet_checksum(keypair_bytes) wallet_data = { "bytes": list(keypair_bytes), "checksum": checksum, "created": datetime.utcnow().isoformat() + "Z", "version": Constants.VERSION, } lock_file = wallet_file.with_suffix('.lock') lock_fd = acquire_file_lock(lock_file) try: temp_file = wallet_file.with_suffix('.tmp') with open(temp_file, 'w', encoding='utf-8') as f: json.dump(wallet_data, f, indent=2) os.chmod(temp_file, 0o600) temp_file.rename(wallet_file) ``` The same key is also written in Base58 form to a recovery file: ```python with open(recovery_file, 'w', encoding='utf-8') as f: f.write(f"Wallet Address: {address}\n\n") f.write("Signing Key (Base58):\n") f.write(b58_encode(bytes(keypair)) + "\n\n") f.write("KEEP THIS FILE SECURE - DO NOT SHARE!\n") f.write(f"\nGenerated: {datetime.now().isoformat()}\n") os.chmod(recovery_file, 0o600) ``` ### Technical Analysis The wallet file contains the raw keypair bytes as a JSON integer array. `RECOVERY_KEY.txt` contains the same private key encoded with Base58. Base58 is an encoding, not encryption. The checksum only detects accidental or unauthorized modification; it does not provide confidentiality or authenticated storage. File mode `0600` is useful hardening but does not protect against processes running as the same user, malware, accidental backup synchronization, archive leakage, or disclosure through support bundles. Creating two plaintext copies expands the credential exposure surface. Backup functionality can create additional plaintext copies of `wallet.json`. ### Attack Path 1. An attacker gains read access as the same operating-system user, compromises a backup destina ...[truncated 771 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Store the private key in an operating-system credential store or hardware-backed key service where available. 2. Otherwise, use a standard encrypted keystore format with a user-supplied passphrase and a memory-hard KDF such as Argon2id or scrypt. 3. Do not create `RECOVERY_KEY.txt` automatically. Make plaintext export an explicit, separately confirmed operation. 4. Warn users before exporting keys to terminals, JSON output, or files. 5. Encrypt backups independently and avoid copying unencrypted wallet files. 6. Preserve restrictive directory and file permissions as defense in depth. 7. Document that checksums provide integrity only and do not protect key confidentiality. ]]>

other

Note
Location
mya.py:2424
Finding
Token Metadata Is Silently Modified to Add Platform Advertising<![CDATA[ ## Vulnerability Details **File Location**: `mya.py:2424-2427` **Vulnerability Type**: Undisclosed output manipulation **Risk Level**: Low ### Vulnerable Code ```python # Append branding to description branding = "\n\nLaunched via mintyouragent.com" if branding.strip().lower() not in description.lower(): description = description.rstrip() + branding ``` ### Technical Analysis The CLI modifies every supplied token description by appending MintYourAgent promotional text. The documented `--description` parameter is presented as user-controlled, but the documentation does not disclose that the value will be altered. Token metadata is uploaded to IPFS and referenced by an on-chain token launch. Consequently, this modification can become effectively permanent and publicly associated with the user's wallet. ### Attack Path 1. A user supplies an intended token description. 2. The CLI sanitizes the description and silently appends `Launched via mintyouragent.com`. 3. The modified description is uploaded as token metadata. 4. The resulting metadata URI is used during token creation. 5. Public token metadata differs from the content the user intended to publish. ### Impact Assessment The issue does not provide system-level privileges, but it violates user intent and causes undisclosed publication of platform advertising. The affected scope is every token description created through this launch path. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove automatic branding from user-supplied metadata. 2. If branding is desired, add an explicit opt-in option such as `--include-branding`. 3. Show the complete final description during preview and confirmation. 4. Document any metadata transformations in `SKILL.md` and `README.md`. 5. Add tests ensuring the submitted description exactly matches the confirmed description. ]]>

T08 · Insecure Dependencies

Note
Location
requirements.txt:5
Finding
Security-Critical Dependencies Are Installed Without Reproducible Version Pins<![CDATA[ ## Vulnerability Details **File Location**: `requirements.txt:5-6`, `SKILL.md:25`, `README.md:29` **Vulnerability Type**: Unpinned third-party dependencies in a wallet-signing application **Risk Level**: Low ### Vulnerable Code ```text # Required solders>=0.20.0 requests>=2.28.0 ``` The installation instructions bypass even these lower bounds: ```bash pip install solders requests ``` ### Technical Analysis The dependencies use open-ended lower bounds, and the primary installation instructions request the latest available releases. This does not provide a reproducible dependency set and allows future releases to enter the wallet-handling environment without project-specific review. No dependency confusion or typosquatting was identified: the package names are consistent across the project. The risk arises from unrestricted future versions, supply-chain compromise, and incompatible behavioral changes in packages responsible for transaction parsing, signing, and network communication. ### Attack Path 1. A dependency account, release pipeline, or package-distribution channel is compromised, or a future release introduces a security regression. 2. A user follows the documented installation command. 3. Package resolution selects the affected release because no exact version or hash is required. 4. Package installation or runtime code executes in the same environment as `mya.py`. 5. The compromised component can access wallet data, alter transaction handling, or intercept network requests. ### Impact Assessment A compromised dependency executes with the privileges of the user running the CLI. It may read plaintext wallet files, observe private keys in process memory, alter signed transactions, or access other same-user files. Because the application handles real-money wallet credentials and transactions, a dependency compromise can result in wallet theft even though this finding is primarily a supply-chain hardening deficiency. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin exact, reviewed versions of all required and optional dependencies. 2. Generate and publish cryptographic hashes for every package and transitive dependency. 3. Install with `pip --require-hashes`. 4. Maintain a lock file generated from a controlled build process. 5. Ensure all installation documentation uses the locked requirements file rather than direct package names. 6. Add automated dependency vulnerability and provenance scanning. 7. Review and deliberately update dependency pins instead of accepting arbitrary future releases. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Rogue AgentSelf-Modification, Session Persistence
Findings (54)

Intent-Code Divergence

High
Confidence
96% confidence
Finding
The statement that listed data is 'LOCAL only - never transmitted' is contradicted by the skill's own documented networked features, including token launches, linking profiles, transfers, poker escrow interactions, and signed/API requests. Misrepresenting transmission boundaries is dangerous because users may store wallet material, audit data, or profile content under the false belief that none of it can influence network operations or be derived into outbound requests.

Credential Access

High
Category
Privilege Escalation
Content
- 3.0.2: Bug fixes
- 3.0.1: Terminology cleanup for security scanner compatibility
- 3.0.0: All 200 issues fixed - complete CLI with all commands
- 2.3.0: All flags (issues 57-100), .env support, network selection
- 2.2.0: Security hardening (issues 17-56), type hints, retry logic
- 2.1.0: Secure local signing, first-launch tips, AI initial-buy
"""
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
- 3.0.2: Bug fixes
- 3.0.1: Terminology cleanup for security scanner compatibility
- 3.0.0: All 200 issues fixed - complete CLI with all commands
- 2.3.0: All flags (issues 57-100), .env support, network selection
- 2.2.0: Security hardening (issues 17-56), type hints, retry logic
- 2.1.0: Secure local signing, first-launch tips, AI initial-buy
"""
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
- 3.0.2: Bug fixes
- 3.0.1: Terminology cleanup for security scanner compatibility
- 3.0.0: All 200 issues fixed - complete CLI with all commands
- 2.3.0: All flags (issues 57-100), .env support, network selection
- 2.2.0: Security hardening (issues 17-56), type hints, retry logic
- 2.1.0: Secure local signing, first-launch tips, AI initial-buy
"""
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
- 3.0.2: Bug fixes
- 3.0.1: Terminology cleanup for security scanner compatibility
- 3.0.0: All 200 issues fixed - complete CLI with all commands
- 2.3.0: All flags (issues 57-100), .env support, network selection
- 2.2.0: Security hardening (issues 17-56), type hints, retry logic
- 2.1.0: Secure local signing, first-launch tips, AI initial-buy
"""
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
- 3.0.2: Bug fixes
- 3.0.1: Terminology cleanup for security scanner compatibility
- 3.0.0: All 200 issues fixed - complete CLI with all commands
- 2.3.0: All flags (issues 57-100), .env support, network selection
- 2.2.0: Security hardening (issues 17-56), type hints, retry logic
- 2.1.0: Secure local signing, first-launch tips, AI initial-buy
"""
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
- 3.0.2: Bug fixes
- 3.0.1: Terminology cleanup for security scanner compatibility
- 3.0.0: All 200 issues fixed - complete CLI with all commands
- 2.3.0: All flags (issues 57-100), .env support, network selection
- 2.2.0: Security hardening (issues 17-56), type hints, retry logic
- 2.1.0: Secure local signing, first-launch tips, AI initial-buy
"""
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
- 3.0.2: Bug fixes
- 3.0.1: Terminology cleanup for security scanner compatibility
- 3.0.0: All 200 issues fixed - complete CLI with all commands
- 2.3.0: All flags (issues 57-100), .env support, network selection
- 2.2.0: Security hardening (issues 17-56), type hints, retry logic
- 2.1.0: Secure local signing, first-launch tips, AI initial-buy
"""
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
AccountMeta(TOKEN_PROGRAM_ID, is_signer=False, is_writable=False),   # token program
    ]
    
    return Instruction(ASSOCIATED_TOKEN_PROGRAM_ID, bytes(), accounts)


def build_transfer_instruction(from_pubkey: Pubkey, to_pubkey: Pubkey, lamports: int) -> Instruction:
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
AccountMeta(TOKEN_PROGRAM_ID, is_signer=False, is_writable=False),   # token program
    ]
    
    return Instruction(ASSOCIATED_TOKEN_PROGRAM_ID, bytes(), accounts)


def build_transfer_instruction(from_pubkey: Pubkey, to_pubkey: Pubkey, lamports: int) -> Instruction:
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
AccountMeta(TOKEN_PROGRAM_ID, is_signer=False, is_writable=False),   # token program
    ]
    
    return Instruction(ASSOCIATED_TOKEN_PROGRAM_ID, bytes(), accounts)


def build_transfer_instruction(from_pubkey: Pubkey, to_pubkey: Pubkey, lamports: int) -> Instruction:
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
AccountMeta(TOKEN_PROGRAM_ID, is_signer=False, is_writable=False),   # token program
    ]
    
    return Instruction(ASSOCIATED_TOKEN_PROGRAM_ID, bytes(), accounts)


def build_transfer_instruction(from_pubkey: Pubkey, to_pubkey: Pubkey, lamports: int) -> Instruction:
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
AccountMeta(TOKEN_PROGRAM_ID, is_signer=False, is_writable=False),   # token program
    ]
    
    return Instruction(ASSOCIATED_TOKEN_PROGRAM_ID, bytes(), accounts)


def build_transfer_instruction(from_pubkey: Pubkey, to_pubkey: Pubkey, lamports: int) -> Instruction:
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Credential Access

High
Category
Privilege Escalation
Content
_runtime = config


# ============== .ENV SUPPORT ==============

# Only load these vars from .env — all others are ignored
ALLOWED_ENV_VARS = {"SOUL_API_URL", "SOUL_SSL_VERIFY", "HELIUS_RPC", "SOLANA_RPC_URL"}
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
"""Load .env file (whitelisted vars only)."""
    env_vars: Dict[str, str] = {}
    search_paths = [path] if path else []
    search_paths.extend([Path.home() / ".mintyouragent" / ".env"])

    for env_path in search_paths:
        if env_path and env_path.exists():
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Ssd 3

High
Confidence
99% confidence
Finding
The setup flow intentionally prints the full private signing key and writes recovery key material in plaintext to disk as part of normal operation. In an agent or shared-console environment, this creates a direct secret disclosure path through stdout, logs, terminal history, screenshots, or downstream tooling that captures command output.

Ssd 3

High
Confidence
99% confidence
Finding
The wallet export/show-key command is a built-in secret exfiltration primitive that reveals the complete signing key on demand. In a skill ecosystem, any natural-language instruction or automation that triggers this path can leak full wallet control and permanently compromise funds.

Missing User Warnings

High
Confidence
98% confidence
Finding
Unsigned deposit transactions returned by the server are signed in poker join/create/reload flows without transaction decoding, human-readable review, or explicit user confirmation. A compromised or malicious API could supply a transaction that transfers more funds or performs unrelated actions, and the local wallet would sign it blindly.

Session Persistence

Medium
Category
Rogue Agent
Content
### Added
- **Poker**: Heads-up Texas Hold'em with real SOL stakes via on-chain escrow
- **Soul/Link**: Extract agent personality (SOUL.md) and link identity to mintyouragent.com
- **Native Launches**: Bundled create + buy transactions via pump.fun (atomic, like the webapp)
- **Balance Validation**: Pre-launch check ensures sufficient SOL before spending
- **Preflight Checks**: Server-side rate limit validation before launch transactions
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The README promotes launching tokens and playing poker with real SOL but does not prominently warn that these actions can spend real funds and trigger irreversible on-chain transactions. In an AI-agent context, this omission is more dangerous because agents or operators may treat the tool as routine automation and enable value-bearing actions without appreciating the financial risk.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| `--network` | mainnet/devnet/testnet |
| `--verbose` | Verbose logging |
| `--debug` | Debug mode |
| `-y, --yes` | Skip confirmation prompts |

## Wallet Storage
Confidence
85% confidence
Finding
Documenting a --yes flag that skips confirmation prompts is risky in a tool that can transfer SOL, launch tokens, and join or create real-money poker games. In this skill context, removing human confirmation lowers the barrier to accidental or autonomous financial actions, especially when combined with JSON/headless agent workflows.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The wallet storage section lists wallet.json and RECOVERY_KEY.txt locations but does not clearly state that anyone who obtains these files may fully control the wallet and steal funds. This is particularly risky in an agent skill because automated deployments often run on shared hosts, developer workstations, or CI-like environments where home-directory secrets may be exposed or backed up insecurely.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill documents capabilities that imply shell, filesystem, environment, and network access, but it does not declare any explicit tool scope or permission boundaries. In an agent setting, this weakens reviewability and can cause the runtime to grant broader powers than users expect, increasing the chance of unsafe execution involving wallet files, API keys, or fund-moving commands.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The transfer command is presented without warning that it moves funds irreversibly on-chain. In an agent-operated wallet, undocumented irreversibility increases the risk of user confusion, accidental transfers, or automation performing value-bearing actions without adequate review.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
An uninstall command that removes all data is documented without a prominent warning about irreversible deletion of wallet-related files, backups, logs, and recovery material. In an agent context, especially with support for non-interactive flags, this can lead to accidental or automated destruction of critical assets and loss of access.

Static analysis

No suspicious patterns detected.