@sofer_agent/cli 0.3.4 → 0.3.6
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/init.d.ts.map +1 -1
- package/dist/init.js +46 -33
- package/dist/init.js.map +1 -1
- package/package.json +1 -1
- package/src/init.ts +47 -33
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAmBA;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA4NjD"}
|
package/dist/init.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cancel, intro, isCancel, note, outro, password, select, spinner } from "@clack/prompts";
|
|
2
|
-
import { AgentClient, agentPaths, generateKeypair, keypairFromSecret, loadConfig, makeSuiClient, provisionMemwal, requestFaucet, shortAgentId, suiBalance, waitForBalance, writePersistedConfig, writeSecret, } from "@sofer_agent/core";
|
|
2
|
+
import { AgentClient, agentPaths, generateKeypair, keypairFromSecret, loadConfig, makeSuiClient, provisionMemwal, readSecret, requestFaucet, shortAgentId, suiBalance, waitForBalance, writePersistedConfig, writeSecret, } from "@sofer_agent/core";
|
|
3
3
|
/**
|
|
4
4
|
* Interactive init wizard — mint the agent + provision Walrus memory.
|
|
5
5
|
* Stores config to ~/.sofer/config.json and secrets to ~/.sofer/{sui,brain}.key
|
|
@@ -43,64 +43,77 @@ export async function initCommand() {
|
|
|
43
43
|
cancel("API key is required.");
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
|
-
// ── 3. Sui wallet
|
|
47
|
-
const existingSecret = process.env.SOFER_SUI_SECRET_KEY;
|
|
46
|
+
// ── 3. Sui wallet — reuse from file/env, or generate & save immediately ──
|
|
47
|
+
const existingSecret = process.env.SOFER_SUI_SECRET_KEY ?? readSecret(agentPaths.suiKey);
|
|
48
48
|
const sGen = spinner();
|
|
49
49
|
let secret;
|
|
50
50
|
let address;
|
|
51
51
|
if (existingSecret) {
|
|
52
|
-
sGen.start("Loading wallet
|
|
52
|
+
sGen.start("Loading wallet");
|
|
53
53
|
const kp = keypairFromSecret(existingSecret);
|
|
54
54
|
secret = existingSecret;
|
|
55
55
|
address = kp.toSuiAddress();
|
|
56
|
-
sGen.stop(`wallet: ${address} (
|
|
56
|
+
sGen.stop(`wallet: ${address} (reused)`);
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
59
59
|
sGen.start("Generating new Sui wallet");
|
|
60
60
|
const kp = generateKeypair();
|
|
61
61
|
secret = kp.getSecretKey();
|
|
62
62
|
address = kp.toSuiAddress();
|
|
63
|
-
|
|
63
|
+
writeSecret(agentPaths.suiKey, secret); // save immediately so re-runs reuse it
|
|
64
|
+
sGen.stop(`wallet: ${address} (new, saved to ${agentPaths.suiKey})`);
|
|
64
65
|
}
|
|
65
66
|
const config = loadConfig();
|
|
66
67
|
const sui = makeSuiClient(net);
|
|
67
68
|
// ── 4. Fund from faucet (testnet only) ─────────────────────────────────
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
let balance = 0n;
|
|
70
|
+
try {
|
|
71
|
+
balance = await suiBalance(sui, address);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// RPC may be down — try anyway
|
|
75
|
+
}
|
|
76
|
+
if (net !== "mainnet" && balance === 0n) {
|
|
77
|
+
const sFund = spinner();
|
|
78
|
+
sFund.start("Requesting testnet faucet");
|
|
79
|
+
let funded = false;
|
|
80
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
81
|
+
try {
|
|
82
|
+
await requestFaucet(net, address);
|
|
83
|
+
await waitForBalance(sui, address, 1n);
|
|
84
|
+
funded = true;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
if (attempt < 2) {
|
|
89
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
80
90
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
await new Promise((r) => setTimeout(r, 5000));
|
|
84
|
-
}
|
|
91
|
+
else {
|
|
92
|
+
sFund.stop(`faucet failed: ${String(e).slice(0, 80)}`);
|
|
85
93
|
}
|
|
86
94
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
else {
|
|
91
|
-
sFund.stop("faucet rate-limited");
|
|
92
|
-
cancel(`Faucet is rate-limited. Fund the wallet manually:\n ${address}\n https://faucet.sui.io/\n\nThen re-run \`sofer init\`.`);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
+
}
|
|
96
|
+
if (funded) {
|
|
97
|
+
sFund.stop("funded");
|
|
95
98
|
}
|
|
96
99
|
else {
|
|
97
|
-
|
|
100
|
+
cancel(`Faucet failed after 3 attempts. Fund manually:\n ${address}\n https://faucet.sui.io/\n\nThen re-run \`sofer init\`.`);
|
|
101
|
+
return;
|
|
98
102
|
}
|
|
99
103
|
}
|
|
104
|
+
else if (balance > 0n) {
|
|
105
|
+
note(`${(Number(balance) / 1e9).toFixed(4)} SUI on ${address}`, "wallet balance");
|
|
106
|
+
}
|
|
100
107
|
// ── 4b. Balance gate ───────────────────────────────────────────────────
|
|
101
|
-
|
|
108
|
+
try {
|
|
109
|
+
balance = await suiBalance(sui, address);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// RPC down — warn but proceed; mint will fail if truly unfunded
|
|
113
|
+
note("Cannot check wallet balance (RPC down). Proceeding anyway…", "network warning");
|
|
114
|
+
}
|
|
102
115
|
if (balance === 0n) {
|
|
103
|
-
cancel(`Wallet has 0 SUI. Fund it at https://faucet.sui.io/ and re-run \`sofer init
|
|
116
|
+
cancel(`Wallet has 0 SUI. Fund it at https://faucet.sui.io/ and re-run \`sofer init\`.\n ${address}`);
|
|
104
117
|
return;
|
|
105
118
|
}
|
|
106
119
|
const agents = new AgentClient(sui, config.packageId);
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EACL,WAAW,EAEX,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,mDAAmD,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,CAAC;IAEpB,0EAA0E;IAC1E,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;YAC1C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;SAC3C;QACD,YAAY,EAAE,SAAS;KACxB,CAAC,CAAoB,CAAC;IACvB,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1D,0EAA0E;IAC1E,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC;QAC7B,OAAO,EAAE,iEAAiE;QAC1E,IAAI,EAAE,GAAG;KACV,CAAC,CAAoB,CAAC;IACvB,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EACL,WAAW,EAEX,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,eAAe,EACf,UAAU,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,mDAAmD,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,CAAC;IAEpB,0EAA0E;IAC1E,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;YAC1C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;SAC3C;QACD,YAAY,EAAE,SAAS;KACxB,CAAC,CAAoB,CAAC;IACvB,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1D,0EAA0E;IAC1E,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC;QAC7B,OAAO,EAAE,iEAAiE;QAC1E,IAAI,EAAE,GAAG;KACV,CAAC,CAAoB,CAAC;IACvB,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,MAAc,CAAC;IACnB,IAAI,OAAe,CAAC;IACpB,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,GAAG,cAAc,CAAC;QACxB,OAAO,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,OAAO,WAAW,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;QAC7B,MAAM,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QAC3B,OAAO,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QAC5B,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,uCAAuC;QAC/E,IAAI,CAAC,IAAI,CAAC,WAAW,OAAO,mBAAmB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAE/B,0EAA0E;IAC1E,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACzC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAClC,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;gBACvC,MAAM,GAAG,IAAI,CAAC;gBACd,MAAM;YACR,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAChB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAChD,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CACJ,qDAAqD,OAAO,2DAA2D,CACxH,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACpF,CAAC;IAED,0EAA0E;IAC1E,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;QAChE,IAAI,CAAC,4DAA4D,EAAE,iBAAiB,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,MAAM,CACJ,qFAAqF,OAAO,EAAE,CAC/F,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAEtD,yEAAyE;IACzE,IAAI,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAC9B,OAAO,EACP,OAAO,EACP,6DAA6D,EAC7D,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAClC,CAAC;YACF,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACtD,MAAM,CAAC,oCAAoC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACjC,CAAC;IAED,yEAAyE;IACzE,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;IAC1C,IAAI,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;IAC9C,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC;gBACjC,WAAW,EAAE,MAAM;gBACnB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;gBAClC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;gBACpC,OAAO,EAAE,GAAG;gBACZ,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YACH,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC3B,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpE,MAAM,CACJ,oGAAoG,CACrG,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,0EAA0E;IAC1E,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,uDAAuD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;IACxB,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,wCAAwC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,0EAA0E;IAC1E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,mDAAmD,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;IACxB,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACnC,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAoB;QACjC,OAAO,EAAE,GAAG;QACZ,aAAa,EAAE,OAAO;QACtB,YAAY,EAAE,OAAO;QACrB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;QACpC,MAAM,EAAE;YACN,SAAS;YACT,WAAW;SACZ;KACF,CAAC;IACF,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3C,yEAAyE;IACzE,MAAM,KAAK,GAAG;QACZ,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;QACnC,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;QACnC,YAAY,GAAG,EAAE;QACjB,YAAY,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;QACrC,EAAE;QACF,sCAAsC;KACvC,CAAC;IACF,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1B,CAAC"}
|
package/package.json
CHANGED
package/src/init.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
loadConfig,
|
|
9
9
|
makeSuiClient,
|
|
10
10
|
provisionMemwal,
|
|
11
|
+
readSecret,
|
|
11
12
|
requestFaucet,
|
|
12
13
|
shortAgentId,
|
|
13
14
|
suiBalance,
|
|
@@ -63,65 +64,78 @@ export async function initCommand(): Promise<void> {
|
|
|
63
64
|
return;
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
// ── 3. Sui wallet
|
|
67
|
-
const existingSecret = process.env.SOFER_SUI_SECRET_KEY;
|
|
67
|
+
// ── 3. Sui wallet — reuse from file/env, or generate & save immediately ──
|
|
68
|
+
const existingSecret = process.env.SOFER_SUI_SECRET_KEY ?? readSecret(agentPaths.suiKey);
|
|
68
69
|
const sGen = spinner();
|
|
69
70
|
let secret: string;
|
|
70
71
|
let address: string;
|
|
71
72
|
if (existingSecret) {
|
|
72
|
-
sGen.start("Loading wallet
|
|
73
|
+
sGen.start("Loading wallet");
|
|
73
74
|
const kp = keypairFromSecret(existingSecret);
|
|
74
75
|
secret = existingSecret;
|
|
75
76
|
address = kp.toSuiAddress();
|
|
76
|
-
sGen.stop(`wallet: ${address} (
|
|
77
|
+
sGen.stop(`wallet: ${address} (reused)`);
|
|
77
78
|
} else {
|
|
78
79
|
sGen.start("Generating new Sui wallet");
|
|
79
80
|
const kp = generateKeypair();
|
|
80
81
|
secret = kp.getSecretKey();
|
|
81
82
|
address = kp.toSuiAddress();
|
|
82
|
-
|
|
83
|
+
writeSecret(agentPaths.suiKey, secret); // save immediately so re-runs reuse it
|
|
84
|
+
sGen.stop(`wallet: ${address} (new, saved to ${agentPaths.suiKey})`);
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
const config = loadConfig();
|
|
86
88
|
const sui = makeSuiClient(net);
|
|
87
89
|
|
|
88
90
|
// ── 4. Fund from faucet (testnet only) ─────────────────────────────────
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
91
|
+
let balance = 0n;
|
|
92
|
+
try {
|
|
93
|
+
balance = await suiBalance(sui, address);
|
|
94
|
+
} catch {
|
|
95
|
+
// RPC may be down — try anyway
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (net !== "mainnet" && balance === 0n) {
|
|
99
|
+
const sFund = spinner();
|
|
100
|
+
sFund.start("Requesting testnet faucet");
|
|
101
|
+
let funded = false;
|
|
102
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
103
|
+
try {
|
|
104
|
+
await requestFaucet(net, address);
|
|
105
|
+
await waitForBalance(sui, address, 1n);
|
|
106
|
+
funded = true;
|
|
107
|
+
break;
|
|
108
|
+
} catch (e) {
|
|
109
|
+
if (attempt < 2) {
|
|
110
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
111
|
+
} else {
|
|
112
|
+
sFund.stop(`faucet failed: ${String(e).slice(0, 80)}`);
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
sFund.stop("faucet rate-limited");
|
|
111
|
-
cancel(
|
|
112
|
-
`Faucet is rate-limited. Fund the wallet manually:\n ${address}\n https://faucet.sui.io/\n\nThen re-run \`sofer init\`.`,
|
|
113
|
-
);
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
115
|
+
}
|
|
116
|
+
if (funded) {
|
|
117
|
+
sFund.stop("funded");
|
|
116
118
|
} else {
|
|
117
|
-
|
|
119
|
+
cancel(
|
|
120
|
+
`Faucet failed after 3 attempts. Fund manually:\n ${address}\n https://faucet.sui.io/\n\nThen re-run \`sofer init\`.`,
|
|
121
|
+
);
|
|
122
|
+
return;
|
|
118
123
|
}
|
|
124
|
+
} else if (balance > 0n) {
|
|
125
|
+
note(`${(Number(balance) / 1e9).toFixed(4)} SUI on ${address}`, "wallet balance");
|
|
119
126
|
}
|
|
120
127
|
|
|
121
128
|
// ── 4b. Balance gate ───────────────────────────────────────────────────
|
|
122
|
-
|
|
129
|
+
try {
|
|
130
|
+
balance = await suiBalance(sui, address);
|
|
131
|
+
} catch {
|
|
132
|
+
// RPC down — warn but proceed; mint will fail if truly unfunded
|
|
133
|
+
note("Cannot check wallet balance (RPC down). Proceeding anyway…", "network warning");
|
|
134
|
+
}
|
|
123
135
|
if (balance === 0n) {
|
|
124
|
-
cancel(
|
|
136
|
+
cancel(
|
|
137
|
+
`Wallet has 0 SUI. Fund it at https://faucet.sui.io/ and re-run \`sofer init\`.\n ${address}`,
|
|
138
|
+
);
|
|
125
139
|
return;
|
|
126
140
|
}
|
|
127
141
|
|