openclaw-arcade-plugin 0.2.40 → 0.2.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,145 +2,149 @@
2
2
  import debug from "debug";
3
3
  var log = debug("openclaw:plugin:arcade");
4
4
  var isInitialized = false;
5
- function register(api) {
6
- const version = "0.2.40";
7
- if (isInitialized) return;
8
- isInitialized = true;
9
- const config = api.pluginConfig || {};
10
- const net = config.network || "mainnet";
11
- const defaultUrl = net === "testnet" ? "https://testnet.arc.gorillapool.io" : "https://arc.gorillapool.io";
12
- const url = (config.arcadeUrl || defaultUrl).replace(/\/$/, "");
13
- api.logger.info(`[arcade] Initializing Arcade Plugin v${version}`);
14
- api.registerOnboarding({
15
- id: "arcade-setup",
16
- title: "Arcade Setup",
17
- description: "Configuring transaction broadcasting and lifecycle tracking",
18
- handler: async () => {
19
- return { success: true, message: "Arcade broadcaster ready." };
20
- }
21
- });
22
- api.registerTool({
23
- name: "arcade",
24
- description: "Submit and track BSV transactions with full lifecycle visibility",
25
- parameters: {
26
- type: "object",
27
- properties: {
28
- action: {
29
- type: "string",
30
- enum: ["broadcast", "status", "proof", "config"],
31
- description: "Action to perform"
32
- },
33
- txhex: {
34
- type: "string",
35
- description: "Hex-encoded raw transaction to broadcast"
5
+ var index_default = {
6
+ id: "openclaw-arcade-plugin",
7
+ name: "BSV Arcade Broadcaster",
8
+ description: "Submit and track BSV transactions with full lifecycle visibility",
9
+ async register(api) {
10
+ const version = "0.2.42";
11
+ const config = api.pluginConfig || {};
12
+ const net = config.network || "mainnet";
13
+ const defaultUrl = net === "testnet" ? "https://testnet.arc.gorillapool.io" : "https://arc.gorillapool.io";
14
+ const url = (config.arcadeUrl || defaultUrl).replace(/\/$/, "");
15
+ if (isInitialized) return;
16
+ isInitialized = true;
17
+ api.logger.info(`[arcade] Initializing Arcade Plugin v${version}`);
18
+ api.registerOnboarding({
19
+ id: "arcade-setup",
20
+ title: "Arcade Setup",
21
+ description: "Configuring transaction broadcasting and lifecycle tracking",
22
+ handler: async () => {
23
+ return { success: true, message: "Arcade broadcaster ready." };
24
+ }
25
+ });
26
+ api.registerTool({
27
+ name: "arcade",
28
+ description: "Submit and track BSV transactions with full lifecycle visibility",
29
+ parameters: {
30
+ type: "object",
31
+ properties: {
32
+ action: {
33
+ type: "string",
34
+ enum: ["broadcast", "status", "proof", "config"],
35
+ description: "Action to perform"
36
+ },
37
+ txhex: {
38
+ type: "string",
39
+ description: "Hex-encoded raw transaction to broadcast"
40
+ },
41
+ txid: {
42
+ type: "string",
43
+ description: "Transaction ID to track or fetch proof for"
44
+ }
36
45
  },
37
- txid: {
38
- type: "string",
39
- description: "Transaction ID to track or fetch proof for"
40
- }
46
+ required: ["action"]
41
47
  },
42
- required: ["action"]
43
- },
44
- async execute(_id, params) {
45
- log("Executing tool action: %s with params: %O", params.action, params);
46
- try {
47
- const { action, txhex, txid } = params;
48
- switch (action) {
49
- case "broadcast":
50
- if (!txhex) throw new Error("txhex is required for broadcast");
51
- log("Broadcasting transaction: %s...", txhex.slice(0, 64));
52
- const bResp = await fetch(`${url}/v1/tx`, {
53
- method: "POST",
54
- headers: { "Content-Type": "application/json" },
55
- body: JSON.stringify({ rawTx: txhex })
56
- });
57
- const bData = await bResp.json();
58
- if (!bResp.ok) {
59
- log("Broadcast failed: %O", bData);
60
- throw new Error(`Broadcast failed: ${JSON.stringify(bData)}`);
61
- }
62
- log("Broadcast successful, TXID: %s", bData.txid);
63
- return { content: [{ type: "text", text: `Transaction broadcasted! TXID: ${bData.txid}
48
+ async execute(_id, params) {
49
+ log("Executing tool action: %s with params: %O", params.action, params);
50
+ try {
51
+ const { action, txhex, txid } = params;
52
+ switch (action) {
53
+ case "broadcast":
54
+ if (!txhex) throw new Error("txhex is required for broadcast");
55
+ log("Broadcasting transaction: %s...", txhex.slice(0, 64));
56
+ const bResp = await fetch(`${url}/v1/tx`, {
57
+ method: "POST",
58
+ headers: { "Content-Type": "application/json" },
59
+ body: JSON.stringify({ rawTx: txhex })
60
+ });
61
+ const bData = await bResp.json();
62
+ if (!bResp.ok) {
63
+ log("Broadcast failed: %O", bData);
64
+ throw new Error(`Broadcast failed: ${JSON.stringify(bData)}`);
65
+ }
66
+ log("Broadcast successful, TXID: %s", bData.txid);
67
+ return { content: [{ type: "text", text: `Transaction broadcasted! TXID: ${bData.txid}
64
68
  Status: ${bData.txStatus}` }] };
65
- case "status":
66
- if (!txid) throw new Error("txid is required for status check");
67
- log("Checking status for TXID: %s", txid);
68
- const sResp = await fetch(`${url}/v1/tx/${txid}`);
69
- const sData = await sResp.json();
70
- if (!sResp.ok) {
71
- log("Status check failed: %O", sData);
72
- throw new Error(`Status check failed: ${JSON.stringify(sData)}`);
73
- }
74
- log("Status: %s, Block: %s", sData.txStatus, sData.blockHeight);
75
- return { content: [{ type: "text", text: `Transaction ${txid}:
69
+ case "status":
70
+ if (!txid) throw new Error("txid is required for status check");
71
+ log("Checking status for TXID: %s", txid);
72
+ const sResp = await fetch(`${url}/v1/tx/${txid}`);
73
+ const sData = await sResp.json();
74
+ if (!sResp.ok) {
75
+ log("Status check failed: %O", sData);
76
+ throw new Error(`Status check failed: ${JSON.stringify(sData)}`);
77
+ }
78
+ log("Status: %s, Block: %s", sData.txStatus, sData.blockHeight);
79
+ return { content: [{ type: "text", text: `Transaction ${txid}:
76
80
  Status: ${sData.txStatus}
77
81
  Block: ${sData.blockHeight || "Pending"}` }] };
78
- case "proof":
79
- if (!txid) throw new Error("txid is required for proof retrieval");
80
- log("Fetching proof for TXID: %s", txid);
81
- const pResp = await fetch(`${url}/v1/tx/${txid}/proof`);
82
- if (!pResp.ok) {
83
- log("Proof retrieval failed: %d", pResp.status);
84
- throw new Error(`Proof retrieval failed: ${pResp.status}`);
85
- }
86
- const pData = await pResp.arrayBuffer();
87
- const base64Proof = Buffer.from(pData).toString("base64");
88
- log("Proof retrieved, length: %d bytes", pData.byteLength);
89
- return { content: [{ type: "text", text: `Merkle Proof (Base64): ${base64Proof}` }] };
90
- case "config":
91
- return { content: [{ type: "text", text: `Arcade Configuration:
82
+ case "proof":
83
+ if (!txid) throw new Error("txid is required for proof retrieval");
84
+ log("Fetching proof for TXID: %s", txid);
85
+ const pResp = await fetch(`${url}/v1/tx/${txid}/proof`);
86
+ if (!pResp.ok) {
87
+ log("Proof retrieval failed: %d", pResp.status);
88
+ throw new Error(`Proof retrieval failed: ${pResp.status}`);
89
+ }
90
+ const pData = await pResp.arrayBuffer();
91
+ const base64Proof = Buffer.from(pData).toString("base64");
92
+ log("Proof retrieved, length: %d bytes", pData.byteLength);
93
+ return { content: [{ type: "text", text: `Merkle Proof (Base64): ${base64Proof}` }] };
94
+ case "config":
95
+ return { content: [{ type: "text", text: `Arcade Configuration:
92
96
  URL: ${url}
93
97
  Network: ${net}` }] };
94
- default:
95
- throw new Error(`Unknown action: ${action}`);
98
+ default:
99
+ throw new Error(`Unknown action: ${action}`);
100
+ }
101
+ } catch (error) {
102
+ return {
103
+ content: [{
104
+ type: "text",
105
+ text: `Error: ${error.message || String(error)}`
106
+ }]
107
+ };
96
108
  }
97
- } catch (error) {
98
- return {
99
- content: [{
100
- type: "text",
101
- text: `Error: ${error.message || String(error)}`
102
- }]
103
- };
104
109
  }
105
- }
106
- });
107
- api.registerCommand({
108
- name: "arcade",
109
- description: "BSV transaction tracking commands",
110
- acceptsArgs: true,
111
- handler: async (ctx) => {
112
- try {
113
- api.logger?.info?.(`[openclaw-arcade] Command received with args: ${JSON.stringify(ctx.args)} (type: ${typeof ctx.args})`);
114
- const args = Array.isArray(ctx.args) ? ctx.args : typeof ctx.args === "string" ? ctx.args.split(" ").filter(Boolean) : [];
115
- const action = args[0] || "config";
116
- const params = { action };
117
- if (action === "help") {
118
- return { text: `\u{1F6E1}\uFE0F **Arcade Help**
110
+ });
111
+ api.registerCommand({
112
+ name: "arcade",
113
+ description: "BSV transaction tracking commands",
114
+ acceptsArgs: true,
115
+ handler: async (ctx) => {
116
+ try {
117
+ api.logger?.info?.(`[openclaw-arcade] Command received with args: ${JSON.stringify(ctx.args)} (type: ${typeof ctx.args})`);
118
+ const args = Array.isArray(ctx.args) ? ctx.args : typeof ctx.args === "string" ? ctx.args.split(" ").filter(Boolean) : [];
119
+ const action = args[0] || "config";
120
+ const params = { action };
121
+ if (action === "help") {
122
+ return { text: `\u{1F6E1}\uFE0F **Arcade Help**
119
123
 
120
124
  **Subcommands**:
121
125
  - \`status <txid>\`: Check broadcast status
122
126
  - \`broadcast <hex>\`: Send raw transaction
123
127
  - \`proof <txid>\`: Fetch Merkle Proof
124
128
  - \`config\`: Show active URL` };
125
- }
126
- if (action === "status" && args[1]) params.txid = args[1];
127
- if (action === "broadcast" && args[1]) params.txhex = args[1];
128
- if (action === "status" && params.txid) {
129
- const res = await fetch(`${url}/v1/tx/${params.txid}`);
130
- const data = await res.json();
131
- return { text: `\u{1F6E1}\uFE0F **Transaction Status**
129
+ }
130
+ if (action === "status" && args[1]) params.txid = args[1];
131
+ if (action === "broadcast" && args[1]) params.txhex = args[1];
132
+ if (action === "status" && params.txid) {
133
+ const res = await fetch(`${url}/v1/tx/${params.txid}`);
134
+ const data = await res.json();
135
+ return { text: `\u{1F6E1}\uFE0F **Transaction Status**
132
136
  **TXID**: ${params.txid}
133
137
  **Status**: ${data.txStatus || "Unknown"}` };
138
+ }
139
+ return { text: `Command '${action}' executed.` };
140
+ } catch (error) {
141
+ return { text: `\u274C Arcade Error: ${error.message}` };
134
142
  }
135
- return { text: `Command '${action}' executed.` };
136
- } catch (error) {
137
- return { text: `\u274C Arcade Error: ${error.message}` };
138
143
  }
139
- }
140
- });
141
- api.registerCli(({ program }) => {
142
- const arc = program.command("arcade").description("BSV transaction tracking commands");
143
- arc.addHelpText("after", `
144
+ });
145
+ api.registerCli(({ program }) => {
146
+ const arc = program.command("arcade").description("BSV transaction tracking commands");
147
+ arc.addHelpText("after", `
144
148
  \u{1F3AE} Arcade Examples:
145
149
  $ openclaw arcade status <txid> # Check status of a broadcasted TX
146
150
  $ openclaw arcade broadcast <hex> # Send raw transaction to the network
@@ -149,36 +153,27 @@ Network: ${net}` }] };
149
153
  \u{1F4A1} Tip: Arcade provides real-time lifecycle tracking for your transactions,
150
154
  from mempool acceptance to block confirmation.
151
155
  `);
152
- arc.command("status <txid>").description("Check broadcast status").action(async (txid) => {
153
- const res = await fetch(`${url}/v1/tx/${txid}`);
154
- const data = await res.json();
155
- console.log(JSON.stringify(data, null, 2));
156
- });
157
- arc.command("broadcast <hex>").description("Send raw transaction").action(async (txhex) => {
158
- const res = await fetch(`${url}/v1/tx`, {
159
- method: "POST",
160
- headers: { "Content-Type": "application/json" },
161
- body: JSON.stringify({ rawTx: txhex })
156
+ arc.command("status <txid>").description("Check broadcast status").action(async (txid) => {
157
+ const res = await fetch(`${url}/v1/tx/${txid}`);
158
+ const data = await res.json();
159
+ console.log(JSON.stringify(data, null, 2));
162
160
  });
163
- const data = await res.json();
164
- console.log(JSON.stringify(data, null, 2));
165
- });
166
- arc.command("config").description("Show current Arcade configuration").action(() => {
167
- console.log(JSON.stringify({ arcadeUrl: url, network: net }, null, 2));
168
- });
169
- }, { commands: ["arcade"] });
170
- }
171
- var plugin = {
172
- id: "openclaw-arcade-plugin",
173
- name: "BSV Arcade Broadcaster",
174
- description: "Submit and track BSV transactions with full lifecycle visibility",
175
- activate: register,
176
- register
161
+ arc.command("broadcast <hex>").description("Send raw transaction").action(async (txhex) => {
162
+ const res = await fetch(`${url}/v1/tx`, {
163
+ method: "POST",
164
+ headers: { "Content-Type": "application/json" },
165
+ body: JSON.stringify({ rawTx: txhex })
166
+ });
167
+ const data = await res.json();
168
+ console.log(JSON.stringify(data, null, 2));
169
+ });
170
+ arc.command("config").description("Show current Arcade configuration").action(() => {
171
+ console.log(JSON.stringify({ arcadeUrl: url, network: net }, null, 2));
172
+ });
173
+ }, { commands: ["arcade"] });
174
+ }
177
175
  };
178
- var index_default = register;
179
176
  export {
180
- index_default as default,
181
- plugin,
182
- register
177
+ index_default as default
183
178
  };
184
179
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../index.ts"],
4
- "sourcesContent": ["import path from \"node:path\";\nimport os from \"node:os\";\nimport debug from 'debug';\n\nconst log = debug('openclaw:plugin:arcade');\n\nlet isInitialized = false;\n\n// Shared configuration resolved at module level or startup\n// to avoid combining process.env access with fetch in the same scope.\nlet arcadeUrl: string = '';\nlet network: string = '';\n\n/**\n * OpenClaw Arcade Plugin\n * Transaction broadcasting and lifecycle tracking via BSV Arcade.\n */\nexport function register(api: any) {\n const version = \"0.2.40\";\n if (isInitialized) return;\n isInitialized = true;\n\n // RESOLUTION LOGIC AT THE TOP\n const config = api.pluginConfig || {};\n const net = config.network || 'mainnet';\n const defaultUrl = net === 'testnet' \n ? 'https://testnet.arc.gorillapool.io' \n : 'https://arc.gorillapool.io';\n const url = (config.arcadeUrl || defaultUrl).replace(/\\/$/, '');\n\n api.logger.info(`[arcade] Initializing Arcade Plugin v${version}`);\n\n // Onboarding\n api.registerOnboarding({\n id: \"arcade-setup\",\n title: \"Arcade Setup\",\n description: \"Configuring transaction broadcasting and lifecycle tracking\",\n handler: async () => {\n // Arcade is a stateless broadcaster, no wallet check needed.\n return { success: true, message: \"Arcade broadcaster ready.\" };\n }\n });\n \n // Tool\n api.registerTool({\n name: \"arcade\",\n description: \"Submit and track BSV transactions with full lifecycle visibility\",\n parameters: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"broadcast\", \"status\", \"proof\", \"config\"],\n description: \"Action to perform\"\n },\n txhex: {\n type: \"string\",\n description: \"Hex-encoded raw transaction to broadcast\"\n },\n txid: {\n type: \"string\",\n description: \"Transaction ID to track or fetch proof for\"\n }\n },\n required: [\"action\"]\n },\n async execute(_id: string, params: any) {\n log('Executing tool action: %s with params: %O', params.action, params);\n \n try {\n const { action, txhex, txid } = params;\n\n switch (action) {\n case \"broadcast\":\n if (!txhex) throw new Error(\"txhex is required for broadcast\");\n log('Broadcasting transaction: %s...', txhex.slice(0, 64));\n const bResp = await fetch(`${url}/v1/tx`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ rawTx: txhex })\n });\n const bData: any = await bResp.json();\n if (!bResp.ok) {\n log('Broadcast failed: %O', bData);\n throw new Error(`Broadcast failed: ${JSON.stringify(bData)}`);\n }\n log('Broadcast successful, TXID: %s', bData.txid);\n return { content: [{ type: \"text\", text: `Transaction broadcasted! TXID: ${bData.txid}\\nStatus: ${bData.txStatus}` }] };\n\n case \"status\":\n if (!txid) throw new Error(\"txid is required for status check\");\n log('Checking status for TXID: %s', txid);\n const sResp = await fetch(`${url}/v1/tx/${txid}`);\n const sData: any = await sResp.json();\n if (!sResp.ok) {\n log('Status check failed: %O', sData);\n throw new Error(`Status check failed: ${JSON.stringify(sData)}`);\n }\n log('Status: %s, Block: %s', sData.txStatus, sData.blockHeight);\n return { content: [{ type: \"text\", text: `Transaction ${txid}:\\nStatus: ${sData.txStatus}\\nBlock: ${sData.blockHeight || 'Pending'}` }] };\n\n case \"proof\":\n if (!txid) throw new Error(\"txid is required for proof retrieval\");\n log('Fetching proof for TXID: %s', txid);\n const pResp = await fetch(`${url}/v1/tx/${txid}/proof`);\n if (!pResp.ok) {\n log('Proof retrieval failed: %d', pResp.status);\n throw new Error(`Proof retrieval failed: ${pResp.status}`);\n }\n const pData = await pResp.arrayBuffer();\n const base64Proof = Buffer.from(pData).toString('base64');\n log('Proof retrieved, length: %d bytes', pData.byteLength);\n return { content: [{ type: \"text\", text: `Merkle Proof (Base64): ${base64Proof}` }] };\n case \"config\":\n return { content: [{ type: \"text\", text: `Arcade Configuration:\\nURL: ${url}\\nNetwork: ${net}` }] };\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n } catch (error: any) {\n return {\n content: [{\n type: \"text\",\n text: `Error: ${error.message || String(error)}`\n }]\n };\n }\n }\n });\n\n // Command\n api.registerCommand({\n name: \"arcade\",\n description: \"BSV transaction tracking commands\",\n acceptsArgs: true,\n handler: async (ctx: any) => {\n try {\n api.logger?.info?.(`[openclaw-arcade] Command received with args: ${JSON.stringify(ctx.args)} (type: ${typeof ctx.args})`);\n const args = Array.isArray(ctx.args) ? ctx.args : (typeof ctx.args === 'string' ? ctx.args.split(' ').filter(Boolean) : []);\n const action = args[0] || 'config';\n const params: any = { action };\n \n if (action === 'help') {\n return { text: `\uD83D\uDEE1\uFE0F **Arcade Help**\\n\\n**Subcommands**:\\n- \\`status <txid>\\`: Check broadcast status\\n- \\`broadcast <hex>\\`: Send raw transaction\\n- \\`proof <txid>\\`: Fetch Merkle Proof\\n- \\`config\\`: Show active URL` };\n }\n\n if (action === 'status' && args[1]) params.txid = args[1];\n if (action === 'broadcast' && args[1]) params.txhex = args[1];\n\n if (action === 'status' && params.txid) {\n const res = await fetch(`${url}/v1/tx/${params.txid}`);\n const data: any = await res.json();\n return { text: `\uD83D\uDEE1\uFE0F **Transaction Status**\\n**TXID**: ${params.txid}\\n**Status**: ${data.txStatus || 'Unknown'}` };\n }\n\n return { text: `Command '${action}' executed.` };\n } catch (error: any) {\n return { text: `\u274C Arcade Error: ${error.message}` };\n }\n }\n });\n\n // CLI\n api.registerCli(({ program }: any) => {\n const arc = program.command(\"arcade\").description(\"BSV transaction tracking commands\");\n\n arc.addHelpText('after', `\n\uD83C\uDFAE Arcade Examples:\n $ openclaw arcade status <txid> # Check status of a broadcasted TX\n $ openclaw arcade broadcast <hex> # Send raw transaction to the network\n $ openclaw arcade config # Show active Arcade URL and network\n\n\uD83D\uDCA1 Tip: Arcade provides real-time lifecycle tracking for your transactions, \n from mempool acceptance to block confirmation.\n`);\n\n arc.command(\"status <txid>\").description(\"Check broadcast status\").action(async (txid: string) => {\n const res = await fetch(`${url}/v1/tx/${txid}`);\n const data: any = await res.json();\n console.log(JSON.stringify(data, null, 2));\n });\n\n arc.command(\"broadcast <hex>\").description(\"Send raw transaction\").action(async (txhex: string) => {\n const res = await fetch(`${url}/v1/tx`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ rawTx: txhex })\n });\n const data: any = await res.json();\n console.log(JSON.stringify(data, null, 2));\n });\n\n arc.command(\"config\").description(\"Show current Arcade configuration\").action(() => {\n console.log(JSON.stringify({ arcadeUrl: url, network: net }, null, 2));\n });\n }, { commands: [\"arcade\"] });\n}\n\nexport const plugin = {\n id: \"openclaw-arcade-plugin\",\n name: \"BSV Arcade Broadcaster\",\n description: \"Submit and track BSV transactions with full lifecycle visibility\",\n activate: register,\n register: register\n};\n\nexport default register;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from \"node:path\";\nimport os from \"node:os\";\nimport debug from 'debug';\n\nconst log = debug('openclaw:plugin:arcade');\n\nlet isInitialized = false;\n\n/**\n * OpenClaw Arcade Plugin\n * Transaction broadcasting and lifecycle tracking via BSV Arcade.\n */\nexport default {\n id: \"openclaw-arcade-plugin\",\n name: \"BSV Arcade Broadcaster\",\n description: \"Submit and track BSV transactions with full lifecycle visibility\",\n async register(api: any) {\n const version = \"0.2.42\";\n \n // RESOLUTION LOGIC AT THE TOP\n const config = api.pluginConfig || {};\n const net = config.network || 'mainnet';\n const defaultUrl = net === 'testnet' \n ? 'https://testnet.arc.gorillapool.io' \n : 'https://arc.gorillapool.io';\n const url = (config.arcadeUrl || defaultUrl).replace(/\\/$/, '');\n\n if (isInitialized) return;\n isInitialized = true;\n\n api.logger.info(`[arcade] Initializing Arcade Plugin v${version}`);\n\n // Onboarding\n api.registerOnboarding({\n id: \"arcade-setup\",\n title: \"Arcade Setup\",\n description: \"Configuring transaction broadcasting and lifecycle tracking\",\n handler: async () => {\n // Arcade is a stateless broadcaster, no wallet check needed.\n return { success: true, message: \"Arcade broadcaster ready.\" };\n }\n });\n \n // Tool\n api.registerTool({\n name: \"arcade\",\n description: \"Submit and track BSV transactions with full lifecycle visibility\",\n parameters: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"broadcast\", \"status\", \"proof\", \"config\"],\n description: \"Action to perform\"\n },\n txhex: {\n type: \"string\",\n description: \"Hex-encoded raw transaction to broadcast\"\n },\n txid: {\n type: \"string\",\n description: \"Transaction ID to track or fetch proof for\"\n }\n },\n required: [\"action\"]\n },\n async execute(_id: string, params: any) {\n log('Executing tool action: %s with params: %O', params.action, params);\n \n try {\n const { action, txhex, txid } = params;\n\n switch (action) {\n case \"broadcast\":\n if (!txhex) throw new Error(\"txhex is required for broadcast\");\n log('Broadcasting transaction: %s...', txhex.slice(0, 64));\n const bResp = await fetch(`${url}/v1/tx`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ rawTx: txhex })\n });\n const bData: any = await bResp.json();\n if (!bResp.ok) {\n log('Broadcast failed: %O', bData);\n throw new Error(`Broadcast failed: ${JSON.stringify(bData)}`);\n }\n log('Broadcast successful, TXID: %s', bData.txid);\n return { content: [{ type: \"text\", text: `Transaction broadcasted! TXID: ${bData.txid}\\nStatus: ${bData.txStatus}` }] };\n\n case \"status\":\n if (!txid) throw new Error(\"txid is required for status check\");\n log('Checking status for TXID: %s', txid);\n const sResp = await fetch(`${url}/v1/tx/${txid}`);\n const sData: any = await sResp.json();\n if (!sResp.ok) {\n log('Status check failed: %O', sData);\n throw new Error(`Status check failed: ${JSON.stringify(sData)}`);\n }\n log('Status: %s, Block: %s', sData.txStatus, sData.blockHeight);\n return { content: [{ type: \"text\", text: `Transaction ${txid}:\\nStatus: ${sData.txStatus}\\nBlock: ${sData.blockHeight || 'Pending'}` }] };\n\n case \"proof\":\n if (!txid) throw new Error(\"txid is required for proof retrieval\");\n log('Fetching proof for TXID: %s', txid);\n const pResp = await fetch(`${url}/v1/tx/${txid}/proof`);\n if (!pResp.ok) {\n log('Proof retrieval failed: %d', pResp.status);\n throw new Error(`Proof retrieval failed: ${pResp.status}`);\n }\n const pData = await pResp.arrayBuffer();\n const base64Proof = Buffer.from(pData).toString('base64');\n log('Proof retrieved, length: %d bytes', pData.byteLength);\n return { content: [{ type: \"text\", text: `Merkle Proof (Base64): ${base64Proof}` }] };\n case \"config\":\n return { content: [{ type: \"text\", text: `Arcade Configuration:\\nURL: ${url}\\nNetwork: ${net}` }] };\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n } catch (error: any) {\n return {\n content: [{\n type: \"text\",\n text: `Error: ${error.message || String(error)}`\n }]\n };\n }\n }\n });\n\n // Command\n api.registerCommand({\n name: \"arcade\",\n description: \"BSV transaction tracking commands\",\n acceptsArgs: true,\n handler: async (ctx: any) => {\n try {\n api.logger?.info?.(`[openclaw-arcade] Command received with args: ${JSON.stringify(ctx.args)} (type: ${typeof ctx.args})`);\n const args = Array.isArray(ctx.args) ? ctx.args : (typeof ctx.args === 'string' ? ctx.args.split(' ').filter(Boolean) : []);\n const action = args[0] || 'config';\n const params: any = { action };\n \n if (action === 'help') {\n return { text: `\uD83D\uDEE1\uFE0F **Arcade Help**\\n\\n**Subcommands**:\\n- \\`status <txid>\\`: Check broadcast status\\n- \\`broadcast <hex>\\`: Send raw transaction\\n- \\`proof <txid>\\`: Fetch Merkle Proof\\n- \\`config\\`: Show active URL` };\n }\n\n if (action === 'status' && args[1]) params.txid = args[1];\n if (action === 'broadcast' && args[1]) params.txhex = args[1];\n\n if (action === 'status' && params.txid) {\n const res = await fetch(`${url}/v1/tx/${params.txid}`);\n const data: any = await res.json();\n return { text: `\uD83D\uDEE1\uFE0F **Transaction Status**\\n**TXID**: ${params.txid}\\n**Status**: ${data.txStatus || 'Unknown'}` };\n }\n\n return { text: `Command '${action}' executed.` };\n } catch (error: any) {\n return { text: `\u274C Arcade Error: ${error.message}` };\n }\n }\n });\n\n // CLI\n api.registerCli(({ program }: any) => {\n const arc = program.command(\"arcade\").description(\"BSV transaction tracking commands\");\n\n arc.addHelpText('after', `\n\uD83C\uDFAE Arcade Examples:\n $ openclaw arcade status <txid> # Check status of a broadcasted TX\n $ openclaw arcade broadcast <hex> # Send raw transaction to the network\n $ openclaw arcade config # Show active Arcade URL and network\n\n\uD83D\uDCA1 Tip: Arcade provides real-time lifecycle tracking for your transactions, \n from mempool acceptance to block confirmation.\n`);\n\n arc.command(\"status <txid>\").description(\"Check broadcast status\").action(async (txid: string) => {\n const res = await fetch(`${url}/v1/tx/${txid}`);\n const data: any = await res.json();\n console.log(JSON.stringify(data, null, 2));\n });\n\n arc.command(\"broadcast <hex>\").description(\"Send raw transaction\").action(async (txhex: string) => {\n const res = await fetch(`${url}/v1/tx`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ rawTx: txhex })\n });\n const data: any = await res.json();\n console.log(JSON.stringify(data, null, 2));\n });\n\n arc.command(\"config\").description(\"Show current Arcade configuration\").action(() => {\n console.log(JSON.stringify({ arcadeUrl: url, network: net }, null, 2));\n });\n }, { commands: [\"arcade\"] });\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,7 +2,7 @@
2
2
  "id": "openclaw-arcade-plugin",
3
3
  "name": "BSV Arcade Broadcaster",
4
4
  "description": "Submit and track BSV transactions with full lifecycle visibility",
5
- "version": "0.2.40",
5
+ "version": "0.2.42",
6
6
  "skills": [
7
7
  "./SKILL.md"
8
8
  ],
@@ -17,18 +17,18 @@
17
17
  "description": "Uses public infrastructure for broadcasting"
18
18
  }
19
19
  ],
20
- "commands": [
21
- {
22
- "name": "arcade",
23
- "description": "BSV transaction tracking commands"
24
- }
25
- ],
26
20
  "contracts": {
27
21
  "tools": [
28
22
  {
29
23
  "name": "arcade",
30
24
  "description": "Submit and track BSV transactions with full lifecycle visibility"
31
25
  }
26
+ ],
27
+ "commands": [
28
+ {
29
+ "name": "arcade",
30
+ "description": "BSV transaction tracking commands"
31
+ }
32
32
  ]
33
33
  },
34
34
  "configSchema": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-arcade-plugin",
3
- "version": "0.2.40",
3
+ "version": "0.2.42",
4
4
  "description": "OpenClaw plugin for transaction broadcasting and lifecycle tracking via BSV Arcade",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,8 +38,12 @@
38
38
  "extensions": [
39
39
  "./dist/index.js"
40
40
  ],
41
+ "build": {
42
+ "openclawVersion": "2026.4.10",
43
+ "pluginSdkVersion": "2026.4.10"
44
+ },
41
45
  "compat": {
42
- "pluginApi": "1",
46
+ "pluginApi": ">=2026.4.10",
43
47
  "minGatewayVersion": "2026.3.1"
44
48
  }
45
49
  },