diff --git a/README.md b/README.md
index 080cf55..0bd0139 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,11 @@ whoami Show current agent profile summary
wallet address Get agent wallet address
wallet balance Get all token balances
+wallet topup Get topup URL to add funds
+wallet send-transaction Send a raw transaction
+ --to
Recipient address (required)
+ --value Transaction value (default: 0)
+ --data Transaction calldata (default: 0x)
browse Search agents on the marketplace
@@ -113,6 +118,9 @@ acp job pay 123 --accept true --content 'Looks good, please proceed'
# Check wallet
acp wallet balance
+# Send a raw transaction
+acp wallet send-transaction --to "0x1234..." --value "1000" --data "0x"
+
# Launch a token
acp token launch MYAGENT "My agent token"
diff --git a/bin/acp.ts b/bin/acp.ts
index 6947566..9e3cef6 100755
--- a/bin/acp.ts
+++ b/bin/acp.ts
@@ -92,6 +92,10 @@ function buildHelp(): string {
cmd("wallet address", "Get agent wallet address"),
cmd("wallet balance", "Get all token balances"),
cmd("wallet topup", "Get topup URL to add funds"),
+ cmd("wallet send-transaction", "Send a raw transaction"),
+ flag("--to ", "Recipient address (required)"),
+ flag("--value ", "Transaction value (default: 0)"),
+ flag("--data ", "Transaction calldata (default: 0x)"),
"",
section("Token"),
cmd("token launch ", "Launch agent token"),
@@ -227,6 +231,11 @@ function buildCommandHelp(command: string): string | undefined {
"",
cmd("address", "Get your wallet address (Base chain)"),
cmd("balance", "Get all token balances in your wallet"),
+ cmd("topup", "Get topup URL to add funds"),
+ cmd("send-transaction", "Send a raw transaction"),
+ flag("--to ", "Recipient address (required)"),
+ flag("--value ", "Transaction value (default: 0)"),
+ flag("--data ", "Transaction calldata (default: 0x)"),
"",
].join("\n"),
@@ -596,6 +605,16 @@ async function main(): Promise {
if (subcommand === "address") return wallet.address();
if (subcommand === "balance") return wallet.balance();
if (subcommand === "topup") return wallet.topup();
+ if (subcommand === "send-transaction") {
+ const to = getFlagValue(rest, "--to");
+ const value = getFlagValue(rest, "--value") ?? "0";
+ const txData = getFlagValue(rest, "--data") ?? "0x";
+ if (!to) {
+ console.error("Error: --to is required");
+ process.exit(1);
+ }
+ return wallet.sendTransaction(to, value, txData);
+ }
console.log(buildCommandHelp("wallet"));
return;
}
diff --git a/src/commands/wallet.ts b/src/commands/wallet.ts
index 70c387c..04a79fd 100644
--- a/src/commands/wallet.ts
+++ b/src/commands/wallet.ts
@@ -1,7 +1,8 @@
// =============================================================================
-// acp wallet address — Get wallet address
-// acp wallet balance — Get token balances
-// acp wallet topup — Get topup URL
+// acp wallet address — Get wallet address
+// acp wallet balance — Get token balances
+// acp wallet topup — Get topup URL
+// acp wallet send-transaction — Send a raw transaction
// =============================================================================
import { getPaymentUrl } from "../lib/api.js";
@@ -102,3 +103,22 @@ export async function topup(): Promise {
output.fatal(`Failed to get topup URL: ${e instanceof Error ? e.message : String(e)}`);
}
}
+
+export async function sendTransaction(to: string, value: string, data: string): Promise {
+ try {
+ const res = await client.post("/acp/wallets/send-transaction", { to, value, data });
+
+ output.output(res.data, (res) => {
+ output.heading("Send Transaction");
+ output.field("To", to);
+ output.field("Value", value);
+ output.field("Data", data);
+ if (res?.data?.txHash) {
+ output.field("Tx Hash", res.data.txHash);
+ }
+ output.log("");
+ });
+ } catch (e) {
+ output.fatal(`Failed to send transaction: ${e instanceof Error ? e.message : String(e)}`);
+ }
+}