clawntenna 0.12.2 → 0.12.3

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.
@@ -22,7 +22,7 @@ var CHAINS = {
22
22
  chainId: 8453,
23
23
  name: "Base",
24
24
  shortName: "Base",
25
- rpc: "https://mainnet.base.org",
25
+ rpc: "https://base.publicnode.com",
26
26
  explorer: "https://basescan.org",
27
27
  registry: "0x5fF6BF04F1B5A78ae884D977a3C80A0D8E2072bF",
28
28
  keyManager: "0xdc302ff43a34F6aEa19426D60C9D150e0661E4f4",
@@ -4842,12 +4842,13 @@ var Clawntenna = class _Clawntenna {
4842
4842
  };
4843
4843
 
4844
4844
  // src/cli/init.ts
4845
- import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs";
4845
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, copyFileSync } from "fs";
4846
4846
  import { homedir } from "os";
4847
4847
  import { join } from "path";
4848
4848
  import { ethers as ethers2 } from "ethers";
4849
4849
  var CONFIG_DIR = join(homedir(), ".config", "clawntenna");
4850
4850
  var CREDS_PATH = join(CONFIG_DIR, "credentials.json");
4851
+ var CREDS_BACKUP_PATH = CREDS_PATH + ".bak";
4851
4852
  var LEGACY_DIR = join(homedir(), ".clawntenna");
4852
4853
  var LEGACY_CREDS_PATH = join(LEGACY_DIR, "credentials.json");
4853
4854
  function migrateV1ToV2(v1) {
@@ -4882,9 +4883,31 @@ function migrateV1ToV2(v1) {
4882
4883
  }
4883
4884
  return v2;
4884
4885
  }
4886
+ function backupCredentials() {
4887
+ if (existsSync(CREDS_PATH)) {
4888
+ copyFileSync(CREDS_PATH, CREDS_BACKUP_PATH);
4889
+ }
4890
+ }
4891
+ function validateKeyAddress(creds) {
4892
+ const { address, privateKey } = creds.wallet;
4893
+ if (!privateKey || !address) return;
4894
+ try {
4895
+ const derived = ethers2.computeAddress(privateKey);
4896
+ if (derived.toLowerCase() !== address.toLowerCase()) {
4897
+ throw new Error(
4898
+ `Key mismatch in credentials.json: private key derives to ${derived} but stored address is ${address}. The file may have been corrupted. A backup was saved to ${CREDS_BACKUP_PATH}.`
4899
+ );
4900
+ }
4901
+ } catch (err) {
4902
+ if (err instanceof Error && err.message.startsWith("Key mismatch")) throw err;
4903
+ throw new Error(
4904
+ `Invalid private key in credentials.json. The key could not be parsed. A backup was saved to ${CREDS_BACKUP_PATH}.`
4905
+ );
4906
+ }
4907
+ }
4885
4908
  async function runPostInit(address) {
4886
- const { initState } = await import("./state-RKJRK6ZY.js");
4887
- const { copySkillFiles } = await import("./skill-JW4NXJ2O.js");
4909
+ const { initState } = await import("./state-AIF4NWKT.js");
4910
+ const { copySkillFiles } = await import("./skill-NOMAG55P.js");
4888
4911
  const stateResult = initState(address);
4889
4912
  const skillResult = copySkillFiles();
4890
4913
  return { stateResult, skillResult };
@@ -4894,6 +4917,7 @@ async function init(json = false) {
4894
4917
  const raw = JSON.parse(readFileSync(CREDS_PATH, "utf-8"));
4895
4918
  if (!raw.version) {
4896
4919
  const migrated = migrateV1ToV2(raw);
4920
+ backupCredentials();
4897
4921
  writeFileSync(CREDS_PATH, JSON.stringify(migrated, null, 2), { mode: 384 });
4898
4922
  const { stateResult: stateResult3, skillResult: skillResult3 } = await runPostInit(migrated.wallet.address);
4899
4923
  if (json) {
@@ -4935,6 +4959,7 @@ async function init(json = false) {
4935
4959
  const raw = JSON.parse(readFileSync(LEGACY_CREDS_PATH, "utf-8"));
4936
4960
  const migrated = raw.version ? raw : migrateV1ToV2(raw);
4937
4961
  mkdirSync(CONFIG_DIR, { recursive: true, mode: 448 });
4962
+ backupCredentials();
4938
4963
  writeFileSync(CREDS_PATH, JSON.stringify(migrated, null, 2), { mode: 384 });
4939
4964
  const { stateResult: stateResult2, skillResult: skillResult2 } = await runPostInit(migrated.wallet.address);
4940
4965
  if (json) {
@@ -5012,13 +5037,15 @@ function formatPostInit(stateResult, skillResult) {
5012
5037
  function loadCredentials() {
5013
5038
  if (existsSync(CREDS_PATH)) {
5014
5039
  const raw = JSON.parse(readFileSync(CREDS_PATH, "utf-8"));
5015
- if (!raw.version) return migrateV1ToV2(raw);
5016
- return raw;
5040
+ const creds = !raw.version ? migrateV1ToV2(raw) : raw;
5041
+ validateKeyAddress(creds);
5042
+ return creds;
5017
5043
  }
5018
5044
  if (existsSync(LEGACY_CREDS_PATH)) {
5019
5045
  const raw = JSON.parse(readFileSync(LEGACY_CREDS_PATH, "utf-8"));
5020
- if (!raw.version) return migrateV1ToV2(raw);
5021
- return raw;
5046
+ const creds = !raw.version ? migrateV1ToV2(raw) : raw;
5047
+ validateKeyAddress(creds);
5048
+ return creds;
5022
5049
  }
5023
5050
  return null;
5024
5051
  }
@@ -5028,15 +5055,20 @@ function parseCommonFlags(flags) {
5028
5055
  return {
5029
5056
  chain: flags.chain ?? "base",
5030
5057
  key: flags.key,
5058
+ rpc: flags.rpc,
5031
5059
  json: flags.json === "true"
5032
5060
  };
5033
5061
  }
5034
5062
  function loadClient(flags, requireWallet = true) {
5035
- const privateKey = flags.key ?? loadCredentials()?.wallet.privateKey;
5063
+ const creds = loadCredentials();
5064
+ const privateKey = flags.key ?? creds?.wallet.privateKey;
5036
5065
  if (requireWallet && !privateKey) {
5037
5066
  outputError("No wallet found. Run `npx clawntenna init` first or pass --key.", flags.json ?? false);
5038
5067
  }
5039
- return new Clawntenna({ chain: flags.chain, privateKey: privateKey ?? void 0 });
5068
+ const chainId = chainIdForCredentials(flags.chain);
5069
+ const credsRpc = creds?.chains[chainId]?.rpc;
5070
+ const rpcUrl = flags.rpc ?? process.env.CLAWNTENNA_RPC_URL ?? credsRpc;
5071
+ return new Clawntenna({ chain: flags.chain, privateKey: privateKey ?? void 0, rpcUrl });
5040
5072
  }
5041
5073
  function output(data, json) {
5042
5074
  if (json) {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CONFIG_DIR
4
- } from "./chunk-XGIPK7SQ.js";
4
+ } from "./chunk-6VM633OH.js";
5
5
 
6
6
  // src/cli/skill.ts
7
7
  import { readFileSync, existsSync, copyFileSync, mkdirSync } from "fs";
@@ -3,7 +3,7 @@ import {
3
3
  CONFIG_DIR,
4
4
  loadCredentials,
5
5
  output
6
- } from "./chunk-XGIPK7SQ.js";
6
+ } from "./chunk-6VM633OH.js";
7
7
 
8
8
  // src/cli/state.ts
9
9
  import { existsSync, mkdirSync, writeFileSync } from "fs";
@@ -21,7 +21,7 @@ function initState(address) {
21
21
  startedAt: now,
22
22
  lastScanAt: now,
23
23
  mode: "active",
24
- skillVersion: "0.12.2",
24
+ skillVersion: "0.12.3",
25
25
  lastSkillCheck: now
26
26
  },
27
27
  chains: {
package/dist/cli/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  stateInit
4
- } from "./chunk-VGRQJ7ZA.js";
4
+ } from "./chunk-VMA7BES6.js";
5
5
  import {
6
6
  showHeartbeat,
7
7
  showSkill,
8
8
  showSkillJson
9
- } from "./chunk-O76XQ2A7.js";
9
+ } from "./chunk-KDFBD47K.js";
10
10
  import {
11
11
  REGISTRY_ABI,
12
12
  chainIdForCredentials,
@@ -16,7 +16,7 @@ import {
16
16
  output,
17
17
  outputError,
18
18
  parseCommonFlags
19
- } from "./chunk-XGIPK7SQ.js";
19
+ } from "./chunk-6VM633OH.js";
20
20
 
21
21
  // src/cli/send.ts
22
22
  async function send(topicId, message, flags) {
@@ -1299,7 +1299,7 @@ function decodeContractError(err) {
1299
1299
  }
1300
1300
 
1301
1301
  // src/cli/index.ts
1302
- var VERSION = "0.12.2";
1302
+ var VERSION = "0.12.3";
1303
1303
  var HELP = `
1304
1304
  clawntenna v${VERSION}
1305
1305
  On-chain encrypted messaging for AI agents
@@ -1401,6 +1401,7 @@ var HELP = `
1401
1401
 
1402
1402
  Options:
1403
1403
  --chain <base|avalanche|baseSepolia> Chain to use (default: base)
1404
+ --rpc <url> Custom RPC endpoint (or set CLAWNTENNA_RPC_URL)
1404
1405
  --key <privateKey> Private key (overrides credentials)
1405
1406
  --limit <N> Number of messages to read (default: 20)
1406
1407
  --json Output as JSON
@@ -4,8 +4,8 @@ import {
4
4
  showHeartbeat,
5
5
  showSkill,
6
6
  showSkillJson
7
- } from "./chunk-O76XQ2A7.js";
8
- import "./chunk-XGIPK7SQ.js";
7
+ } from "./chunk-KDFBD47K.js";
8
+ import "./chunk-6VM633OH.js";
9
9
  export {
10
10
  copySkillFiles,
11
11
  showHeartbeat,
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  initState,
4
4
  stateInit
5
- } from "./chunk-VGRQJ7ZA.js";
6
- import "./chunk-XGIPK7SQ.js";
5
+ } from "./chunk-VMA7BES6.js";
6
+ import "./chunk-6VM633OH.js";
7
7
  export {
8
8
  initState,
9
9
  stateInit
package/dist/index.cjs CHANGED
@@ -99,7 +99,7 @@ var CHAINS = {
99
99
  chainId: 8453,
100
100
  name: "Base",
101
101
  shortName: "Base",
102
- rpc: "https://mainnet.base.org",
102
+ rpc: "https://base.publicnode.com",
103
103
  explorer: "https://basescan.org",
104
104
  registry: "0x5fF6BF04F1B5A78ae884D977a3C80A0D8E2072bF",
105
105
  keyManager: "0xdc302ff43a34F6aEa19426D60C9D150e0661E4f4",